LLMのTrainingとInferenceを「検量線を引く・使う」で理解する
LLMについて勉強していると、
- Training(学習)
- Inference(推論)
という言葉が出てきます。
説明だけ読むと、
Trainingはモデルを学習すること
Inferenceは学習済みモデルから回答を生成すること
となります。
もちろん正しいのですが、これだけだと両者の違いが少しつかみにくいかもしれません。
そこで私は、TrainingとInferenceを説明するとき、
検量線を引くのがTraining、できた検量線を使うのがInference
と考えると分かりやすいのではないかと思っています。
化学分析などで検量線を使ったことがある人には、かなり馴染みやすい比喩です。
まず検量線を作る
例えば、ある物質の濃度を吸光度から求めたいとします。
最初から未知試料を測定しても、
吸光度 = 0.50
だけでは、その物質がどのくらいの濃度なのか分かりません。
そこで、まず濃度が分かっている標準試料を用意します。
例えば、
濃度 吸光度
----------------
0 0.02
10 0.21
20 0.41
30 0.60
40 0.81
のような測定結果が得られたとします。
これを使って、
既知濃度の標準試料
↓
測定
↓
濃度と吸光度の関係を求める
↓
検量線
を作ります。
これが「検量線を引く」工程です。
LLMでは、これがTrainingに相当する
LLMでも、まず大量のTraining Dataを使ってモデルを学習します。
かなり単純化すると、
大量のTraining Data
↓
Training
↓
Model Parameters
(Weights)
↓
Trained Model
となります。
Trainingによって、ニューラルネットワーク内部のWeight(重み)が調整されます。
つまりTrainingは、
データから関係を学習し、モデル内部のParameterを作っていく工程
です。
検量線でいえば、
標準試料から
濃度と吸光度の関係を求める
ことに相当します。
その意味で、
検量線を引く
≒
Trainingする
と考えることができます。
検量線ができたら、今度は使う
検量線が完成した後、未知試料を測定したところ、
吸光度 = 0.50
だったとします。
今度は、既に作った検量線を使います。
未知試料
吸光度 = 0.50
↓
完成済みの検量線に当てはめる
↓
濃度 ≒ 25
ここで重要なのは、
未知試料を測定するたびに、検量線を作り直しているわけではない
ということです。
既に作った検量線を使って、未知の値を求めています。
LLMでは、これがInferenceに相当する
LLMでも同じように考えられます。
Training済みのモデルへInputを与え、
Trained Model
+
Input
↓
Inference
↓
Output
という処理を行います。
普段ChatGPTなどに質問して回答を受け取る処理は、基本的にはこちら側です。
つまり、
検量線を作る
↓
Training
検量線を使う
↓
Inference
という対応で考えることができます。
TrainingとInferenceを並べてみる
対応関係をまとめると、こんな感じです。
| LLM | 検量線 |
|---|---|
| Training Data | 濃度が既知の標準試料と測定値 |
| Training | 標準試料から検量線を引く |
| Model Parameters | 検量線を表す係数や関係 |
| Trained Model | 完成した検量線 |
| Input | 未知試料の測定値 |
| Inference | 検量線を使って値を求める |
| Output | 推定された濃度 |
もちろんLLMは、単純な一次式で表せる検量線とは比較にならないほど巨大で複雑なモデルです。
ここで言いたいのは、
「LLMは検量線と同じ仕組みで動いている」
ということではありません。
あくまで、
データからモデルを作る工程と、できたモデルを使う工程は別
という点を理解するための比喩です。
InferenceするたびにWeightを学習しているわけではない
この比喩を使うと、もう一つ分かりやすくなることがあります。
例えばChatGPTと会話していると、
User:
私はC#を使っています。
Assistant:
分かりました。
User:
私が使っている言語は?
Assistant:
C#ですね。
となります。
これを見ると、
AIが「私はC#を使っている」と学習した
ようにも見えます。
しかし、これは通常、TrainingによってモデルのWeightそのものを書き換えたという意味ではありません。
会話履歴などがContextとして与えられ、その情報を使ってInferenceしていると考えた方がよいでしょう。
検量線で考えてみます。
未知試料を測定
↓
検量線に当てはめる
↓
濃度を求める
この処理を100回行ったからといって、
検量線そのものが
100回学習し直された
わけではありません。
LLMでも、
Training
↓
Weightを作る・更新する
Inference
↓
そのWeightを使って
Outputを生成する
という区別があります。
「覚えている」と「学習した」は別
ここはLLMを使っていると、かなり混同しやすいところです。
AIが前の発言を覚えているように見えるからといって、
覚えている
=
Weightが更新された
とは限りません。
例えば、
Conversation History
RAG
Memory
Tool Result
System Instructions
などが今回のContextとしてモデルへ渡されていれば、その情報を使って回答できます。
これはTrainingとは別の話です。
Training
↓
Model Weights
↓
LLM
+
Context
↓
Inference
↓
Output
こう分けると、
「モデルが持っているもの」と「今回モデルへ渡したもの」
の違いも見えてきます。
まとめ
TrainingとInferenceは、検量線を例にするとかなり単純に分けられます。
検量線
標準試料
↓
検量線を引く
↓
完成した検量線
↓
未知試料を入れる
↓
値を求める
LLM
Training Data
↓
Training
↓
Trained Model
↓
Input
↓
Inference
↓
Output
一言でまとめれば、
Trainingは「使うためのモデルを作る」工程。
Inferenceは「作ったモデルを使う」工程。
そして検量線で言い換えるなら、
Trainingは検量線を引く。
Inferenceは検量線を使う。
この二つを分けて考えるだけでも、LLMの仕組みはかなり見通しがよくなると思います。