本文は Andrej Karpathy の 2023 年 3 月の Microsoft Build 講演の整理です。
講演 Beamer は以下で見ることができます:https://karpathy.ai/stateofgpt.pdf
講演では GPT のトレーニングプロセス、発展の段階、現在の LLM エコシステム、そして未来の展望について紹介されており、1 年後の今日でも古くはなく、現在の実際の発展と比較して読むことができます。
概要#
pretraining 部分はトレーニング時間の大部分を占めており、後の 3 つの段階はすべて fine-tuning 段階です。
データ収集#
Meta の LLaMA モデルで使用されたトレーニングデータの混合
混合の構成:
- CommonCrawl: 一般的なウェブクローラー
- C4:Common Crawl の巨大でクリーンなバージョン。
- その他の高品質データセットは図の通り
これらの知識が混合され、指定された比率に基づいてサンプリングされ、GPT 神経ネットワークのトレーニングセットが構成されます。
プレトレーニング#
実際のトレーニング前に、以下の前処理ステップが必要です。
トークン化#
基本的には、インターネット上でクローリングした生のテキストを整数列(sequence of integers)に変換する無損失変換プロセスです。
byte-pair encoding(BPE)などの方法を使用して、小さなテキストブロックを反復的に結合し、それらをトークンにグループ化することができます。
Transformer 神経ネットワークのハイパーパラメータ表
-
語彙サイズ(Vocabulary Size):
- 語彙サイズは、モデルが認識し生成できるユニークな語彙(単語、文字、またはサブワードユニット)の総数を指します。この数字は、モデルの入力と出力の可能性の範囲を定義します。
- Bigramの例では、出力予測の文字を指定しているため、「文字表」となり、サイズは 27 です。
-
コンテキスト長(Context Length):
- コンテキスト長は、モデルがテキストを処理する際に考慮できる最大単位数(通常は単語またはトークン)の数を指します。この長さは、モデルがテキストを生成または理解する際に回顧できる情報量を定義します。
- NPLMモデルでは、コンテキスト長は 3 に設定されており、最初の 3 つのトークンを使用して次のトークンを予測します。
- 現在、GPT4 などのモデルは 10 万以上の入力を受け入れることができます。
-
パラメータ数(Parameters)
- パラメータ数は、モデルを構成するパラメータの総数を指し、これらのパラメータはトレーニングプロセス中に学習し調整され、予測誤差を最小化します。パラメータは重み(weights)とバイアス(biases)であり、神経ネットワーク内で入力データを処理し、変換し、最終的に出力を生成するために使用されます。モデルのパラメータ数は、モデルのサイズと複雑さを測る直接的な指標です。
- NPLMのこのコードでは、モデルのパラメータ数をカウントし、隠れ層のニューロン数を増やすなどの方法でパラメータ数を増やしてフィッティングを改善しようとしました。
g = torch.Generator().manual_seed(2147483647)
C = torch.randn((27,2), generator=g)
W1 = torch.randn((6,100), generator=g)
b1 = torch.randn(100, generator=g)
W2 = torch.randn((100,27), generator=g)
b2 = torch.randn(27, generator=g)
parameters = [C, W1, b1, W2, b2]
sum(p.nelement() for p in parameters)
- トレーニングトークン総数(Training Tokens Total):
- トレーニングトークン総数は、トレーニングプロセス中にモデルが処理したトークン(単語、文字、またはサブワードユニット)の総数を指します。この数字は、モデルのトレーニングプロセス中に「見た」および学習したデータ量を反映します。
- 名前データセットの例では、合計 30k データがあり、(1B は、すなわち十億)と理解できます。
LLaMA のトレーニング量は非常に大きく、より長いトレーニング時間をかけて GPT-3 よりも良い結果を得たため、モデルのパラメータ数だけで性能を判断することはできません。
最初の頃、モデルの重みはランダムであったため、サンプリング結果は完全にランダムでした。トレーニング時間が増すにつれて、モデルから得られるサンプルはますます一貫性を持つようになります。図の最後からわかるように、この GPT モデルは単語、スペース、句読点などの知識を学びました。
トレーニング曲線#
トレーニングが進むにつれて、注目すべきは損失関数の変化であり、低い損失はこの Transformer モデルがシーケンス内の正しい次の整数に対してより高い確率を与えていることを意味します。
GPT は強力なgeneral representationsを学び、非常に効率的に微調整でき、任意の下流タスクに適用できます。
感情分類タスクの例として、私は以前関連研究に参加しており、その際に百度のある感情分析 API を呼び出して収集したデータに対してポジティブ、ネガティブの判断を行い、監視学習で使用できるデータを得て、さらに他の NLP モデルでトレーニングを行いました。しかし、GPT が登場した後は、感情分類を無視して LLM のプレトレーニングを行い、少量のデータで効率的にこのタスクに特化した Transformer モデルを微調整することが可能です。
これは、Transformer モデルが言語モデリングタスクで大量のmultitaskを強制され、次のトークンを予測するためにテキストの構造とその中のすべての異なる概念を理解する必要があったからです。これが GPT-1 の段階です。
GPT-2 の段階では、人々はprompt(プロンプト)を使用することが実際には微調整よりも良く、より効果的であることに気付きました。
基本モデル ≠ アシスタント#
基本モデルは、私たちが普段使用する ChatGPT ではなく、私たちが使用しているのは GPT モデルの API(Davinci、3.5 Turbo など)であり、これらはアシスタントです。そして、実際の基本モデルはassistantではなく、単にファイルを補完することを目的としています:
特定のfew-shot promptを作成することで基本モデルをアシスタントに変えることができ、彼に中間のインタラクションドキュメントを見せて、あなたのクエリを末尾に置くと、基本モデルは自動的に調整されて質問に答えることができるアシスタントになります。しかし、これはあまり信頼性がなく、効果も良くないため、実際の GPT アシスタントを作成するには異なる道を歩みました。
監視付き微調整#
この段階では、小さく高品質なデータセットを収集し、クラウドソーシングの形式で、人工的にプロンプトと理想的な応答のデータを収集します。これらのデータに対して言語モデリングを続け、アルゴリズムは変わらず、データセットだけが変更されます。トレーニングを経て、SFT(Supervised Fine-Tuning)モデルが得られ、これはデプロイ可能な真のアシスタントであり、一定の効果があります。
図示、クラウドソーシングの作業者が書いた応答は、友好的で、真実であり、有害でないことが求められ、指示文書に従っています。
RLHF パイプライン#
人間のフィードバックからの強化学習の略
報酬モデリング#
この段階では、収集したデータをComparisonsの形式に変換し、同じプロンプトを使用してアシスタントにタスクを完了させ、トレーニングされた SFT モデルに複数のバージョンの応答を生成させ、人々にどのバージョンがより良いかを評価させます(これは非常に時間と労力がかかります)。
その後、これらのバージョンを分類し、最後に特別なreward tokenを追加することで、基本的にこの(緑色の)トークンの上で Transformer を監視します。Transformer は、特定のプロンプトに対する応答に対応する報酬を予測し、人工的にラベル付けされた真の報酬ラベルに基づいて損失関数に変換し、モデルをトレーニングして、人工的なクラウドソーシングの評価事実と一致する報酬の予測を生成します。
報酬モデルを構築した後、それ自体はアシスタントとしてあまり役に立たないが、次の強化学習段階には非常に役立ちます。
強化学習#
報酬モデルに基づいて、任意の与えられたプロンプトの完了品質にスコアを付けることができます。この段階では、報酬モデルに対して強化学習を行います。
現在のトレーニング目標は(黄色の)完了です。SFT モデルを使用して異なるプロンプトに対していくつかの完了を作成し、再度報酬トークンを追加し、すでに固定された報酬モデルが示す報酬に基づいて言語モデリング目標を重み付けします。
図からわかるように、高い絶対値の報酬は将来のトークンサンプリングの重みを増加させます。
大量のプロンプトとバッチにわたって反復し、報酬モデルで高得点を得る完了を生成する戦略を得ました。
デプロイ可能な RLHF モデルを得ました。
なぜ RLHF?#
より良いパフォーマンス、人間は彼らが生成した応答を好みます。
一つの説明は、比較判断と生成の難易度が不均等であることです。例えば、優れた俳句(日本の古典短詩)を創作することに比べて、いくつかの俳句の中でどれがより良いかを判断することは明らかに簡単です。これは人間の判断力を潜在的に利用し、より良いモデルを作成することができます。
しかし、そのため、基本モデルに比べて RLHF 後のモデルはエントロピーを失います。つまり、モデルの出力の変化は非常に小さく、基本モデルは非常に高いエントロピーを持ち、多様な出力を生成します。したがって、「より多くのポケモンの名前を生成する」といったタスクでは、基本モデルの方が得意かもしれません。
LLM アシスタントの適用#
思考の連鎖#
aka COT
人間が執筆する際、私たちの心の中には独立したプロセスがあります —— 常に自分が書いた内容を見直し、それが十分に良いかどうかを判断し、一部を削除したり再執筆したりして、結果に満足します。
しかし、GPT の視点では、これは一連のトークンに過ぎず、各トークンを見て、各トークンに等しい計算量を費やし、上記の内面的独白は全くありません。つまり、Transformers モデルはトークンシミュレーターのようなものであり、自分が得意なことや不得意なことを知りません。ただ次のトークンをフィットさせるだけです。モデルはどの内容にもフィードバック、合理性チェック、または誤り訂正を行いません。
GPT は、数十億のパラメータを使用して、事実に基づく知識の広範なストレージを持ち、強力な作業記憶を持っています。したがって、コンテキスト長の範囲内の任意の内容は、Transformer 内部の自己注意メカニズムを通じて即座に取得され、無損失で記憶されます。これは限られた完璧な記憶に相当します。
プロンプティングは、人間の脳と「LLM 脳」の間の認知のギャップを埋めるための一つの方法です。したがって、実際には、推論能力を必要とするタスクを行う場合、Transformer が各トークンに対して多くの推論を行うことを期待してはいけません。したがって、推論をより多くのトークンに分散させる必要があります。
LLM にこの推論をシミュレートさせる
または、複数回サンプリングし、投票で答えを選ぶ
または、私たちの生活でよく使う方法:LLM にその回答に誤りがあることを伝えると、彼は誤りを認識します。しかし、あなたが彼にヒントを与えなければ、彼は全く自主的にフィードバックを行いません。
思考の木#
複数の潜在的な実行可能な計画を同時に考慮し、価値フィードバックメカニズムを利用して意思決定を行うことで、既存の計画方法を拡張しました。さらに、この方法は自己反省メカニズムを導入し、言語モデルが自ら生成した候補の実行可能性を評価できるようにします。
これは、Python の接着コード(Glue Code)と単一のプロンプトを組み合わせて実現され、木の探索なども含まれています。
AlphaGo は人間の意思決定をシミュレートし、モンテカルロ木探索などを使用してすべての可能性を評価し、良い選択肢を保持します。
文字に対する AlphaGo に例えられます。
人々は、単一のプロンプトではなく、より一般的な技術を探求し、多くのプロンプトを組み合わせるようになりました。
チェーン / エージェント#
- ReAct:プロンプトに対する応答を一連の思考、行動、観察などの組み合わせに構造化し、思考プロセスを通じて質問に答えます。このプロセスでは、モデルは外部ツールを使用することもできます。
- AutoGPT:LLM がタスクリストを保持し、タスクを再帰的に分割して完了することを許可します。一般的にはパフォーマンスは普通ですが、いくつかのインスピレーションをもたらすことができます。
良好なパフォーマンスの条件#
プロンプトエンジニアリング#
LLM は実際には「タスクを成功裏に完了したくない」という「心理的特性」を持っています。彼は単にトレーニングセットのデータをシミュレートしたいだけですが、あなたはタスクを完了したいので、要求をする必要があります。
例えば、数学の問題において、トレーニングデータにはある学生が誤った答えを出し、数学の専門家が完璧な答えを出した場合、Transformers はどちらの答えの質が高いかを区別できません。したがって、より良いパフォーマンスを得るためには、彼に要求する必要があります。
聞こえは奇妙かもしれませんが、これにより Transformers は低品質の解決策に確率密度を寄せる必要がなくなります。
しかし、彼に「400 の IQ」を持たせることは避けるべきです。そうすると、SF 作品のような回答を得る可能性があります。
ツール / プラグイン#
LLM はデフォルトでは自分が不得意なことを知りません。
したがって、プロンプトの中で「計算が得意ではない」と彼に伝えることさえできます。その計算部分はこのトークンの組み合わせ(例えば、計算機 API を呼び出して得られたもの)を使用します。
検索強化 LLM#
検索エンジンはRetrieval only(検索機能のみ)の代表であり、前 LLM 時代の主流です。
LLM はMemory onlyであり、両極端の間には大きなRetrieval augment(検索強化)のスペースがあります。
LlamaIndex の例では、異なるタイプのデータを接続し、これらのデータにインデックスを作成し、LLM に開放することができます。
原理は、与えられた文書をブロック(chunks)に分割し、それらを埋め込んでデータを表す埋め込みベクトル(embedding vectors)を得て、それをベクトルストレージに保存します。質問する際には、ベクトルストレージに対して何らかのクエリを発行し、提起されたタスクに関連する可能性のあるブロックを取得し、それをプロンプトに詰め込んで回答を生成します。実際には非常に良い効果があります。
優れた記憶力を持つ学生であっても、期末試験の前には教科書の具体的な原文を見つけたいと思うでしょう。
制約プロンプティング#
これは基本的に、LLMs に特定のテンプレートを出力させる技術です。
以下の例では、LLM に JSON 形式で出力することを強制し、テンプレート内の空白部分に追加の制約を強制することができます。
Microsoft の「guidance」プロジェクト
微調整#
モデルの微調整は、モデルの重みを変更することを意味し、いくつかの技術によりこれが以前よりも容易になりました。LoRA のような技術は、低精度の推論(勾配降下ではなく)を使用して、モデル内の小さく疎な部分(変更が許可されている部分のみ)をトレーニングすることを保証し、効果的な微調整を実現し、良好な効果を得ながらコストを削減します。
提案#
提案は以下の 2 つの目標に分かれ、振り返りにもなります。
目標 1 最適なパフォーマンスを得る:
- GPT-4 を使用する。
- 詳細なタスクコンテキスト、関連情報、指示のプロンプトを設計する。
- 電子メールで返信できない場合、タスクの請負人がどうするかを尋ねる。
- プロンプトに関連するコンテキストや情報を追加する。
- 前のスライドで言及されたプロンプトエンジニアリング技術を試す。
- 少数の例(few-shot examples)を使用して実験し、これらの例が 1)テストケースに関連していること、2)多様性(適切であれば)を確保する。
- 計算、コード実行など、LLMs が処理するのが難しいタスクをオフロードするためにツール / プラグインを使用する。
- 質の高い時間を最適化するプロセス /「チェーン(chains)」。
- すでにプロンプトの有用性を最大化した自信がある場合、SFT データと RLHF 微調整(fine-tuning)を収集することを検討する。
目標 2 コストを最適化する:
- 最高のパフォーマンスを達成したら、コスト削減策を試みる(例えば、より短いプロンプトを使用する、GPT-3.5 など)。