初学者の段階から一歩前に進みたい方に勧めたい「深層強化学習入門」

こんにちは、品川です。本記事は強化学習 Advent Calendar 2021 17日目の記事です。

今回は以前献本いただいた「深層強化学習入門」についてご紹介したいと思います。

www.kyoritsu-pub.co.jp

オレンジと黒白の装丁がカッコよくて素晴らしいです。

目次

前置き

強化学習は様々な分野で用いられており、コンピュータビジョンや自然言語処理でも強化学習を使った手法がたくさん提案されてきています。

ただ、全体からすれば、強化学習を使う手法というのは依然としてマイナーな部類だと言えるかもしれません。理由は、おそらく強化学習教師あり学習教師なし学習よりもとっつきにくいためでしょう(私も最初はそうでした)

最近はそうでもないですが、強化学習の教科書は割と共通した以下のような特徴があります(個人の感想です)

  • 分厚い
  • 重厚なベルマン方程式と動的計画法からの導入
  • 突然出現する迷路、その中での方策や価値の更新(policy iterationやvalue iteration)
  • 対になる似たような名前の概念が多くて面食らう(Policy Iteration vs Value Iteration, Policy base vs Value base, Model base vs Model free, On-policy vs Off-policy, Online vs Offlineなど)

体感ではここら辺が壁です。具体的には、逐次的な操作で徐々に方策や価値が更新されていく感じが分かるところが最初の目標だと思います。研究室で勉強会をした時も、ここら辺がハマりやすいポイントだと感じています。ここを完全に理解した気になると、山を越えて体に強化学習が少し馴染んだ気持ちになれると思っています(個人の感想です)

ここら辺を乗り越える方法としては、なんでも良いので色々見てみると良いかと思います。個人的にはこのあたりがおススメです。

Policy IterationとValue Iterationの部分を取り上げてますが、もちろん最初から読んだ方が(視聴した方が)良いです。よくわからなければ、安心と信頼のSutton本がおススメです。

Sutton本は昔から邦訳のある強化学習の教科書としても親しまれてきた本です。2020年に深層学習も盛り込んで刷新されました。一から読むのは大変ですが詳しく書かれているので、私は分からないところがあった時にしばしば読んでは助かっています。

乗り越えたあとは、そのまま上の資料で勉強しても良いですし、ニューラルネットで深層強化学習がしたいんじゃ~~~という方は、入り口として下記のチュートリアル資料が役に立つと思います。

チュートリアルコード

本題:「深層強化学習入門」は誰向けの本?

ようやく本題です。これだけ色々と資料がある中で、「深層強化学習入門」はどういう位置づけになるのでしょうか?私の中の答えとしては、「前述の資料とかで深層強化学習にちょっと親しんできて、自分で手を動かして実装とかをし始めた」くらいの方に最適だと思います。(つまり、私に最適でした)

もう少しかみ砕くと、頭の整理が捗る本であり、実装上のコツや気を付ける点が満載されたハンドブックだと思っています。

「深層強化学習入門」の特徴は、まず分厚くないという点です。参考文献含めて124ページ。おお、ほぼコンピュータビジョン最前線 Winter2021と同程度のページ数ですね(ダイマ)鈍器じゃなくてかさばらないので、通勤通学中も気軽に読めるのは嬉しいですね。

コンパクトな見た目に反して、中身は近年までの深層強化学習の話題がてんこ盛りです。特に、

  • 重要概念を比較して説明してくれてることが多い点(例えば、第3章ではOn-policy vs Off-policy, Online vs Offlineの違いについて、第6章では、Model base vs Model freeの違いが説明されている)
  • 価値ベース(Value base)、方策ベース(Policy base)、およびそれらの組合せのActor-criticの異なる点や利点が説明されている(第4章、第5章)
  • 後半7章からは、モデルの汎化性を高めるための工夫や、関連するタスクや概念について網羅的に述べられている

ずっとこういう本が欲しかったんですけど、実は最初さらっと読んでツイートしてた時はまだ真のすごさに気づけてませんでした。ちゃんと読み直してみたらまんま欲しい感じの本だったので驚きました。

入門という名前の通り、最初に読んでももちろん良いと思います。でも、おそらく他の本で一通り学んでなんとなくわかった気になってからこの本を読むと、より良い体験があると思います。前述した理由から他の教科書とは趣が違うので、とりあえず一冊買って持っておくと良いのではと思いました。ご紹介くださった著者の皆様、共立出版様、ありがとうございました。

最近の言語生成の強化学習

こんにちは、品川です。本記事は強化学習 Advent Calendar 2021 6日目の記事です。

短いですが、最近の言語生成周りの強化学習関連の話題を取り上げたいと思います。

言語生成周りの強化学習のおさらい(2020年時点での私の理解)

  • 言語生成モデルの訓練にはTeacher forcingを用いる
  • 言語生成で最もよく使われている強化学習手法は、方策勾配法の最も簡単な手法であるREINFORCEアルゴリズムである(他にもActor-criticや、DQNをはじめとする価値ベースの手法などが使われている)
  • REINFORCEでは、生成した文に対してあらかじめ報酬を算出しておき、Teacher forcingで用いていた目的関数(負の対数尤度)に、トークンごとに重みづけして学習する操作に対応している
  • REINFORCEは勾配の分散が大きいので、ベースライン関数を適用することで分散を下げる工夫が重要である
    • ベースライン関数には、ミニバッチ内の報酬の平均値や、Self-critic(greedyにサンプルした文の報酬を使う)ことが多い
  • REINFORCEでモデルを一から学習するのはうまくいかない。Fine-tuningで用いるのが一般的
  • REINFORCEは色々な分野で頻繁に登場しているものの、Actor-criticや価値ベースの手法は、(いくつかの手法が提案されてきたものの)あまり他の論文で利用されていない。
    • 私見としては、Action space(語彙数)が大きいのもあってか、モデル学習の手間がかかる割には期待するほどの精度向上が得られないとみなされているのではないかと考えている。

詳しくは、去年の「強化学習苦手の会 Advent Calendar 2020」の私の記事や、「2021.04.08 強化学習若手の会チュートリアル 言語生成の強化学習」を参考にしていただければと思います。

adventar.org

speakerdeck.com

最近の言語生成の強化学習①:REINFORCEもPPOへ徐々に移行中

Proximal Policy Optimization (PPO)とは、REINFORCEと同じく方策勾配ベースの手法です。
ロボティクスの分野ではよく使われている手法でしたが、2019年にOpenAIがPPOを利用する論文を出してから、徐々に言語生成周りの論文でもPPOが登場するようになってきました。

このOpenAIの論文は、私の記事でも一度取り上げたことがあります。PPOをREINFORCEと直接比較した結果がないのがちょっと気になるんですけど、まあPPOがREINFORCEより悪くなるケースというのもそんなにないんでしょうし、大丈夫でしょう。。。いつか誰かが試してくれることを願います・・・(自分でやる時間がない) snowman-88888.hatenablog.com

ちなみにHuggingfaceでは、GPT-2をPPOで学習するライブラリがサポートされてたりします。 lvwerra.github.io

実は言語生成の強化学習周りで使い勝手の良いライブラリは(いまだに)あんまり無いです。あると便利かもですね(自分でやる時間がない)

PPOが使われた最近の事例としては、募金を呼び掛けるという説得対話タスクにおける文生成の強化学習にPPOを使った例があります。

Refine and Imitate: Reducing Repetition and Inconsistency in Persuasion Dialogues via Reinforcement Learning and Human Demonstration (EMNLP2021 Findings) aclanthology.org

最近の言語生成の強化学習②:価値ベース?できるよ。そう、事前学習済み言語モデルならね

トークンごとに価値を推定するActor-criticや価値ベースの手法は難しいとされていました。理由は、下記の論文で言及されているように、action spaceが語彙サイズなのでデカすぎて、即時報酬を予測するモデルを学習することが難しいという点です。

However, RL by far has made limited success for training text generation, primarily due to the key challenges of sparse reward (i.e., a single reward signal is received only after the whole text sequence is generated) and large action space (i.e., a vocabulary of millions of words). [2106.07704] Text Generation with Efficient (Soft) Q-Learning

昔は何をしていたかというと、action spaceに制約を与えたり、時刻ごとに報酬を切り崩すreward shapingという方法が行われていました(詳しくは下記)。 言語生成の強化学習をやっていく(手法紹介 Actor-Critic編②) - Seitaro Shinagawaの雑記帳

ただ、最近の論文によると、BERTやGPT-2などの事前学習済み言語モデルを使えば、価値ベースでも十分動くようです。

arxiv.org

この論文では、Soft Q-learning(目的関数に、報酬の期待値最大化に加えて方策エントロピーを最大化して多様性も向上させる項を追加したQ-learning手法)を利用した手法を提案してして、Critic(Q)のモデルに事前学習済みの言語モデルを用いています。性能もpolicy gradientと比肩しているようで、タスクによっては有効な選択肢に入ってくるのではないでしょうか?

ただ、どういう場合で活きてくるかは私もまだよくわかってません。文の途中からでも評価ができるという利点は文の制御がまず思いつきますが、昨今の文生成では俗に「スペシャトークン芸」と言われるように、タスクや制御したい情報を特殊トークンとして加えることで文を制御することが一般的であり、少なくとも言語生成タスクにおいてはそこまで重要とは思えません。off-policyとon-policyを使い分けられるところがうまみになるんでしょうか?よくわからんです。知見のある方がいらっしゃればぜひ教えていただけると幸いです。

研究で詰まっている時におススメな本

こんにちは、品川です。

学生さんが自分の研究の進め方に悩んでいるのを最近(通年)よく見ます。例えば、何をしたら新規性が出るのかとか、指導教員との研究議論や進捗報告のコミュニケーションがうまくいかないといったことです。 こういうところで苦しんだり悩むようになるのは成長の証でもあると思っていて、「ああ~~成長しているんじゃ~~もっと成長した姿を見せてくれ~~」と嬉しくなってしまいますが、具体的な行動としてどのような選択肢をとれば改善できるのかが頭にないと、ただ悩んだだけで何も解決しない可能性もあります。私もできた学生ではなかったので、学生時代ずいぶん四苦八苦していたのですが、そんな中で、私が学生時代に読んでいたor読みたかった書籍で特にためになった本を5冊紹介したいと思います。こういう方法もあるんだということを知ることで、この記事を読まれた学生さんの気持ちが少しでも楽になれば幸いです。

新規性や研究ストーリー構築の方法について

研究の育て方: ゴールとプロセスの「見える化

www.amazon.co.jp

研究を一から組み立てていくためのハウツー本です。良い研究というのはFINER: Feasible(実現可能性), Interesting(面白さ・意義), Novel(新規性), Ethical(倫理性), Relevant(妥当性)の5つの要素を満たしているという話に始まって、新規性には7類型に分けられると紹介しています。著者は医学系の方なので、情報系では評価されにくい場合もあるかと思いますが、新規性にも色々種類があるんだな、研究っていうものは思ってたよりもっと広いんだなということに気づけて、私は気持ちが楽になりました。研究プロセスのロードマップについても含蓄が深かったので、研究のテーマ決めやネタだしに苦労してる方におススメです。

研究の軸をブラさないために研究計画を書く方法、指導教員への研究の進捗報告の方法

成果を生み出すテクニカルライティング

www.amazon.co.jp

研究を進めていて「あれ?私は何を明らかにしたかったんだっけ?」という経験がある方も多いのではないでしょうか?私も経験がしこたまあります。そんな時に、言語化による思考の整理の重要さをうたって、研究を「背景、課題、手段、結果」のマトリックスに分けて、それぞれの要素を対応付けて言語化することを勧めている本です。きちんと「対応付ける」というのがポイントで、これをきちんと守って整理すると、自分の中でも何がしたいかが分かりやすくできるようになりました。これは指導教員と研究の議論をする時もミスコミュニケーションを減らすのに役立ちました。このスキルは社会人になってからも役立つので、誰にでもおススメの一冊です。

博士号のとり方[第6版]―学生と指導教員のための実践ハンドブック:研究生活の過ごし方、指導教員や周りとのコミュニケーションの取り方

www.amazon.co.jp

研究の進め方・研究生活のコツについて書かれた本です。博士課程の学生さんや教員を対象にした修士課程の学生さんにも役に立つ本だと思います。私は特に7章の「指導教員との付き合い方」を読んで、感銘を受けました。学生の心構えとして、指導教員から良いアドバイスをもらうための方法や、指導教員を学生である自分に合わせて教育する必要性について論じています。「教育」という言葉は若干語弊があって、正確には指導教員にちゃんと判断材料になる情報(こういう論文がある・こういう結果が出た・自分はこう考えている・自分はこういう指導が欲しい)を提供して、指導教員を自分に合わせてカスタマイズするつもりで指導教員との議論に臨めってことですね。最初は指導教員の方が知識も経験も上だからといって、どのように研究を進める気でいるか自分で考えずにいると不幸が起きがちです。指導教員を教育するという論点は他の本ではあまりお目にかかれないと思うので、ぜひ読んでいただきたい推しポイントです。

研究の進め方

独創はひらめかない―「素人発想、玄人実行」の法則

www.amazon.co.jp

CMUの金出武雄先生の著書です。ご自身の経験を交えて自説を展開した本なので、人を選ぶ本かもしれないのですが、研究を進める上での大事なエッセンスが詰まっている良書だと思います。私はこの本から、シンプルに素直に考えることが重要であること、問題をどのような切り口で切るかというセンスを養うことが重要であること、考え続けられることが一種の長所であること、イデアは信頼できる相手にどんどん話してこそ練り上げられるものであること、などを学びました。現在の研究スタイルに多大な影響を与えてくれた本です。

妄想する頭 思考する手

www.amazon.co.jp

東大の暦本先生の著書です。まず本に明示的には書いてない前置きとして紹介しておきたいのですが、研究の進め方は大きく二つ、「トップダウン型(リサーチクエスチョン型)」の研究と「ボトムアップ」の研究があるといわれています。トップダウン型の研究というのは、明らかにしたい仮説があり、何をすればそれが明らかになるのかを逆算して進めていく研究です。対してボトムアップ型の研究は、先行研究をベースとしてその課題を見出し、解決するような研究や、既存のものを組合わせて何かやろうとする研究(問題よりも解決方法が先に決まっている研究)を指すものだと、私は解釈しています。一般に、研究ではトップダウン型の研究が好まれ、研究指導でも「トップダウン的に考えよう」という指導が入ることが多いと思います(「トップダウン至高教」と私は呼んでいます)。なぜかというと、ボトムアップ型の研究は、先行研究が課題としていたものの、大して重要ではない研究を解いてしまう恐れや、研究に一貫性が無くなりやすいという危惧があるからです*1。しかし、トップダウンに考えるというのは知識や経験が必要で、研究を始めたばかりの学生さんには難しいものがあります。

暦本先生のこの本では、トップダウンな考え方をベースとして、ボトムアップな考え方も時には柔軟に研究に取り入れるのも大事ということを説いている、と私は解釈しています。
通常の研究プロセスでは、まず最初に研究の問い(課題・仮説)を設定します(Claimと呼びます)。これを設定してから解決法を考えるのがトップダウンに考えるということですが、この本では、実際には解決方法がClaimよりも先に来る場合もあるという点に言及しています。これは(先ほど私が述べた)ボトムアップな考え方です。「解決方法が課題に先行するのは良くない」とされるのが通説*2ですが、この本では解決方法のアイデアが最も活きる課題を考えてみて、時には元の課題にこだわらずにピボットして研究を成立させるのも大事なことだという主張がなされています。他にも重要な課題、もっと面白い課題はあるわけで、それが解決できるのも重要だということです。

他にも以下のようなことへの言及があります。

  • 良さそうなアイデアを思いついたら、うまくいくか考える前にすぐ手を動かしてみよう(GANのストーリーが例に挙がっています。これもボトムアップ的な考え方だと私は思います)。
  • 何が出来たら面白いのか(発想の斬新さ)と技術的な実現可能性の難しさをそれぞれ天使度と悪魔度と表現していて、このバランスが重要という話があります(素人発想、玄人実行に通じる話です)
  • 主張(Claim)の言語化についての方法論(Claimは一言で言えるか、論文はまずアウトラインを書いて都度修正するなど)についても載っています(成果を生み出すテクニカルライティングに通じる話です)

この本は私の学生時代に読むことはできなかったのですが、本当に早く知りたかったです。ちなみに、この本の前身として、暦本先生が関連する講義動画をYouTubeにアップしてくださっています。一般公開されてるのでぜひご覧いただけたらと思います。

www.youtube.com

正直私も、この動画を観るまでに、長く「トップダウン至高教」の呪いに侵されていて、ボトムアップに考えて気軽に手を動かすことができなくなっていました。実際には、トップダウンな考え方とボトムアップな考え方は相補的な関係にあって、ボトムアップな考え方で手を動かすことがトップダウンに考える上での課題設定の修正を行うのに役に立つことがあると学びました。例えば、研究テーマをより明確化するために、先行研究で公開されているコードをいじって遊んでみると、論文だけでは見えなかった問題が明らかになることがあります。これが典型例といえると思います。しかしながら、ボトムアップな考え方だけで研究するのは研究が迷子になってしまう恐れがあるので、暦本先生も「何がこの研究のClaimになるのか考えよう」ということを繰り返し強調されています。

以上です。研究で悩んだり苦しんだりされてる学生さんにとって、状況を打開するヒントになれば幸いです。

*1:アカデミックでは、行ってきた研究が一つのビジョンに従って一貫している方が評価される傾向にあります

*2:イシューからはじめよ、という本があるくらいです

gpt2-japaneseのmediumモデルで架空のNAIST生をD進させてD進後の状況を独白してもらう

こんにちは、品川です。

最近仕事でGPT-2,3について調べてたのですが、日本語GPT-2を作っているプロジェクトのことを知りました。

github.com

見てみると学習済みモデル(small, medium)が公開済みで、fine-tuning用のコードなども揃っておりいたく感動しました。
本記事は生成結果をぜひみてみたいということで試してみたという趣旨の記事になります。

使い方は上記リポジトリのREADMEを読んでいただければ良いかと思います。
contextをオプションで指定することで、contextに沿った生成が可能とのこと。なるほど、ならば架空のNAIST生をD進させてD進後の状況を独白してもらうことも可能・・・?

早速試してみる(この結果はフィクションです)

python gpt2-generate.py \
   --model gpt2ja-medium \
   --num_generate 20 \
   --context="私は奈良先端科学技術大学院大学の博士後期課程に進学してからというもの、"

GPT-2の生成結果でネットが汚れたら嫌だなという良心の呵責が出たので、結果をこちらに置きました。
20名の架空のNAIST生による味わい深いD進、甘酸っぱいD進、闇のD進、色々なD進をお楽しみください。

drive.google.com

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

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

こんにちは、品川です。いよいよこのAdvent Calendarも最終日ですね。
紹介する論文は、引き続きOpenAIの"Fine-Tuning Language Models from Human Preferences (ArXiv, 2019)"です。

PPOによる学習の工夫

ペナルティ項へのターゲットの導入

Policyの学習に用いるペナルティ項の$KL(\pi, \rho)$はseedによって変わるそうなので、設定間で単純な比較が難しくなってしまうようです。論文ではペナルティ項の係数$\beta$を次の式のように適応的に変化できるようにして、$KL(\pi, \rho)$がある目標値$KL_{target}$に近くなるようにする工夫をしています。性能のためというより単に比較のためということのようです。

$e_{t}=\operatorname{clip}\left(\frac{\mathrm{KL}\left(\pi_{t}, \rho\right)-\mathrm{KL}_{\text {target }}}{\mathrm{KL}_{\text {target }}},-0.2,0.2\right)$

$\beta_{t+1}=\beta_{t}\left(1+K_{\beta} e_{t}\right)$

Online data collectionの方法

学習されるpolicy$\pi$はどんどん変化していくので、reward modelもそれに合わせて更新する必要があります。ただし、これはスタイル文生成だとあまり重要ではないようです。

n回目のPPO episodeを始める前に必要とするサンプル数(人間による選択によるラベル付けの数)$l(n)$を次のようにします。

$l(n)=N_{r}^{0}+\left(N_{r}-N_{r}^{0}\right)\left(1-\left(1-n / N_{\pi}\right)^{2}\right)$

  • $N_{\pi}=2 \times 10^{6}$:PPO episodesの総数
  • $N_{r}^{0}=l(0)$:最初からラベルの付いたサンプルの総数
  • $N_{r}$:ラベル付けされたサンプルの総数

もし現状のラベル付きサンプルの総数が$N_{r} < l(n)$ならば、$l(n)+1000 < N_{r}$になるまで、labelerにクエリを投げてラベル付きのサンプルを追加します。

訓練中のvalidationは、訓練データからサンプルした入力文$x$に対して初期分布$\rho(\cdot|x)$と学習中の分布$\pi(\cdot|x)$からそれぞれ2文ずつ生成した4文をlabelerに見せ、分布$\pi$の勝率を計算することによって行うとのこと(最後のモデル評価時の比較も2つのモデルからそれぞれ2文ずつ生成して比較する)

  • クラウドソーシングをするのにScale AIのサービスを使用(クラウドソーシングの代行業らしく、OpenAIやHONDAとかNVIDIAとかが利用しているらしい)
  • agreementを推定するために、5%のクエリは5回別々のlabelerに回答させた
  • 著者らも100サンプルラベリングして比較
  • 正解が曖昧な設定のタスクなので、著者間のagreementは60%。著者がScale AIのlabelerへのagreementはスタイル文生成タスクに対して38%、要約タスク(TL;DL)で46%と厳しめ

実験で用いたモデルの設定

PPOのfine-tuning設定

  • Policyモデルは事前にBookCorpusで教師ありfine-tuning
  • 2Mのエピソード$\left(x, y_{0}, y_{1}, y_{2}, y_{3}\right)$を利用
  • $\gamma=1$ (おそらく割引率)
  • four PPO epochs per batch with one minibatch each (←これの書いてある意味が分からない・・・)
  • 他のパラメータはdefault
  • policyの学習中にdropoutはoff

Policyの初期値となる事前訓練済みのモデル(GPT-2)

  • 774M parameters
  • 36層Transformer, 20 heads, embedding size: 1280
  • WebText dataset (50,257 BPE tokens)で訓練済み
  • 温度パラメータ$T<1$によって生成文に多様性を持たせる工夫あり

Reward model

  • Policyと同じGPT-2の学習済みモデルを初期値とするが、最終層だけはランダムに初期化
  • ポジティブ文継続生成のタスクでは、6層Transformer, 8 heads, embedding size: 512(論文の注釈3を参照)

上記のポジティブ文継続生成のタスクで用いるReward modelは、Amazon review datasetでポジネガの2値分類を学習した学習済みモデル。最終層のsigmoid関数を通す前のlog oddsを報酬$r_{s}(x,y)$とする。

  • 学習率: $1.77 \times 10^{-5}$
  • 1 epoch学習
  • dropoutはoff
  • 最適化関数はAdam

タスクごとの設定

スタイル文継続生成タスク

Policy model

  • batch size: 1024
  • 学習率: $1.41 \times 10^{-5}$
  • GPT-2は$T=0.7$で訓練済みのものを使用

Reward model

  • batch size:8

要約生成

Policy model

  • batch size: 512
  • 学習率: $7.07 \times 10^{-6}$

Reward model

  • batch size:32

比較用ベースライン:教師ありfine-tuningをしたモデル

  • CNN/Daily MailとTL;DRで1epoch訓練
  • 30K examplesはvalidation用に訓練データから分割
  • 学習率はcosine annealing。初期値は$[10^{-4}, 3\times 10^{-4}]$間を対数線形空間上で8つに分割した値で試した
  • dropout rateは色々試して0.1がbest
  • モデル選択はvalidation setで最も良いスコアを基準とした

実験

いくつか結果の分析があるのですが、時間的制約と主張がうまく掴めないものがあったので推せる結果を抜粋して紹介します。

3.1. スタイル文継続生成タスク (Stylistic continuation tasks)

32~64トークン生成した後に24の追加トークンを同じスタイルで文を生成するというタスクです。

KL penaltyの影響

初期方策$\rho$と学習中の方策$\pi$が離れすぎないようにするためのKL penalty項の影響について、ポジティブなスタイル文継続生成タスクでの生成例を比較した結果が付録の表10です。下に一部紹介します。"no penalty / bonus"がペナルティ項なし($\beta=0$)です。"entropy bonus"はペナルティ項ありですが、これは$KL_{target}=30 (nat)$と、目標値のKLが本来の設定($KL_{target}=8 (nat)$)より大きめな設定の場合のようです。

f:id:snowman_88888:20201228183944p:plain
表10(一部):KLに対するpenaltyの影響

"no penalty / bonus"も"entropy bonus"の両方ともですが、生成文には同じトークンの繰り返し現象が頻出しており、言語モデルとして崩壊しているのが分かるかと思います。KL penaltyはいい感じの値を設定するのが必要のようです。

オフライン設定でfine-tuningしたモデル(offline)とfine-tuningなしモデル(zero-shot)の勝率比較

続いて、図4はラベルが増えていくにつれて、オフライン設定のモデルのzero-shotモデルに対する勝率を示した結果です。左図は「positive and happy」な文を選ぶタスク、右図は「vividly descriptive」な文を選ぶタスクでのモデルの比較した結果です。

f:id:snowman_88888:20201228040153p:plain
図4:オフライン設定でラベルを付けして学習させるサンプルの増加に伴う、学習後方策$\pi$ (offline)の初期方策$\rho$ (zero-shot)に対する勝率の推移

図4の結果を見ると、事前学習済みGPT-2の方策$\rho$そのまま(zero-shot)よりも、RLでfine-tuningした方が(人間によるラベル付けデータが$\rho$で生成したサンプルであるオフライン設定といっても)両タスクで結果が良くなっていることが分かります。

オフライン設定でfine-tuningしたモデル(offline)と他の設定との勝率比較

f:id:snowman_88888:20201228042149p:plain
表1:オフライン設定と各設定の勝率の比較

表1は、元の学習済み言語モデル$\rho$からサンプリングして生成して得たサンプル5kによるモデルと各設定の勝率の比較です。下記、上から順に設定変更を追加していったモデルと考えて良いかと思います(ただし、最後の2つは5k offlineからの設定変更)

  • zero-shot:BookCorpusによる教師ありfine-tuningをした学習済み言語モデル(方策)$\rho$(RL前の初期分布)
  • mock:$\rho$を初期方策として、Review corpus(ポジネガ分類タスク)で訓練済みのReward model $r_{s}$によって訓練した方策$\pi$
  • 5k offline:$\rho$から5kのサンプルを生成して人間にラベル付けしたデータをRLの訓練に追加してReward model $r_{s}$と一緒に訓練した方策$\pi$
  • 20k offline:5k offlineのサンプルを20kに増やした場合
  • 5k online:5k offlineのサンプル生成に、学習途中の方策$\pi$を用いた場合

各評価は全1024サンプルで、各サンプルは3人に評価されたとのこと。

表1の結果を見ると、5k offlineで20k offlineと5k onlineと同等という判断が人間によってなされており、イントロにあった「5kで割と十分」という話はここから主張されているようです。オンライン設定にわざわざする必要性もこのタスクではなかったようです。

3.2. Summarization

評価対象にCNN/Daily Mail datasetとTL;DR datasetを利用。

(学習データは?)Redditの投稿からサンプリングし、500トークンを切り取り、 "\n\nTL;DR:" suffixを追加。方策モデルは75トークンまで生成可能。生成した要約は、自然な要約となるように55~75トークンの改行文字以降を切り取ってから人間に評価させる。RL fine-tuning中は、改行の入らない要約文に対して$-1$の報酬(罰)を与えます。

学習は、目的タスクのデータセット教師あり学習してから、RLによるfine-tuningという順番で行ったとのこと。最初からRLもできますが、タスクから離れてしまうので間に目的タスクのデータセットでの教師あり学習を挟むとのことです。

また、タスクごとに以下の設定を追加。

  • CNN/Daily Mail:"Article:\n\n" prefixを追加、温度$T=0.5$、ペナルティ係数$\beta=0.1$
  • TL;DR dataset:温度$T=0.7$、ペナルティ係数$\beta=0.3$

RLの学習中は以下の設定でデータを収集したとのこと。

online データ収集:15k, 30k, 60k
offline データ収集:60k

各設定でのROUGEスコアの比較

f:id:snowman_88888:20201230052929p:plain
表4:各設定でのROUGE

表4は、各設定でのROUGEスコアです。ROUGEは要約でよく使われるN-gramの一致率に基づく評価指標です。R-1とR-2はROUGEで考慮されるN-gramのN=1,2の場合、ROUGE-Lは最長一致部分列に基づく計算方法のようです。R-AVGはよくわかりませんが、他3つの指標の算術平均のようです(試しに2組計算してみたら一致しました)

R-1, R-2, R-Lの参考:ググったら出てきた言語処理学会の論文
投票型回帰モデルによる要約の自動評価法

各設定については以下の通りです。

  • lead-3 baseline:文脈文の最初の3文を単純にコピーした設定。(前述の切り取りルールを適用した後2文になることはある)
  • zero-shot:BookCorpusによる学習済み言語モデル(方策)$\rho$
  • supervised baseline:$\rho$を目的タスクのデータセット教師あり学習
  • supervised + 60k fine-tune:教師あり学習のあとonlineで収集した60kサンプルでのRL fine-tuning
  • 60k fine-tune:教師あり学習なしで、onlineで収集した60kサンプルでのRL fine-tuning
  • 30k fine-tune:教師あり学習なしで、onlineで収集した30kサンプルでのRL fine-tuning
  • 30k fine-tune:教師あり学習なしで、onlineで収集した15kサンプルでのRL fine-tuning
  • 60k offline fine-tune:教師あり学習なしで、offlineで収集した60kサンプルでのRL fine-tuning

太字が最高精度を示しているので、"supervised + 60k fine-tune"が一番良さそうですが、そこまで他の設定と劇的に違うというほどでもなさそうですかね?(私は要約分野には疎いのでなんとも言えないですね・・・)

各設定での人間の主観評価による勝率比較

f:id:snowman_88888:20201230054044p:plain
各設定の勝率の比較

表5は、各設定の勝率を比較した結果です。単純ベースラインの"lead-3"が強いですね・・・。"supervised + 60k fine-tune"はROUGEでこそ勝ちましたが、人間の評価だと"60k fine-tuned"に負けているようです。スタイル継続文生成と異なり、要約ではオフライン設定の"60k offline fine-tune"よりもオンライン設定の"60k fine-tuned"が上回っているようです。それだけ要約が判断難しいタスクなのかなあという印象でした。

原因の分析(省略)

この部分(§3.2.1)は時間の関係でよく読めなかったので省略しますが、基本的にはこのモデルは入力文の色々なところをコピーしてるだけで、Abstractな要約はできてないというのが問題のようです(それはそう)

Challenges

本論文のウリである「オンラインでデータを収集する」という部分の難しさについて書かれていました。感想欄みたいなものでした。せやなあと納得できる項目が多いですが、目新しい事実は無かったです。

よくわからなかったところ

継続的なスタイル文生成のポジネガタスクではReward modelはReview datasetで学習したモデルとGPT-2を使ったもの2種類があると思うのですが、このタスクでは前者のみを使ったのか後者もどこかの段階で使っているのかよくわかりませんでした。

感想

本論文は強化学習手法の一つであるPPOを使って、人間のフィードバックを取り入れながら、GPT-2の学習モデルをオンラインにfine-tuningしていくというお話でした。

しかしながら、継続的なスタイル文生成タスクではオフラインの設定でもいい感じの結果が出るという点、要約タスクはオンラインが有効ながらもそもそもタスクとして難しく、オンラインという手間のかかる設定をしたにしては思ったほど性能は上がっていない点が渋いな・・・という印象でした。

あと、情報が散らばっててとても読みにくかったですが、自分がこの分量の情報を論文としてまとめるとなると、うまいやり方も思いつかなくてこれまとめるの大変やったろうなという感想を持ちました・・・

今回の結果は、論文を読んだ限り著者らとしてもあまり期待したほど印象的な結果ではなかったようでしたが、ちゃんと分析してArXivにアップしてるのは偉いなあと思いました。この下地がNeurIPS2020のタスク設定の工夫につながってるのかなあと思います(NeurIPSの方の論文も暇をみて読みたいところです)

これにて強化学習苦手の会Advent Calendarも無事終了となりました!非常に盛り上がり大変満足です!ご寄稿いただいた皆様、記事を読んでくださった皆様ありがとうございました!もくもく会は来年も続けていきますのでご興味ある方は是非ご参加ください!

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版とのこと)

感想、コメント

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

言語生成の強化学習をやっていく 実験編 REINFORCE編

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

はじめに

こんにちは、品川です。
本記事では、言語生成の強化学習でよく用いられるREINFORCE(baseline あり/なし)による結果を前回のSelf-Criticの結果と比較しながら見ていきたいと思います。
Self-CriticはREINFORCEの派生的な手法で、REINFORCEのbaselineをgreedyに生成した文による報酬とすることで、REINFORCEの分散が大きい問題を緩和する手法です。期待する結果としてはREINFORCE w/o baseline < REINFORCE w/ baseline < Self-Criticとなることが期待されます。

REINFORCEへのコードの改変

ベースとするコードは前回と同じものを用いました。
github.com

これは元々Self-Criticのコードなので、w/ & w/o REINFORCEへの改変を行うために、captioning/utils/rewards.pyget_self_critical_rewardを以下のように改変しました。

def get_self_critical_reward(greedy_res, data_gts, gen_result, opt):
    
    ...

    scores = opt.cider_reward_weight * cider_scores + opt.bleu_reward_weight * bleu_scores

    # Self-Critic
    # scores = scores[:gen_result_size].reshape(batch_size, seq_per_img) \
    #             - scores[-batch_size:][:, np.newaxis]

    # variant: REINFORCE with baseline
    scores = scores[:gen_result_size].reshape(batch_size, seq_per_img) \
                   - scores[:gen_result_size].mean(keepdims=True)[:, np.newaxis]

    # variant: REINFORCE without baseline
    # scores = scores[:gen_result_size].reshape(batch_size, seq_per_img)

    scores = scores.reshape(gen_result_size)

    rewards = np.repeat(scores[:, np.newaxis], gen_result.shape[1], 1)

    return rewards

ちょっとややこしいのですが、scoresはgen_result_size分のサンプリングして生成した文とbatch_size分のgreedyに生成した文がつながっているarrayだったので、こんな形になっています。
REINFORCE w/ baselineのbaselineには、サンプリングして得られた文による報酬のサンプル平均を用いていることになります。

実験設定

実験設定は、前回の記事の「強化学習あり(Self-Critic)」の設定と同じです。前述のコード改変部分のみが変わっています。

学習結果

前回と同様に、3000イテレーションごとに、validation set 5000サンプルに対してBLEU、CIDEr(正確にはCIDEr-D)SPICE、train/validation lossを計測してみた結果は以下の通りです。青がSelf-Critic濃いピンクがREINFORCE w/ baseline水色がREINFORCE w/o baselineの結果になります。

BLEU(単語n-gramの一致率、高いほど良い)

BLEUは学習経過と共に上昇
BLEUスコアの推移

CIDEr (CIDEr-D) (TF-IDFも考慮した単語n-gramの一致率、高いほど良い)

CIDEr-Dは学習経過と共に上昇
CIDEr-Dスコア

SPICE(シーングラフの一致率、高いほど良い)

SPICEはおおむね上昇傾向
SPICEの推移①

SPICEはおおむね上昇傾向
SPICEの推移②

train/validation loss

train/validation lossは一度下降してから徐々に上昇
train/validation lossの推移

train lossの拡大版(cross entropyから強化学習に切り替わるあたりから)

train lossの推移(拡大版)

BLEUやCIDEr、SPICEは概ね期待通りREINFORCE w/o baseline < REINFORCE w/ baseline < Self-Criticという感じでした。REINFORCE w/ baselineは割といい線いってましたが、最後の方で若干Self-Criticに差をつけられた形になりました。train lossについても、Self-Criticの方が中盤から後半にかけて常に若干優勢で0に近いという結果でした。

サーベイ論文にはSelf-Criticを使った手法がたくさん載っていましたが、今回の結果では確かにSelf-Critic使っとけば良さそうという結果でした。
バッチサイズを増やした影響か、収束まで学習させられてなかったのでこれで性能の上下を断言するのはちょっと厳しい感じがありますが、少なくともbaselineあり/なしの差はそこそこあるようです。
REINFORCE w/ baselineSelf-Criticにあまり大きな差が見られなかったのは、バッチサイズの増大により確率勾配の分散が低減された影響もあるのではないかと思います。バッチサイズを下げた状態だと、より差が浮き彫りになるのかもしれません。

収束するまでの結果と、batch sizeを下げた結果は、また後日追記できればいいなあと思います(やるとは言ってない)

本日はここまでです。次回はDQNを新たな仲間に加えてActor-Criticにした場合の結果を見てみたいと思います(果たしてやる余裕があるのか・・・)