LLMの事前学習とは?文章から「次のトークン」を教師信号にする
LLMは最初から質問に答えるよう訓練されるとは限らない。GPT系の自己回帰型言語モデルでは、大量のテキストをトークン列にし、各位置から次のトークンを予測する事前学習を行う。正解は別途人が付けた分類ラベルではなく、元の文章で実際に続いているトークンだ。
「教師データを人が一件ずつ作っていないのに、何を正解にして学ぶのか」と疑問に思う場面がある。答えは、文章を1つずらすことにある。ただし、事前学習を終えただけで、利用者の指示に従うチャットモデルが完成するわけではない。
入力の次の位置が、そのまま正解になる
説明用のトークンID列を [17, 42, 9, 31] とする。最初の位置では 17 を見て 42 を予測する。次の位置では 17, 42 を見て 9 を予測し、その次では 17, 42, 9 から 31 を予測する。IDは説明用で、実際のトークナイザーが特定の文章へ割り当てた値ではない。
原文の続きが正解になるので、個々の位置に「この文章の話題は旅行」といった手動ラベルを付ける必要はない。こうした学習は自己教師あり学習と呼ばれる。ただし、データ収集、重複除去、品質管理、安全上の処理まで自動で不要になるという意味ではない。
Hugging Faceの因果言語モデルの学習資料も、入力のトークン列を1位置ずらして正解ラベルとして使うと説明している。実装によっては、入力IDと同じ列を渡し、モデル内部で損失計算用の位置合わせを行う。コード上で入力配列とラベル配列が同じに見えても、「今のトークン自身を答えとして見ている」ということではない。
未来を見ずに、複数位置の誤差を一度に計算する
学習時には既知のトークン列をまとめて入力し、各位置の次トークン予測に対する損失を計算できる。その際、因果マスクによって、位置 が正解となる未来の位置をAttentionで参照することを防ぐ。モデルは複数位置の計算を並列に進められるが、各位置が利用できる情報はその位置までに制限される。
予測した確率が正解トークンに低ければ損失は大きく、高ければ小さい。複数位置の損失を集め、誤差逆伝播で重みの勾配を求めて更新する。以前の「次トークン予測」の記事で扱ったlogitsとsoftmaxは、ここでは答えを抽選するためではなく、正解にどれだけ確率を割り当てたかを測るために使われる。
生成時との違いも重要だ。生成時には正解の続きを渡さず、モデル自身が選んだトークンを入力に加えて次の予測へ進む。学習中に多数の位置の損失を並列に計算できても、自己回帰型の出力を1トークンずつ作る順序はなくならない。
事前学習と、指示に従わせる調整は別の段階
OpenAIの初期GPT論文は、生成的な事前学習のあと、個別タスクに合わせた教師あり微調整を行う構成を示した。GPT-3論文は大規模な自己回帰型事前学習を行い、追加の勾配更新をしないfew-shot評価も報告している。これらは「事前学習」と、その後に行う調整や評価の方法が別の論点であることを示す例だ。
次トークン予測をうまく行えることと、質問の意図を汲んで安全・正確に答えることは同じではない。Instruction Tuningなどの後続段階では、指示と応答のデータを使って、回答の形式や振る舞いを調整する。どの段階をどのデータと目的で行ったかはモデルごとに異なるため、「LLMはすべて同じ手順で作られる」とは考えないほうがよい。
事前学習で押さえるべき点は、文章の続き自体が教師信号になること、因果マスクで未来を隠して学習すること、損失から重みを更新することだ。生成時は同じ「次のトークンを予測する」モデルを使うが、正解を知って学ぶ段階ではない。