1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MMLUってなんだ?〜LLMの「学力テスト」を完全理解する〜

1
Posted at

この記事の対象読者

  • 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スコアを見る際は、以下に注意しよう。

  1. 評価条件の違い: Zero-shot vs Few-shot、Chain-of-Thoughtの有無で結果が大きく変わる
  2. データ汚染の可能性: 学習データにMMLU問題が含まれているリスク
  3. 公開モデル vs 非公開スナップショット: 論文の結果が再現できないことがある

6. まとめ

この記事では、MMLUベンチマークについて以下を解説した。

  1. MMLUとは: LLMの「学力テスト」。57科目約1.6万問の4択問題
  2. 背景: 既存ベンチマークの「天井効果」を解決するために2020年に登場
  3. 評価方法: 単純な正解率(Accuracy)で測定
  4. 実装: Hugging Face Datasetsで簡単に取得・評価可能
  5. 限界: 正解の誤り、データ汚染、天井効果などの問題あり

MMLUは完璧なベンチマークではない。
しかし、LLMの進化を追いかける上で、今なお重要な指標であり続けている。

次にLLMのリリース記事を読むとき、「MMLUで○○%」という数字の重みがわかるはずだ。


参考文献

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?