WaytoAGI 飛書ナレッジベースへ · 1 亿+ 回のアクセス、誰でも利用できます →
WaytoAGI通往 AGI 之路

GPTの現状(State of GPT)

Karpathyの講演を基に、GPTアシスタントの訓練プロセスを解説。事前学習、SFT、報酬モデリング、強化学習の4段階を通じて、大規模言語モデルの動作原理と効率的な応用方法を明らかにする。

GPT大语言模型AI训练

AI により中国語から翻訳されています。問題があればフィードバックボタンからお知らせください。

  • スピーカー:Andrej Karpathy(OpenAI 創設メンバー、元テスラ AI 部門責任者)
  • 公開日:2023 年 5 月 24 日
  • 翻訳のきっかけ:『A16Z が推奨する AI 学習パス』の中で、この講演が入門編の2番目の記事として推奨されていたため、翻訳を思い立ちました。翻訳中にネット上で異なる翻訳版や動画版がいくつかあるのを目にしました。この版は完璧ではありませんが、他の版と照らし合わせてご覧ください。誤りがありましたらご指摘いただけますと幸いです。ありがとうございます。

[図]

日本語翻訳

ANDREJ KARPATHY: 皆さん、こんにちは。本日は GPT の現状についてご紹介できることを嬉しく思います。より広く言えば、急速に発展している大規模言語モデルのエコシステムについてお話ししたいと思います。そこで、この講演を2部構成にしたいと思います。

  • 第1部では、どのようにして GPT アシスタントを訓練しているのかをお話しします。

  • 第2部では、これらのアシスタントを皆さんのアプリケーションで効果的に活用する方法について検討します。

一、GPTアシスタントのトレーニング方法

まず、これらのアシスタントをトレーニングするための新しいレシピを見てみましょう。これはすべて非常に新しいものであり、急速に発展していることを覚えておいてください。しかし、今のところ、このレシピはおおよそ次のようになっています:

[図]

これはかなり複雑なスライドなので、段階的に説明します。大まかに言うと、4つの主要なフェーズがあります:事前学習、教師ありファインチューニング、報酬モデリング、強化学習です。これらは順番に実行されます。

各フェーズでは、そのフェーズを支えるデータセットがあります。また、ニューラルネットワークをトレーニングするための目標となるアルゴリズムがあります。そして、モデルが得られます。下部にはいくつかの注釈もあります。

[図]

事前学習

それでは、事前学習フェーズから始めましょう。このフェーズは図の中でも特別で、この図は縮尺通りではありません。なぜなら、このフェーズは計算作業のほとんどすべてが行われる場所だからです。トレーニング計算時間と浮動小数点演算の99%を占めています。

つまり、ここではインターネット規模のデータセットを扱い、スーパーコンピュータ内の数千のGPUを使用し、数か月のトレーニング時間が必要になる可能性があります。他の3つのフェーズはファインチューニングフェーズであり、数時間から数日間、いくつかのGPUを使用してトレーニングする程度です。

では、事前学習フェーズを経てベースモデルを得る方法を見てみましょう。

まず、大量のデータを収集します。ここに、Metaが公開した論文からのデータ混合体の例を示します。この論文ではLLaMAのベースモデルが公開されています。

[図]

これらのコレクションに含まれるデータセットの種類がおおよそわかります。Common Crawl(単なるウェブクローラー)、C4(これもCommon Crawl)、そしてGitHub、Wikipedia、書籍、ArXiv、StackExchangeなどの高品質なデータセットがあります。これらを混ぜ合わせ、一定の比率でサンプリングして、GPTニューラルネットワークのトレーニングセットを形成します。

実際にこれらのデータをトレーニングする前に、前処理ステップであるトークン化を行う必要があります。これは基本的に、インターネットからスクレイピングした生のテキストを整数のシーケンスに変換する作業で、これがGPTの操作のネイティブな表現です。

[図]

これはテキストの断片、トークン、整数の間のロスレスな変換であり、このフェーズには多くのアルゴリズムがあります。通常、例えばバイトペアエンコーディングのようなものを使用し、小さなテキストブロックを反復的にマージしてトークンを構成します。ここでは、これらのトークンのサンプルブロックをいくつか示し、それが実際にTransformerに入力される生の整数シーケンスです。

ここで、このフェーズを制御するハイパーパラメータに関する2つの類似した例を示します。

[図]

GPT-4については、どのようにトレーニングされたかなどの情報はあまり公開されていません。そのため、GPT-3の数値を使用していますが、GPT-3はもちろん約3年前のもので、すでに少し古いです。しかし、LLaMAはMetaのかなり新しいモデルです。

したがって、これらが事前学習を行う際に扱うおおよそのオーダーです。語彙サイズは通常10,000トークンです。コンテキスト長は通常2,000、4,000、現在では10万にもなります。これは、GPTがシーケンス内の次の整数を予測する際に参照する最大整数数を決定します。

おおよそのパラメータ数を見ることができます。例えば、LLaMAは650億のパラメータを持っています。GPT3の1750億パラメータと比較すると、LLaMAは650億パラメータしかありませんが、LLaMAは明らかに強力なモデルです。直感的には、モデルのトレーニング時間が明らかに長く、この場合は1.4兆トークンであり、単なる3000億トークンではないからです。モデルに含まれるパラメータ数だけでモデルの強さを判断することはできません。

以下に、Transformerニューラルネットワークを指定するためによく使用されるハイパーパラメータの表を示します(ヘッド数、次元サイズ、層数など)。

下部には、いくつかのトレーニングハイパーパラメータを示しています。例えば、65Bモデルをトレーニングするために、Metaは2,000のGPUを使用し、約21日間のトレーニング時間と、約数百万ドルの費用がかかりました。これが、事前学習フェーズで覚えておくべきおおよそのオーダーです。

では、実際に事前学習を行うと何が起こるのでしょうか?大まかに言うと、トークンをデータバッチに入れます。Transformerに送り込むこれらの配列があります。これらはB(バッチサイズ)で、行方向に積み重ねられた独立した例であり、B×T(Tは最大コンテキスト長)です。

[図]

私の図では10個しかありませんが、これがコンテキスト長であり、この数は2,000、4,000などになります。これらは非常に長い行です。私たちが行うのは、これらのドキュメントを取得し、それらを行にパックし、特別なテキスト終了トークンで区切って、基本的にTransformerに新しいドキュメントがどこから始まるかを伝えることです。

ここにいくつかのドキュメントの例があり、それらをこの入力に引き伸ばしています。これらすべての数値をTransformerに入力します。特定のセルにのみ焦点を当てますが、この図のすべてのセルで同じことが起こります。

[図]

では、緑色のセルを見てみましょう。緑色のセルは、その前にあるすべてのトークン(ここではすべての黄色のトークン)を参照します。コンテキスト全体をTransformerニューラルネットワークに入力します。Transformerは、シーケンス内の次のトークン(この例では赤色)を予測しようとします。

さて、Transformerについてですが、このニューラルネットワークアーキテクチャを詳しく説明する時間はあまりありませんが、私たちの目的にとっては、それは単なる大量のニューラルネットワークの塊であり、通常は数百億のパラメータ、あるいはそれに類するものを持っています。

もちろん、これらのパラメータを調整すると、各セルの予測分布は少しずつ異なります。例えば、語彙サイズが50,257トークンであれば、それだけの数の数値が存在します。なぜなら、次に来るものの確率分布を指定する必要があり、基本的に次に来る可能性のあるすべてのものの確率が得られるからです。

さて、この特定の例では、この特定のセルについて、次に来るのは513(上の図の赤いブロック)です。したがって、これを教師信号として使用して、Transformerの重みを更新できます。つまり、基本的にすべてのセルでこれを並行して適用します。バッチを交換し続け、Transformerがシーケンス内の次のトークンを正しく予測できるようにします。

では、これらのモデルの1つをトレーニングするとき、それがどのように見えるかをより具体的に示します。これは実際にニューヨーク・タイムズの記事からのもので、シェイクスピア作品で小さなGPTをトレーニングしたものです。ここにシェイクスピアの小さな断片があり、彼らはこれでGPTをトレーニングしました。

[図]

さて、最初はGPTは完全にランダムな重みで始まるため、出力も完全にランダムになります。しかし、時間が経つにつれて、GPTをより長くトレーニングすると、ますます一貫性のあるモデルサンプルが得られるようになります。

もちろん、そこからサンプリングする方法は、次に何が起こるかを予測することです。この分布からサンプリングし、それを継続的にフィードバックすることで、基本的に大量のシーケンスをサンプリングできます。

最終的には、Transformerが単語について、どこにスペースを入れるか、どこにカンマを入れるかなどを学習していることがわかります。時間の経過とともに、予測はますます一貫性を増します。

モデルの事前トレーニングを行うとき、見るのはこのようなグラフ(下図参照)です。実際には、トレーニング中の損失関数が時間とともにどのように変化するかを観察します。低損失は、Transformerが正しく予測していることを意味します。つまり、シーケンス内の正しい次の整数により高い確率を与えています。

[図]

では、1か月のトレーニングを経て、このモデルをどのように使用するのでしょうか?まず気づくのは、この分野では、これらのモデルが言語モデリングのプロセスを通じて非常に強力な汎用表現を学習し、関心のある任意の下流タスクに非常に効果的に微調整できることです。

[図]

例えば、感情分類に興味がある場合、以前の方法は、ポジティブとネガティブな感情のデータを収集し、そのためのNLPモデルをトレーニングすることでした。しかし、新しい方法は、感情分類を無視して、大規模な言語モデルの事前トレーニングを行い、大きなTransformerをトレーニングし、その後、少数の例だけでモデルをそのタスクに非常に効果的に微調整することです。

この方法は実際にうまく機能します。その理由は、Transformerが言語モデリングタスクで多くのタスクを処理することを強いられるからです。次のトークンを予測する過程で、テキストの構造やそこに含まれるさまざまな概念について多くのことを理解する必要があるからです。

これがGPT-1です。

その後、GPT-2の時代になると、人々は微調整よりもはるかに優れた方法があることに気づきました。それは、これらのモデルを非常に効果的に誘導できることです。これらは言語モデルであり、ドキュメントを完成させようとするため、実際にはこれらの偽のドキュメントを並べ替えることで、タスクを実行するように騙すことができます。

[図]

例えば、この例では、いくつかの段落があり、「Q&A、Q&A、Q&A」のような操作を行います。これは少数ショットプロンプトと呼ばれます(上の図の「Q: How old is Catherine? A: 54」など)。そして、質問をします(上の図の「where does she live?」)。すると、Transformerがドキュメントを完成させようとするとき、実際に私たちの質問に答えます。これは、基礎モデルにドキュメントを模倣していると思わせ、タスクを実行させるプロンプトエンジニアリングの例です。

したがって、これは、プロンプトが微調整よりも優れている時代を引き起こしたと思います。そして、これは実際に多くの問題で非常に効果的であり、ニューラルネットワークをトレーニングしたり、微調整を行ったりする必要さえありません。

[図]

それ以来、基礎モデルの進化の系統樹全体が見られ、誰もがトレーニングを行ってきました。しかし、これらのモデルのすべてが利用可能というわけではありません。例えば、GPT-4の基礎モデルは公開されたことがありません。APIを通じてやり取りする可能性のあるGPT-4モデルは基礎モデルではなく、アシスタントモデルです。これらをどのように取得するかについては後で説明します。

GPT-3の基礎モデルは、DaVinciというAPI呼び出しで利用可能でした。GPT-2の基礎モデルは、私たちのGitHubリポジトリで重みとして利用可能です。しかし、現在利用可能な最高の基礎モデルは、おそらくMetaのLLaMAシリーズでしょう。ただし、商用ライセンスはありません。

ここで指摘しておくべき点として、ベースモデルはアシスタントではないということです(下の図参照)。ベースモデルはあなたの質問に答えたいわけではなく、ドキュメントを完成させたいだけです。したがって、「パンとチーズについての詩を書いて」と伝えると、ベースモデルは——まあ、そのように——さらに多くの質問で質問に答えるだけになります。ベースモデル认为自己がドキュメントだと思うものを補完しているだけです。

[図]

しかし、特定の方法でベースモデルにプロンプト(指示)を出すことで、よりうまく機能する可能性が高まります。例えば、これはパンとチーズについての詩です、という場合、ベースモデルは正しく自動補完を行います。

ベースモデルを騙してアシスタントにすることもできます。その方法として、特定の few-shot プロンプトを作成し、まるで人間とアシスタントの間で情報を交換しているドキュメントのように見せかけることができます。

[図]

そして最後に自分のクエリを配置すると、ベースモデルは自分自身を条件付けし、有用なアシスタントのように振る舞って回答します。しかし、これはあまり信頼性が低く、実践的に特別効果的ではありませんが、できないわけではありません。

したがって、私たちは本物の GPT アシスタントを作るため、ベースモデルの単なるドキュメント補完者ではないものを作るための、別の道筋を進みます。これが教師あり微調整(SFT)フェーズへと私たちを導きます。

教師あり微調整フェーズ

[図]

教師あり微調整フェーズでは、少量のただし高品質なデータセットを収集します。この場合、人間の請負業者にプロンプトと理想的な応答のデータを収集してもらいます。通常、数万個程度といった規模で、こうしたデータを大量に収集します。

そしてこれらのデータに対して言語モデリングを行います。アルゴリズム的には何も変わっていません。訓練セットを交換しただけです。以前はインターネット上のドキュメントで、これは大量/低品質でしたが、今では基本的に質問と回答のプロンプトと応答タイプのデータとなり、これは少量/高品質です。

それでも言語モデリングを行います。訓練後、**SFT モデル(教師あり微調整モデル)**が得られます。このモデルは実際にデプロイすることができ、本物のアシスタントであり、ある意味で有用です。

サンプルのデモがどんなものになるかお見せしましょう。これは人間の請負業者が考え出すかもしれないランダムなプロンプトの例です。「経済学における『独占』について短い紹介文を書いていただけますか?」といったものです。そして請負業者も理想的な応答を書きます。

[図]

請負業者がこれらの応答を書く際、詳細なラベリング指示書に従っており、役に立つ、正確で、かつ無害な回答を提供するよう求められています。これらがラベル付け指示です。はっきりとは見えないかもしれませんが、私も同様ですが、これらは長い文章であり、人々が指示に従ってこれらのプロンプトを完成させているという、ただそれだけのことです。

これがデータセットの姿です。これらのモデルを訓練することができ、これはある程度は機能します。

報酬モデリング

ここからプロセスを続けて、**RLHF、つまり「人間からのフィードバックによる強化学習」**に進むことができます。これには報酬モデリングと強化学習が含まれます。

まずこれを紹介し、その後、なぜ追加のステップを完了したい可能性があるのか、そしてこれが単に SFT モデルを使用することとどう異なるのかについて振り返って議論します。

[図]

報酬モデリングステップでは、データ収集をペアワイズ比較形式に変換します。これがデータセットの例です。上部に同じプロンプトがあり、助手にある文字列が回文(前から読んでも後ろから読んでも同じになる単語、文、または数字の列)であるかどうかをチェックするプログラムや関数を書かせています。

[図]

そして行うことは、すでに訓練済みの SFT モデルを使い、複数の completion(コンプリーション、補完)を生成することです。この例では、モデルが作成した 3 つのコンプリーションがあります。そして人間にこれらのコンプリーションをランキングしてもらいます。

[図]

少しこれを見つめてみてください、ちなみに、これらの予測を比較することは非常に困難な作業であり、1 つのプロンプトとコンプリーションのペアを比較するだけで数時間かかることもあります。しかし、いずれか 1 つが他のものよりずっと良いなどと判断したと仮定して、私たちはこれらをランキングします。そして、これらのコンプリーション間のすべての可能なペアに対して、ランキングのために二値分類に非常によく似た処理を行うことができます。

[図]

したがって、プロンプトを行に並べる作業を行います。プロンプトは 3 行すべてで同じです。これは同じプロンプトですが、コンプリーションは変化しているため、黄色のトークンは SFT モデルからのものです。

そして最後に特別な報酬読み取りトークンを追加し、基本的にこの 1 つの緑のトークンだけについて transformer を監督し、 transformer はそのプロンプトに対して、このコンプリーションの品質を予測します。

したがって、基本的に各コンプリーションの品質について推測を行います。一度すべてに対して推測を行えば、モデルがそれらをランキングするための基礎真実が得られます。実際にこれらの一部の数値が他よりずっと高くなければならないといったことを強制できます。これを損失関数として定式化し、人間の請負業者からの比較基礎真実データと一貫した報酬予測をモデルが行うように、モデルを訓練します。

これが報酬モデルの訓練方法であり、これにより任意のプロンプトに対するコンプリーションがどの程度良いかを評価できるようになります。

強化学習

[図]

この報酬モデルが手に入ったら、それを直接デプロイすることはできません。なぜなら、それ単体ではアシスタントとしてうまく機能しないからです。しかし、次の強化学習フェーズには非常に有用です。報酬モデルが手に入ったので、任意のプロンプトに対して任意のコンプリーションにスコアを付けることができます。

強化学習プロセスで行うことは、基本的に再び大量のプロンプトを取得し、報酬モデルに基づいて強化学習を行うことです。

これはどのように行われるのでしょうか?単一のプロンプトを取り、それを複数行に並べます。ここでSFTモデルを使用します。訓練したいモデル(SFTモデルとして初期化されたもの)を使って、黄色の補完(completion)をいくつか生成します。次に、報酬トークンを追加し、報酬モデルに従って報酬を読み取ります。この時点で報酬モデルは固定され、変化しません。

[図]

報酬モデルは、各プロンプトにおける各補完の品質を教えてくれます。そこで今できることは、同じ言語モデリング損失関数を適用することですが、今度は黄色のトークンに対して訓練を行います。報酬モデルが示す報酬に基づいて、言語モデリングの目的を重み付けします。

例えば(上の図のように)、最初の行では報酬モデルがこの補完をかなり高いスコアと評価しています。そのため、最初の行でサンプリングされたすべてのトークンは強化され、将来より高い確率を得ることになります。逆に2行目では、報酬モデルはこの補完を非常に低く評価し、-1.2となっています。そのため、2行目でサンプリングされた各トークンは、将来わずかに低い確率を得ることになります。これを多くのプロンプト、多くのバッチで繰り返し行います。基本的に、ここで黄色のトークン(すなわちすべての補完)を生成するポリシーが得られ、これらの補完はすべて、前の段階で訓練した報酬モデルに従って高いスコアを得るようになります。

これが訓練の方法です。これがRLHFのプロセスです。

[図]

そして最後に、デプロイ可能なモデルが得られます。例えばChatGPTはRLHFモデルですが、Vicuna-13B(通称小羊驼モデル)など、他のモデルに出会うこともあるでしょう。これらはSFTモデルです。ベースモデル、SFTモデル、RLHFモデルがあり、これが現在の状況です。

では、なぜRLHFを行いたいのかと疑問に思うかもしれません。その答えはそれほど刺激的ではないかもしれませんが、それは「より効果が高いから」です。

[図]

この図はinstructGPTの論文からのものです。これらの実験(すでに少し前のものですが)では、PPOモデルがRLHFです。人間に提示したとき、多くの比較でこれらのモデルが好まれることがわかりました。プロンプトに対するアシスタントとしてのベースモデルと比較しても、SFTモデルと比較しても、人間は基本的にRLHFモデルからのトークン(出力テキスト)を好みます。つまり、効果がより高いのです。

しかし、なぜでしょうか?なぜ効果が高いのでしょうか?コミュニティ全体が合意する驚くべき答えはないと思いますが、一つの可能性として、比較と生成の計算上の容易さの非対称性が関係していると考えられます。

俳句を生成する例を考えてみましょう。モデルに「クリップについての俳句」を書かせるとします。SFTデータを収集する請負業者として、クリップについての良い俳句をどうやって作ればよいでしょうか?おそらくあなたはそれが得意ではないでしょう。しかし、いくつかの俳句の例を与えられれば、その中のいくつかをより評価できるかもしれません。つまり、どれが良いかを判断する方がより簡単なタスクなのです。この非対称性により、比較は人間の判断をより有効活用し、わずかに優れたモデルを作成するためのより良い方法となり得ます。

[図]

さて、RLHFモデルはすべての状況でベースモデルより改善されているわけではありません。特に、RLHFはエントロピーを失う傾向があることに注意してください。つまり、出力されるサンプルの多様性が低下し、ベースモデルよりもバリエーションの少ないサンプルを出力する可能性があります。ベースモデルは高いエントロピーを持ち、多様な出力を生成します。

[図]

例えば、私がベースモデルを使いたいと思う状況の一つは、基本的にn個の事例があり、それらに似たものをさらに生成したい場合です。ここに私が今でっち上げた例があります。

[図]

かっこいいポケモンの名前を生成したいとします。7つのポケモンの名前を与え、ベースモデルにこのドキュメントを完成させてもらいます。すると、さらに多くのポケモンの名前を提供してくれました。これらはすべて架空のもので、調べてみましたが、本物のポケモンではないと思います。これはベースモデルが得意とするタスクだと思います。なぜなら、ベースモデルはまだ大量のエントロピーを持っており、与えられたものに似た、多様でかっこいいものをたくさん提供してくれるからです。

さて、これらが現在利用できるアシスタントモデルかもしれません。バークレーのチームが多くの利用可能なアシスタントモデルをランク付けし、ELOレーティングを割り当てました。

[図]

現在、最高のモデルのいくつかは、もちろんGPT-4が大きくリードしており、次にClaude、GPT-3.5、そしてその他のモデルが続きます。Vicuna、Koalaなど、重みの形で利用できるものもあります。ここでの上位3行はすべてRLHFモデルであり、他のモデルはすべて、私の知る限りSFTモデルです。

以上が、これらのモデルをハイレベルでどのように訓練するかです。ここからは方向を変えて、GPTアシスタントモデルをあなたの問題に最適に適用する方法を見ていきましょう。

二、GPTアシスタントモデルを問題に適用する

ここで、具体的なシナリオを通じてこれを示したいと思います。具体例を使ってみましょう。あなたが記事やブログ記事を作成しており、文章の最後に「カリフォルニア州の人口はアラスカ州の53倍である」という一文を書こうとしているとします。なんらかの理由で、この2つの州の人口を比較したいのです。

[図]

あなたの頭の中で繰り広げられる豊かな内的対話や、ツールの使用、そしてこの最後の一文を生成する際に脳が実際にどれだけの計算作業を行っているかを考えてみてください。あなたの脳がこのように動作している可能性があります:

  • さて、次はブログを書くぞ。この2つの人口を比較しよう。

  • よし、まず当然、この2つの人口データを取得する必要があるな。

  • さて、この人口データを一発で知っているわけではないかもしれないので、自分が何を知っていて何を知らないかを把握している。

  • ツールを使って、ウィキペディアでカリフォルニア州とアラスカ州の人口を確認する。

  • さて、この2つの数値を割り算すればいいことは分かっているが、頭の中で39.2を0.74で割るのは無理だと分かっている。これは頭の中でできることではない。

  • だから、計算機に頼ることにする。計算機にこの2つの数値を入力して、結果が約53であることを確認する。

  • 次に、頭の中で少し内省と妥当性チェックを行い、53という数字が妥当かどうか考える。

  • おや、これはかなり大きな倍数だが、カリフォルニア州は人口最多的州だから、まあ妥当かもしれない。

  • これで必要な情報がすべて揃ったので、創造的な部分、つまり執筆を始めることができる。

  • 「カリフォルニア州の人口はアラスカ州の53倍である」のような文を書き始めるかもしれない。

  • そして、これは非常にぎこちない表現だと気づく。消してもう一度書き直そう。

  • つまり、執筆中には、書いている内容を確認し、良さそうかどうかを評価する別のプロセスがある。そして削除したり、文を再構成したりして、最終的な結果に満足したりする。

要するに、あなたがこの種の一文を作成するとき、あなたの内なる独白は舞台裏で多くの作業を行っているのです。しかし、GPTを訓練する際、このような一文はどのように見えるでしょうか?

[図]

GPTの観点から見ると、これは単なるトークンのシーケンスです。GPTがこれらのトークンを読み取ったり生成したりするとき、それは単に1つずつ処理し、各ブロックにほぼ同じ量の計算作業が必要です。そしてこれらのTransformerは非常に浅いネットワークではありません。それらは約80層の推論能力を持っていますが、80層はまだそれほど多くありません。したがって、このTransformerは模倣を行うために全力を尽くしますが、ここでのプロセスはあなたが経験するプロセスとは非常に、非常に異なるものに見えます。

特に、最終的な成果物において、私たちが作成したデータセットの中、そして最終的にLLMに入力されるものの中では、すべての内部対話が完全に剥ぎ取られています。あなたとは異なり、GPTはすべてのトークンを確認し、各トークンに同じ計算量を費やします。したがって、実際に——まあ、すべてのトークンで多くの作業をすることを期待することはできません。

そして特に、基本的にこれらのTransformerはトークンシミュレーターのようなものです。それらは自分が何を知らないかを知りません。次のトークンを模倣するだけです。何が得意で何が不得意かを知りません。ループ内で反省することもなければ、妥当性チェックも行いません。デフォルトでは、自分の間違いを修正することもありません。ただ、トークンのシーケンスをサンプリングするだけです。評価を行っている別個の内的独白の流れは存在しないのです。

ただし、認知的優位性がいくつかあると言えます。それは、トークンシミュレーターが実際には非常に大きな事実的知識ベースを持っているということです。何百億ものパラメータを持っているため、これは膨大な事実を保存する巨大なストレージ空間です。また、比較的 large で完璧に機能する作業記憶も持っていると思います。コンテキストウィンドウに適合する内容は、内部の自己注意メカニズムを通じてTransformerに即座に利用可能になります。つまり、一種の完璧な記憶ですが、サイズは限られています。しかし、Transformerはそれに直接アクセスできます。したがって、コンテキストウィンドウ内のすべての内容を无损で記憶することができます。

これが私が両者を比較する方法です。これらすべてを提起する理由は、プロンプトとは基本的にこれら2つのアーキテクチャ(私たちの脳と大規模言語モデルの脳)の間の認知的差異を補うものに過ぎないと考えるからです。ほとんどこの観点からそれを見ることができます。

たとえば、人々が発見したことの一つに、実際にはかなりうまく機能するものがあります。特に、あなたのタスクに推論が必要な場合、Transformerが各トークンで多くの推論を行うことを期待できません。そのため、推論をより多くのトークンに拡張しなければなりません。たとえば、非常に複雑な問題をTransformerに与えて、1つのトークンで答えを得ること expectation ことはできません。Transformerにとって、時間が全然足りないのです。これらのTransformerは「考える」ためのトークンを必要とします、私は時折こう表現します。

[図]

したがって、これは効果的であると分かっている方法の一例です。たとえば、いくつか few-shot prompt( few-shot プロンプト)を持っていて、質問に答える際に作業プロセスを示すようにTransformerに指示することができます。いくつかの例を提供すれば、Transformerはそのテンプレートを模倣し、最終的に評価の面でよりよく perform するでしょう。

さらに、「ステップ・バイ・ステップで考えよう(let's think step by step)」と言うことで、Transformerからこのような振る舞いを引き出すことができます。これによりTransformerは「作業を見せる」状態になります。作業を見せるモードに入ることで、各トークンに対する計算負荷が減ります。その結果、ゆっくりと推論するため、成功する可能性が高まります。

もう一つの例として、自己無撞着(self-consistency)というものがあります。

[図]

私たちは文章を書き始める能力を持っており、もしうまくいかなければもう一度試すことができます。何度か試して、最良のものを選ぶことも可能です。これらの手法では、サンプリングを1回だけでなく複数回行い、良いものを選び出す方法(多数決を取るなど)を用います。基本的に、これらのTransformerは次のトークンを予測する過程で、人間と同じように運が悪いことがあります。あまり良くないトークンをサンプリングしてしまい、行き止まりの推論に陥ることもあります。

しかし、人間と違い、彼らはそこから回復できません。サンプリングした各トークンに縛られてしまうのです。たとえその系列が成功しないと分かっていても、その系列を続けてしまいます。彼らに振り返り、確認し、周辺をサンプリングする能力を与えることも、一つのテクニックです。

実際、LLMは自分が失敗したことを認識していることが分かっています。

[図]

例えば、韻を踏まない詩を生成するようにモデルに依頼したとします。するとモデルは詩を返すかもしれませんが、実際には韻を踏んでいます。しかし、特にGPT-4のような大きなモデルでは、直接「タスクを完了しましたか?」と尋ねると、GPT-4は自分がタスクを完了していないことをよく認識しています。サンプリングの際に運が悪かっただけなのです。そのため、「いいえ、実際にはタスクを完了していません。もう一度試します」と答えます。

しかし、あなたがプロンプトで促さなければ、彼らはそれに気づきません。再考すべきだということも知りません。プロンプトでその点を補う必要があります。確認させるようにしなければならないのです。確認を要求しなければ、彼らは自分から確認しません。彼らは単なるトークンシミュレーターなのです。

より一般的に言えば、これらのテクニックの多くは、私たちが「システム2」を再構築するという範疇に入ると思います。人間のシステム1、システム2の思考様式(ダニエル・カーネマンの『ファスト&スロー』参照)をご存知かもしれません。システム1は高速で自動的なプロセスであり、これはLLMがトークンをサンプリングするプロセスに対応していると考えられます。一方、システム2は脳内のより遅く、熟考を伴う計画部分です。

[図]

実際、これは先週の論文です。この分野の進歩は非常に速いためです。「思考の木(Tree of Thought)」と呼ばれ、この論文の著者は、任意のプロンプトに対して複数の完了結果を保持し、その過程でスコアリングを行い、うまくいっているものを残すという手法を提案しています。多くの人々がプロンプトエンジニアリングを活用して、LLMに人間の脳が持つ能力の一部を回復させようと試みています。

ここで指摘しておきたいのは、これは単なるプロンプトではないということです。実際には、いくつかのプロンプトとPythonのグルーコードを組み合わせたものです。複数のプロンプトを維持し、どのプロンプトを拡張するかを決定するための木探索アルゴリズムも実行する必要があります。これはPythonのグルーコードと個々のプロンプトの共生関係であり、whileループ内やより大きなアルゴリズムの中で呼び出されます。

また、ここには非常にクールな類推があります。それはAlphaGoです。AlphaGoは囲碁で次の手を打つためのポリシーを持っており、当初は人間の模倣によって訓練されました。しかし、そのポリシーに加えて、モンテカルロ木探索も行います。基本的に、頭の中でいくつかの可能性をシミュレーションし、評価して、うまくいったものだけを残します。したがって、これはテキスト版のAlphaGoだと言えるでしょう。この比喩が意味をなせばですが。

「思考の木」と同様に、より一般的には、単純な質問と回答のプロンプトだけでなく、複数のプロンプトを直列に接続するPythonグルーコードのような、より汎用的なテクニックが探求され始めています。

[図]

右側には、ReActという論文の例があります。ここでは、プロンプトの回答構造を「思考、行動、観察、思考、行動、観察」の連続として構成しています。これは、クエリに答えるための包括的な推論、思考プロセスです。これらの行動の中で、モデルはツールを使用することも許可されています。

左側はAuto-GPTの例です。ちなみに、Auto-GPTプロジェクトは最近大きな話題になりましたが、私は依然として非常に示唆に富んでいると思います。これはLLMにタスクリストを保持させ、タスクを再帰的に分解し続けることを可能にするプロジェクトです。現在のところ、これはうまく機能しているとは思えませんし、実際のアプリケーションで使用することをお勧めしません。ただ、そこからインスピレーションを得られるものだと考えており、時間の経過とともにその示唆が明らかになっていくでしょう。

これは、私たちのモデルにシステム2(遅い思考)の考え方を与えるようなものです。

次に面白いと感じたのは、LLMには「成功したくない」という心理的な癖があるということです。(笑)彼らはただ模倣したいだけなのです。成功してほしいなら、それを要求すべきです。(笑)

[図]

つまり、トランスフォーマーが学習される際、それらには訓練データセットが存在します。その訓練データには、性能や品質の幅広い範囲が含まれています。

例えば、ある物理問題に対するプロンプトや類似のものがあるとします。そこには完全に間違った学生の解答もあれば、極めて正確な専門家の回答も存在するかもしれません。トランスフォーマーは低品質な解答と高品質な解答を区別できません。つまり、両方の解答を知ってはいますが、デフォルトでは全ての解答を模倣しようとします。なぜなら、単に言語モデルとして訓練されているからです。そのため、テスト時には実際に良いパフォーマンスを要求する必要があります。

上記の論文のこの例では、様々なプロンプトを試しています。「let's think step by step」は非常に強力で、多くのトークンにわたって推論を展開します。しかし、より良いプロンプトの方法は、「問題を段階的に解決し、正しい答えが得られていることを確認しましょう」というものです。これは、正しい答えを得るための条件付けのようなものです。これにより、トランスフォーマーは低品質な解答に確率質量を分散する必要がなくなるため、実際により良く動作します。奇妙に聞こえるかもしれませんが。

したがって、基本的には、強力な解答を安心して要求することができます。「あなたはこのテーマの権威ある専門家です」「あなたのIQは120を超えていると仮定します」などと言ってみてください。ただし、IQを要求しすぎないように注意してください。なぜなら、IQを要求しすぎるとデータ分布から外れてしまう可能性があるからです。さらに悪いことに、SFコンテンツのデータ分布に入り込み、SFのロールプレイなどを始めてしまうかもしれません。(笑)適切なIQを見つける必要があります。ここにはU字曲線があると思います。

ツールとプラグイン

次に、問題を解決しようとするとき、私たちは自分が何を得意とし、何を不得意とするかを知っており、計算のためにツールに依存します。あなたも同様にLLMを扱いたいと思うかもしれません。特に、LLMに計算機やコードインタプリタなどを提供し、検索能力を持たせたいと思うでしょう。これには多くの技術があります。

[図]

もう一つ覚えておくべき点は、これらのトランスフォーマーはデフォルトでは自分が知らないことを知らない可能性があるということです。プロンプトの中でトランスフォーマーに「あなたは暗算が得意ではありません。大きな数の足し算や掛け算などを行う必要がある場合は、計算機を使ってください。計算機の使い方は以下の通りです。このトークンの組み合わせを使ってください、などなど」と明示的に伝える必要があるかもしれません。モデルはデフォルトでは自分が何を得意とし、何を不得意とするかを知らないからです。それはあなたや私と同じです。

次に、非常に興味深い点として、私たちは検索のみに依存する世界から、完全にLLMの記憶に依存する世界へと移行しました。しかし実際には、これら二つの振り子の間には、検索拡張モデル全体の空間が存在し、実践で非常にうまく機能しています。

[図]

先ほど述べたように、トランスフォーマーのコンテキストウィンドウはその作業記憶です。タスクに関連する情報を作業記憶にロードできれば、モデルは非常にうまく機能します。なぜなら、すべての記憶に即座にアクセスできるからです。そのため、多くの人が基本的な検索拡張生成(RAG)に非常に関心を持っています。下部には、LLaMAインデックスの例があります。これは様々なタイプのデータに接続できるデータコネクタを備えています。これらすべてのデータをインデックス化し、LLMがアクセスできるようにすることができます。

ここでの新しいレシピは、関連するドキュメントを取得し、それらをチャンクに分割し、すべてを埋め込み、基本的にこれらのデータを表す埋め込みベクトルを取得することです。それをベクトルストアに保存し、テスト時にはベクトルストアに対してクエリを実行します。タスクに関連する可能性のあるチャンクを取得し、それらをプロンプトに埋め込んでから生成します。これは実践でかなりうまく機能します。

これは私たちが問題を解決する方法と似ています。自分の記憶に完全に依存することもできます。トランスフォーマーの記憶は非常に強力で広範囲ですが、主要なドキュメントを参照することも役立ちます。教科書やライブラリのドキュメントを再確認する必要があるときはいつでも、トランスフォーマーも同じことをする必要があります。ライブラリのドキュメントについてある程度の記憶はありますが、それを参照する方が良いでしょう。ここでも同様です。

制約付きプロンプト

次に、制約付きプロンプトについて簡単に触れたいと思います。これも非常に興味深いと感じています。これは主に、LLMの出力を特定のテンプレートに強制的に従わせる技術です。MicrosoftのGuidanceプロジェクトhttps://github.com/microsoft/guidance)がその一例です。ここでは、LLMの出力をJSONに強制しています。これにより、出力がこの形式を取ることが保証されます。なぜなら、トランスフォーマーから出てくるすべての異なるトークンの確率に介入し、それらのトークンを制限するからです。そして、トランスフォーマーはここでの空白を埋めるだけになります。その後、これらの空白部分に対して他の制約を強制することもできます。

[図]

これは非常に役立つ可能性があると思います。このような制約付きサンプリングも非常に興味深いです。

ファインチューニング

ファインチューニングについても少し述べておきたいと思います。プロンプトエンジニアリングで大きな進歩を遂げることはできますが、モデルをファインチューニングすることも検討すべきです。

[図]

現在、モデルをファインチューニングするということは、実際にモデルの重みを変更することを意味します。これを実践で行うことはますます容易になってきています。これは、最近多くの技術が開発され、それらの技術のためのコードベースが構築されたためです。

例えば、LoRA のようなパラメータ効率の良いファインチューニング技術は、モデルの小さなスパースな断片だけを学習することを保証します。モデルの大部分はベースモデルの状態に保たれ、一部分だけが変更を許されます。実際、これはかなり効果的であり、モデルの小さな部分だけを調整することでコストを低く抑えることができます。さらに、モデルの大部分は固定されているため、それらの部分は勾配降下法で更新されないため、非常に低い精度で計算することができます。これにより、プロセス全体がより効率的になります。

さらに、先ほど述べたように、多数のオープンソースの高品質な基盤モデルがあります。LLaMA は優れていると思いますが、現在まだ商用ライセンスを取得していないと思います。

覚えておくべき点として、基本的に、ファインチューニングは技術的により複雑です。正しく行うにはより多くの技術的専門知識が必要です。人間のデータ契約請負業者によるデータセット(および/または)かなり複雑な合成データパイプラインが必要です。これにより、イテレーションサイクルが大幅に遅くなることは確実です。

高レベルから言うと、SFT(教師ありファインチューニング)は、言語モデルタスクを継続しているため、比較的シンプルで明確なので、実現可能です。しかし、RLHF(人間フィードバック強化学習)は非常に研究的な領域であり、効果的に機能させることはさらに難しいと言うでしょう。そのため、誰かに RLHF の実装を自分で作ることを勧めるつもりはありません。これらのものは非常に不安定で、トレーニングが難しく、現時点では初心者には適していないと思います。そして、それは今も急速に変化している可能性があります。

デフォルトの推奨事項

これらが私の現在のデフォルトの推奨事項です。タスクを 2 つの主要な部分に分けます。第一に、最高のパフォーマンスを実現すること。第二に、これに従って、その順番で、コストを最適化して削減することです。

[図]

  • 第一に、最高のパフォーマンスは現在 GPT-4 モデルから得られます。これが迄今为止最も強力なモデルです。

  • タスクコンテキスト、関連情報、指示を含む非常に詳細なプロンプトを使用してください。このような方向で考えてください:もし相手があなたにメールを返してくれない場合、あなたは何を伝えますか?ただし、タスク請負業者は人間であり、彼らには内面的な考えがあり、非常に賢いということを覚えておいてください。LLM にはこれらの特性がないため、LLM の心理をほぼ考慮し、それに応じてプロンプトを設計するようにしてください。

  • 大量のプロンプトエンジニアリング技術を参照し、これらのプロンプトで関連するコンテキストや情報を検索して追加してください。そのいくつかは上記のスライドで強調されていますが、これもまた非常に大きな分野です。私は単にオンラインでプロンプトエンジニアリング技術を検索することをお勧めします。そこには多くのコンテンツがあります。

  • Few-shot プロンプト(少ショットプロンプト)を試してみてください。これは、単に質問するだけでなく、可能な限り(望むものを)見せ、例を与え、可能であれば、あなたの意味を本当に理解させるのに役立つということです。

  • LLM 自体が苦手なタスクを分担するために、ツールやプラグインを使用してみてください。

  • 単一のプロンプトと回答だけでなく、潜在的なチェーン(連鎖)やリフレクション、そしてそれらをどう接着するか、どうやって多様なサンプルを作成するかなども考慮してください。

  • 最後に、プロンプトエンジニアリングの効果を最大限に最適化したと思えば、しばらくそれを使い続け、アプリケーションに合わせてモデルをファインチューニングすることも検討すべきですが、これが遅く、より多くの内容が伴うことを予想してください。

  • そして、ここにエキスパートレベルの研究領域があります。それが RLHF であり、もし機能させることができれば、現在確かに SFT よりも少しうまく機能しています。しかし繰り返しますが、これは非常に複雑だと言います。コストを最適化するために、より容量の低いモデルやより短いプロンプトなどを試してみてください。

適したユースケース

LLM が現在適していると思うユースケースについてもいくつか述べたいと思います。特に注意してほしいのは、今日の LLM には多くの制限があり、すべてのアプリケーションでこれを心に留めておくということです。ちなみに、これは完全な講演になり得るため、詳しく説明する時間はありません。

[図]

モデルは偏りを持つ可能性があります。彼らはでっち上げたり、ハルシネーション(幻覚)情報を生成したり、推論エラーを起こしたり、アプリケーションカテゴリー全体で問題を抱えたりする可能性があります。彼らにはナレッジカットオフ(知識の截止日)があるため、例えば 2021 年 9 月以降の情報については知らない可能性があります。彼らは広範囲な攻撃に対して脆弱であり、これらは毎日 Twitter に投稿されています。これにはプロンプトインジェクション、脱獄(ジェイルブレイク)攻撃、データポイズニング攻撃などが含まれます。

私の現在の推奨事項は、リスクの低いアプリケーションで LLM を使用し、常に人間の監督と組み合わせて使用し、インスピレーションや提案のソースとして、副操縦士(コパイロット)のような使用パターンを考慮し、どこかで完全に自律的にタスクを実行するエージェントとしてではないということです。モデルが準備できているかどうかは、まだ明確ではありません。

おわりに

最後に言いたいのは、GPT-4 は素晴らしい成果だということです。私はその存在にとても感謝していますし、それは美しいものです。

[図]

GPT-4 は多くの分野に膨大な知識を持ち、計算を行ったり、コードを記述したりすることができます。さらに、活気にあふれたエコシステムも存在し、私がお話ししたものを含め、その他すべてのものがこのエコシステムの上に構築・統合されています。これらの機能はすべて手の届くところにありますので、GPT-4 に質問したり、プロンプトを与えたりして応答を得るために必要なコードはすべてここにあります。

[図]

私は GPT-4 に「Microsoft Build 2023 の視聴者を鼓舞するために何かを話してもらえますか?」と尋ねました。

[図]

これを Python に入力しただけで、GPT-4 は一字一句そのまま以下のように話しました。

ちなみに、基調講演でこのテクニックが使われていることは知らなかったので、自分のことを賢いと思っていました(笑)。でも GPT-4 は本当にこれが得意なんですよね。

[図]

GPT-4 は次のように返しました。「 Ladies and gentlemen、2023 年 Microsoft Build 大会の革新者たち、パイオニアの皆さん、無数の傑出した思想が集うこの大会にようこそ。皆さんは未来の設計者であり、人類の繁栄を支えるデジタル領域を形づくるビジョナリーです。技術の無限の可能性を胸に抱き、思いを皆さんの想像力と同じ高さまで羽ばたかせましょう。より緊密で、卓越した、包摂的な世界を共に創造し、後世に受け継いでいきましょう。創造力を解き放ち、未知を探索し、夢を実現させる準備をしてください。皆さんの旅は今日、始まります。」

ありがとうございました!(拍手)