日本語LLM 9種を量子化して回答内容を比較調査してみた

## TL;DR

* 量子化しても成績が下がりにくいモデルと、大きく下がるモデルがある
* 一部のモデルは量子化すると回答が極端に短くなる
* 量子化によって回答が短くなる度合いは、量子化前モデルの回答の長さと相関がある可能性がある

## はじめに

皆さんは**量子化したLLM**を使っていますか？

深層学習における**量子化（quantization）** とは、モデルのパラメータを少ないビット数で表現することです。
通常のモデルは float32 などの高精度なデータ型を使ってパラメータを表現しますが、この精度を float16 や int8 に下げることを量子化といいます。
量子化による最大のメリットは、モデルのメモリ使用量を削減できることです。メモリの大きなモデルを動かすためには、大容量のメモリを搭載したGPUが必要ですが、量子化によってモデルのメモリ使用量を削減することで、より多くのGPUでモデルを動かすことができます。

下の図は、さまざまな量子化手法を用いて、量子化前後におけるメモリ使用量の変化を測定した結果です（Y軸は対数スケールです）。
図の右端に近づくほど、精度を落とした「強い」量子化を適用していますが、それに伴ってメモリ使用量が減っていることがわかります。
![k-quants_file_size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58671/59fe3b0e-b3ab-6a00-55e5-84de56828f59.png)

(出典: Jin, Du, et al. "A Comprehensive Evaluation of Quantization Strategies for Large Language Model," 2024)

また、量子化したモデルを使うことで、推論を高速化することもできます。
下の図は、K-quants という量子化手法を用いて、強度を変えてモデルの推論を行ったときの、1トークンあたりの推論時間を示したものです。
一部でゆらぎはありますが、量子化の強度に応じて推論時間が短くなっていることが見て取れます。
![k-quants_speed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58671/f801121f-6a90-0faa-a7f1-27f50216ae77.png)

(出典: [ikawrakow](https://github.com/ggerganov/llama.cpp/pull/1684) をもとに筆者作成)

このように、メモリ使用量の削減、推論の高速化という効果が得られることから、量子化は LLM の分野で重要な技術となっています。
最近では、小型コンピュータ Raspberry Pi で LLM を動かす例（[kazuhitoyokoiさん](https://qiita.com/kazuhitoyokoi/items/66e8c9e1b447a2850ba7)、[roxaさん](https://qiita.com/roxa/items/f9e9e9d53a401efd1e68)など）も登場していますが、こうした環境で LLM を利用したい場合、量子化はとても有用な手法です。

量子化の技術そのものは、画像認識や言語モデルなど様々な分野で研究されています。
量子化に関する論文をまとめている [htqin/awesome-model-quantization](https://github.com/htqin/awesome-model-quantization) によれば、2015～2016年の時点で "BinaryConnect: Training Deep Neural Networks with binary weights during propagations" ([arXiv](https://arxiv.org/abs/1511.00363)) や "Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1" ([arXiv](https://arxiv.org/abs/1602.02830)) などの論文が登場しています。
これらの論文は画像認識の分野での量子化に関するものですが、その後言語モデル分野でも量子化に関する研究が進み、2019年～2020年ごろにかけて、BERT を対象とするさまざまな量子化手法が考案されました ([Q8BERT](https://arxiv.org/abs/1910.06188), [Q-Bert](https://arxiv.org/abs/1909.05840), [TernaryBERT](https://arxiv.org/abs/2009.12812), [BinaryBERT](https://arxiv.org/abs/2012.15701v2) など)。

その後、言語モデルのスケールアップが進み、大規模言語モデル（LLM）が登場したことで、量子化の重要性が高まりました。
LLM は学習・推論に多くの計算資源を必要とし、大容量のメモリを搭載したGPUがなければ学習・推論ができないほどの規模を持つモデルが登場したためです。
このような環境を用意しなくても手軽に LLM を動かせる手法として、さまざまな量子化の方法が提案されました。
主な手法としては、[GPTQ](https://arxiv.org/abs/2210.17323) や [AWQ](https://arxiv.org/abs/2306.00978)、llama.cpp の GGUF フォーマットで採用されている [K-quants](https://github.com/ggerganov/llama.cpp/pull/1684) などがあり、現在も研究が進んでいます。

日本語 LLM も昨今は大規模化の傾向があり、[stabilityai/japanese-stablelm-instruct-beta-70b](https://huggingface.co/stabilityai/japanese-stablelm-instruct-beta-70b) や [karakuri-ai/karakuri-lm-70b-chat-v0.1](https://huggingface.co/karakuri-ai/karakuri-lm-70b-chat-v0.1) など、70Bレンジの大規模モデルが登場しています。
これらのモデルは、実行に 100 GB を超える VRAM を必要とし、潤沢なリソースをもたないユーザにとっては、学習はもとより推論するにはハードルが高いです。
こうした中、日本語 LLM を量子化して利用する場面が今後増えてくることが予想されます。

一方、量子化が日本語 LLM に与える影響は未知であり、**モデルによっては、量子化すると回答の質が大きく下がると感じる**こともあります。
そこで、本稿では日本語 LLM を量子化して回答内容を比較し、どのような影響があるのかを明らかにしたいと思います。

## 日本語LLMを量子化するとどうなるのか

今回は、llama.cpp の GGUF フォーマットで利用されており、 **K-quants** で量子化したモデルを用いました。

:::note info
**GGUF と K-quants について**

HuggingFace で公開されているモデルを見ると、 `-GPTQ` や `-AWQ` などの量子化手法と並んで `-GGUF` という名前のついたモデルが存在するケースが多く、初めて見たとき、GGUF は量子化手法の一種と勘違いしておりました。

![thebloke_codellama.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58671/c8a48156-022f-5c07-763a-03b7b1db335a.png)


しかし、**GGUF はあくまでファイルフォーマットであり、量子化手法そのものではありません。**
llama.cpp は独自の量子化手法をいくつか開発しており、K-quants のほかにも**レガシー量子化手法** (`Q4_0`, `Q4_1` など) や [**I-quants**](https://github.com/ggerganov/llama.cpp/pull/4773) が存在します。

量子化手法の比較は [r/LocalLLaMA](https://www.reddit.com/r/LocalLLaMA/comments/1ba55rj/overview_of_gguf_quantization_methods/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button) の投稿が詳しいです。
また、GGUF フォーマットの規格は [ggerganov/ggml](https://github.com/ggerganov/ggml/blob/master/docs/gguf.md) で定義されています。
:::

Google Colab 上で `llama-cpp-python` ([GitHub](https://github.com/abetlen/llama-cpp-python)) を使ってモデルを読み込み、日本語 LLM 評価用データセット [ELYZA-tasks-100](https://huggingface.co/datasets/elyza/ELYZA-tasks-100) の質問・指示に対する回答を生成しました。
その後、[自動評価スクリプト](https://github.com/Northern-System-Service/gpt4-autoeval)を使って GPT-4 に回答を評価させ、平均スコアを集計しています。

K-quants には、量子化対象のレイヤや量子化後のビット数によって様々なバリエーションがありますが、今回はメモリ使用量と品質のバランスがとれているとされる **Q4_K_M** を使用しています ([参考 - TheBloke さんのコメント](https://huggingface.co/TheBloke/calm2-7B-chat-GGUF#provided-files))。

対象としたのは、日本語に対応している下記のモデルです（リンクは HuggingFace のモデルページ）。
検証環境（Colab）の VRAM に未量子化モデルを載せる都合上、今回は 7B と 13B のモデルのみを調査対象としています。

* Xwin-LM V0.1 (7B, 13B)
    * 量子化前: [7B](https://huggingface.co/Xwin-LM/Xwin-LM-7B-V0.1)、[13B](https://huggingface.co/Xwin-LM/Xwin-LM-13B-V0.1)
    * 量子化後: [7B (TheBloke さん)](https://huggingface.co/TheBloke/Xwin-LM-7B-V0.1-GGUF)、[13B (TheBloke さん)](https://huggingface.co/TheBloke/Xwin-LM-13B-V0.1-GGUF)
* ELYZA-japanese-Llama-2 (7B, 13B)
    * 量子化前: [7B](https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b-instruct), [13B](https://huggingface.co/elyza/ELYZA-japanese-Llama-2-13b-instruct)
    * 量子化後: [7B (mmnga さん)](https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-7b-instruct-gguf), [13B (bash11116 さん)](https://huggingface.co/bash11116/ELYZA-japanese-Llama-2-13b-instruct-gguf)
* CALM2 7B Chat (7B)
    * 量子化前: [7B](https://huggingface.co/cyberagent/calm2-7b-chat)
    * 量子化後: [7B (TheBloke さん)](https://huggingface.co/TheBloke/calm2-7B-chat-GGUF)
* Japanese-StableLM-Instruct-Beta (7B)
    * 量子化前: [7B](https://huggingface.co/stabilityai/japanese-stablelm-instruct-beta-7b)
    * 量子化後: [7B (TheBloke さん)](https://huggingface.co/TheBloke/japanese-stablelm-instruct-beta-7B-GGUF)
* Youri 7B Chat (7B)
    * 量子化前: [7B](https://huggingface.co/rinna/youri-7b-chat)
    * 量子化後: [7B (mmnga さん)](https://huggingface.co/mmnga/rinna-youri-7b-chat-gguf)
* Swallow (7B, 13B)
    * 量子化前: [7B](https://huggingface.co/tokyotech-llm/Swallow-7b-instruct-hf), [13B](https://huggingface.co/tokyotech-llm/Swallow-13b-instruct-hf)
    * 量子化後: [7B (TheBloke さん)](https://huggingface.co/TheBloke/Swallow-7B-Instruct-GGUF), [13B (TheBloke さん)](https://huggingface.co/TheBloke/Swallow-13B-Instruct-GGUF)

なお、量子化前の成績はアドベントカレンダー記事「[ELYZA-tasks-100 でLLM14個の日本語性能を横断評価してみた](https://qiita.com/wayama_ryousuke/items/105a164e5c80c150caf1)」での調査結果を利用しています。

### 成績

ELYZA-tasks-100 での回答を GPT-4 に評価させ、モデル別の平均スコアを集計したグラフを下図に示します。
塗りつぶされた棒グラフは量子化前、ストライプの棒グラフは量子化後の成績を示しています。

![elyza-tasks-100-quant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58671/0d109f26-1129-5ba1-1fb8-4d729ac9d8ae.png)


図は量子化前の平均スコアでソートしていますが、量子化による成績の変化はモデルによって異なることがわかります。
量子化によって成績が低下するモデルがあるのは予想通りでしたが、意外なことに、量子化後のほうが平均点が高いモデルもありました。
また、Xwin-LM-7B と Swallow-13B の2つを除けば、量子化後の成績変化は最大でも0.1点前後の低下にとどまり、**量子化によって大きな成績低下が生じるケースは少ない**ことがうかがえます。

それでは、それぞれのモデルの成績を見てみましょう。

* **ELYZA-japanese-Llama-2-7B**は、量子化後もほぼ同等の性能を維持し、0.10点のスコア低下に留まりました。
* **Swallow-7B**では、量子化前後で成績に変化はなかった一方、**Swallow-13B**では平均スコアが 0.28 点低下しました。
* **CALM2** や **StableLM-Beta** は、量子化後のスコアが高い結果（それぞれ 0.28 点/ 0.21 点向上）となりました。
* **Xwin** モデル同士を比較すると、**Xwin 7B**は0.36点の低下を示している一方、**Xwin 13B**では0.11点の向上が見られ、同じモデルファミリー内でも異なる振る舞いが確認されました。

量子化後に成績が上がる現象については、モデルの量子化によって、[枝刈り（pruning）](https://qiita.com/Nurkic/items/a382fc84a34fd0ae9400#4-%E6%9E%9D%E7%8B%A9%E3%82%8Apruning)のように品質低下の原因となる重みが量子化され、モデルの性能が改善した可能性が考えられます。
ただし、評価に用いたデータセットの質問数が限られている（n=100）ことや、評価回数が1回だけであることによる評価のぶれ、OpenAI API の仕様変更による影響も考慮する必要があります。

### 回答例 (1): CALM2

実際の回答内容を見てみましょう。
まずは、成績が向上した **CALM2** の回答を比較してみます。

#### 質問

> 仕事の熱意を取り戻すためのアイデアを5つ挙げてください。

#### CALM2 (量子化前)

> 1. 仕事の目標や目的を再確認する: 自分が何を目指して仕事をしているのか、その目標や目的を再度認識することで、自分の意欲を再燃させることができます。
> 
> 2. チームワークを強化する: チームメンバーが互いに協力し、サポートし合うことで、チーム全体としての仕事の熱意に火をつけることができます。
> 
> 3. 仕事の意義を再評価する: 仕事の価値や意義を見つめ直し、自分がどのように社会に貢献しているのかを理解することで、仕事に対するモチベーションを再燃させることができます。
> 
> 4. 上司や同僚と密にコミュニケーションを取る: 上司や同僚と定期的にコミュニケーションを取ることで、自分がどのような仕事をしているのか、どのようなことを期待されているのかを理解することができます。また、チームワークを強化し、仕事に対するフィードバックやアドバイスを得ることもできます。
> 
> 5. ストレスを解消する: 仕事によるストレスはモチベーションの低下につながることがあります。趣味や休息の時間を確保し、ストレスを解消することで、仕事に対する熱意を再燃させることができます。

#### CALM2 (量子化後)

> 1. ワークライフバランスの改善：仕事と生活のバランスを取ることは、あなたが働く意欲を再燃させるのに役立ちます。例えば、週の労働時間を減らす、またはフレキシブルなスケジュールを選択するなどして、ストレスを減らし、家族との時間を増やすことができます。
> 
> 2. 自己啓発やスキルアップのための投資：新たなスキルを習得することは、仕事において生産性を高め、モチベーションを維持するのに役立ちます。また、資格取得などの自己啓発にも投資することで、自分自身の成長と自信を得ることができます。
> 
> 3. 職場環境の改善：職場での人間関係や仕事環境が良好であることは、働く意欲を高めるのに重要です。上司や同僚とのコミュニケーションを改善したり、働きやすい職場環境を整備することが、仕事に対する満足度を向上させます。
> 
> 4. 報酬の見直し：適切な報酬は働くモチベーションを維持するために不可欠です。自分の職務に見合った報酬が支払われているか確認し、必要に応じて交渉することで、より強い労働意欲を得ることができます。
> 
> 5. 目標設定と達成感：自分自身の成長や成果を実感することは、仕事に対する喜びを再燃させるのに重要です。明確な目標を設定し、その達成に向けて努力することで、自己実現の喜びを感じることができ、働く意欲を維持することができます。

アイディアの中身には差異があるものの、どちらも妥当な内容で、量子化前後で回答の質に大きな差がないことがわかります。

### 回答例 (2): Swallow-13B

次に、点数が低下した **Swallow-13B** の回答を比較してみましょう。
量子化前後で回答がほとんど変わらない例もある一方、量子化によって出力されるテキストの傾向が大きく変わるケースもみられました。
そうしたケースの一例をご紹介します。

#### 質問

> クマが海辺に行ってアザラシと友達になり、最終的には家に帰るというプロットの短編小説を書いてください。

#### Swallow-13B (量子化前)

> 「クマの冒険」。
> 
> クマはいつも海が何であるかを疑問に思っていました。彼はそれがどれほど壮大であるかを想像し、彼の興味をそそりました。彼はその広大さについて考え、そこに何があるのかと思いました。ある日、彼は岩の上に座って海を眺めていました。遠くに、水の大きな塊が見えました。彼はそれがとても速く動いているのを見て、それに興味をそそられました。
> 
> それで、クマは彼の冒険を始めるために泳ぐことにしました。彼は最初は怖かったが、すぐに夢中になり、それがどれほど美しくて楽しいかに驚いた。彼は海の下の不思議な生き物と会い、彼がどれほど孤独であるかについて泣きました。彼はついにアザラシと友達になりました - 彼が彼の孤独について話すと、アザラシはクマが彼が望むなら彼と一緒に住むことができると言いました。しかし、クマは海の外の世界で家に帰りたかったので、彼らは友達になりました。
> 
> 海を離れて、クマは彼がどのように感じていたかを考えました。彼は冒険について考え、新しい友達と出会い、海の下の世界を探検するのがどれほどエキサイティングであるかに気づきました。彼はアザラシと一緒に、彼らの友達であり続けることを計画しました。そして、クマは彼の冒険が彼が思っていたよりずっとエキサイティングだったことを知っていました。

#### Swallow-13B (量子化後)

> 1.序章
> 2.クマがアザラシと仲良くなり、その後家に帰るまでのストーリー

量子化前の回答は、日本語の表現やストーリーに不自然な面がありますが、「小説のプロットを提供する」という指示そのものは満たしています。
一方、量子化後のモデルは量子化前よりも非常に短く、ただの箇条書きになってしまっています。

## 回答の長さの比較 - 量子化すると回答が短くなる？

先ほどの Swallow-13B のように、一部のモデルでは量子化によって回答傾向が大きく変化する現象がみられました。
量子化前のモデルでは、理由も含めた詳細な回答をしている一方、**量子化後には「はい」や「いいえ」のような短い回答が極端に増える**、というケースです。

この現象をより詳しく観察するため、量子化前後で回答長（文字数）の分布をプロットしてみました。
各モデルの回答長を[バイオリン図](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%82%AA%E3%83%AA%E3%83%B3%E5%9B%B3)で示したのが、下の図です。

![回答長の分布](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58671/476193cd-7114-0940-b4d6-77ab947c0ed0.png)


さまざまな形の図形が見えますが、これらは各モデルの回答の長さの分布を[カーネル密度推定](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E5%AF%86%E5%BA%A6%E6%8E%A8%E5%AE%9A)によって描いたものです。
上段が量子化前のモデル、下段が量子化後のモデルの分布です。
y 軸は回答長（文字数）を表しており、図形の重心が高い位置にあるほど長い回答を出力する傾向がある、と解釈できます。
また、図形の中に見える黒い点は、各サンプル（質問ごとの回答長）をプロットしたものです。

このように比較すると、**それぞれのモデルの回答傾向が、図形の形状として表れている**ことがわかります。
例えば Xwin は「**つぼ型**」で、200文字前後をピークに、短い回答から長い回答まで幅広く出力しています。
一方、StableLM-beta や Swallow は（最大幅が違うものの）「**スライム型**」で、非常に重心が低い、つまり短い回答をすることが多いと言えそうです。
ELYZA-japanese-Llama-2 や CALM2 は両者の中間に位置し、「**フラスコ型**」の形状をしています。
ELYZAとCALM2の分布は似通っており、100文字前後をピークとして、ほぼすべての回答が500文字以内に集中する、という特徴が見られます。

また、同じモデルファミリー（たとえば Xwin の 7/13B）では似たような回答長の分布を示していることもわかります。
学習したデータセットやファインチューン手法などが同様であるために、同じような回答傾向を持っているのだと推測されます。

さらに、量子化前後で回答の長さを比較すると、「つぼ型」のモデルは量子化しても形が大きく変化しない一方、「フラスコ型」や「スライム型」のモデルは量子化すると重心が低くなる（短い回答が増える）傾向にあり、とくに「スライム型」モデルでは形が大きくつぶれる（回答が非常に短くなる）場合があるとわかります。
つまり、**回答の長さの傾向と量子化に対する耐性（回答傾向の変化のしづらさ）には相関があるのでは**、と考えられます。

また、ELYZA-tasks-100 の平均スコアとも突き合わせてみると、平均スコアが低いモデルは「スライム型」の傾向が強いことがわかります。
[ELYZA-tasks-100 でモデル成績を比較した記事](https://qiita.com/wayama_ryousuke/items/105a164e5c80c150caf1)では Xwin や ELYZA-japanese-Llama-2、CALM2 が高い成績を示していましたが、これらのモデルはいずれも「つぼ型」や「フラスコ型」に近い形状をしていることが、先ほどの図から読み取れます。
ただし、評価モデル（GPT-4）が長い回答を選好する傾向にあるため、ELYZA-tasks-100 の成績をもって性能の良しあしを断定することはできない、という点に注意が必要です。
あるいは逆に、長い回答を出力するように学習させたからといって、回答の品質が上がるとは限りません。

とはいえ、量子化による回答の様子の変化や、モデルがどのような回答傾向をもっているのかを測る指標のひとつとして、回答長の分布が参考になるかもしれません。

## 原因分析 - モデル間の差異はどうして生じるのか？

最後に、モデル間の差異がどのような要因によって生じるのか、考察してみたいと思います。

次の表は、今回利用したモデルについて、学習データ、ファインチューン手法、トークナイザなどの観点から比較したものです。情報が公開されていないものは「N/A」としています。

| モデル名 | ベースモデル | トークナイザ | データセット（事前学習/CPT） | トークン数（事前学習） | データセット（ファインチューン） | 学習方法 | 出典 |
|---|---|---|---|---|---|---|---|
| Xwin-7b | Llama 2 | Llama 2 | N/A | N/A | N/A | SFT, Reward models, Reject Sampling, RLHF | [[1]](https://github.com/Xwin-LM/Xwin-LM/blob/c76a7759f9ff3e2ff376e3ed58618d5a5cb88d6d/README.md) |
| CALM2-7B-Chat | フルスクラッチ | 独自 | Publicly available Japanese and English datasets | 1.3T | N/A | PT, SFT | [[2]](https://huggingface.co/cyberagent/calm2-7b) |
| ELYZA-japanese-Llama-2-7b | Llama 2 | Llama 2 | Wikipedia, OSCAR, 「その他クロールデータ」 | 18B | 「ELYZA独自の高品質な指示データセット」 | CPT, (SFT?) | [[3]](https://note.com/elyza/n/na405acaca130) |
| Japanese-StableLM-Beta | Llama 2 | Llama 2 | Japanese/English Wikipedia, mC4, CC-100, OSCAR, SlimPajama（Books3を除く）| 100B | Anthropic HH-RLHF, Databricks Dolly 15-k, OpenAssistant Covnersations Dataset | CPT, SFT | [[4]](https://huggingface.co/stabilityai/japanese-stablelm-base-beta-7b), [[5]](https://huggingface.co/stabilityai/japanese-stablelm-instruct-beta-7b) |
| youri-7b-chat | Llama 2 | Llama 2 | Japanese CC-100, Japanese C4, Japanese OSCAR, The Pile, Wikipedia, 独自収集データ | 40B | Databricks Dolly, Japanese Databricks Dolly, Anthropic HH RLHF (原語/日本語訳), FLAN Instruction Tuning (原語/日本語訳), Izumi lab LLM Japanese (一部) | CPT, (SFT?) | [[6]](https://huggingface.co/rinna/youri-7b), [[7]](https://huggingface.co/rinna/youri-7b-chat) |
| Swallow-7B/13B | Llama 2 | Llama 2（日本語語彙拡張） | Japanese Wikipedia, RefinedWeb, Swallow Corpus, The Pile | 100B | Anthropic HH-RLHF, Databricks Dolly 15-k, OpenAssistant Covnersations Dataset | CPT, SFT | [[8]](https://huggingface.co/tokyotech-llm/Swallow-7b-instruct-hf), [[9]](https://huggingface.co/tokyotech-llm/Swallow-13b-instruct-hf), [[10]](https://zenn.dev/tokyotech_lm/articles/d6cb3a8fdfc907) |

CALM2 はフルスクラッチで学習したモデルですが、他のモデルはすべて Llama 2 をベースにしています。
Llama 2 ベースのモデルのうち、情報開示が進んでいる ELYZA / StableLM-β / Youri / Swallow を比較してみると、次のことがわかります。

* **トークナイザ**: Swallow は日本語語彙を拡張しているが、他のモデルはいずれも Llama 2 のトークナイザをそのまま使用
* **事前学習データセット**: Wikipedia はすべてのモデルで共通。CommonCrawl 系データのうち、OSCAR は ELYZA / StableLM-β / Youri で使用。その他、モデルによっては mC4 や CC-100 などを使用
* **事前学習トークン数**: ELYZA が最も少ない（18B）。youri は 40B、Swallow と StableLM-β は 100B
* **ファインチューニング用データ**: ELYZA は独自データセットを使用。StableLM-β, Youri, Swallow は一般公開されているデータセット (Anthropic HH-RLHF など) を使用
* **学習方法**: いずれも Llama2 からの継続事前学習（CPT）を行ったのち、ファインチューンを実施

このように4つのモデルを比較すると、トークナイザや事前学習データセット、学習方法の観点では大きな差がないことがわかります（もっとも、データセットのフィルタリング方法によって、データ品質に大きな差が生じる可能性はありますが）。
むしろ、事前学習のデータセット量では StableLM / Swallow が ELYZA を上回っており、単純に学習データを増やすほど「つぼ型」に近づく、というような仮説は立てづらいように思えます。
トークナイザについても、Llama 2 から語彙拡張している Swallow を除けば、いずれも Llama 2 トークナイザをそのまま使用しており、この部分の違いがモデルの出力傾向に大きな影響を与えているわけではないようです。

そうすると、回答長の分布に大きな影響を与える要因は、ファインチューニング用データセットの内容にあるのかもしれません。
ELYZA モデルのファインチューン用データセットは公開されていませんが[^elyza-data-factory]、モデルができるだけ詳細な回答・説明をするように学習されている可能性があります。
この結果、ELYZA は「フラスコ型」の回答長の分布を示していると考えられます。

## まとめ

今回は、量子化の前後で日本語LLMの出力がどのように変化するのか、**ベンチマーク成績**と**回答の長さ**という2つの観点から調べました。
量子化によるベンチマーク成績の変化は、当初予想していたような「すべてのモデルが同じように低下する」というものではなく、**成績が大きく変わらないモデルや、量子化後のほうが好成績を残すモデルもある**、という結果が得られました。この結果をふまえると、モデルを選択するときは、できるだけ**量子化前後のモデルを両方試し、回答品質とメモリ使用量・推論速度のバランスを検討する**ことが重要であると言えそうです。

また、モデルの回答傾向をみる方法のひとつとして「**出力テキストの長さの分布**」を用い、量子化による影響の受けやすさが回答の長さの分布と関連している可能性があることを示しました。
とくに、短い回答を好むモデルは量子化によって回答品質が大きく変わる可能性があるため、回答の長さにも着目しながら、量子化モデルを使うべきかどうかを判断する必要がありそうです。

回答は [Google スプレッドシート](https://docs.google.com/spreadsheets/d/19gCvFMZnHa1QnS_RFFSHAp7Iu5Nq8D0keQ2uCgKTGyc/edit?usp=sharing) でも見ることができますので、興味のある方はご参照ください。

## リンク

* LLM の回答生成用 Colab ノートブック
  * 量子化前
    * [Xwin-LM 7B](https://colab.research.google.com/drive/1M43V3lvdjB30Tuufz9oxj-gfT0dbCQT4)
    * [Xwin-LM 13B](https://colab.research.google.com/drive/1Arj9GQbW28GvQsD5ij5WXESu1VHZ3QXo)
    * [ELYZA-japanese-Llama-2 7B](https://colab.research.google.com/drive/1k4ks6m8c4OuoGZkJ3njTwoOmeot0hHeD)
    * [ELYZA-japanese-Llama-2 13B](https://colab.research.google.com/drive/1secnaCF8zYNPwTFIOKDYpWd--YdZfYqq)
    * [CALM2 7B](https://colab.research.google.com/drive/1cz-UKLiRaJRAOipg3Hr4R5rK1lzwPrTZ?usp=sharing)
    * [Japanese-StableLM-Instruct-Beta 7B](https://colab.research.google.com/drive/1dMcFjr5LGpKbwPHrGBjriX2WXbsWY_fx?usp=sharing)
    * [Youri 7B Chat](https://colab.research.google.com/drive/1rets4X8JHXTJgrSsRSdqEk2G-6HNu0GK?usp=sharing)
    * [Swallow 7B](https://colab.research.google.com/drive/1dOqTuNTXvl__le9OVIHU0oXXxVD7lIt_)
    * [Swallow 13B](https://colab.research.google.com/drive/1OC7srF6hDMNZa5xdwbwo10j5vRyPmxc_)
  * 量子化後
    * [Xwin-LM 7B](https://colab.research.google.com/drive/1mWuQe--7EPR2wv3LxZUC349ARIXffvZK)
    * [Xwin-LM 13B](https://colab.research.google.com/drive/1cONUVXMbsh_tGDJPz3BhvpRV1AtNJZX7)
    * [ELYZA-japanese-Llama-2 7B](https://colab.research.google.com/drive/1qJlvvHH5WvyQAgy9KJF92jUtLj4VH-vI)
    * [ELYZA-japanese-Llama-2 13B](https://colab.research.google.com/drive/1iEdq8GJipnoJQVvo48rxyu8l4EyZqQ0G?usp=sharing)
    * [CALM2 7B](https://colab.research.google.com/drive/1vKZFEq50lMSK8bwuaIvMYljs5xaoZis8)
    * [Japanese-StableLM-Instruct-Beta 7B](https://colab.research.google.com/drive/1VTf-qA8jdRDMCviePkfG8-VxblEuQoBt?usp=sharing)
    * [Youri 7B Chat](https://colab.research.google.com/drive/1AWdAsNuCESZJFMnwxUjTYTG54uBhkMxW?usp=sharing)
    * [Swallow 7B](https://colab.research.google.com/drive/1lWNEGisNBKhUwnBn4_oRMhGc3ksw2pAy)
    * [Swallow 13B](https://colab.research.google.com/drive/1vOx4DfQt3YNf7OCi-Kk-bsHjGWX9crBI)
* 評価用スクリプト
  * [Northern-System-Service/gpt4-autoeval (GitHub)](https://github.com/Northern-System-Service/gpt4-autoeval)

## Appendix - Swallow-MX, Karakuri, Sakana-AI の成績

上記で紹介したモデルはいずれも 2023 年に公開されたものですが、2024年に入ってからも新たな日本語モデルが続々登場しています。
ここでは、今年公開されたモデルのうち、Swallow-MX 8x7B ([HF](https://huggingface.co/tokyotech-llm/Swallow-MX-8x7b-NVE-v0.1))、Karakuri-LM 70B ([HF](https://huggingface.co/karakuri-ai/karakuri-lm-70b-chat-v0.1))、Sakana-AI の EvoLLM-JP (HF: [v1-7B](https://huggingface.co/SakanaAI/EvoLLM-JP-v1-7B), [A-v1 7B](https://huggingface.co/SakanaAI/EvoLLM-JP-A-v1-7B), [v1-10B](https://huggingface.co/SakanaAI/EvoLLM-JP-v1-10B)) の成績をご紹介します。

**Swallow-MX** は東工大が公開したモデルで、MoE アーキテクチャを採用した Mixtral モデルをベースにしています。
**Karakuri-LM** はAIチャットボットなどのサービスを提供する[カラクリ](https://karakuri.ai/)が開発した国産LLMです。
**EvoLLM** は、東京を拠点とするスタートアップ企業[Sakana.ai](https://sakana.ai/)が開発したLLMで、進化的アルゴリズムをモデルマージの組み合わせ探索に応用した「進化的モデルマージ」という手法を用いている点が特徴です。

評価方法は本編と同様に、ELYZA-tasks-100 の回答を GPT-4 に評価させています。
**Swallow-MX**  と **Karakuri-LM** は、Colab のメモリ制約により量子化モデル（Q4_K_M、GGUF フォーマット）のみを評価しています。
量子化モデルは mmnga さんが公開しているものを使用しています([Swallow-MX](https://huggingface.co/mmnga/tokyotech-llm-Swallow-MX-8x7b-NVE-v0.1-gguf), [Karakuri-LM](https://huggingface.co/mmnga/karakuri-lm-70b-chat-v0.1-gguf), [EvoLLM-JP v1-7B](https://huggingface.co/mmnga/SakanaAI-EvoLLM-JP-v1-7B-gguf), [EvoLLM-JP A-v1-7B](https://huggingface.co/mmnga/SakanaAI-EvoLLM-JP-A-v1-7B-gguf)) [^evollm-10b-quantization]。

なお、KARAKURI については[2024/2/19の記事](https://qiita.com/wayama_ryousuke/items/f4f384b89e9b40a2d794)、Swallow-MX については[2024/3/21の記事](https://qiita.com/wayama_ryousuke/items/a58791cdc2a05847824d)で詳しく評価していますので、そちらもご参照ください。

本編で紹介したモデルと比較する形で、これらのモデルの成績を表示したものが、以下の図です。

![bar_appendix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58671/3380da0a-5ff0-8753-21eb-d76f9d6d89db.png)


まず目を引くのは、グラフのいちばん左側にある **Karakuri LM 70B** の高い指示応答性能です。
ELYZA-tasks-100 での平均スコアは 2.98 で、オープンアクセスの日本語モデルとしてはトップクラスの成績です。

また、Sakana-AI の **EvoLLM** シリーズに注目すると、**v1-7B** の平均スコアが 2.83 点で、7B クラスの日本語LLMでは突出して高い成績をマークしています。
v1-10B は v1-7B よりもスコアが低いですが、13B クラスのモデル（ELYZA-japanese-Llama-2 13B や Xwin-LM 13B）と同程度の成績であり、パラメタ数が若干少ないことを考慮すれば十分な性能を持っていると言えるでしょう [^sakana-ai-10b]。
Apache ライセンスで提供されている A-v1-7B は、回答を生成しない（すぐに EOS を出力してしまう）ケースが多く、平均スコアは低くなっています。

**Swallow-MX** はほかの 7B モデルと同程度のスコアですが、これは Swallow-MX が指示応答向けにファインチューンされていないベースモデルである点が影響していると考えられます[^swallow-mx-prompts]。
記事執筆時点で Instruct モデルはまだ未公開ですが、Instruct モデルの成績がどのようになるかも注目したいところです。


実際の回答を見てみましょう。

### 質問

> 仕事の熱意を取り戻すためのアイデアを5つ挙げてください。

### Karakuri-LM 70B

> 1. 自分自身にモチベーションを与える：仕事に対する熱意を取り戻すために、自分自身にモチベーションを与えることが大切です。これは新しいチャレンジを受け入れたり、新しいスキルを学んだり、自分自身に報酬を与えたりすることで達成できます。
> 2. 目標を設定する：明確な目標を設定することで、仕事に対するモチベーションを高めることができます。これは、短期的な目標と長期的な目標の両方を含みます。
> 3. フィードバックを求める：フィードバックは、自分の仕事がどのように評価されているかを理解する上で役立ちます。また、自分のスキルを向上させ、自分の成長を支援するための情報を提供します。
> 4. 自分の価値観と一致する仕事を探す：自分の価値観と一致する仕事に就くことは、仕事の熱意を高めるための重要な要素です。自分の価値観と一致しない仕事に取り組むと、燃え尽き症候群や仕事に対する熱意の欠如につながる可能性があります。
> 5. ワーク・ライフ・バランスを確保する：ワーク・ライフ・バランスを確保することで、仕事に対する熱意を保つことができます。これは、十分な休息と自分の趣味や興味に費やす時間を取ることを意味します。 

### Swallow-MX 8x7B

> 1. 目標設定：自分自身に対して、短期・長期的な目標を設定し、それに向かって努力し続けることが大切です。目標を達成し、成功している自分自身を想像して、やる気を高めましょう。2. ポジティブ思考：ネガティブに考えるクセがついてしまっている場合、ポジティブに考えることが重要になります。自分自身に対して、ポジティブな言葉や励まし言葉をかけましょう。3. 自分自身にご褒美：小さな目標や成功を達成したときに、自分自身にご褒美を与えることが大切です。小さなご褒美から始めて、徐々に自分自身にご褒美が与えられるようにしましょう。4. 他者と比較しない：他者と比較してしまうと、自分自身に対してネガティブに考えてしまうことが多くなってしまいます。自分自身にとって、重要なことに集中し、他者と比較しないようにしましょう。5. リラックス：時に、リラックスして休息することも必要です。リラックスして、自分自身と向き合う時間が持てるようにしましょう。リラックスして、自分自身と向き合うことが大切だと思います

### Sakana-AI EvoLLM-JP v1-7B

> 1. 自分の強みを認識する: 自分が最も熱心に取り組むことは何かを考えてみましょう。それは仕事の中でもあるはずです。その強みを活かす仕事にフォーカスすることで、仕事への熱意が復活します。
> 
> 2. 小さな成功を積み重ねる: 仕事で成功を感じていないと、熱意は薄れます。逆に、小さな成功を積み重ねることで、仕事への熱意が復活します。
> 
> 3. 仕事の目的を再確認する: 仕事をする目的を再確認することで、仕事への熱意が復活します。目的は、例えば、家族を養うため、自己実現のため、社会貢献のためなど、個人によって異なります。
> 
> 4. 仕事環境を改善する: 仕事環境が悪いと、熱意は薄れます。逆に、仕事環境を改善することで、仕事への熱意が復活します。例えば、席を変える、コミュニケーションを改善する、ツールを更新するなど。
> 
> 5. 仕事と生活のバランスを取る: 仕事と生活のバランスが崩れると、熱意は薄れます。逆に、仕事と生活のバランスを取ることで、仕事への熱意が復活します。例えば、休暇を取る、勉強をする、趣味を愉しむなど。

### SakanaAI/EvoLLM-JP-A-v1-7B

> 1. 自分の強みを認識し、それを活かす仕事を選ぶ。
> 2. 仕事の目的を理解し、自分の役割を明確にする。
> 3. 仕事を自分のスタイルに合わせる。
> 4. 仕事の成果を定期的に評価し、自分の成長を確認する。
> 5. 仕事の負荷を適切に管理し、ストレスを減らす。
> 
> これらのアイデアを実践することで、仕事の熱意を取り戻すことができます。

### SakanaAI/EvoLLM-JP-v1-10B

> 1.自分の強みを認識する: 自分が何をするのが得意なのかを理解することで、仕事に対するモチベーションが高まります。
> 
> 2.短期目標を設定する: 大きな目標を達成するために、短期的な目標を設定しましょう。小さな成功を積み重ねることで、仕事に対する motivation が回復します。
> 
> 3.新しいスキルを身につける: 新しい技能を習得することで、仕事をより刺激的に感じ、 motivation を高めることができます。
> 
> 4.職場環境を改善する: 仕事をする場所の清潔さやcomfortability も motivation に影響を及ぼします。整理整頓を行い、快適な環境を作りましょう。
> 
> 5.職場の人間関係を改善する: 仕事を共にする人々との良好な関係は motivation を高めます。もしあなたが苦手な人と働く場合、その人の良い側面を探し、関係を改善しましょう。

**Karakuri-LM** や **EvoLLM-JP v1 7B** の回答は自然で、具体的なアドバイスも含まれており、よい回答と言えるでしょう。
**Swallow-MX** や **EvoLLM-JP 10B**の回答も方向性は合っており、おおむね指示に従った回答を生成しています。
一方、 **EvoLLM-JP A-v1-7B** はやや短い説明にとどまっています。
また、他の設問では、回答なし（回答開始直後にストップトークンを出力する）となる現象が観察されました。
得点の計算では、無回答には最低点（1点）を付与して処理しているため、平均スコアが低くなっています。

なお EvoLLM については、英単語が混ざってしまう現象（コンテキストスイッチ）が生じるケースがありました。
評価者（GPT-4）は、回答に「不自然な日本語」が含まれる場合は減点するよう指示していますが、ローマ字表記や英単語が含まれる場合、この減点が適用されることがあります [^gpt4-japanese]。
コンテキストスイッチの問題が解消できれば、さらに成績が向上する可能性があると思います。

最後に、本編と同様に回答長の分布をみてみましょう。
下の図は、回答長をバイオリン図で表現したものです。

![violin_appendix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58671/fa2cb2f1-a01a-751b-7d81-f3707858baab.png)


Karakuri-70B は、Xwin-LM などと同様に「つぼ型」の分布を示していることがわかります。
また、EvoLLM-JP の v1-7B と v1-10B （量子化前）は、おおむね「つぼ型」または「フラスコ型」に近い分布を示していると言えそうです。
EvoLLM-JP A-v1-7B は重心が低く「スライム型」寄りの分布を示していますが、これは回答なし（0文字）のケースが多いためと考えられます。
一方、Swallow-MX はこれまでのモデルでみられなかった非常に細長い分布（明確な頂点をもたない）になっています。
回答のみで理由を述べないケースや、同じ言葉を繰り返してしまうケースが比較的多いため、短い回答（50文字前後）と極端に長い回答（1000文字前後）にサンプルが集中し、このような分布になったと考えられます。

以上、新たな日本語モデルの成績を紹介しました。
今後も、さまざまな日本語モデルが登場すると予想されるので、引き続き注目していきたいと思います。

[^swallow-mx-prompts]: Swallow-MX については、プロンプトフォーマット次第で成績が大きく変わることを確認しています。今回の評価では ELYZA-japanese-llama-2 のシステムプロンプトを用いて回答を生成し、成績を評価しました。詳細は、[2024/3/21の記事](https://qiita.com/wayama_ryousuke/items/a58791cdc2a05847824d)をご参照ください。

[^elyza-data-factory]: ELYZA にはデータセット構築に特化した「データファクトリー」とよばれる部門があり、LLM 学習用のデータセットを自前で用意していることが知られています ([参考 - note](https://note.com/elyza/n/n2978c88be0ee#eea86bbb-b16b-4d69-bb8d-e51a458d29d3))。ELYZA-japanese-Llama-2 シリーズも、このグループが作成したデータセットを利用していると推測されます。筆者が2024年2月に聴講した[東京工業大学主催のシンポジウム](https://www.titech.ac.jp/event/2024/068334)でも、ELYZAの佐々木氏が「質の高いPost-training用データを蓄積・学習する」点を強調しており、ファインチューニングデータの品質がモデルの性能を決定づける重要な要素であることがうかがえます。

[^gpt4-japanese]: とはいえ、回答が完全に英語の場合、GPT-4 は減点を適用せずに評価してしまうケースが多いです。「回答が日本語でない場合は1点」のような評価基準にしていないため、このような評価になっています。本来はそのようなルールを設けるべきなのですが、スコアの後方互換性（以前のスコアと比較できるようにする）を考慮して、現在の評価基準を維持しています。

[^evollm-10b-quantization]: EvoLLM-JP v1-10B は量子化モデルが HuggingFace に公開されていないため、評価していません。[mganeko さん (Zenn)](https://zenn.dev/mganeko/articles/convert-gguf-8bit-evollm-jp-v1-10b) によると、オリジナルモデルの `.safetensors` を編集してメタデータを書き換えれば、`llama.cpp` の `convert.py` で GGUF フォーマットに変換できるようです。

[^sakana-ai-10b]: v1-10B よりも v1-7B モデルのほうが成績がよい原因は分かっていませんが、[arXiv の論文](https://arxiv.org/abs/2403.13187) に掲載されている成績は 7B が 10B を上回っており、本記事でご紹介した成績もこれと符合しています。なお、論文上では 10B モデルとして データフロー空間のみマージしたモデル (DFS) と、これに加えてパラメータ空間もマージしたモデル (PS+DFS) の2種類が紹介されていますが、HuggingFace で公開されているモデルが 10B DFS と 10B PS+DFS のどちらなのかは不明です。