🤖

ChatGPTはどのように学習を行なっているのか

2022/12/06に公開2

はじめに

ChatGPTのインパクトが個人的にすごかったので、どういった学習が行われているのか、どういう課題があるのか等を理解しようと思い、OpenAIの記事をベースに情報をピックアップしてざっとまとめました。

あくまで私なりの解釈で情報を整理してまとめたものになりますので、いくつか専門性の低い分野に対しては曖昧な記述になっていたり、理解を誤って記載しているかもしれません。

もし間違い等がありましたらご指摘いただけると大変ありがたいです。

ChatGPT: Optimizing Language Models for Dialogue

参考

https://openai.com/blog/chatgpt/

ChatGPTは、OpenAIによって開発された、対話に特化した言語モデルである。

特徴としては、

  • 前の対話内容に続く質問への回答が可能。
  • 間違いを認めることもできる。
  • 正しくない前提に対する異議を唱えることもできる。
  • 不適切なリクエストには応じない。

といった点がある。

ChatGPTとの対話サンプル

USER
help me write a short note to introduce myself to my neighbor

CHATGPT
Hi there,

My name is [Your Name] and I just moved in next door. I wanted to reach out and introduce myself. I’m looking forward to getting to know you and the neighborhood. If you ever need anything or just want to chat, please don’t hesitate to stop by or give me a call.

Best,
[Your Name]

USER
can you make it more formal?

CHATGPT
Dear Neighbor,

I am writing to introduce myself. My name is [Your Name] and I have recently moved in next door. I wanted to take a moment to reach out and say hello. I am looking forward to getting to know you and the neighborhood.

If there is anything I can do to be a good neighbor, or if you ever need anything, please do not hesitate to let me know. I am happy to help in any way that I can.

Sincerely,
[Your Name]

USER
can you send it for me?

CHATGPT
I’m sorry, but I am a text-based AI assistant and do not have the ability to send a physical letter for you. I can only provide suggestions and advice on what to write. It is up to you to take that advice and send the letter yourself.

引用元:https://openai.com/blog/chatgpt/

ChatGPTを理解するための前提知識

概要を理解するのに最低限必要かつ重要と思われるものをピックアップしてまとめてみました。

※GPT3や強化学習の基本概念についてはここでは省略します。

Safe AI

参考

https://arxiv.org/pdf/1606.06565.pdf

  • AIが急速に発展していく中で、社会にもたらす(ネガティブな)潜在的インパクトの一つに「AIシステムの設計の中の欠陥による、意図しない攻撃的な行動」という要素が挙げられる。

  • この論文ではAIがもたらす危険性に繋がりうる5つの研究課題という形で分類されている。

    1. Avoiding Negative Side Effects

      最適化の結果、環境に悪影響を及ぼしうるAIになってしまう危険性。

      お掃除ロボットが掃除の効率を求めるあまり、部屋にあるあらゆる物を破壊して移動するよう学習してしまうことを防げる保証はあるか?ルールベースで指定する以外にモデルにそのことを教えることは可能か?といったような観点。

    2. Avoiding Reward Hacking

      最適化したい目的関数(報酬)をAIがハックしてしまう危険性。

      お掃除ロボットの最大限の報酬(達成したい目標)が「ゴミの数が0の環境」だとすると、ゴミをゴミと認識しないようにするorゴミをゴミ以外のもので覆い隠すor人間がいるときだけ隠す といったことでも、システム上目的を達成したことにできてしまう恐れがあるといったような観点。

    3. Scalable Supervision

      AIが学習する過程で、評価にコストのかかる状況を効率良く処理できないといった危険性。

      お掃除ロボットがゴミと思われるものを認識した時、それが実は人の所有物だったり捨ててはまずいものである可能性もある。しかし、それを捨てるべきかどうかを判断するのに毎回人間に問い合わせをすることは効率悪い。といったような観点。

    4. Safe Exploration

      最適化を行うプロセスにおける探索のフェーズで、環境に悪影響を及ぼしてしまう危険性。

      お掃除ロボットがモップをかけるための最適なルートを新たに探索するため、普段は通らないであろう場所を通るときに、そこに置いてある電子機器などに濡れたモップをかけてしまうのは避けなければならない。といったような観点。

    5. Distributional Shift

      学習環境と実際に稼働させる環境が異なると、目的達成の頑健性を失ってしまう危険性。

      オフィス環境で学習したお掃除ロボットを工場の床で稼働させると、危険を伴う入ってはいけないところに侵入したりするかもしれない。といった観点。

  • 1, 2については目的関数の設計の課題、3については目的関数の計算コストの課題、4, 5は学習の過程における想定外の振る舞いに対する課題というように分類される。

ChatGPTにおいては主に目的関数の設計の課題にフォーカスしたモデルの構築を行っている。

Reinforcement Learning from Human Feedback

参考

https://openai.com/blog/deep-reinforcement-learning-from-human-preferences/
https://arxiv.org/abs/1706.03741

“安全なAI”を構築するには、人の手による目的関数の設定というプロセスを省く必要がある。達成したい複雑な目的をシンプルな目的関数として落とし込もうとすること、あるいは達成したい目的をその複雑さ故取り違えてしまうことは、想定しない危険を孕むAIの振る舞いに繋がってしまうからだ。

そのアプローチとして、「行動の候補となる2つの選択肢を提示して人間ならどうするかを推察する」ようなタスクを導入し、人間のフィードバックを強化学習の環境に与えながら学習するアルゴリズムReinforcement Learning from Human Feedbackを提案。

以下のような人間-エージェントの目標理解-RLモデルの学習の3-step feedbackサイクルによって学習が行われる。

https://openai.com/content/images/2017/06/diagram@2x-2.png
https://openai.com/blog/deep-reinforcement-learning-from-human-preferences/

  • まずエージェントはランダムに環境に対する行動を2つ選択する。
  • その後、環境に対してその選択を実行した場合の結果2パターンを表示し、人間がそれを見て目的達成に近づくと判断できる方を選択しFBする。
  • モデルはこのステップごとに人間の判断を最もよく説明する報酬(目的)関数を探り、タスクの目的を達成するための学習を行う。
  • さらに学習のステップが進むにつれ選択する行動が良くなってくると、モデルはどちらの行動を選択して良いか自信がない時に限って、人間のフィードバックを得るように働きかける。
  • この方法で下記のようなbackflipのタスクについての学習を進めたところ、少ない人間からのフィードバックで十分な学習を行うことができた。
    (バックグラウンドのモデル学習に費やした70時間の学習時間に対して、人間の評価者に費やしてもらう必要があったのは1時間未満だった。)

https://www.youtube.com/watch?time_continue=39&v=oC7Cw3fu3gU

他にもAtariドメインの様々なタスク[1]に対して、同様に目的関数を固定化することなく人間のFBを得ながら学習させたところ以下のような結果になった。
(右の上下に動くバーは、それぞれのステップにおいてどれくらい人間からのフィードバックに沿った動きになっていそうかという自信度を表している)

https://openai.com/content/images/2017/06/seaquestsave.gif

  • また、必ずしもエージェントの置かれた環境のルールに従った形で報酬を最大化すること目指さなくても良い。
    例えば、以下のようなEnduro(2Dレーシングゲーム)において、相手を追い抜かずに一定距離空けてで追尾させるようにしたければそのようなFBを与えることでアルゴリズムは目的関数を組んでくれる。

https://openai.com/content/images/2017/06/enduro.gif

backflipのタスクで人力で目的関数を探し当てることも試したところ、2時間かけて下のような結果となった。比較してみると、人力で目的関数を設定した場合よりも、Human Feedbackによるアルゴリズムの学習結果の方がよりエレガントな動きを習得できているように見える。
その他多くのケースでもHuman Feedbackによるアルゴリズムの方が、人力で目的関数を設計するよりも、より直感的な目的関数をより素早く発見できると考えられる。

def reward_fn(a, ob):
    backroll = -ob[7]
    height = ob[0]
    vel_act = a[0] * ob[8] + a[1] * ob[9] + a[2] * ob[10]
    backslide = -ob[5]
    return backroll * (1.0 + .3 * height + .1 * vel_act + .05 * backslide)

Human Feedbackによる結果
Human Feedbackによる結果

人力で目的関数を設定した結果
人力で目的関数を設定した結果

課題

  • このアプローチでは、基本的には人間の評価者以上の性能は発揮できないと考えられるため、人間の評価者がタスクに対するドメイン知識が足りなかったり、経験が足りない場合はモデルの性能も良くならない。

  • ドメインによってはエージェントは評価者を欺くようなポリシーを構築する可能性がある。例えば以下のタスクでは、ボールをつかむことが目標なのだが、エージェントはボールを掴んだように見せかける行動を示しており、評価者側からしたら見間違えてしまいそうな行動を最適なものとして学習してしまう恐れがある。

    https://openai.com/content/images/2017/06/gifhandlerresized.gif

    このようなタスクでは評価者がエージェントの行動結果をより理解しやすくするようにする必要がある。(上の例では白い十字を補助的に表示してエージェントの深度の位置を把握しやすくしている。)

Policy Network & Policy Gradient Optimization

参考

http://karpathy.github.io/2016/05/31/rl/

エージェントの判断を司るPolicy Networkは、入力として環境の状態(state)を受け取り、次に取るべき行動(action)を出力する。

例えば入力が画像データ形式だとすると、以下のように中身はDense Layerからなるニューラルネットで、出力にactionに対する確率値を返すLayerを持つようなモデルが考えられる。


引用元:http://karpathy.github.io/2016/05/31/rl/

1エピソード(例. 1ゲームの開始から勝ち負けが決まるまで)における一連の各環境の状態に対する行動による結果に対し、最終的な報酬(例. 勝ちor負け)の値を教師ラベルとして誤差伝播によるネットワークのパラメータ更新を行う。


引用元:http://karpathy.github.io/2016/05/31/rl/

各状態の行動結果の対数確率の値を最適化する際に、最終的に得られた報酬の値を教師ラベルとして誤差逆伝播法によるパラメータ更新を行う。

上記の更新を何百回、何千回・・・と繰り返すことで徐々にモデルは”勝ち”に繋がりやすい行動を取る確率が高く、”負け”に繋がりやすい行動を取る確率が低くなるように学習していく。

エピソードを繰り返してパラメータを更新することで、ある状態における行動が勝ちに繋がりやすいものは、”勝ち”のラベルの方が”負け”のラベルよりも徐々に増えていく(逆も然り)。
よって、最終的にPolicy Networkは全体平均として勝ちに繋がるような行動を選択する可能性が高くなっていく。

Proximal Policy Optimization

https://openai.com/blog/openai-baselines-ppo/

https://arxiv.org/abs/1707.06347

OpenAIによって提案された強化学習の最適化アルゴリズムで、従来のPolicy Gradient Methodよりもパフォーマンス・使いやすさといった点で優れたものとなっている。

  • 従来のDeep Reinforcement Learningで使われていたPolicy Gradient Methodは以下のような課題があり、扱いが難しい側面があった。
    • step size(状態を何個ずつまとめて見るか)の調整が難しい
      • 小さすぎると学習が全然進まない
      • 大きすぎるとノイズ(関係のない行動)の影響が大きくなりすぎて、性能に悪影響が出る
    • 単純なタスクでも学習を十分に進めるには数百万以上のオーダーでエピソードを回さなければならない。
  • サンプルごとのパラメータの更新に対して、パラメータの値に応じた制約をかけて目的関数の最適化を行う新たな手法の提案を行った。

    引用元:https://openai.com/blog/openai-baselines-ppo/
    • 詳細はこちら
    • 更新前後の目的関数の出力の比を計算し、その値が一定以上にならないようクリッピングを行うことで、報酬の期待値が極度に大きくなる場合でもパラメータの更新幅を抑えながら学習を進められるようにしている。
      • 上記の課題に対する部分では、step sizeを大きくしても、ノイズ部分に対するパラメータの更新が大きくなりすぎないようクリップを行うことで、性能の安定化が図れる。といったところが狙い?
  • MuJoCo[2]のタスクに対して、100万ステップ学習させた結果の比較。他の最適化手法に比べてPPOの方が最適化に要するステップ数も少なく、パフォーマンスも良い傾向にあることが見て取れる。


引用元:https://arxiv.org/abs/1707.06347

  • PPOによるPolicy最適化で以下のような3D Humanoidの動きを制御するタスクも学習可能。

https://cdn.openai.com/openai-baselines-ppo/flagrun-keyboard-control.mp4

InstructGPT

参考

https://openai.com/blog/instruction-following/
https://arxiv.org/pdf/2203.02155.pdf

  • ユーザーの意図に沿った、より信頼性があり害の少ない結果を返すような言語生成モデルを学習させることを目標に提案されたもの。

  • GPT3の大きな問題に、信頼性の低いテキストや有害なテキストを生成する恐れがあるというものがあった。(GPT-3はネット上から収集された大規模なテキストデータを学習に用いており、ユーザーが期待する結果を安全に返してくれる保証はなかった)

  • そこで上記のReinforcement Learning from Human Feedbackのアプローチで、入力プロンプトに対して出力された生成結果をいくつか用意し、適切なものであると思われる順に人間の評価者にランク付けしてもらうことで、一連のデータを入力の流れに沿った、より安全でユーザーの役に立つ形のデータセットを作成。

  • ランク付けしたデータセットを使ってGPT-3モデルをファインチューニングさせる。

  • 人間の定性的な評価では、1.3Bのパラメータを持つInstructGPTは175Bのパラメータを持つGPT-3よりも好ましいテキストを返すという評価結果になった。

  • また他のNLPのベンチマークタスクに対する精度的にも、GPT-3と同程度の性能を発揮できることも示された。

どれくらい上手くいったのか?

定性的な評価

InstructGPTとGPT-3それぞれのモデルによって生成された結果を評価者にレビューしてもらった結果。
GPTのプロンプトにprefixを追加して”instruction-following mode”にした場合=GPT(prompted)でもInstructGPTには敵わなかった。

安全性の評価

下記ベンチマークデータセット及びOpenAIのAPI経由で収集したデータセットに対して既存の指標による評価を実施した。

  • RealToxicity
    入力プロンプトに対して、生成した結果の有害性を評価するためのベンチマーク。

https://www.semanticscholar.org/paper/RealToxicityPrompts%3A-Evaluating-Neural-Toxic-in-Gehman-Gururangan/399e7d8129c60818ee208f236c8dda17e876d21f

  • TruthfulQA
    ある程度の人間が間違えやすい形式の質問を入力としたときに、モデルは正しい回答をきちんと生成できるかを評価するためのベンチマーク。

https://arxiv.org/abs/2109.07958

  • また、APIで入力されたプロンプト群に対する生成結果が、事実と異なる内容となっていないか(hallucinations)や適切な内容となっているか(appropriateness)を人間によって評価した。

評価結果は下記の通り。

総じて、InstructGPTはGPTよりも信頼性の高さや、有害性の低さという観点で上回っている結果となった。

Methods

  1. GPT3モデルに対する教師ありデータでのファインチューニング
  2. 1.のモデルによるプロンプトに対する生成結果を人間によってランク付したデータセットを作成
  3. 2.のデータセットを使って報酬モデルをProximal Policy Optimizationによって学習

のステップで入力プロンプトに対する適切な回答を生成するよう学習を進める。
(詳細は後述)

Dataset

プロンプトデータセットは以下のような形で用意。

  • Plain: 人間に多様なタスクを任意に考えてもらう

    例.

    ユースケース:brainstorming 
    
    プロンプト:
    List five ideas for how to regain enthusiasm for my career
    
  • Few-shot: タスクとその回答を数パターン考えてもらい、それらの組み合わせでデータセットを用意。
    例.

    ユースケース:brainstorming 
    
    プロンプト:
    Baby name ideas for a boy:
    1. Alfred
    2. Theo
    3.
    
  • User-based: 実際にOpenAI API利用ユーザーのユースケースをピックアップし、それらに関するプロンプトを考えてもらう。この時、匿名性を担保するため、利用ユーザーの具体的なアプリケーションが特定されうる情報は人の手で表現を修正したりすることで排除。

ラベリング

  • ラベリングは人を40人程度雇って実施。
  • 適切な回答を作成するのが得意な人、回答の信頼性や有害性を評価するのが得意な人を事前にスクリーニングして、それぞれに適したラベリングタスクを割り当てた。
  • PlainやUser-basedで用意したプロンプトについては、教師あり学習のためのラベルとなる適切な回答を人間が作成。
  • 有益性、信頼性、有害性の観点で回答を評価しランクづけする際には、評価者に対して以下のようなガイドとインターフェースを提供して実施した。

ChatGPTの学習について

ここまで長々とリストアップしてきましたが、いずれもChatGPTを理解する上で重要な要素となっています。

ChatGPTモデルの学習プロセスにはInstructGPT同様、Reinforcement Learning from Human Feedback+PPOの学習アプローチを採用している。つまり、固定の目的関数を最適化させるという形ではなく、人間の嗜好や評価に適応するよう目的関数に調整をかけながら学習を行うものとなっている。

具体的なステップは下記の通り。


引用元:https://openai.com/blog/chatgpt/

step1. Collect demonstration data and train a supervised policy

AIモデルvs人間の適切な内容の会話サンプルを人手によって作成し、これを学習データとしてGPT3のような言語生成モデルをファインチューニングする。
InstructGPTの時は、プロンプトとしてはOpenAIのAPIに入力されたものに対してフィルタリングをかけ、適切な分割を行い学習データとして整備して利用している。

step2. Collect comparison data and train a reward model

ここでも人手を使って、一つの入力プロンプトに対するstep1で学習させたモデルの出力結果を複数用意し、人間にその中で良いものはどれかの順位付けをしてもらう。

step3. Optimize a policy against the reward model using the PPO reinforcement learning algorithm

step2で作成したプロンプトに対する出力結果のランキングデータを用い、Proximal Policy Optimizationを実施。

Reward Model(RM)には、step1のモデルの最終層を除き、スカラーの報酬値を出力する層に置き換えたものを用意。入力データはプロンプトと回答のペア、出力は報酬値として学習させる。

(InstructGPTではプロンプトごとにK個の候補回答を生成(K=4~9)し、プロンプト単位で候補回答とのペアをバッチとして学習させることで学習が安定した とある。)

ChatGPTの限界

デモ[3]で遊んだ方々は十分その性能を感じ取られていると思いますが、ChatGPTには以下のようにまだまだ課題が残っているようです。

  • 一見素晴らしいが、実際は不正確だったりナンセンスな回答をしてしまうこともある。

    • 学習の過程で真実かどうかを判定するためのソースとなる物が無い。
    • 質問に対して、はっきりと言い切らないよう学習させると、正確に答えられるものにも曖昧な回答を返してしまうようになる。
    • モデルが獲得した知識には人間の評価者が前提としている知識が必ず含まれているとは限らない。(fine-tuningによって起こるミスリード要素がある。)
      • 常識的に考えて当たり前のことは人間の評価者はモデルには明示的には教えることはないため、モデルは前提を理解しないまま人間の評価者を真似ることを覚えるため、前提が成立しない時には間違ったことをやってしまう恐れがある。
      • (大人がお酒を美味しそうに飲むのを子供が見て真似してしまう。みたいな感じだろうか?)
  • 入力プロンプトの微細な変化や同じプロンプトを複数回繰り返されることに敏感に反応してしまう。

    • ある質問文に対しては答えがわからないが、質問文のフレージングを少し変えるだけで正確に答えられるようになる場合がある。
  • 回答内容が多少冗長で、「OpenAIによって開発された人工知能です」といった特定のフレーズを強調して使うことがある。

    • これは学習データにおけるバイアスによるもので、人間の評価者は包括的な長い回答を好む傾向にあったことに由来する。
  • プロンプトの表現内容がわかりにくかったりしたら、より詳しく説明するよう要求を返してくれるのが理想だが、現状ChatGPTはユーザーの入力プロンプトの意味が分からなくても憶測で回答を生成するようになっている。

  • 不適切な要求に対してはなるべく回答を拒否するようChatGPTを調整する努力をしているものの、時には有害なプロンプトにも反応してしまったり、偏見の含まれた振る舞いをしてしまう場合がある。

    • Moderation APIによって安全でないコンテンツに対するフィルタをかけているが、誤判別はどうしても起こると考えられるため、ユーザーからのフィードバックを受けて改善していくとのこと。

感想

  • 信頼性の高いデータセットの収集、ラベリングにリソースをしっかり割き、工夫を凝らしているのがわかり、良質なAIのためには良質なデータセットが重要であるというのを感じた。
  • AIに解かせたいタスクを、"適切に"達成してもらうためには目的関数に対して人間のフィードバックを提供しながら適応させていくというアプローチが効果的で、その点において強化学習の重要性と実用性が高まってきている印象を受けた。
  • 有害なコンテンツに対しては別途フィルタリングをかけている等、対話AIにおけるend-to-endなソリューションはまだまだチャレンジングな部分も多いかもしれない。
  • とはいえ安全なAIを実現するための課題を、一歩ずつクリアしていっている印象があり、シンギュラリティは意外と近い未来に訪れるのかもという期待も持てるようなイノベーションとなっているのではないかと感じた。

最後までお読みいただきありがとうございます。
ご指摘等ございましたら、ぜひコメントいただけると幸いです。

脚注
  1. https://www.gymlibrary.dev/environments/atari/ ↩︎

  2. https://www.gymlibrary.dev/environments/mujoco/ ↩︎

  3. https://chat.openai.com/ ↩︎

Discussion

ganちゃんganちゃん

とても面白い記事でした!
特に、目的関数を制約条件の変化にあわせて調整する、という考え方が興味深かったです!

ttyattya

ありがとうございます!
人間のフィードバックをもとにして目的関数を適応させるという発想はとても面白いですよね。今後似たようなアプローチが取り入れられていき、AIの実用性もより高まってくるといいなと思いました!