事前学習とは?LLMが知識を獲得する仕組み

LLMの事前学習をデータ準備から評価まで俯瞰した図

LLM(大規模言語モデル)の事前学習は、大量の文章をtoken(モデルが扱う文字列の単位)へ変換し、元の文章から自動で作った予測問題を解かせ、誤差が小さくなるようパラメータを更新する工程です。

「大量の文章を読ませる」という説明だけでは、学習の実体が見えません。実際には、データを集めて終わりではなく、品質を整え、学習用と評価用を分け、目的関数に合う入力と正解を作り、損失を計算し、勾配で重みを少しずつ変える処理を繰り返します。

この記事では、1つの文章が学習データになり、1回の更新を経て、最終的に基盤モデルへ反映されるまでを順番に追います。

3文要約

LLMの事前学習をデータ準備から評価まで俯瞰した図

  1. 事前学習は、文章自身から「次のtoken」「隠したtoken」「欠けたspan(連続区間)」などの正解を作る自己教師あり学習です。
  2. GPT型の学習では、正解のprefix(先頭から予測位置までの列)を入力するteacher forcingにより、生成時は逐次処理でも、学習時は複数位置の損失をまとめて計算できます。
  3. 低い予測損失は言語能力の土台になりますが、事実性、指示追従、安全性、最新性を保証しないため、SFTや選好学習、RAGなどを役割に応じて組み合わせます。

この記事で基準にする一次資料

本記事は、Jacob Devlinらが2018年に発表したBERT: Pre-training of Deep Bidirectional Transformers for Language Understanding、Tom B. Brownらが2020年に発表したLanguage Models are Few-Shot Learners、Colin Raffelらが2020年に発表したExploring the Limits of Transfer Learning with a Unified Text-to-Text Transformerを目的関数の基準にします。

規模の設計にはscaling lawとChinchillaの研究、データ品質と暗記には重複除去およびtraining data extractionの研究を参照します。個別論文の結果は、その実験条件を超えて普遍化しません。

事前学習の全体像

生テキストが基盤モデルになるまでの事前学習パイプライン

事前学習は、大きく次の7段階に分けられます。

  1. 収集:Web、書籍、論文、コードなど、利用条件を確認したデータ候補を集める
  2. 整形:文字コードや文書形式をそろえ、壊れた文書を除く
  3. 品質管理:低品質文書、重複、個人情報、有害な内容などを方針に沿って検査する
  4. 分割:学習用、検証用、テスト用を分け、評価データとの混入を調べる
  5. 教材化:tokenizeし、データの混合比を決め、固定長に近い列へpackする
  6. 最適化:予測、損失計算、誤差逆伝播、パラメータ更新を繰り返す
  7. 評価:検証損失、下流タスク、安全性、暗記や汚染の兆候を確認する

「事前学習」と聞くと6番だけを想像しがちですが、1〜5番が悪ければ、最適化はその欠点まで忠実に学びます。逆に、評価の設計が悪ければ、改善したように見えても実際には評価問題を覚えただけかもしれません。

なぜ人手のラベルなしで学習できるのか

事前学習は自己教師あり学習(入力データ自身から正解を作る学習)です。外部の人が各文へ「政治」「スポーツ」のようなラベルを付けなくても、元の文章が正解を持っています。

たとえば、元文が次の通りだとします。

富士山は日本で最も高い山です。

GPT型なら、先頭側を入力、直後のtokenを正解にできます。

入力として見せるprefix 正解
富士
富士山は 日本
富士山は日本で最も 高い
富士山は日本で最も高い

実際の分割単位はtokenizer(文章をtoken IDへ変換する仕組み)で決まるため、表の日本語の区切りと一致するとは限りません。重要なのは、元のtoken列を1つずらすだけで、大量の入力と正解の組を作れることです。

BERT型なら一部を隠し、元のtokenを正解にします。T5型の代表的な方法では、連続したspanを抜き、その欠けた部分を生成させます。目的関数が違えば、同じ元文から作る教材も変わります。

データ準備は「量を集める」だけではない

収集した文章を重複除去し、学習用と評価用へ分ける流れ

生の文章は、そのまま学習へ投入できません。少なくとも次の観点を分けて考える必要があります。

工程 主な目的 省略した場合の問題
provenance管理 出所、取得条件、処理履歴を追えるようにする 権利や削除要求へ対応しにくい
format正規化 HTML断片、文字化け、制御文字などを整える 無意味なpatternへ計算を使う
language・quality filter 対象言語や用途に合う文書を残す 狙った能力にdata配分が届かない
重複除去 同一・近似文書の過剰反復を減らす 暗記や特定sourceへの偏りが増える
privacy・safety検査 個人情報や有害内容のriskを下げる 漏えい、再生成、望ましくない挙動につながる
train/validation/test分割 未見dataで一般化を測る 学習dataを評価して高得点に見える
contamination検査 benchmarkと学習dataの重なりを調べる 能力ではなく問題の記憶を測る

順序も重要です。文書を無作為に分割した後で重複が残っていると、ほぼ同じ文章がtrainingとvalidationの両方へ入る可能性があります。重複をグループとして扱い、評価用データとの近似一致も検査する必要があります。

LeeらのDeduplicating Training Data Makes Language Models Betterは、研究対象のデータセットとモデルにおいて、近重複の除去が逐語的な暗記出力を減らし、train-test overlapを抑えたと報告しています。これは「重複除去だけですべて解決する」という意味ではありません。個人情報、著作権、内容の偏り、有害性は、それぞれ別の基準で扱う必要があります。

tokenize、混合比、packing

cleaning後の文書はtoken ID列へ変換します。tokenizationの詳しい仕組みはTokenizationとは?AIは文章をどう分割しているのかで扱っています。

複数sourceを使う場合、単純に全件を連結すると、量の多いsourceが学習を支配します。そこで、Web、コード、論文、特定言語などのsampling比率を決めます。この比率は、モデルが何をよく見るかを変える設計変数です。

さらに、短い文書を固定長の学習列へ詰めるpackingを行います。文書境界にはEOS(文書の終端を表す特別token)などを置き、padding(長さ合わせ用token)を減らします。ただし、別文書を詰めた境界をモデルにどう見せるかは、目的関数とattention maskの設計に依存します。

3種類の事前学習目的を比較する

同じ文章をGPT型、BERT型、T5型の教材へ変換する比較図

代表的な目的関数を、同じ観点で比較します。

比較軸 causal language modeling masked language modeling span corruption
代表例 GPT系 BERT T5
主な構造 decoder-only encoder encoder-decoder
入力から隠すもの 予測位置より右側 選んだtoken 選んだ連続span
正解 各位置の次token 選んだ位置の元token 抜いたspanの列
損失を取る位置 通常はpadding等を除く全予測位置 選択位置 decoderが生成するtarget位置
向く形 左から右の生成 双方向の表現・理解 入力から出力を生成するtext-to-text

GPT型:次token予測

token列を \(x_1, x_2, \ldots, x_T\) とすると、causal language model(未来を見ずに次tokenを予測するモデル)は、列全体の確率を次のように分解します。

\[p_\theta(x_1,\ldots,x_T) = \prod_{t=1}^{T} p_\theta(x_t \mid x_{<t})\]

ここで \(x_{<t}\) は位置 \(t\) より前のtokenです。causal mask(未来位置へのattentionを遮るmask)があるため、正解tokenそのものを見て当てることはできません。

BERT型:隠したtokenの復元

BERTの原論文では、入力tokenの15%を予測対象として選びます。選ばれたtokenのうち80%を[MASK]へ、10%を別tokenへ置換し、10%をそのまま残します。そして、選択した位置の元tokenだけを予測します。

すべてを[MASK]へ変えないのは、事前学習時だけ現れる記号への依存を弱めるためです。また、BERT原論文はNSP(2文が連続しているかを予測する課題)も併用しましたが、後続のすべてのMLMが同じ構成を採るわけではありません。

T5型:欠けたspanの生成

T5の代表的なspan corruptionでは、連続したtoken列をsentinel token(欠損位置を示す特別token)へ置換します。encoderは壊れた入力を読み、decoderは欠けたspanを順番に生成します。

1 tokenずつ独立に穴埋めするMLMと比べ、複数tokenからなるまとまりを出力する課題になります。ただし、この3分類は代表例です。実際の事前学習目的には多くの変種があり、architectureと目的関数を一対一で固定して考えるべきではありません。

生成は逐次でも、学習は全位置をまとめて採点できる

teacher forcingによる学習時の並列採点と生成時の逐次処理の違い

GPT型の生成では、1つ出力したtokenを次の入力へ追加するため、時間方向には逐次的です。一方、事前学習では文章の正解列が最初から手元にあります。

位置 入力 正解
1 BOS 富士
2 BOS 富士
3 BOS 富士 山
4 BOS 富士 山 は 日本

入力を1つずらした正解と対応させ、causal maskで未来を隠します。各位置は左側しか参照できませんが、GPU上では複数位置のlogit(softmax前のscore)を1回のforward passで計算できます。これがteacher forcing(正解の過去tokenを入力に使う学習)です。

観点 学習時 生成時
過去token datasetの正解prefix modelがそれまでに生成したtoken
未来token causal maskで見えない まだ存在しない
1回で評価する位置 複数位置 基本的に次の1位置
主な目的 効率よくlossを計算する 未知の続きを作る

teacher forcingは計算を効率化しますが、学習時には常に正しい過去を見て、生成時には自分の誤りも次入力になるという差が残ります。この違いは、長い生成で誤差が連鎖する理由の1つです。

causal maskとdecoder-only構造の詳細はDecoder-only Transformerとは?GPT系LLMの学習と生成を図解で説明しています。

損失はどう計算するのか

正解tokenの確率からcross entropyとperplexityを計算する図

modelは各位置でvocabulary(語彙)全体の確率分布を出します。正解tokenへ割り当てた確率が \(q\) なら、その位置のnegative log-likelihood(負の対数尤度)は次の通りです。

\[\ell = -\log q\]

自然対数を使うと、正解確率によって損失は次のように変わります。

正解確率 \(q\) 損失 \(-\log q\) 読み方
0.80 約0.223 正解へ高い確率を置いた
0.50 約0.693 まだ迷っている
0.10 約2.303 正解をかなり低く見積もった
0.01 約4.605 強く外した

誤って自信を持った位置ほど損失が大きくなり、更新への寄与も大きくなります。

batch全体では有効tokenだけを平均する

paddingを含むbatchでは、すべての位置を同じように数えません。sequence \(i\) の位置 \(t\) を損失へ含めるかをmask \(m_{i,t}\) で表すと、平均損失は次のように書けます。

\[\mathcal{L} = -\frac{1}{M} \sum_{i=1}^{B} \sum_{t=1}^{T_i} m_{i,t} \log p_\theta(x_{i,t}\mid x_{i,<t}), \qquad M=\sum_{i,t}m_{i,t}\]

\(B\) はbatch内のsequence数、\(M\) は採点対象token数です。causal LMならpaddingなどを除く予測位置、MLMなら選択したmask位置を主に数えます。

たとえば、2つのsequenceに有効な予測位置が3個ずつあり、6位置の損失合計が9.0なら、平均損失は \(9.0/6=1.5\) です。

perplexityは平均損失の指数

perplexity(予測の迷いを表す代表指標)は、同じtokenizationと評価条件なら、平均negative log-likelihoodから次のように計算できます。

\[\mathrm{PPL}=\exp(\mathcal{L})\]

平均損失が1.5なら、perplexityは約4.48です。ただし「常に4.48個の候補で迷う」という厳密な意味ではなく、比較しやすく変換した指標と考える方が安全です。

tokenizerや評価corpusが違うモデル同士のperplexityは単純比較できません。また、perplexityが低くても、事実性、指示追従、安全性が高いとは限りません。これは次token予測が測るものと、ユーザーが期待する品質が同一ではないからです。

1回の学習stepで何が起きるのか

forwardからloss、backward、optimizer更新、評価へ進む学習ループ

causal LMの1 stepを概念的に追うと、次のようになります。

  1. batchを作る:token列をdeviceへ載せ、入力と1つずらしたlabelを用意する
  2. forward:Transformerが各位置のlogitを計算する
  3. loss計算:正解tokenとのcross entropyを有効位置で平均する
  4. backward:lossを各parameterで微分し、gradient(損失を減らす方向の手掛かり)を得る
  5. gradient処理:必要に応じて複数microbatchの勾配を累積し、異常に大きい勾配をclipする
  6. optimizer update:learning rate(1回の変更幅)に従ってparameterを更新する
  7. scheduler update:step数に応じてlearning rateを調整する
  8. 記録・保存:lossや勾配の統計を記録し、一定間隔でcheckpointと評価結果を保存する

modelが学ぶのは、正解文を直接parameterへ書き込む操作ではありません。lossを少し減らす方向へ、多数のparameterが少しずつ動きます。この更新を異なるbatchで繰り返すと、頻繁に再利用できるpatternがparameterへ反映されます。

global batchをtoken数で考える

長さがほぼ一定なら、1 updateで処理するtoken数は概算で次のように捉えられます。

\[\text{tokens per update} \approx \text{devices} \times \text{sequences per device} \times \text{sequence length} \times \text{gradient accumulation steps}\]

たとえば8 device、deviceあたり2 sequence、長さ2,048 token、勾配累積4回なら、1 updateあたり約131,072 tokenです。実際にはpadding、可変長、packing、並列方式によって有効token数が変わるため、これは設計を考えるための概算です。

batchを大きくすれば無条件に良いわけではありません。勾配のばらつき、必要memory、通信、learning rate設定、同じdataを何回見るかが変わるため、model規模とcompute環境に合わせて調整します。

なぜ次token予測から知識らしいものが生まれるのか

言語規則の一般化と一部の逐語暗記が併存することを示す図

次tokenを当てるには、直前の単語だけでは足りません。次のような規則性を使う必要があります。

  • 言語の規則:語順、係り受け、文体、コードの構文
  • 概念間の関連:人物と所属、場所と出来事、原因と結果
  • 文書内の手続き:例題の解き方、説明の順序、質問と回答のpattern
  • 長い文脈の整合:主語の対応、定義の再利用、前提と結論の関係

同じ関係が多様な表現で繰り返されると、特定の一文だけでなく、別の文脈にも使える内部表現を作る圧力が働きます。これが、next token predictionという単純に見える課題から、翻訳、要約、質問応答に利用できる基盤が生まれる理由です。

ただし、ここから「モデルは意味を人間と同じように理解する」とまでは結論できません。反対に「文章は一切記憶されない」も誤りです。

CarliniらのExtracting Training Data from Large Language Modelsは、GPT-2を対象に、学習データ中の逐語的な列や個人情報をqueryから抽出できる例を示しました。一般化と暗記は二択ではなく、同じモデル内で併存し得ます。重複回数、列の珍しさ、model容量などが暗記riskに関係します。

また、重みに反映された関連には、通常、出典URLや更新日時が結び付いていません。モデルは「どの資料の何行目を根拠にしたか」をparameterだけから安定して提示するdatabaseではありません。

モデル・データ・計算量はセットで設計する

固定された計算予算をモデル規模と学習tokenへ配分する関係図

事前学習の規模を考えるときは、少なくとも3つを分けます。

  • \(N\):parameter数、つまりmodel容量
  • \(D\):学習で処理するtoken数
  • \(C\):利用できるtraining compute

単純化すれば、dense Transformerの主要なtraining computeは \(N\) と \(D\) の積におおむね比例すると考えられます。

\[C \propto N D\]

これはhardware効率やarchitecture差を省いた概算で、費用計算の式ではありません。固定computeで \(N\) だけを大きくすれば、処理できる \(D\) が減ります。dataだけを増やしても、model容量や更新回数との釣り合いが悪ければ、計算を有効に使えません。

KaplanらのScaling Laws for Neural Language Modelsは、model規模、data量、computeとlossの間に経験的なpower lawが見られることを報告しました。その後、HoffmannらのTraining Compute-Optimal Large Language Modelsは、固定computeの下ではmodelとtraining token数をともに増やす配分が重要だと示しました。

ここから得られる実務的な教訓は、「最大parameter数を選ぶ」ことと「最もよく学習されたmodelを作る」ことは同じではない、という点です。ただし、最適な比率はarchitecture、data品質、学習目的、推論制約によって変わります。特定論文の係数を、あらゆるmodelへそのまま適用するのは危険です。

学習中は何を監視するのか

training lossだけを見ていると、失敗を見逃します。少なくとも次の層を分けて監視します。

観測対象 分かること 分からないこと
training loss 見せたbatchへの当てはまり 未見dataへの一般化
validation loss 保留dataへのtoken予測性能 指示追従や安全性の全体
分野・言語別loss data mixtureごとの偏り 実利用での総合品質
gradient norm・更新量 発散や数値異常の兆候 意味的な正しさ
下流task評価 特定能力の変化 benchmark外の能力
contamination検査 評価問題の混入risk 未検出の近似・翻訳重複
memorization/privacy評価 特定の再生成risk すべての漏えい可能性

training lossとvalidation lossがともに下がっていても、特定言語の性能が落ちる場合があります。逆に、全体lossの差が小さくても、コードや数学のdata比率変更が対象taskへ大きく効く場合があります。

checkpoint(途中のparameterとoptimizer状態の保存)は、障害復旧だけでなく比較にも使います。一定token間隔で保存し、同じ評価suiteを走らせれば、「lossは下がったが安全性評価は悪化した」「特定時点から過学習が始まった」といった変化を追えます。

評価を頻繁に回すほど良いわけでもありません。評価計算のcost、benchmarkへの過適合、測定のばらつきを考え、学習規模に応じた間隔と判断基準を先に決めます。

事前学習で解決しない問題

事前学習は強力ですが、次の問題を単独では解決しません。

知識の古さ

parameterはtraining data cutoff(学習データの対象時点)以後の出来事を自動では知りません。継続事前学習や追加学習で更新できますが、頻繁に変わる情報はRAG(検索した外部文書を推論時に渡す方法)の方が更新しやすい場合があります。

ハルシネーション

目的関数は、もっともらしい次tokenへ高い確率を付けることを求めます。「分からないと答える」「根拠を示す」「必ず真実だけを出す」は同じ目的ではありません。事実らしい文体を学ぶことと、事実性を保証することを分ける必要があります。

biasと有害なpattern

Web等の文章に含まれる偏りや有害なpatternは、学習を通じて反映され得ます。filter、data配分、後段のalignment、安全性評価を組み合わせますが、完全な除去を保証するものではありません。

privacyと権利

公開場所から取得できることと、学習・再配布・商用利用が許されることは同じではありません。出所と利用条件を記録し、個人情報を検査し、削除や問い合わせへ対応できるdata governance(データ管理の方針と手続き)が必要です。

指示追従

事前学習modelは「文章の続きを作る」能力を持っても、「ユーザーの依頼へ安全かつ簡潔に答える」よう最適化されているとは限りません。対話形式と望ましい回答を学ぶSFT、その出力傾向を調整する選好学習が別に必要です。

事前学習・SFT・RAGは何が違うのか

事前学習からSFT、選好学習、RAGへ続く役割分担

各手法は代替関係ではなく、変えたいものが違います。

手法 主な入力 主目的 model重み 更新頻度との相性 主なtrade-off
事前学習 大規模な一般text 広い言語能力の土台 大きく更新 低頻度 最大規模のdata・computeが必要
継続事前学習 特定分野の生text 分野の言語分布へ適応 更新する 中〜低頻度 一般能力の変化を監視する必要
SFT 指示と望ましい回答 task形式・指示追従 全体または一部を更新 中頻度 教師dataの品質へ強く依存
選好学習 chosen/rejected等 回答傾向を選好へ寄せる 全体または一部を更新 中頻度 選好の定義と偏りが入る
RAG 検索対象文書 推論時に外部根拠を渡す 通常は更新しない 高頻度 検索失敗と文脈構成がbottleneck

専門用語や文体を広く馴染ませたいなら継続事前学習が候補です。決まった入力へ望ましい回答を返したいならSFTが中心です。最新価格や社内規程のように頻繁に変わる事実を参照したいなら、RAGの方が更新と出典管理をしやすいことがあります。

次工程の詳細はFine-tuningとは?LLMを用途に合わせて調整する方法で扱います。

事前学習を設計・評価するときの確認事項

学習計画を見るときは、次の問いを順番に確認すると抜けを見つけやすくなります。

  1. 対象能力:どの言語、分野、形式を改善したいか
  2. data権利:出所、license、個人情報、削除手続きを追えるか
  3. data品質:重複、低品質、自動生成文、benchmark混入をどう測るか
  4. 目的関数:必要な利用形態と入力・正解の作り方が合っているか
  5. token配分:source・言語・分野のsampling比は狙いに合うか
  6. compute配分:model規模、token数、sequence長、batchの釣り合いは何か
  7. 安定性:loss、gradient、数値異常をどう検知し復旧するか
  8. 評価:validation、下流task、safety、memorizationをどう分けるか
  9. 停止条件:どの指標を満たしたら続行・停止・checkpoint採用とするか
  10. 後工程:SFT、選好学習、RAGのどこへ責務を渡すか

この順番にすると、「modelを大きくする」より先に、何を学ばせ、何で成功を判断するかを決められます。

よくある誤解

「ラベルなし学習だから正解はない」

正解は元の文章から機械的に作ります。人手のtask labelがないことと、lossを計算するtargetがないことは別です。

「生成が1 tokenずつなら、学習も1位置ずつしか計算できない」

causal maskにより各位置は未来を見られませんが、学習時は正解列が既知です。teacher forcingを使い、複数位置のlogitとlossをまとめて計算できます。

「損失が下がれば事実性も上がる」

損失は対象corpus上のtoken予測を測ります。事実性、最新性、指示追従、安全性には別の評価が必要です。

「LLMは学習文をdatabaseのように検索している」

通常の生成はparameterが表す確率分布から行われ、出典付きの検索とは異なります。一方で逐語暗記は起こり得るため、「databaseではない」ことから「文章は保存されない」と結論してはいけません。

「dataは多いほどよい」

利用条件、品質、重複、分野比率、評価汚染を無視した追加は、能力を改善しないだけでなくriskを増やすことがあります。量と同時に、何を何回見せたかを管理します。

まとめ

事前学習は、文章から自動で予測問題を作り、cross entropyを減らす方向へparameterを更新する自己教師あり学習です。その本体は、data準備、教材化、目的関数、teacher forcing、loss、gradient update、評価の連鎖にあります。

GPT型、BERT型、T5型では、見せる文脈と正解の作り方が異なります。model・data・computeは別々に最大化するのではなく、目的と制約に合わせて配分します。

そして、低い予測損失は有用な基盤であって、真実性や安全性の保証ではありません。暗記、汚染、古さ、biasを評価し、SFT・選好学習・RAGへ適切に責務を渡して、初めて実用的なLLM systemになります。

関連記事

次に読むべき記事

次回は次トークン予測だけでなぜ賢くなるのかで、単純に見える目的関数がfew-shot learningや複数taskの形式へつながる理由を掘り下げます。

参考資料

コメント

タイトルとURLをコピーしました