ChatGPTやInstructGPTはなぜユーザーの意図に沿った返答を生成できるのか?:ChatGPT入門
ChatGPTやその前身ともいえるInstructGPTは、GPTとは異なる目的を持ったモデルです。それ故にこれまでとは異なり、ユーザーの意図に沿ったテキストを生成できます。その違いを見てみましょう。
GPT、InstructGPT、そしてChatGPT
ChatGPTはその名の通り、対話に特化した言語モデルです。GPT 3(GPT 3.5)をベースとしていますが、GPT 3からChatGPTが生まれるまでの間にはもう一つ重要な言語モデルがあります。それがInstructGPTです(InstructGPT自体はGPT 3をベースとしているようです)。
では、GPT→InstructGPT→ChatGPTという進化がなぜ起きたのでしょう。InstructGPTについての論文ではその概要でおおよそ次のようなことが述べられています。つまり、「大規模な言語モデルは嘘、有害な出力を生成したり、単にユーザーの役には立たない出力を生成したりする。言い換えれば、これらのモデルはユーザーに合ったものになっていない(not aligned with their users)」ということです。
これはGPTのような大規模言語モデルが目的としているのは「一連のトークン(単語)が入力されたときに、次のトークンは何かを予測する」ことであり、「ユーザーの指示に従って有用で無害な出力を行う」ことではないからです。InstructGPTはまさにユーザーの指示(instruction)に従った出力が行えるようにGPTをチューンしたもので、ChatGPTはInstructGPTをベースに対話を行えるようにチューンしたものだと考えることができるでしょう。
モデル | 目的 |
---|---|
GPT | 入力されたトークンを基に次に出現するトークンを予測する |
InstructGPT | ユーザーの指示に従って有用で無害な出力を行う |
ChatGPT | InstructGPTと同様な学習方法を用いて対話に特化した出力を行う |
GPT/InstructGPT/ChatGPTの違い |
有用で無害な出力を得られるようにするために、ChatGPTとInstructGPTではそれらの訓練過程でRLHF(Reinforcement Learning from Human Feedback、人間のフィードバックを基にした強化学習)と呼ばれる手法が採用されているのが重要です(ただし、ChatGPTとInstructGPTとではデータ収集の方法に違いがあり、これがChatGPTを対話に特化したものとしていると思われます)。
やばい。コードを少しは出そうと思っていたんですが、この回、コードが出てくるのかなぁ(かわさき)。
RLHF(Reinforcement Learning from Human Feedback)
では、このRLHFとはどんなものでしょうか。以下にOpenAIのブログ記事からその手法を説明する図を引用します。
図の内容を文章でまとめると次のような感じになるでしょうか。
- ステップ1:あるプロンプトに対する望ましいモデルからの出力を人間が用意して、GPTモデルを教師あり学習でファインチューンする
- ステップ2:何らかのプロンプトに対するステップ1のモデルの出力を幾つかサンプリングして、出力にランク付けをし、そのデータを使って報酬モデルの学習を行う
- ステップ3:報酬モデルを使ってGPTモデルの強化学習を行う
ステップ1では、以前のバージョンのInstructGPTに入力されたプロンプトをデータセットとして、その一部を取り出し、それらのプロンプトが入力されたときにモデルがどう振る舞えばよいか(どんな出力を行えばよいか)、その出力として望ましいものを人間が用意してやります。そして、「プロンプトと望ましい出力」の組み合わせを使って教師あり学習を行って、GPTモデルをファインチューンします(Supervised Fine-Tune、SFT)。
ステップ2では、このモデルに対して何らかのプロンプトを入力し、そこから幾つかの出力を得た上で、どの出力が望ましいか/望ましくないか、人間がランク付けをします。そして、そのデータを使い報酬モデルの学習を行います。
ステップ3では、GPTモデルを強化学習します。このときにはステップ2で作成した報酬モデルが使われます。
このうち、ステップ2とステップ3を繰り返すことで、プロンプトに対する出力にランク付けを行ったデータが新しく得られ、その結果、報酬モデルが更新され、強化学習もさらに進むといった具合に学習が行われます。
このように学習の過程に人間を組み込んだものを「ヒューマン・イン・ザ・ループ」と呼ぶことがありますね。
このようにして作成されたのがInstructGPTです。ChatGPTは対話に特化したモデルであることから、学習に使われるデータの収集方法が少し異なっています。
「ChatGPT: Optimizing Language Models for Dialogue」によれば、「ユーザーとAIとの対話を、人間(AIトレーナー)が両方の立場でデモしたデータ」がステップ1のデータとして使われます。これらがInstructGPTの学習で使われたデータセットと統合され、対話の形式に変換されたものがGPTモデルのファインチューン(SFT)に使われます。さらにステップ2ではAIトレーナーとチャットボットとの対話を基にデータ収集(とランク付け)を行います。これらがInstructGPTとChatGPTのデータ収集方法の違いです。
InstructGPTにしてもChatGPTにしても、重要なのは報酬モデルの学習に使われるデータのランク付けでしょう。モデルからの出力の品質に応じてランク付けを行うことで、人にとって有用で害のない出力を行えば、より多くの報酬をもらえるようにモデルが学習することでモデルが生成するテキストがユーザーの意図や指示に沿ったものになるのです。
さらにいえば、InstructGPTではユーザーからの入力(プロンプト)に対してモデルがどういう出力を返せばよいのかを学習させることで単に次に出力されるトークン(単語)を推測するというモデルではなく、ユーザーの指示に合った出力を推測するようなモデルになっています。そして、ChatGPTでは対話形式のデータセットを使うことで、それを対話に特化したものにできているということです。これがChatGPT(やInstructGPT)からの出力が人間にとって好ましい出力となっている大きな理由なのでしょう。
これまで強化学習は自動的なゲーム操作や自動走行などに使われていてあまり目立っていなかったので、こんなふうに使われて面白いですね(一色)。
さまざまなモデル
OpenAIのドキュメント「Model index for researchers」にはGPTやInstructGPTに関連するモデルについての説明があります(残念ながらChatGPTについてはまだ記載がないようです)。
これによればInstructGPTに関連するモデルには以下のようなものがあります。
モデル | 説明 |
---|---|
code-davinci-002 | コード生成に適したモデル。text-davinci-002のベース |
text-davinci-002 | InstructGPTモデル。code-davinci-002がベース |
text-davinci-003 | text-davinci-002を改善したモデル |
InstructGPTに関連したモデル |
他のモデルについては上記のリンク先を参照してください。
WebでInstructGPTを試すにはOpenAIが用意しているPlaygroundページが使えます(OpenAIへのサインアップ/ログインが必要です)。
上の画像を見れば分かる通り、中央の大きな区画にInstructGPTへの入力とそれに対する出力が表示されます(薄緑の背景色のテキストがInstructGPTからの出力です)。また、右上の[Model]欄には「text-davinci-003」と表示されているので、InstructGPTの改善版モデルがここでは使われていることが分かります。
中央の大きな区画の下部には「Looking for ChatGPT?」とあることから、ここで使われているモデルがChatGPTではないということも想像できますね。
コードからモデルを使うには
では、コードから簡単にInstructGPTモデルを使ってみましょう。OpenAIはInstructGPTのAPIを公開しているのでこれを呼び出すだけのホントに簡単なコードです(ノートブックはこちら)。
取りあえずコードを出してみることにしました(笑)。
そのために必要な手順は以下です。
- OpenAIにサインアップ/ログインして、APIキーを取得する
- PyPIからopenaiモジュールをインストールする
- openai.Completion.createクラスメソッドを呼び出す
APIキーはOpenAIにサインアップ/ログインした後に、右上のアカウントアイコンをクリックすると表示されるメニューから[View API keys]を選択します。
すると、以下のようなページが表示されるので、[Create new secret key]ボタンをクリックしてください。
これでAPIキーが作成され、次のようなダイアログにキーが表示されます。このキーは一度しか表示されないので、忘れずにコピーしておくようにしましょう。
そしてシェルやコマンドプロンプト、あるいはVisual Studio Codeなどの開発環境のシェルやコマンドプロンプトから「pip install openai」コマンドを実行するか、Jupyterノートブックのセルで「!pip install openai」を実行します。
これで準備は完了です。後はopenaiモジュールをインポートし、そのapi_key属性に、先ほど生成されたAPIキーを代入し、最後にopenai.Completion.createクラスメソッドを呼び出すだけです。以下に例を示します。
KEY = '取得したAPIキーをここに記述'
import openai
openai.api_key = KEY
response = openai.Completion.create(
model='text-davinci-003', # InstructGPT
prompt='晴れた日曜日の午後には何をすればいいかな?',
temperature=0.7,
max_tokens=256,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
print(response['choices'][0]['text'])
InstructGPTのAPIを呼び出すので、model引数には'text-davinci-003'を指定します。promptには先ほどWebで試したのと同じ'晴れた日曜日の午後には何をすればいいかな?'を指定しました。その他の引数については「Create completion」を参照してください。
実行した結果を以下に示します。
中身のことはよく分からなくても、APIを呼び出せばそれなりの答えが返ってくるというのは楽でいいですね(笑)。
これは簡単ですね。Pythonなどでソフトウェアのプログラムを書ける人は多いと思うので、多くの人が試すことで思いもしない面白い活用方法やソリューションのアイデアもたくさん出てきそうだと思いました。
というわけで、今回はInstructGPTとChatGPTという2つのモデルがどんなふうに作られているかを見てきました。次回は何をするか未定ですが、何か面白いことをできたらと思っています。
Copyright© Digital Advantage Corp. All Rights Reserved.