OpenAIのPPO言語生成論文を読む①

この記事は強化学習苦手の会 Advent Calendar 2020の24日目の記事です。

2020.12.28 追記
解釈が致命的にミスってました・・・"To keep $\pi$ from moving too far from $\rho$"なので「両分布が離れすぎないように」です。
(誤)学習する方策$\pi$が、初期方策$ \rho$よりも離れた分布となるように、KL divergenceが大きくなるようにする役割です。
(正)学習する方策$\pi$が、初期方策$ \rho$よりも離れすぎないように、両分布のKL divergenceが大きいとペナルティをかける役割です。

2020.12.26 追記 記載が間違ってたので訂正します。
(誤)学習する方策$\rho$が、初期方策$ \pi$よりも離れた分布となるように
(正)学習する方策$\pi$が、初期方策$ \rho$よりも離れた分布となるように

こんにちは、品川です。
本記事では、Actor-Critic with DQNを実験的に実装して試そうと思っていましたが、諸事情で実装の時間が取れなかったので最近の言語生成で使われている論文について紹介していこうと思います。

紹介する論文は、OpenAIの"Fine-Tuning Language Models from Human Preferences (ArXiv, 2019)"です。

書誌情報

どんな論文?

人間の評価(Preference)を報酬として、事前訓練した言語生成モデルのfine-tuningを強化学習手法の一つであるPPOで行った話。タスクは指定文体での文生成と要約の2タスク、それぞれ2つずつの計4つのデータセットで有効性を検証したとのこと。

スタイル文生成はPositiveな感情や物理的な記述の文体での継続的な生成。要約タスクはいわゆるExtractive summarization (TL;DR and CNNDaily Mail)

  • 指定文体での文生成では5,000サンプル程度の人間による比較評価によって良いスコア。
  • 要約タスクでは60,000サンプルの訓練データで良いROUGEスコアとなったとのこと。

これを知るきっかけはRyobotさんがコメントで紹介して下さった(ありがとうございますm(__)m)というのと、NeurIPS2020に採択されていたOpenAIの論文の中にPPOを使った要約の話があったので興味を持ったためです。今はPPOがイケてるのか・・・ならば読まねばなるまい・・・ということで読んでみました。

どこがすごい?

強化学習を言語生成に使うという話や人間の好みのデータで学習するという話は古今東西色々あります。
この論文のウリはGPT-2のようなつよつよ学習済み言語モデルに対して、「複数例生成する→人間に複数の生成例から一番良いものを選んでもらう→PPOで強化学習」を繰り返すと、案外少ないサンプル数で目的のタスクで高い性能のモデルを得ることができる、ということを示したことなのかなと思います。(PPOだからすごい、ってことは特に書いてなかったように思います)

手法のキモ

学習は、下のFigure 1に示すように、言語モデルであるPolicyと、価値を計算するReward modelの交互の学習により実現されています。Actor-Criticにかなり近いなあと思いましたが、Actor-Criticは各時刻における行動に対する価値を評価している一方で、Reward modelは単に文全体に対して評価している点が異なるかなと思われます。

f:id:snowman_88888:20201224100713p:plain

人間による好みの生成例の選択操作

人間が行う具体的な操作は、入力$x$に対して生成された4つの生成文$\{y_0,y_1,y_2,y_3\}$から、一番良いと思うものを人間に一つ選ぶという操作です。このとき、人間が選択した番号を$ b \in \{0,1,2,3\}$とします。

Appendix Aには、実際に人間の実験参加者(labelers)に好みのアノテーションをしてもらう時にどのように指示を出したのかが説明されているので同じようなことをする時には参考になりそうです。クラウドソーシングはマジ大変ですね・・・指示書はまず読んでもらえないのでできるだけに簡単に書くという点、あとはまず信頼のおけるlabelerのベンチマークスコアを用意しておいて、クラウドワーカーの品質評価に使うといった工夫について述べられていて「わかる・・・」となりました。

Reward model $r(x,y)$の訓練

ユーザによって選択されたサンプルは、Reward modelの訓練に回されます。このReward modelにはPolicyと同じGPT-2を使っているようです(ひぇ~~~)。ただし、完全に同じモデルとしてパラメータを共有した状態だと八百長(つまり、過学習)が起きてしまうので、完全に同じネットワークならないよう、Rewrd modelの最終線形層の重みをランダムに初期化するということをしています。(4.2節参照)

報酬最大化のための損失関数は以下のようになっています。式の上では多変数のsoftmax cross entropyと同じ形ですね。

$loss(r)=\mathbb{E}_{\left(x, \left\{y_{i}\right\}_{i}, b\right) \sim S} \left[\log \frac{e^{r\left(x, y_{b}\right)}}{\sum_{i} e^{r \left(x, y_{i}\right)}}\right]$

Policy $\rho$の学習

Policyは次に示す報酬スコアRを最大化するように学習します。

$R(x, y)=r(x, y)-\beta \log \frac{\pi(y \mid x)}{\rho(y \mid x)}$

ここで第二項はペナルティ項となっています。学習する方策$\pi$が、初期方策$ \rho$よりも離れすぎないように、両分布のKL divergenceが大きいとペナルティをかける役割です。

学習に用いるPPOについてですが、これは完全にモジュールとして使っているということで説明がありませんでした。
PPOについてはじっくり調べて紹介するつもりでしたが、まだ記事にできるほど理解できてないので今後の宿題としたいと思います・・・

代わりといってはなんですが、PPOを理解するために苦手の会でおススメいただいた記事を載せておきます(ありがとうございます!)↓
spinningup.openai.com

基本的には、Policyが大きく更新されてしまうと回復不能な致命的な更新がされてしまうことがあるということで、これを抑えるために更新前の方策と更新後の方策の比が一定の範囲内に収まるようにclippingするという話と理解しています。GANとかでも重みの更新に指数移動平均を使ってちょっとずつ重みを動かしていく工夫がありますが、そういう感じのモチベーションという感じでしょうか?

実際にはこのOpenAIのブログで紹介されているPPO2を学習に用いたとのことです。
(PPO2はPPOのGPU-enable版とのこと)

感想、コメント

おそらくサンプルの選び方にも工夫があるのではと思いますが、正直追いきれなかったのでこちらも今後調べたいと思います。
可処分時間が尽きてしまったので今回はここまでです(もっと時間が欲しい・・・)明日は実装の部分と結果をもう少し見ていきたいと思います。