PenLP の定数部分がわからなかったという話。
https://aclanthology.org/2020.tacl-1.20.pdf の p.302 Table 2 の PenLP の式で 5 とか 1 という定数が出てきて、これはナンジャラホイ? という話になったのでメモ。
もともとの出どころは、下記の Wu et al. (2016) で、
Section 7 Decorder に出てくる (14)式 Length normalization (参考)ということまではたどり着いたけれど、そこにも定数の意味が書いてなかった
との報告だったので頭回してみた。
Wu, Y., Schuster, M., Chen, Z., Le, Q. V., Norouzi, M., Macherey, W., ... & Klingner, J. (2016). Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation. arXiv preprint arXiv:1609.08144.
$$
lp(Y) = \frac{ (5 + |Y|)^\alpha}{(5 + 1)^\alpha}
$$
$${lp}$$ は length penalty 。$${Y}$$ は output sentence で、$${|Y|}$$ は出力文長($${Y}$$ を構成する総トークン数)。
$${log(P(Y|X))}$$ を文長で割って正規化するために導入されているのが $${lp}$$。
最初は単純に $${|Y|}$$ で割ってたけど、そのヒューリスティックを改良して $${lp}$$ にしたらしい。
たしかに $${\alpha}$$ 導入した以外に過程は書いてない。
そこでぼんやり考える。
スタートは $${|Y|}$$ 。これを長さによる正規化に使いたい。よくあるやつ。
ただそのまま使うと、例えば $${|Y|=1}$$ と $${|Y|=5}$$ の違いは $${|Y|=61}$$ と $${|Y|=65}$$ の違いと同じで $${4}$$の差である。
直観的には文長 1 と 5 は確かに違うけれど、スケールが文長 61 とかの長さになってくると、61 だろうが 65 だろうが同じくらい長い。
そこで $${0 < \alpha < 1}$$ を乗じることにする。
$$
|Y|^\alpha
$$
このままでもいいが、例えば $${\alpha = 0.5}$$ を考える。
つまり $${|Y|^{0.5} = \sqrt{|Y|}}$$。
表に書いてみる。
$${|Y|}$$ と $${|Y|^{0.5}}$$ を見比べると、$${|Y|}$$ が大きくなればなるほど期待通り元々の識別能力は落ちていく。
(文長 100 だろうが121だろうが大体同じ値になる)
ただ $${|Y|}$$ が 0 に近い値ではまだ $${|Y|^\alpha}$$ が $${|Y|}$$ の振る舞いを残していて、$${|Y|}$$ の変化に対する $${|Y|^\alpha}$$ の変化も大きく過敏である。これは $${\alpha}$$ が 1.0 に近づくほど顕著になる。
なので、$${\alpha}$$乗する前にあらかじめ「かさ増し」をしておく。
$$
(b + |Y|)^\alpha (b>0)
$$
こうしておけば上の表の $${|Y|}$$ の振る舞いが鈍化しているあたりから使用できる。
式に使われる $${|Y|}$$ のスケールが大きくなれば、$${b}$$ も相対的に大きく変えていった方がいいかもしれないが、$${|Y|}$$ は出力文長なのでそうそう大きく変わることもないとして、決め打ちでもいいだろう。$${b=5}$$くらいにしよう。
あとは $${|Y| = 1}$$ のとき、$${(b + |Y|)^\alpha}$$ も 1 になるようにしたい。
やり方は簡単で、$${(b + 1)^\alpha}$$ で割るだけ。
それで最終的に出来上がるのが、
$$
lp(Y) = \frac{ (5 + |Y|)^\alpha}{(5 + 1)^\alpha}
$$
こんな感じ。