この記事の対象読者
- LLM(大規模言語モデル)の評価方法に興味がある方
- Pythonの基本文法を理解している方
- 機械学習の基礎用語(モデル、推論、精度)を知っている方
この記事で扱わないこと
- LLMの学習方法やTransformerアーキテクチャの詳細
- PyTorchやTensorFlowの環境構築
- ファインチューニングの実装
この記事で得られること
- MMLUベンチマークの仕組みと評価方法が理解できる
- Pythonで実際にMMLU評価を実行できる
- LLMの性能を客観的に比較する視点が身につく
1. MMLUとの出会い
「このLLM、賢いって言うけど、何を基準に?」
GPT-4やClaude、Geminiのリリース記事を読むたびに、私はこの疑問を抱えていた。
各社が「○○%の精度を達成!」と華々しく発表するけれど、その数字の意味がわからない。
そんなとき出会ったのがMMLUだった。
MMLUは、いわば「LLMのセンター試験」だ。
57科目、約1.6万問の4択問題で、AIの「教養」を測定する。
数学から法律、歴史から医学まで、人間が大学で学ぶような幅広い知識を問う。
このベンチマークを理解してから、LLMのニュースの見え方がガラッと変わった。
2. MMLUが生まれた背景
2.1 既存ベンチマークの「天井問題」
2020年、AI研究者のDan Hendrycksらはある問題に直面していた。
既存のベンチマーク(GLUEやSuperGLUE)が「簡単すぎる」のだ。
最新のLLMは人間を超えるスコアを叩き出し、モデル間の差別化が困難になっていた。
"The test covers 57 tasks including elementary mathematics, US history, computer science, law, and more."
(このテストは初等数学、アメリカ史、コンピュータサイエンス、法律など57のタスクをカバーする)出典: Hendrycks et al., 2020, "Measuring Massive Multitask Language Understanding"
2.2 「人間の専門家レベル」という目標
MMLUの設計思想は明確だ。
「人間の専門家が89.8%程度のスコアを取る難易度」を目指した。
2020年のリリース時、最高性能のGPT-3でも43.9%しか取れなかった。
ランダム回答(25%)をかろうじて上回る程度だったのだ。
これが2024年には、GPT-4oやClaudeが88%以上を達成するまでに進化した。
4年で人間の専門家レベルに到達したことになる。
3. MMLUの基本概念
3.1 データセット構成
MMLUは以下の構成で成り立っている。
| 項目 | 内容 |
|---|---|
| 総問題数 | 15,908問 |
| カテゴリ数 | 57科目 |
| 問題形式 | 4択問題(A/B/C/D) |
| 難易度 | 初等〜専門家レベル |
57科目は大きく4つの分野に分類される。
STEM(理系): 数学、物理、化学、コンピュータサイエンス等
人文学: 哲学、歴史、法学等
社会科学: 経済学、心理学、政治学等
その他: 栄養学、医学、倫理学等
3.2 問題の具体例
実際の問題を見てみよう。
【マイクロ経済学の問題】
政府が独占を規制する理由の一つは何か?
(A) 生産者余剰が失われ、消費者余剰が増加する
(B) 独占価格は生産効率を保証するが、配分効率を犠牲にする
(C) 独占企業は研究開発に投資しない
(D) 価格上昇と生産量減少により消費者余剰が失われる
正解: (D)
この問題、経済学を学んでいないと厳しいだろう。
MMLUは「検索すれば答えがわかる」類の問題ではなく、理解と推論を要求する。
3.3 評価指標:Accuracy(精度)
MMLUの評価は単純明快だ。
精度 = 正解数 / 総問題数 × 100 (%)
4択なのでランダム回答なら25%になる。
これを基準に、モデルがどれだけ「知っている」かを測定する。
4. 実際にMMLUを動かしてみよう
4.1 環境構築
まず必要なライブラリをインストールする。
pip install datasets transformers torch accelerate
4.2 データセットの取得と確認
Hugging Face Datasetsから簡単に取得できる。
from datasets import load_dataset
# MMLUデータセットの読み込み(abstract_algebraカテゴリ)
dataset = load_dataset("cais/mmlu", "abstract_algebra")
# データ構造を確認
print(f"訓練データ数: {len(dataset['test'])}")
print(f"キー: {dataset['test'].features.keys()}")
# 問題例を1つ表示
example = dataset['test'][0]
print(f"\n【問題】{example['question']}")
print(f"(A) {example['choices'][0]}")
print(f"(B) {example['choices'][1]}")
print(f"(C) {example['choices'][2]}")
print(f"(D) {example['choices'][3]}")
print(f"正解: {['A', 'B', 'C', 'D'][example['answer']]}")
実行結果の例:
訓練データ数: 100
キー: dict_keys(['question', 'subject', 'choices', 'answer'])
【問題】Find the degree for the given field extension Q(sqrt(2), sqrt(3), sqrt(18)) over Q.
(A) 0
(B) 4
(C) 2
(D) 6
正解: B
4.3 LLMでMMLU評価を実行する
実際にLLMを使ってMMLUを評価するコードを書いてみよう。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from datasets import load_dataset
from tqdm import tqdm
def evaluate_mmlu(model_name: str, subject: str = "abstract_algebra", num_samples: int = 50) -> dict:
"""
MMLUベンチマークでLLMを評価する
Args:
model_name: Hugging Faceのモデル名
subject: 評価する科目
num_samples: 評価するサンプル数
Returns:
評価結果の辞書
"""
# モデルとトークナイザーの読み込み
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
device_map="auto"
)
# パディングトークンの設定
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
# データセットの読み込み
dataset = load_dataset("cais/mmlu", subject, split="test")
correct = 0
total = min(num_samples, len(dataset))
results = []
for i in tqdm(range(total), desc=f"Evaluating {subject}"):
example = dataset[i]
# プロンプトの構築(Few-shot形式)
prompt = f"""以下は4択問題です。最も適切な選択肢をA、B、C、Dから1つ選んでください。
問題: {example['question']}
A) {example['choices'][0]}
B) {example['choices'][1]}
C) {example['choices'][2]}
D) {example['choices'][3]}
回答:"""
# 推論
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=5,
temperature=0.0,
do_sample=False,
pad_token_id=tokenizer.pad_token_id
)
# 回答の抽出
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
generated = response[len(prompt):].strip().upper()
# 最初のA/B/C/Dを抽出
predicted = None
for char in generated:
if char in ['A', 'B', 'C', 'D']:
predicted = char
break
# 正解判定
correct_answer = ['A', 'B', 'C', 'D'][example['answer']]
is_correct = (predicted == correct_answer)
if is_correct:
correct += 1
results.append({
'question': example['question'],
'predicted': predicted,
'correct': correct_answer,
'is_correct': is_correct
})
accuracy = correct / total * 100
return {
'model': model_name,
'subject': subject,
'accuracy': accuracy,
'correct': correct,
'total': total,
'details': results
}
if __name__ == "__main__":
# 小さめのモデルで実験(GPUメモリ8GB程度で動作)
result = evaluate_mmlu(
model_name="microsoft/phi-2",
subject="high_school_mathematics",
num_samples=20
)
print(f"\n=== 評価結果 ===")
print(f"モデル: {result['model']}")
print(f"科目: {result['subject']}")
print(f"精度: {result['accuracy']:.1f}%")
print(f"正解数: {result['correct']}/{result['total']}")
4.4 よくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
OutOfMemoryError |
GPUメモリ不足 |
torch_dtype=torch.float16を追加、または小さいモデルを使用 |
KeyError: 'pad_token' |
パディングトークン未設定 |
tokenizer.pad_token = tokenizer.eos_tokenを追加 |
| 精度が25%付近 | モデルが回答形式を理解していない | プロンプトにFew-shot例を追加 |
5. MMLUの限界と発展形
5.1 MMLUの問題点
2024年、MMLUには深刻な問題が発覚した。
研究者が5,700問を手動分析したところ、相当数の「正解の誤り」が見つかったのだ。
また、最新モデルが88%以上を達成し、再び「天井効果」が起きている。
5.2 後継ベンチマーク
これらの問題を解決するため、新しいベンチマークが登場している。
| ベンチマーク | 特徴 |
|---|---|
| MMLU-Pro | 10択に拡張、より高難度 |
| MMLU-Redux | 誤り訂正版 |
| MMMU | マルチモーダル対応(画像+テキスト) |
5.3 評価時の注意点
MMLUスコアを見る際は、以下に注意しよう。
- 評価条件の違い: Zero-shot vs Few-shot、Chain-of-Thoughtの有無で結果が大きく変わる
- データ汚染の可能性: 学習データにMMLU問題が含まれているリスク
- 公開モデル vs 非公開スナップショット: 論文の結果が再現できないことがある
6. まとめ
この記事では、MMLUベンチマークについて以下を解説した。
- MMLUとは: LLMの「学力テスト」。57科目約1.6万問の4択問題
- 背景: 既存ベンチマークの「天井効果」を解決するために2020年に登場
- 評価方法: 単純な正解率(Accuracy)で測定
- 実装: Hugging Face Datasetsで簡単に取得・評価可能
- 限界: 正解の誤り、データ汚染、天井効果などの問題あり
MMLUは完璧なベンチマークではない。
しかし、LLMの進化を追いかける上で、今なお重要な指標であり続けている。
次にLLMのリリース記事を読むとき、「MMLUで○○%」という数字の重みがわかるはずだ。