評価について
Swallowプロジェクトでは、高性能な大規模言語モデル (LLM) の開発の参考とするため、LLMの開発と並行して、公開されているLLMの評価実験を独自に進めています。日本国内のみならず、世界中で開発されたLLMと比較することで、Swallowプロジェクトの「現在地」を知ることができます。各LLMの独自仕様(トークン化やシステムプロンプトなど)を加味しながら公平な条件で評価を行い、各LLMの開発方法と照らし合わせることで、高性能なLLMを開発するための「レシピ」を検討できます。また、タスクの評価スコアの高低が、LLMに性能差によるものではなく、評価における些細な仕様(プロンプトのフォーマット等)に起因することを経験することで、LLM評価における課題も実感しています。このサイトでは、Swallowプロジェクト内で実施されたLLMの評価結果を棒グラフやレーダーチャート、散布図などで閲覧できます。用途にあったLLMを選択するための情報としてだけでなく、日本語に強いLLMの開発のための参考情報としてお役に立てると幸いです。
評価タスク
2024年度のSwallowプロジェクトでは、日本語理解・生成タスクとして10件のデータセット、日本語マルチターン対話タスクとして日本語MT-Bench、英語理解・生成タスクとして9件のデータセットを用い、LLMの評価実験を行っています。全てのタスクに関して、評価スコアは0 (最低) から1 (最高) までの範囲の値をとります。
日本語理解・生成タスク
JCom (JCommonsenseQA)
常識的な知識・推論に関する質問応答
知識ベースに基づいて作成された5択の選択式問題
- 評価尺度: 正解率
- 実験設定: 4-shot
- 出典: (Kurihara et al., 2022)
JEMHopQA
マルチホップ質問応答
知識量や推論能力を評価するための自由記述式質問応答
- 評価尺度: 文字F1
- 実験設定: 4-shot
- 出典: (Ishii et al., 2024)
NIILC
クラシカルな質問応答
百科事典で解答が得られそうな自由記述式質問応答
- 評価尺度: 文字F1
- 実験設定: 4-shot
- 出典: (関根, 2003)
JSQuAD
機械読解
Wikipedia記事に対する自由記述式質問応答
- 評価尺度: 文字F1
- 実験設定: 4-shot
- 出典: (Kurihara et al., 2022)
XL-Sum
自動要約
イギリス国営放送(BBC)の記事本文からハイライト(要約)を生成するタスク
- 評価尺度: ROUGE-2
- 実験設定: 1-shot
- 出典: (Hasan et al., 2021)
MGSM
数学(算数)
小学校の数学の文章題データセット(GSM8K)の日本語訳
- 評価尺度: 正解率, 完全一致
- 実験設定: 4-shot
- 出典: (Shi et al., 2023)
WMT20 (en-ja)
英日機械翻訳
ニュース記事の翻訳
- 評価尺度: BLEU
- 実験設定: 4-shot
- 出典: (Barrault et al., 2020)
WMT20 (ja-en)
日英機械翻訳
ニュース記事の翻訳
- 評価尺度: BLEU
- 実験設定: 4-shot
- 出典: (Barrault et al., 2020)
JMMLU
マルチタスク言語理解
4値選択式試験問題のベンチマークMMLUの日本語訳(53科目)
- 評価尺度: 正解率
- 実験設定: 5-shot
- 出典: (尹ら, 2024)
JHumanEval
コード生成
コード生成能力のベンチマークHumanEvalの日本語訳
- 評価尺度: pass@1
- 実験設定: 0-shot, 10回試行
- 出典: (佐藤ら, 2024)
日本語マルチターン対話タスク(日本語MT-Bench)
マルチターン対話能力のベンチマークMT-Benchの日本語版である日本語MT-Bench Nejumi Leaderboard Neo版を用いました。指示チューニングされたモデルのみ、GPT-4 (gpt-4-1106-preview) を用いて応答文を10段階で自動評価します。評価のカテゴリは以下の通りです。
Coding
コード生成
Extraction
情報抽出
Humanities
人文科学
Math
数学
Reasoning
推論
Roleplay
ロールプレイ
STEM
科学・技術・工学・数学
Writing
執筆
なお、我々の日本語MT-Benchの評価結果が外部リーダーボードの評価結果よりも低いことが確認されています。多くの外部リーダーボードが応答文の評価にGPT-4 (gpt-4-0613) を利用していますが、我々はGPT-4 (gpt-4-1106-preview) を利用しているため、このスコアの相違を引き起こしていると推測されます。調査の結果、我々と外部リーダーボードの評価結果には大きな差異があるものの、モデル間の順位はほとんど変わらないことが分かりました。そのため、(すでに多くの評価を完了していたこともあり)GPT-4のバージョンを変更せず評価を続行しました。
英語理解・生成タスク
OpenBookQA
事実と常識に基づく質問応答
科学的な知識と常識に基づく4択の選択式問題
- 評価尺度: 正解率
- 実験設定: 4-shot
- 出典: (Mihaylov et al., 2018)
TriviaQA
知識に基づく質問応答
雑学的な知識に基づく自由記述式質問応答
- 評価尺度: 正解率, 完全一致
- 実験設定: 4-shot
- 出典: (Joshi et al., 2017)
HellaSwag
常識推論
次に起こるイベントを予測する4択の選択式問題
- 評価尺度: 正解率
- 実験設定: 4-shot
- 出典: (Zellers et al., 2019)
SQuAD2
機械読解
根拠文書に対して作成された自由記述式質問応答
- 評価尺度: 正解率, 完全一致
- 実験設定: 4-shot
- 出典: (Rajpurkar et al., 2018)
XWINO
常識推論
文中の代名詞の先行詞を推定する2択の選択式問題
- 評価尺度: 正解率
- 実験設定: 4-shot
- 出典: (Tikhonov and Ryabinin, 2021)
MMLU
マルチタスク言語理解
57科目からなる4値選択式の試験問題
- 評価尺度: 正解率
- 実験設定: 5-shot
- 出典: (Hendrycks et al., 2021)
GSM8K
数学(算数)
小学校の数学の文章題データセット
- 評価尺度: 正解率, 完全一致
- 実験設定: 4-shot
- 出典: (Cobbe et al., 2021)
BBH (BIG-Bench-Hard)
LLMにとって難しいタスクのコレクション
BIG-Benchデータセット (Srivastava et al., 2023) の中でも難易度の高い23件のタスク
- 評価尺度: 正解率, 完全一致
- 実験設定: 3-shot, CoT
- 出典: (Suzgun et al., 2023)
HumanEval
コード生成
単体テストによるコード生成能力の評価
- 評価尺度: pass@1
- 実験設定: 0-shot, 10回試行
- 出典: (Chen et al., 2021)
評価に用いたツール
評価に用いたソフトウェアは以下の通りです。
JP Language Model Evaluation Harness (commit #9b42d41)
日本語の大規模言語モデルの評価フレームワーク
https://github.com/Stability-AI/lm-evaluation-harness/Code Generation LM Evaluation Harness (commit #0261c52)
コード生成(HumanEval)の評価フレームワーク
https://github.com/bigcode-project/bigcode-evaluation-harnessswallow-evaluation
上記5つのツールを統合・改修した、Swallowプロジェクトで用いた評価フレームワーク
https://github.com/swallow-llm/swallow-evaluation評価したモデル
アルファベット順で掲載しています。 なお、評価フレームワークの都合により、一部のモデルに対しては日本語MT-benchのみ評価を行ったため、言語理解・生成タスクのスコアが欠損しています。
Name | Size | Type | Distribution | Missing scores |
---|---|---|---|---|
Aya Expanse 32B | 32.0 | instruct | CohereForAI/aya-expanse-32b | |
Aya Expanse 8B | 8.0 | instruct | CohereForAI/aya-expanse-8b | |
C4AI Command-R v0.1 | 35 | base | CohereForAI/c4ai-command-r-v01 | |
CyberAgentLM2-7B-chat | 7.0 | instruct | cyberagent/calm2-7b-chat | |
CyberAgentLM2-7B | 7.0 | base | cyberagent/calm2-7b | |
CyberAgentLM3-22B-chat | 22 | instruct | cyberagent/calm3-22b-chat | |
ELYZA-japanese-Llama-2-13b | 13 | base | elyza/ELYZA-japanese-Llama-2-13b | |
Fugaku-LLM 13B | 13 | base | Fugaku-LLM/Fugaku-LLM-13B | |
GPT-3.5 (gpt-3.5-turbo-0125) | NaN | instruct | gpt-3.5-turbo-0125 | Japanese tasks, English tasks |
GPT-4o (gpt-4o-2024-05-13) | NaN | instruct | gpt-4o-2024-05-13 | Japanese tasks, English tasks |
GRIN-MoE | 42 | instruct | microsoft/GRIN-MoE | |
Gemma 2 27B IT | 27 | instruct | google/gemma-2-27b-it | |
Gemma 2 2B IT | 2.6 | instruct | google/gemma-2-2b-it | |
Gemma 2 9B IT | 9.2 | instruct | google/gemma-2-9b-it | |
Gemma 2 27B | 27 | base | google/gemma-2-27b | |
Gemma 2 2B | 2.6 | base | google/gemma-2-2b | |
Gemma 2 9B | 9.2 | base | google/gemma-2-9b | |
Gemma 2 Baku 2B IT | 2.6 | instruct | rinna/gemma-2-baku-2b-it | |
Gemma 2 Baku 2B | 2.6 | base | rinna/gemma-2-baku-2b | |
Gemma 2 JPN | 2.6 | instruct | google/gemma-2-2b-jpn-it | |
Japanese Stable LM Base Gamma 7B | 7.2 | base | stabilityai/japanese-stablelm-base-gamma-7b | |
Japanese Stable LM Beta 70B | 70 | base | stabilityai/japanese-stablelm-base-beta-70b | |
Japanese Stable LM Beta 7B | 6.7 | base | stabilityai/japanese-stablelm-base-beta-7b | |
KARAKURI LM 70B Chat v0.1 | 70 | instruct | karakuri-ai/karakuri-lm-70b-chat-v0.1 | |
KARAKURI LM 8x7B Instruct v0.1 | 47 | instruct | karakuri-ai/karakuri-lm-8x7b-instruct-v0.1 | |
KARAKURI LM 70B v0.1 | 70 | base | karakuri-ai/karakuri-lm-70b-v0.1 | |
LLM-jp-13B v2.0 | 13 | base | llm-jp/llm-jp-13b-v2.0 | |
Llama 2 13B | 13 | base | meta-llama/Llama-2-13b-hf | |
Llama 2 70B | 70 | base | meta-llama/Llama-2-70b-hf | |
Llama 2 7B | 6.7 | base | meta-llama/Llama-2-7b-hf | |
Llama 3 70B Instruct | 70 | instruct | meta-llama/Meta-Llama-3-70B-Instruct | |
Llama 3 8B Instruct | 8.0 | instruct | meta-llama/Meta-Llama-3-8B-Instruct | |
Llama 3 70B | 70 | base | meta-llama/Meta-Llama-3-70B | |
Llama 3 8B | 8.0 | base | meta-llama/Meta-Llama-3-8B | |
Llama 3 Swallow 70B Instruct | 70 | instruct | tokyotech-llm/Llama-3-Swallow-8B-Instruct-v0.1 | |
Llama 3 Swallow 8B Instruct | 8.0 | instruct | tokyotech-llm/Llama-3-Swallow-8B-v0.1 | |
Llama 3 Swallow 70B | 70 | base | tokyotech-llm/Llama-3-Swallow-70B-v0.1 | |
Llama 3 Swallow 8B | 8.0 | base | tokyotech-llm/Llama-3-Swallow-8B-v0.1 | |
Llama 3 Youko 70B Instruct | 70 | instruct | rinna/llama-3-youko-70b-instruct | |
Llama 3 Youko 8B Instruct | 8.0 | instruct | rinna/llama-3-youko-8b-instruct | |
Llama 3 Youko 70B | 70 | base | rinna/llama-3-youko-70b | |
Llama 3 Youko 8B | 8.0 | base | rinna/llama-3-youko-8b | |
Llama 3 heron brain 70B v0.3 | 70 | instruct | turing-motors/Llama-3-heron-brain-70B-v0.3 | |
Llama 3 heron brain 8B v0.3 | 8.0 | instruct | turing-motors/Llama-3-heron-brain-8B-v0.3 | |
Llama 3.1 405B Instruct | 405 | instruct | deepinfra/meta-llama/Meta-Llama-3.1-405B-Instruct | Japanese tasks, English tasks |
Llama 3.1 70B Instruct | 70 | instruct | meta-llama/Meta-Llama-3.1-70B-Instruct | |
Llama 3.1 8B Instruct | 8.0 | instruct | meta-llama/Meta-Llama-3.1-8B-Instruct | |
Llama 3.1 70B | 70 | base | meta-llama/Meta-Llama-3.1-70B | |
Llama 3.1 8B | 8.0 | base | meta-llama/Meta-Llama-3.1-8B | |
Llama 3.1 Swallow 70B Instruct v0.1 | 70 | instruct | tokyotech-llm/Llama-3.1-Swallow-8B-Instruct-v0.1 | |
Llama 3.1 Swallow 8B Instruct v0.1 | 8.0 | instruct | tokyotech-llm/Llama-3.1-Swallow-8B-v0.1 | |
Llama 3.1 Swallow 8B Instruct v0.2 | 8.0 | instruct | tokyotech-llm/Llama-3.1-Swallow-8B-v0.2 | |
Llama 3.1 Swallow 70B v0.1 | 70 | base | tokyotech-llm/Llama-3.1-Swallow-70B-v0.1 | |
Llama 3.1 Swallow 8B v0.1 | 8.0 | base | tokyotech-llm/Llama-3.1-Swallow-8B-v0.1 | |
Llama 3.1 Swallow 8B v0.2 | 8.0 | base | tokyotech-llm/Llama-3.1-Swallow-8B-v0.2 | |
Llama 3.2 1B Instruct | 1.2 | instruct | meta-llama/Llama-3.2-1B-Instruct | |
Llama 3.2 3B Instruct | 3.2 | instruct | meta-llama/Llama-3.2-3B-Instruct | |
Llama 3.2 1B | 1.2 | base | meta-llama/Llama-3.2-1B | |
Llama 3.2 3B | 3.2 | base | meta-llama/Llama-3.2-3B | |
Llama-3-ELYZA-JP-8B | 8.0 | instruct | elyza/Llama-3-ELYZA-JP-8B | |
Llama-3.1-70B-Japanese-Instruct-2407 | 70 | instruct | cyberagent/Llama-3.1-70B-Japanese-Instruct-2407 | |
Mistral-7B-Instruct-v0.3 | 7.2 | instruct | mistralai/Mistral-7B-Instruct-v0.3 | |
Mistral-7B-v0.1 | 7.2 | base | mistralai/Mistral-7B-v0.1 | |
Mistral-7B-v0.2 | 7.2 | base | mistral-community/Mistral-7B-v0.2 | |
Mistral-7B-v0.3 | 7.2 | base | mistralai/Mistral-7B-v0.3 | |
Mistral-NeMo-Instruct-2407 (12B) | 12 | instruct | mistralai/Mistral-Nemo-Instruct-2407 | |
Mistral-NeMo-Minitron 8B Instruct | 8.4 | instruct | nvidia/Mistral-NeMo-Minitron-8B-Instruct | |
Mistral-NeMo-Minitron 8B | 8.4 | base | nvidia/Mistral-NeMo-Minitron-8B-Base | |
Mistral-Nemo-Base-2407 (12B) | 12 | base | mistralai/Mistral-Nemo-Base-2407 | |
Mixtral-8x7B-Instruct-v0.1 | 47 | instruct | mistralai/Mixtral-8x7B-Instruct-v0.1 | |
Mixtral-8x22B-Instruct-v0.1 | 141 | instruct | mistralai/Mixtral-8x22B-Instruct-v0.1 | |
Mixtral-8x7B-v0.1 | 47 | base | mistralai/Mixtral-8x7B-v0.1 | |
Mixtral-8x22B-v0.1 | 141 | base | mistralai/Mixtral-8x22B-v0.1 | |
Phi-3-Mini-128K-Instruct | 3.8 | instruct | microsoft/Phi-3-mini-128k-instruct | |
Phi-3.5-MoE Instruct | 42 | instruct | microsoft/Phi-3.5-MoE-instruct | |
Qwen1.5-7B | 7.7 | base | Qwen/Qwen1.5-7B | |
Qwen2-72B-Instruct | 72 | instruct | Qwen/Qwen2-72B-Instruct | |
Qwen2-7B-Instruct | 7.6 | instruct | Qwen/Qwen2-7B-Instruct | |
Qwen2-72B | 72 | base | Qwen/Qwen2-72B | |
Qwen2-7B | 7.6 | base | Qwen/Qwen2-7B | |
Qwen2.5-72B-Instruct | 72 | instruct | Qwen/Qwen2.5-72B-Instruct | |
Qwen2.5-3B-Instruct | 3.1 | instruct | Qwen/Qwen2.5-3B-Instruct | |
Qwen2.5-7B-Instruct | 7.6 | instruct | Qwen/Qwen2.5-7B-Instruct | |
Qwen2.5-0.5B-Instruct | 0.5 | instruct | Qwen/Qwen2.5-0.5B-Instruct | |
Qwen2.5-0.5B | 0.5 | base | Qwen/Qwen2.5-0.5B | |
Qwen2.5-72B | 72 | base | Qwen/Qwen2.5-72B | |
Qwen2.5-1.5B-Instruct | 1.5 | instruct | Qwen/Qwen2.5-1.5B-Instruct | |
Qwen2.5-1.5B | 1.5 | base | Qwen/Qwen2.5-1.5B | |
Qwen2.5-3B | 3.1 | base | Qwen/Qwen2.5-3B | |
Qwen2.5-7B | 7.6 | base | Qwen/Qwen2.5-7B | |
RakutenAI-7B-chat | 7.2 | instruct | Rakuten/RakutenAI-7B-chat | |
RakutenAI-7B | 7.2 | base | Rakuten/RakutenAI-7B | |
Sarashina2-13B | 13 | base | sbintuitions/sarashina2-13b | |
Sarashina2-70B | 70 | base | sbintuitions/sarashina2-70b | |
Sarashina2-7B | 7.3 | base | sbintuitions/sarashina2-7b | |
Stockmark-100b | 100 | base | stockmark/stockmark-100b | |
Swallow 13B | 13 | base | tokyotech-llm/Swallow-13b-hf | |
Swallow 70B | 70 | base | tokyotech-llm/Swallow-70b-hf | |
Swallow 7B | 6.7 | base | tokyotech-llm/Swallow-7b-hf | |
Swallow-70b-instruct-v0.1 | 70 | instruct | tokyotech-llm/Swallow-70b-instruct-v0.1 | |
Swallow-7b-instruct-v0.1 | 6.7 | instruct | tokyotech-llm/Swallow-7b-instruct-v0.1 | |
Swallow-MS 7B v0.1 | 7.2 | base | tokyotech-llm/Swallow-MS-7b-v0.1 | |
Swallow-MS-7b-instruct-v0.1 | 7.2 | instruct | tokyotech-llm/Swallow-MS-7b-instruct-v0.1 | |
Swallow-MX 8x7B v0.1 | 47 | base | tokyotech-llm/Swallow-MX-8x7b-NVE-v0.1 | |
Tanuki-8x8B-dpo-v1.0 | 47 | instruct | weblab-GENIAC/Tanuki-8x8B-dpo-v1.0 | |
Tanuki-8B-dpo-v1.0 | 7.5 | instruct | weblab-GENIAC/Tanuki-8B-dpo-v1.0 | |
Yi-1.5 34B | 34 | base | 01-ai/Yi-1.5-34B | |
Yi-1.5 6B | 6.1 | base | 01-ai/Yi-1.5-6B | |
Yi-1.5 9B | 8.8 | base | 01-ai/Yi-1.5-9B | |
Youri 7B | 6.7 | base | rinna/youri-7b | |
llm-jp-3-13b-instruct | 13 | instruct | llm-jp/llm-jp-3-13b-instruct | |
llm-jp-3-13b | 13 | base | llm-jp/llm-jp-3-13b | |
llm-jp-3-1.8b-instruct | 1.8 | instruct | llm-jp/llm-jp-3-1.8b-instruct | |
llm-jp-3-1.8b | 1.8 | base | llm-jp/llm-jp-3-1.8b | |
llm-jp-3-3.7b-instruct | 3.7 | instruct | llm-jp/llm-jp-3-3.7b-instruct | |
llm-jp-3-3.7b | 3.7 | base | llm-jp/llm-jp-3-3.7b |
評価の苦労話
評価の実行環境が多様
Swallowプロジェクトでは、大規模言語モデルの評価のため、AI Bridging Clud Infrastructure (ABCI) のAノード(NVIDIA A100)の他、東京工業大学のTSUBAME 4.0 (NVIDIA H100)、岡崎研究室内の計算サーバ(NVIDIA RTX A6000)、横田研究室内の計算サーバ(NVIDIA A100, RTX 6000 Ada, A6000など)が使われています。まとまった大規模なGPU計算資源は大規模言語モデルの学習に割り当てることになりますので、モデルの評価は学習環境の予備ノードや、クラウド計算環境の通常利用枠、研究室内の計算資源などでやりくりをします。さらに、規模の異なる多数のモデルに対して、19~27個のタスクで評価を行いますので、評価実験は8名くらいの学生で分担しています。したがって、計算環境と評価者の掛け算で、20~30個の評価環境が使われることになります。
(J)HumanEvalの評価にdocker環境が必要
(J)HumanEvalでは、大規模言語モデルが生成したコードを実際に実行するため、dockerを用いてサンドボックス環境を作る必要があります。ところが、ABCIはdockerに対応していないため、(J)HumanEvalの評価は別の実行環境で行う必要がありました(ABCIでは代わりにsingularityが利用できますが、今回の評価実験では採用しませんでした)。
実行環境によって評価スコアが変動する
乱数シードの固定など、評価の再現性を担保するための対策を講じていますが、それでも実行環境によって評価スコアが変動することを観測しています。評価スコアの有効数字3桁目以降は、再現性の担保が困難な状況にあります。
実行環境によってエラーが発生する
XL-Sumのタスクで、以下のエラーに遭遇することがあります。
File "/.../.venv_harness_jp/lib/python3.10/site-packages/transformers/models/llama/modeling_llama.py", line 1184, in forward
logits = logits.float()
RuntimeError: CUDA error: unspecified launch failure
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.
この問題はtransformersのversionを上げることで解決しました。
Llama 3にはtransformers 4.40.0以降が必要
Llama 3に対応したtransformersのバージョンは4.40.0以降です。そのため、評価を行うときは、評価担当者のtransformersのバージョンが4.40.0以降になるように指定する必要がありました。また、4.39.3以前のtransformersはLlama 3のtokenizer.jsonを正しく扱えないため、学習データのトークン化もtransformersのバージョンが4.40.0以降を使う必要があり、学習データの準備のやり直しが発生しました。
稀に評価が途中でハングアップする
評価タスクの実行が途中で止まってしまうことがあります。正確には、特定のモデル、タスク、事例において、モデルの出力が停止し、いつまでたっても評価が終わらないという状況に遭遇することがあります。この現象は実行環境を変えると解消することがあるため、Pythonやtransformersのバージョンによる微妙な挙動の違いを疑っていますが、現段階では原因を特定できていません。
GPUのメモリ不足によるエラー
評価したいモデルのサイズやタスクによっては、メモリ不足(out of memory)が発生することがあります。このような場合は、バッチサイズを下げる必要があり、時にはバッチサイズを1に設定することもあります。ところが、それでもメモリ不足が解消しないことがあり、そのような場合はより多くのメモリを積んだGPUの実行環境に変更するなど、対処が必要になります。
評価のジョブが打ち切られる
Swallowプロジェクトではたくさんの評価実験を行っていますが、自分たちが開発しているモデルのハイパーパラメータ調整の実験では、評価結果をできるだけ早く知りたい場合があります(本実験にできるだけ早く移行したいため)。逆に、他で開発されたモデルの評価は、さほど急ぐ必要がありません。このように、評価実験にも優先度があります。ところで、ABCIにジョブを投入する場合、実行時間を短く指定した方がジョブが早く実行されます。ABCIは大変混雑していますので、評価実験を行う担当者は、各タスクの評価実験にかかる実行時間を予測し、ジョブの投入時に経過時間制限値を設定します。ところが、何らかの要因で評価タスクの実行時間が長くなってしまうと、無慈悲にも設定した経過時間でジョブの実行が打ち切られ、評価実験が未完了となります。一部の評価タスクでは、評価中に結果をキャッシュしておくことで、ジョブの実行が打ち切られた場合でも続きから評価が再開できるような対策を講じました。
MT-Benchの評価でOpenAIのAPIを呼び出すときにRateLimitErrorが発生した
MT-Benchの評価では、GPT-4のAPIを呼び出す必要があります。MT-Benchの評価を並列で実行すると、OpenAI APIのRateLimitErrorが高頻度で発生し、retry回数の上限を超えてしまい正しく評価が行えないことがありました。FastChatの実装では、retry回数の上限を超えた際はエラーを出すのではなくスコアを-1として記録するため、最終結果のスコアを見るだけでは気づきにくい状況にありました。最終的にはretryの処理を工夫することで、この問題に対処しました。
一部のモデルの評価が正しく行えない
他で開発されたモデルを評価しているとき、過去に自分たちで実施した評価や外部のリーダーボードの評価を大幅に下回るスコアに出くわすことがありました。このようなことが複数のモデルにおいて発生するうえ、その現象を引き起こし得る原因がいくつも考えられる(先ほどのtransformersのバージョンによる動作の違い、評価ソフトウェアのバージョンアップに伴うプロンプトの違い等)ため、評価スコア低下の原因を特定し、デバッグをするのは困難です。そこで、モデルの評価で問題が発生した場合は、Swallowプロジェクトで開発しているモデルと規模や性能で競合する場合だけ原因を特定し修正することにし、競合しないと思われるモデルの評価は優先順位を下げ、場合によっては断念しました。
確率的デコーディングが意図せずに使われていた
2024年度のSwallowプロジェクトで採用している評価フレームワークで初代Swallowモデルの評価をやり直したとき、いくつかのタスクで以前よりも10ポイントくらい低いスコアが出ることがありました。これは、論文やウェブサイト等で報告していたスコアが間違っている可能性を示唆していますので、我々にとって深刻な問題です。結局、この現象は評価ソフトウェアのバージョンアップに伴う初期設定の変更によるものでした。
大規模言語モデルで出力を予測するときは、出力単語の確率分布を計算して、確率の高い単語を選びます。このとき、最も高い確率が計算された単語を出力するのが基本ですが、出力の多様性を高めるため、大規模言語モデルの応用では確率分布に従って単語をサンプリングする手法(確率的デコーディング)が用いられます。ところが、確率的デコーディングを多値選択式質問応答の回答生成に使ってしまうと、(よくデキるモデルでは)正解率が下がります。例えば、「はい」「いいえ」の2択問題を解いているとき、言語モデルが「はい」の確率を80%、「いいえ」の確率を20%と予測した状況を考えましょう。「はい」という答えに比較的自信を持っているようですので、「はい」と答えるのが合理的ですが、確率的デコーディングでは20%の確率で「いいえ」と答えることになります。つまり、回答にある程度自信を持っていたとしても、それとは異なる回答をわざと行うことになります。
出力単語の確率分布の形状は温度パラメータによって変わりますし、大規模言語モデルによっては推奨される温度パラメータがモデルの設定ファイルで指定されていることがあります。評価スコアを安定させるためには、(コード生成や対話などの生成系のタスクを除き)多値選択式のタスクでは確率的デコーディングを使わず、貪欲的デコーディング(最も高い確率が計算された単語を出力すること)を採用することが望ましいです。そのため、大規模言語モデルの評価ソフトウェアでは、しばしば貪欲デコーディングを大規模言語モデルに強制することがあります。我々が経験したケースでは、llm-jp-eval v1.0.0では初期設定の温度パラメータが0.1だったため、貪欲デコーディングに近い状態になっていましたが、v1.3.0でその設定が削除されたため、確率的デコーディングがデフォルトになっているモデルでは、特定のタスクの評価スコアが低下しました。この問題を解決するため、貪欲デコーディングを強制するように修正してすべてのモデルを再評価しました。
(J)HumanEvalではプロンプトの末尾に改行が必要だった
Swallowプロジェクトでは2024年度からコード生成タスクをモデルの評価に採用しました。これは、コード生成タスクが大規模言語モデルの論理的思考力を鍛えると期待していることに加え、初代Swallowがコード生成タスクに弱かったことが理由です。
ところが、Llama 3 Swallowの開発を進める中で、JHumanEvalやHumanEvalの評価スコアは8Bのモデルよりも70Bのモデルの方が悪いことに気づきました。Llama 3をHumanEvalで評価してみると、pass@1が0.28 (8B) および0.16 (70B) となり、8Bのモデルよりも70Bのモデルが苦戦しています。この問題を調査していくと、プロンプトの末尾が"""\n
で終わるならコードが生成されますが、"""
で終わる場合は[EOS]
が生成され、コードが生成されない傾向があることが分かりました(三重引用符"""
はPythonのドキュメンテーション文字列の開始と終了を表すことが多く、コード生成の指示やテストケースの末尾によく出現します)。さらに細かく調べていくと、Llama 3は"""
, [SPC]"""
, [SPC]"""\n
, [SPC]"""\n\n
をそれぞれ異なる単独のトークンにエンコードしており、この扱いかたに原因があるのかもしれません。
HumanEval, JHumanEvalの元々のデータでは、プロンプトの末尾に改行が付加されています。ところが、Code Generation LM Evaluation Harnessのデフォルトの実行条件では末尾の改行が除去されます。正確には、末尾の改行を除去するか否かを選べるようになっています( --tasks=humaneval-unstripped
を指定すると除去されません)。先に説明した通り、改行の有無でコード生成が変わる問題はトークン化に起因するものと考えられ、実際に多くのモデルではどちらでもかまわないようです。しかし評価の条件をそろえるのが望ましいという原則を鑑みて、(J)HumanEvalは改行を付与するように修正してすべてのモデルを再評価しました。
生成の冒頭に改行を出力するモデルがある
Sarashina2 7Bと13Bをllm-jp-evalで評価しているとき、特定のタスクで評価スコアが0点になることに気づきました。これは、モデルが生成の冒頭に改行文字\n
を出力することが原因で、JMMLUのように出力の完全一致で評価するタスクでは致命的です。Swallowプロジェクトの評価実験では、Sarashina2の出力に対して空白や改行を除去する処理を追加して評価を行っています。
謝辞
このウェブサイトは、以下のソフトウェアを用いて構築されました。