transformersのgenerate
メソッドを使っていて気になったのでメモ。
参考文献1を確認したところ論文を見てねとのことだったので、参考文献2の論文を拝見しました。
すごくわかりやすい論文やんって思いました!
repetition penaltyを導入する動機
言語生成をする際、はじめに次トークンとしてふさわしいものを予測し、それらを確率分布の形で出力します。つぎにtop-kやtop-pといった確率を利用した操作によって次トークンを決定するわけですが、時として貪欲に最大の尤度のトークンを選択したほうが良い場合が存在します。この論文の例だと首都を当てるクイズが挙げられてますね。こうしたケースに合わせるならば貪欲に最大尤度のトークンを選択するのが良いと思ってしまうのですが、そうしてしまうと同じ文章や言い回しを繰り返し出力することが知られているので、これを回避したいというのが動機です。
どうやって実現しよーと?
アイディアはシンプルで予測した次トークンの確率分布の確率をいじってやればいいわけですね。形はSoftmax関数ですね。
$$p_i=\frac{\exp(x_i/(T・I(i\in g)))}{\Sigma_j \exp(x_j/(T・I(j\in g)))}$$
ここで、$g$は生成されたトークンのリスト、$T$はTemperatureで、$I(c)$は$c$という条件が真の場合に$\theta$をかえし、そうでない場合は1を返す関数です。
なので一度トークンが生成されればTemperatureがさらに強まるイメージですね!
蛇足: Temperatureは?
式の形はrepetition penaltyの項がない分簡潔に表せます。
$$p_i=\frac{\exp(x_i/T)}{\Sigma_j \exp(x_j/T)}$$
Temperatureが何をやってるかというと、実際にTに値を代入するとわかりやすいです。
まず、$y=e^x$の場合
次に、$y=e^{x/10}$の場合
$T$が大きくなるほどに値の上昇が緩やかになってるのがわかりますね。$T$を大きくすると大きな値は小さく、小さな値は大きくなるように調整されるわけです。
なので、論文内では$T\rightarrow0$とすると最大の値を増幅した貪欲な確率分布に近づき、$T\rightarrow\infty$とすれば一様分布に近くなるって書いてあります。納得ですね。