03.6.1
BLEU 指標
直感:候補文の断片がどれだけ参照文に見つかるか #
翻訳モデルが “the cat is on the mat” と出力し、人間の訳が “there is a cat on the mat” だったとします。BLEU は候補文を 1 語ずつ(1-gram)、2 語ずつ(2-gram)…と切り出し、その断片が参照文にも現れる割合を数えます。1 語単位なら “the”, “cat”, “is”, “on”, “mat” が見つかって高い値、3 語単位になると “on the mat” しか一致せず値は下がります。長い断片まで一致するほど語順も合っているとみなせるので、1〜4-gram を幾何平均して 1 つのスコアにします。ただし “the the the” のような候補でも “the” が参照文にある以上 1-gram 精度が 1.0 になってしまうため、参照文での出現回数を上限にする修正を入れ、“on the” だけの 2 語の候補が高得点を取らないように短さへの罰(brevity penalty)も掛けます。
式で書くと何を数えているか #
修正精度(Modified Precision) #
通常の精度は候補文の n-gram が参照文に出現する割合ですが、同じ n-gram を何度も繰り返す候補に対して不当に高くなります。修正精度は、各 n-gram の一致数を「参照文に出現する最大回数」で上限を設けて数えます:
$$p_n = \frac{\sum_{C \in \text{Candidates}} \sum_{\text{n-gram} \in C} \min\!\left(\text{Count}(\text{n-gram}),\; \text{MaxRef}(\text{n-gram})\right)}{\sum_{C \in \text{Candidates}} \sum_{\text{n-gram} \in C} \text{Count}(\text{n-gram})}$$分子の \(\min\) が上限で、候補に “the” が 3 回あっても参照文に 2 回しかなければ 2 回分しか数えません。分母は候補文の n-gram の総数です。
BLEU スコアの計算 #
BLEU は $N$-gram(通常 $N=4$)までの修正精度の幾何平均に、brevity penalty を掛けた値です:
$$\text{BLEU} = \text{BP} \cdot \exp\!\left(\sum_{n=1}^{N} w_n \ln p_n\right)$$ここで $w_n = 1/N$(均等重み)です。対数の平均を \(\exp\) で戻しているので算術平均ではなく幾何平均になり、どれか 1 つの \(p_n\) が 0 なら全体も 0 になります。
Brevity Penalty(BP) #
候補文が参照文より短い場合にペナルティを課します:
$$\text{BP} = \begin{cases} 1 & \text{if } c > r \\\\ e^{1 - r/c} & \text{if } c \leq r \end{cases}$$$c$ は候補文のトークン数、$r$ は候補文に最も長さが近い参照文のトークン数です。候補が参照の半分の長さなら \(e^{1 - 2} \approx 0.37\) が掛かり、長い候補にはペナルティがありません(長すぎる候補は精度側で下がります)。
計算例 #
候補文: “the cat is on the mat”(6 トークン) 参照文: “there is a cat on the mat”(7 トークン)
| n-gram レベル | 一致数 | 候補 n-gram 総数 | $p_n$ |
|---|---|---|---|
| 1 | 5 (“the”, “cat”, “is”, “on”, “the mat” → 重複修正で 5) | 6 | 5/6 |
| 2 | 3 (“the cat”, “on the”, “the mat”) | 5 | 3/5 |
| 3 | 1 (“on the mat”) | 4 | 1/4 |
| 4 | 1 (“on the mat” の延長なし) | 3 | 0/3 |
$p_4 = 0$ のため、この例では参照文 1 本の BLEU-4 = 0 になります。実務では smoothing を適用して 0 を回避し、下のコードでは 2 本目の参照文 “the cat sits on the mat” が 4-gram “the cat is on” に近い断片を補うため 0 を免れています。
Python で実装する #
次のコードは標準ライブラリのみで BLEU を実装し、候補文 “the cat is on the mat” と 2 本の参照文に適用して BLEU = 0.638 を出力します。
| |
出力例:
BLEU = 0.638
実行結果の読み方 #
0.638 は「1〜4-gram の修正精度の幾何平均が 0.638 で、長さの罰はなし」という意味です。BLEU は 0〜1(論文や sacrebleu では 100 倍して 0〜100)で、参照文と完全に一致した候補だけが 1.0 になるので、1.0 に近い値が多いときは参照文の丸写し(テストデータの混入)を疑います。
長所と注意点 #
実装が Counter と数行の算術で済み高速なので、WMT などの翻訳ベンチマークで 2002 年から比較指標として使われ続けています。参照文を 2 本、4 本と増やすほど正しい言い換えが一致する機会が増え、言い換えへの耐性が上がります。一方、同義語や語順の違いには弱く、“the cat sat on the mat” と “on the mat sat the cat” は意味が同じでも 3-gram 以上の一致が減って低く出ます。文単位ではなくコーパス全体で \(p_n\) を集計するのが本来の定義で、1 文ごとに計算すると 4-gram が 0 になりやすいため smoothing が必要です。長文要約では人手評価との相関が低くなる場合があるため、ROUGE や BERTScore と併用します。日本語など語境界が曖昧な言語では、MeCab などで分かち書きしてから split() 相当のトークン化をしないと、文全体が 1 トークンになって一致が取れません。
まとめ #
BLEU は候補文の 1〜4-gram が参照文に現れる割合(修正精度)を幾何平均し、候補が短いときは brevity penalty \(e^{1 - r/c}\) を掛けた 0〜1 の指標で、“the cat is on the mat” と 2 本の参照文では 0.638 になります。修正精度の min(count, max_ref[ng]) が単語の繰り返しによる水増しを防ぎ、幾何平均が 4-gram の一致ゼロをそのまま 0 点にします。同義語と語順の入れ替えには弱いので、参照文を複数用意し、短文では smoothing を使い、日本語は分かち書きしてから計算します。要約のように「参照の情報をどれだけ拾えたか」を測るなら ROUGE、言い換えまで評価するなら埋め込みの コサイン類似度 を使った BERTScore 系の指標を併用します。