MoE
Mixture of Experts Explained
TL;DR
高密度モデルと比較して、事前トレーニングがはるかに高速です
同じ数のパラメータを持つモデルと比較して推論が高速になります
すべてのエキスパートがメモリにロードされるため、高 VRAM が必要
微調整では多くの課題に直面しているが、MoE の命令調整に関する最近の研究は有望である
https://gyazo.com/c40da68268e06fabd5040fa03d46a2f8
= Mixture of Experts
https://huggingface.co/blog/moe歴史からトレーニングの概要的なところ、Mixtral 8x7Bのアーキテクチャ(共有部分の存在など)についてまで書かれている。
歴史を遡るとVisionモデル(vlmではない)についての記事https://qiita.com/cvusk/items/c5f9622d7b87c36bf4f5があったりllm方面以外で使われてきた割と歴史のある?技術のようだ。
DeepSeek-R1によって再び注目を集めた技術…だがそもそもGPT-4(初代)はMoEである可能性が指摘されていたりと、案外LLM分野でもそれなりに頻出している。
そのDeepSeek-R1(もといそのベースたるDeepSeek V3)のMoE構成は最適化の為にかなり独特な組み合わせがなされている(正直素人が見ても訳わからん作りしてるmorisoba65536.icon)
Claude 3.5 Sonnetにまとめてもらった内容(さすがに長いのでちょっと編集)
1. 基本的な実装例
最もシンプルな実装として、https://medium.com/@prateeksikdar/understanding-mixture-of-experts-building-a-moe-model-with-pytorch-dd373d9db81cのような構造が参考になります
2. 学習しやすい実装例
https://github.com/peytontolbert/simple-moepeytontolbert/simple-moeは、学習プロセスを理解しやすい実装として参考になります。
3. 主要なコンポーネント
シンプルなMoEの基本構造は以下の3つから成り立っていますhttps://medium.com/@bragadeeshs/implementing-a-mixture-of-experts-moe-model-using-pytorch-0852fdc5633e:
1. エキスパートモデル
- 個々の専門家として機能する単純なニューラルネットワーク
- 同じ入出力インターフェースを持つ
2. ゲーティングネットワーク
- 入力に基づいてエキスパートの重みを決定
- 通常は単層のニューラルネットワーク
3. 統合メカニズム
- エキスパートの出力を重み付けして結合
- 最終的な予測を生成
4. 実装時の重要なポイントhttps://hungyuling.com/blog/fast-mixture-of-experts-in-pytorch/:
1. 負荷分散
- エキスパート間で入力が均等に分散されるように設計
2. トレーニング安定性
- 適切な損失関数の選択
- バッチサイズの調整
3.メモリ効率
- 必要に応じたTop-k選択の実装
- 効率的なバッチ処理
これらの実装例を参考に、まずは基本的な構造を理解し、その後必要に応じて機能を追加していくアプローチが推奨されます。
どうやら(非常にシンプルな実装の場合)タスクに応じた比率で専門家モデル同士を選択・マージし、その結果を出力することで精度を得る考え方のようだmorisoba65536.icon
マージ、も厳密には違うようで重みつけして出力足し合わせる、が正解のようだ……(MoE何もわからない)morisoba65536.icon
ふつうに勘違いしてたが、ゲーティングネットワークの所(ルーティングとか色々な呼ばれ方をする)は、「MoEで同じアーキテクチャに縛られるモデル(llm)ではない」
極論すれば「特定の単語(トークン)が来たらこっちのモデル」見たいなシンプルな仕組みでも良い、基本的にはシンプルなTransFormerアーキテクチャの分類器を使うことが多いようだ
構造的に「学習済みモデル」をベースにしつつ「共用部」を学習対象外にしたLoraでチューニング→独立したLora適用専門家モデルを作る→ゲーティングネットワークを学習、とすればかなり省資源に学習できると思われる…(私の理解が間違ってなければ)
ゲーティングネットワークについては長くなってきたので別記事に分離
gating network