MergeKitによるMoEマージだけで日本語性能は上がるか?

  • 前回の記事で、「LightChatAssistant 2x7B」が日本語チャットモデルのベンチマークでもかなり高いスコアを示すことを確認しました(スコア上はCohereの「Command-R 35B」に近い水準です)。
  • 体感的にもベンチマーク的にも優れた日本語チャットモデルで、サイズが小さいことも考えるととても魅力的です。

sc-bakushu.hatenablog.com

  • 作者さんがモデルカードで説明されている制作プロセスを読むと、単純に「ChatNTQ 7B」と「Antler-7B」をMoEマージする前に、ChatVectorという手法により各モデルに微調整を施しているようです。
  • となると、「LightChatAssistant 2x7B」の性能の上昇はMoEによる部分が大きいのか、あるいはChatVectorによる部分が大きいのかが気になってきます。
  • というわけで、まずChatVectorを使わない単純なMoEマージを試して、MoEオンリーでどれくらいの性能上昇が得られるのかを確認してみたいと思います。

ChatNTQ 7B x Antler 7B の単純なMoE

  • 最初に、「LightChatAssistant 2x7B」の制作プロセスのうちChatVectorによる処理の部分だけスキップして、単純なMoEモデルを作ります。
  • なお、MoEマージの手順については、はちさんによる以下の記事を参考にさせていただきました。ありがとうございます。

note.com

  • 結果は以下のとおりです。2モデルの単純な直マージだと「Chat NTQ 7B」からの性能向上はありません。誤差を踏まえるとほぼ同じと言っていいと思います。
名称 LightChatAssistant
2x7B

Chat NTQ JA 7B x Antler 7B 直マージ

(CheapEmbed)

ChatNTQ JA 7B
パラメータサイズ 2x7B 2x7B 7B
量子化タイプ Q8_0 Q8_0 Q8_0
ElyzaTasks100
スコア平均
3.31 3.04 3.06
標準誤差 0.14 0.14 0.15
  • ただし実際の出力をみると、日本語の流暢性はいくらか改善している印象があり、小説生成モデル「Antler-7B」の影響はわずかに感じられます。
  • ところで、このMoEでは「LightChatAssistant 2x7B」のマージ設定でも使われている「cheap_embed」というゲートモードを使いましたが、どうやらこのモードの選択がけっこう重要なようです。
  • 次は「random」というモードに変更して、あらためてマージを試してみます。結果は以下のとおりでした。
名称 LightChatAssistant
2x7B
Chat NTQ JA 7B x Antler 7B 直マージ
(Random)
ChatNTQ JA 7B
パラメータサイズ 2x7B 2x7B 7B
量子化タイプ Q8_0 Q8_0 Q8_0
ElyzaTasks100
スコア平均
3.31 3.15 3.06
標準誤差 0.14 0.14 0.15
  • 「random」へ変更することで、スコアに改善が見られました。まだ誤差の範囲内ですが、体感的にはわずかに差がありそうです。とはいえ本家の「LightChatAssistant 2x7B」には及びません。
  • MergeKitに関するウェブ上の解説を斜め読みすると、「random」というモードは一番単純なマージ設定のようで、「cheap_embed」や「hidden」のように各モデルの特長の違いを考慮しない雑なモードのようです。

docs.google.com

  • ということは、純粋にパラメータ数が増えるだけでも日本語性能が上がる余地があるのかもしれない、という気がしてきます。

ChatNTQ 7B x ChatNTQ 7B のダブルMoE

  • 「Antler-7B」は小説生成モデルなので、チャットモデルである「Chat NTQ 7B」と性能補完的ではあるものの、それ自体のチャット性能は(微調整しない限り)低いままです。
  • では、「Antler-7B」を使わずに「Chat NTQ 7B」を2つ使ってMoEマージするとどうなるのでしょうか?
  • MergeKitの説明などを見ると、一般的には「同一モデルのマージは意味がない」とされているようですが、物は試しでやってみます。結果は以下の通りです。
名称

LightChat

Assistant

2x7B

Chat NTQ JA 7B x Chat NTQ JA 7B 直マージ(Random) Chat NTQ JA 7B x
Antler 7B 直マージ
(Random)
ChatNTQ JA 7B
パラメータ 2x7B 2x7B 2x7B 7B
量子化タイプ Q8_0 Q8_0 Q8_0 Q8_0
ElyzaTasks100
スコア平均
3.31 3.25 3.15 3.06
標準誤差 0.14 0.14 0.14 0.15
  • 意外なことに、かなりスコアが改善しています。「LightChatAssistant 2x7B」ほどではありませんが、明らかに性能が上がりました。
  • 実際の出力をみると「LightChatAssistant 2x7B」に比べて日本語の流暢性は劣っており面白味はありませんが、計算などの推論能力に多少の向上が見られました。

感想

  • ということで、「Chat NTQ 7B」→「LightChatAssistant 2x7B」の顕著な性能向上のうち、ざっくり1/3~半分程度はMoEマージでパラメータ数が伸びることで説明できそうな印象です。
  • なお今回は素の「Antler-7B」を使ったので、チャットファインチューンを施していないモデルをマージに組み込むことの悪影響が出た感は否めません。
  • 次は、ChatVectorによる効果についても調べてみたいと思います。

補足

  • パラメータ数(モデルサイズ)を増やすタイプのモデルマージとしては、MoEのほかに「Passthrough」という手法も存在します。
    • MoEがコミュニティで一般化する前から使われていたいわゆる「Frankenマージ」を作成する手法です。
  • 今回、MoEマージ以外にも、この「Passthrough」など他のマージ手法も簡単に試してみたのですが、そもそもモデルの出力がかなり壊れてしまい、性能を測定するに至りませんでした。MoEマージのほうが意外に扱いやすい手法のようです。