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

こんにちは、品川です。

学生さんが自分の研究の進め方に悩んでいるのを最近(通年)よく見ます。例えば、何をしたら新規性が出るのかとか、指導教員との研究議論や進捗報告のコミュニケーションがうまくいかないといったことです。 こういうところで苦しんだり悩むようになるのは成長の証でもあると思っていて、「ああ~~成長しているんじゃ~~もっと成長した姿を見せてくれ~~」と嬉しくなってしまいますが、具体的な行動としてどのような選択肢をとれば改善できるのかが頭にないと、ただ悩んだだけで何も解決しない可能性もあります。私もできた学生ではなかったので、学生時代ずいぶん四苦八苦していたのですが、そんな中で、私が学生時代に読んでいた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にした場合の結果を見てみたいと思います(果たしてやる余裕があるのか・・・)

言語生成の強化学習をやっていく 実験編 強化学習なしとSelf-Criticの比較

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


追記 2020.12.15:loss計算の式を以下のように変更しました。

  • (修正前):$loss = -\underset{\hat{Y} \sim \pi_{\theta}}{\mathbb{E}}\left[\left( r(\hat{Y}) - r_b \right) \right]$ (ただし、$r_b = r(\hat{Y}_{greedy})$)
  • (修正後):$loss = -\underset{\hat{Y} \sim \pi_{\theta}}{\mathbb{E}}\left[ \left( r(\hat{Y}) - r_b \right) \log \pi_{\theta} \right]$ (ただし、$r_b = r(\hat{Y}_{greedy})$)

はじめに

こんにちは、品川です。
以前の記事で強化学習の言語生成の方法について紹介しました。
本記事では、実験を通して実際に言語生成の強化学習がどのような結果になるのか見ていきたいと思います。

使ったコード

github.com

強化学習なしモデルと強化学習あり(Self-Critic)モデル

今回は、ベースラインのモデルとして、こちらのリポジトリのREADMEで紹介されているfcモデルを用いました。こちらはResNet101で抽出した画像特徴量を毎時刻単語トークンと一緒にLSTMへ入力するシンプルなモデルとなっています。(自前でも同様の設定のを実装していましたが、結局思ったような精度が出なかったので泣く泣くこちらを使いました・・・)

こちらはSelf-Criticの再現実装がメインコンテンツとなる非公式リポジトリのようですが、Transformerなど最近のモデルの実装もあってimage-captioningを始めるのにおススメかもしれません。

本記事では、このリポジトリでサポートされている強化学習なしと強化学習あり(Self-Critic)の設定で学習を回して比較してみます。

コードの動かし方:

# 強化学習なしのモデルの学習
python tools/train.py --cfg configs/fc.yml --id fc

強化学習あり(Self-Critic)のモデルの学習
python tools/train.py --cfg configs/fc_rl.yml --id fc_rl

実験設定

実験設定として、メモリをあまり食わなかったのでバッチサイズを大きくして実験しました。(この時は研究室の共用のマシンを使ってたので小さいバッチサイズは気が引けた)

強化学習なし

  • GeForce GTX 1080Ti×1 (実際に使用したメモリは5,000 MiB+α程度)
  • epoch: 30 (default)
  • batch size: 10(deault)→256
  • pre-trained image feature extractor: ResNet101 (default)
  • learning rate decayあり(以下の通り)(default)
  • scheduled samplingあり(以下の通り)(default)

learning rate decay

学習率は段階的にステップで減少させた
学習率の推移

scheduled samplingする確率

scheduled samplingを行う確率を段階的に上昇させた
scheduled samplingする確率

強化学習あり(Self-Critic)  

  • GeForce GTX 1080Ti×1 (実際に使用したメモリは5,000 MiB+α程度)
  • epoch: 50 (強化学習なし 30 epoch + RL 20epoch) (default)
  • batch size: 10(deault)→256
  • pre-trained image feature extractor: ResNet101 (default)
  • learning rate decayなし ($5.0 \times 10^{-5}$で固定) (default)
  • scheduled samplingなし (default)

学習結果

3000イテレーションごとに、validation set 5000サンプルに対してBLEU、CIDEr(正確にはCIDEr-D)SPICE、train/validation lossを計測してみた結果は以下の通りです。(perplexity, entropyは計算が間違ってる説があったので無視しました)オレンジが強化学習なし青が強化学習あり(Self-Critic)の結果になります。

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

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

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

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

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

SPICE以外のSPICE_なんやらかんやらは、私は知らなかったのですが、一応載せておきます。(元のSPICEはシーングラフのObject, Attribute, Relationをカウントしていたと思いますが、このSPICEは他の要素も計算しているっぽい・・・?)

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

train/validation loss

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

強化学習なし」のみ拡大版

train/validation lossの推移(「強化学習なし」のみ拡大版)

BLEUやCIDEr、SPICEが概ね継続的に上昇している一方で、 train/validation lossは一度減少してから上昇しました。強化学習なし(オレンジ)のlossは一見過学習している曲線のよう見えますが、scheduled samplingの影響でむしろteacher forcing形式への過学習が抑制された結果こうなっているのかなと考えられます。

強化学習あり(Self-Critic;青)のtrain lossは途中で負のlossが発生していて奇妙に見えますが、ここはlossの計算がcross entropyからrewardに切り替わったためでした。期待報酬の最大化は負の期待報酬の最小化に相当するので、これをlossの値として算出しています。前のREINFORCE紹介編の記事に沿って書くと、 以下のようになります。

$loss = -\underset{\hat{Y} \sim \pi_{\theta}}{\mathbb{E}}\left[ \left( r(\hat{Y}) - r_b \right) \log \pi_{\theta} \right]$
(ただし、$r_b = r(\hat{Y}_{greedy})$)

ということで、greedyに生成した文によるCIDErスコアであるベースライン$r_b$によっては負になる場合もあるわけですね。lossが0になるということは、サンプリングした場合の文とgreedyに生成した場合の文が近くなっていると解釈すれば良さそうです。

総合的な結果としては、強化学習なし(オレンジ)よりも強化学習あり(Self-Critic;青)の方が概ね優勢のようです(まだこの先はどうなるか分からないですが)

参考値

ちなみに、リポジトリで公開されている結果だと、以下のようなスコアになるようです。

CIDEr-D SPICE
強化学習なし 0.953 0.1787
Self-Critic 1.045 0.1838

生成例

生成例でもいくつか比べてみました。()内の評価は私の主観です。

生成例1(強化学習なし < Self-Critic)

f:id:snowman_88888:20201214194648p:plain

生成文
強化学習なし a person holding a piece of pizza in a hand
Self-Critic a bowl of broccoli on a plate with a table

Self-Criticでは、plateに野菜が乗ってる感が出てきています。

生成例2(強化学習なし < Self-Critic)

生成文
強化学習なし a close up of a bird on a branch
Self-Critic a piece of cake sitting on top of a plate

強化学習なしでは" bird on a branch"が出てきていましたが、Self-Criticではplateが出てきました。cakeはまあ、いくら丼はキラキラしてるしcakeと判断されるのはわかりみがありますね(piece of cakeとは)。

生成例3(強化学習なし = Self-Critic)

f:id:snowman_88888:20201214195151p:plain

生成文
強化学習なし a person is on a snowboard in the air
Self-Critic a man riding a wave on a surfboard in the ocean

ある忍者村で撮った写真です。空中に浮かんでいるのがスノボやサーフィンをしているように見えたようです。背景は空中なので、強化学習なしの方が若干正しい感じですね。

生成例4(強化学習なし = Self-Critic)

生成文
強化学習なし a person holding a pair of scissors in a hand
Self-Critic a man holding a pair of scissors on a pair of scissors

結構多かったのですが、人間の写っている画像ではscissorsを執拗に出してくる傾向にありました。そんなにハサミを使っている人間が多かったのか・・・

生成例5(強化学習なし > Self-Critic)

f:id:snowman_88888:20201214195621p:plain

生成文
強化学習なし a red and white fire hydrant sitting on a lush green field
Self-Critic a teddy bear sitting on top of a table

Self-Criticは謎にteddy bearを生成しています。何が見えているんだ・・・

生成例2(強化学習なし > Self-Critic)

生成文
強化学習なし a large clock tower with a sky background
Self-Critic a dog sitting on top of a traffic light

Self-Criticでは、 謎にdogが出てきています。

感想

生成文について

  • Self-Criticの方が、少し長めで多様な文を生成してくれてる傾向があった
  • Self-Criticの方が、"a person"を"a man"や"a group of xx"など、より具体的な表現にしてくれる傾向があった

全体的な感想

  • Self-Criticの影響は、生成文を見ても割と大きそう
  • scheduled samplingはしなくても、強化学習を使ってfine-tuningすれば良さそう

次回はコードをREINFORCEに改造してみて結果がどうなるか見てみたいと思います。

言語生成の強化学習をやっていく(手法紹介 Actor-Critic編②)

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

言語生成の強化学習 参ノ型 「Actor-Critic with Q-learning」

Deep Q-learningについて書くと言ったな、あれは嘘だ。言語生成の強化学習では方策$\pi$を方策勾配法で更新したいというモチベーションがベースになっているようなので、Q-learning単体の手法はサーベイ論文の方には載っていませんでした。Actor-CriticのCritic部分をQ関数の推定器で置き換えるという話はあるようですのでこちらを紹介したいと思います。

ちなみに、Q-learningを使う手法自体があんまり言語生成だとメジャーではないっぽいですね。論文によると、

Aside from these issues, there are problems inherent to specific applications that make it hard for researchers to combine RL techniques with current seq2seq models. For instance, in most of the NLP problems, the output or action space is massive comparing to the size of actions in a robotic or game-playing problems.
Deep Reinforcement Learning For Sequence to Sequence Models

とのことで、要するに「(Action space)デカ過ぎんだろ・・・」というのが問題のようです。おそらく学習が難しくなるのだと思います。

一応メリット的なものもあったので紹介しておくと、Q関数の推定器$Q_{\Psi}(s,a)$は状態$s$を入力として各行動$a$についての行動価値$Q(s,a)$を推定するので、推論時にもこれを活用することで推論時の出力を制御できるとのことです。以下、2つ紹介します。

[164] Decoding with Value Networks for Neural Machine Translation (NIPS2017)

タスクは機械翻訳です。Value network $v(s,a)$(Q関数の推定器であり、状態価値関数の推定器ではない)の導入によるActor-Criticへの拡張を行ったとのこと。推論時には予測確率に推定器$v(s,a)$で重みづけする方法を提案しています。このValue network $v(s,a)$はちょうどDQNの形をしているのかと思われます。

追記 2020.12.16 こちら、Actor-Criticではなかったです・・・Criticのみの導入ですね。Q学習の導入と言った方が良さそうです。

$\beta \times \frac{1}{|a|} \log P(a \mid x)+(1-\beta) \times \log v(s, a)$

ここで、$\beta$はハイパーパラメータです。実験ではcross validationで$\beta$を決めており、$\beta=0.8,0.85,0.9$でBLEUが良かったとのこと。$\beta=1.0$の結果が私気になります!全体的な性能向上はbeam searchと比べてBLEUが1.0ポイント程度の改善なのですが、当時は大きなインパクトがあったのでしょうか???

[167] Learning to Decode for Future Success (ArXiv)

タスクは機械翻訳と要約です。状態$s$を入力として生成する残りのトークン数を推定する状態価値推定器$V(s)$を利用したActor-Critic手法です。
「Q関数使ってないやんけ!」と思われるかもしれませんが、この手法では状態価値推定器$V(s)$を使って、ある意味力技で行動価値推定器$Q(s,a)$を表現します。
つまり、あるトークン$a$が生成されたと仮定して、これを次のRNNの入力として更新した隠れ層$h$(状態$s$)から、行動$a$をした時の価値$V(s)$(つまり$Q(s,a)$)が計算できるので、これを全語彙に対して行っているわけです(ほげ~~~)

推論時は、このQ関数の項を追加することで、長さに合わせてトークンを選択するのに役立つとのことでした。

目標とするになる長さを$N$とすると、以下のようになるようです。
$y_{t} = \underset{y}{\arg \max } \log p\left(y_{1: t} \mid X\right) -\lambda\left|(N-t)-Q\left(h_{t}\right)\right|^{2} $
残りの長さ$N-t$から離れてしまうトークンに対して、予測確率にペナルティを課すという形のようです。$λ$はハイパーパラメータです。生成結果は長さがイイ感じになってるのか私は結果から判断できませんでしたが、 repetition現象が抑えられてるなという印象でした。

他には、Actor-Criticを安定させるための学習時のテクニック的な話もありました。

[39] An Actor-Critic Algorithm for Sequence Prediction (ICLR2017)

RNNベースのCriticを提案しており、CriticはDQNと同様各語彙のQ値を直接推定するモデルとなっています。

Delayed actor

元々はContinuous control with deep reinforcement learningで提案された手法です。Actorの重みの更新を徐々に更新する手法です。ActorとCriticは交互に学習しているため、Actorの更新が激しいとCriticがちゃんと学習できない問題を解決するために考案されたようです。Fixed target networkとモチベーションは同じですね。前述の論文では"soft" target updateという呼び方をしていました。

Dealing with large action spaces

Action spaceを削減するために、Criticに以下の制約項$C$を追加する手法です。解釈としては、レアなトークンに対してペナルティを与えるようになっています。これによりCriticの推定が安定するようです。多様性を犠牲にしてしまうようにも見えますが、これはよくやられるんですかね?(よくわからん)

$C_{t}=\sum_{a}\left(\hat{Q}\left(a ; \hat{Y}_{1 \ldots t-1}\right)-\frac{1}{|\mathcal{A}|} \sum_{b} \hat{Q}\left(b ; \hat{Y}_{1 \ldots t-1}\right)\right)^{2}$

Reward shaping

言語生成の強化学習では遅延報酬しかないという話をしたと思いますが、それだと報酬がスパース過ぎるということで、遅延報酬を切り崩して即時報酬として段階的に与えるようにするという手法です。 生成された系列$\hat{Y}$のスコア(BLEUとか)を時刻ごとに計算して差分を即時報酬とするとのことです。

$r_{t}\left(\hat{y}_{t} ; \hat{Y}_{1 \ldots t-1}\right)=R\left(\hat{Y}_{1 \ldots t}\right)-R\left(\hat{Y}_{1 \ldots t-1}\right)$

[55] Fast Abstractive Summarization with Reinforce-Selected Sentence Rewriting (ACL2018)

サーベイ論文で紹介されていた学習激早論文です。これの紹介は後日やろうかなと思います(時間がなかった)。要約タスクのようですが、性能も他と比べて悪くないので良さそうです。

追記 2021.02.28 読みました。要約タスクにおいて学習を早める工夫は、Abstractive summarizationにおけるExtractor agentによる文選択とabstractor networkによる文生成の2段階にしている点が大きそうです。強化学習自体は文選択でROUGEを最大化するのに用いており、文生成に使っているわけではありませんでした・・・

DQNとDDQNとDueling networkについて

力尽きたので割愛します・・・言語生成における特別な話はないので、ご容赦願えれば幸いです・・・

まとめ

言語生成の強化学習に興味があって2ヶ月ほど少しずつ勉強を進めてきました。
現状の立ち位置としては、最後にfine-tuningするのにREINFORCEないしはその派生形を使うことが標準的で、CriticにQ関数を使ったDQNのような形は意外とこの時点ではあまり出てきていない(おそらく語彙サイズの問題で学習が難しくなってる)という印象でした。ただ、[55]の論文のようにまだ発展形があるようですので継続して勉強を進めていきたいと思います。