見出し画像

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.

With length normalization, we aim to account for the fact that we have to compare hypotheses of different length.Without some form of length-normalization regular beam search will favor shorter results over longer ones on average since a negative log-probability is added at each step, yielding lower (more negative) scores for longer sentences.

https://arxiv.org/abs/1609.08144


$$
lp(Y) = \frac{ (5 + |Y|)^\alpha}{(5 + 1)^\alpha}
$$

$${lp}$$ は length penalty 。$${Y}$$ は output sentence で、$${|Y|}$$ は出力文長($${Y}$$ を構成する総トークン数)。
$${log(P(Y|X))}$$ を文長で割って正規化するために導入されているのが $${lp}$$。

We first tried to simply divide by the length to normalize.
We then improved on that original heuristic by dividing by $${length^\alpha}$$, with $${0 < \alpha < 1}$$ where $${\alpha}$$ is optimized on a development set ($${\alpha \in [0.6 − 0.7]}$$ was usually found to be best).

https://arxiv.org/abs/1609.08144

最初は単純に $${|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}
$$

こんな感じ。

この記事が気に入ったらサポートをしてみませんか?