ひとことで言うと
パープレキシティ(PPL)は、言語モデルが正解トークンをどれだけ予測しにくかったかを、平均して何個の選択肢で迷っているかのように読める値です。値は低いほど良く、言語モデルの評価で使われます。
毎回の四択問題で、正解に高い確率を置けたかを採点し、その平均的な迷いを「実質何択か」に戻した値です。
なぜ必要か
損失の平均値は改善していても、読者には尺度が直感的でないことがあります。PPLなら、モデルが正解トークンを平均して何通りほどに分散して予測しているか、と読み替えられます。ただし、この値は与えられたテキストの次トークン予測を測る指標です。要約や分類などの下流タスクの性能と、必ず同じ順位になるわけではありません。
PPLの順位をモデルの総合順位として扱わず、同じトークン化・データ・評価窓での言語モデル比較に限定して読みます。
仕組み
トークン列の長さを 、時刻 の正解トークンを 、それ以前の列を 、モデルのパラメータを とすると、PPLは平均負の対数尤度を指数化します。
つまり、交差エントロピーの指数です。比較時にトークナイザーや前処理が変わると、同じ文章でもトークン列と が変わるため、PPLをそのまま比べられません。固定長のモデルでは文脈窓の切り方も値を変えます。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 値の読み方 | 低いほど正解トークンの予測が良い | 高いほど良い |
| 定義式 | 平均負の対数尤度を指数化 | 対数尤度をそのまま使う |
| モデル比較 | 同じトークン化・評価条件で比べる | 文字単位とサブワード単位を直比較 |
| 指標の限界 | 下流タスク性能とは別に確認する | PPLだけで実用性能を断定 |
実装で確かめる
正解トークンに割り当てた確率から、平均負の対数尤度を作って指数化します。確率が になると対数が定義できないため、実装では確率の扱いも確認します。
import numpy as np
prob = np.array([0.5, 0.25, 0.125])
avg_nll = -np.log(prob).mean()
ppl = np.exp(avg_nll)
print(ppl)
出力は 4.0 です。各位置の確率の算術平均を指数化するのではなく、対数を平均してから戻している点が要所です。
取り違えやすいもの
| 用語 | 切り分け |
|---|---|
| 交差エントロピー | PPLはその値を指数化した尺度 |
| 正解率 | PPLは確率の大小を連続的に反映し、正解・不正解だけではない |
| 下流タスク性能 | 文章続きを当てる評価であり、別タスクの性能を保証しない |
| モデル比較 | トークン化、文脈窓、データが揃わない値は比較しにくい |
想起チェック
PPLは何を指数化した値か
平均負の対数尤度、つまり交差エントロピーを指数化した値です。
PPLを比較する前に揃える条件は何か
少なくともトークン化、評価データ、文脈窓などの評価条件を揃えます。