トークン化とパディングを学んで、テキストがモデルに読める形になりました。でも、まだ大事な課題が残っています。
「モデルに会話の正しい部分からだけ学習させる」ってどうやるの?
今回は、命令ファインチューニングの核心技術「アシスタントのみマスキング」について学びます!
復習:言語モデルの学習方法
言語モデルは、一度に1つの位置で次のトークンを予測して学習します。
「The cat sat on the mat」というシーケンスがあったら:
- 「The」が与えられた → 「cat」を予測
- 「The cat」が与えられた → 「sat」を予測
- 「The cat sat」が与えられた → 「on」を予測
各予測は損失値を生成して、その損失がバックプロパゲーション(逆伝播)を通じて学習をガイドします。
デフォルトでは、モデルはすべての位置で損失を計算します。でも、命令ファインチューニングでは、それは望ましくないんです。
問題:ユーザーの質問まで学習しちゃう
命令ファインチューニングでは、こんなデータを使います:
ユーザー: 2+2は何ですか?
アシスタント: 4
もしすべての位置で損失を計算すると、モデルはすべてのトークンを予測することを学習します。「What’s」「2+2?」「Assistant:」を含めて!
なぜこれが問題?
推論中(実際に使う時)、モデルはユーザー入力を生成しません。ユーザーがそれを提供します。モデルはアシスタントの応答だけを生成すればいいんです。
ユーザートークンを予測するようにトレーニングすると、間違った動作を教えちゃいます。
だから、ベースモデル(命令チューニング前)は、プロンプトを模倣したり、質問にさらに質問で返したりすることがよくあるんです。「プロンプトを読む」と「答える」を区別することを学んでいないからですね。
解決策:モデルに「どのトークンから学習し、どれを無視するか」を伝える。それがマスキングの役割です!
アシスタントのみマスキング:仕組み
マスキングは、どの位置が損失に寄与するかを制御します。
PyTorchでは、無視されたトークンは特別な値「-100」でマークされます。損失関数が-100に遭遇すると、そのトークンを完全にスキップするんです。
具体例で見てみよう
こんなやり取り:
ユーザー: フランスの首都は何ですか?
アシスタント: パリです。
トークン化すると:
[ユーザー][フランス][の][首都][は][何][ですか][?][アシスタント][パリ][です][。]
マスキングなし(全部学習):
損失を計算: [○][○][○][○][○][○][○][○][○][○][○][○]
全部のトークンから学習しちゃう。
アシスタントのみマスキング(正しい方法):
損失を計算: [×][×][×][×][×][×][×][×][×][○][○][○]
アシスタントの応答部分だけから学習!
Pythonコードで表すと:
# 入力ID
input_ids = [101, 1234, 5678, ..., 9012]
# ラベル(損失計算用)
labels = [-100, -100, -100, ..., 9012]
# ↑ユーザー部分は-100 ↑アシスタント部分は実際のID
なぜこれが重要?
アシスタントのみマスキングがないと:
悪い例(マスキングなし):
ユーザー: こんにちは
モデル: ユーザー: こんにちは
アシスタント: こんにちは!お元気ですか?
ユーザー入力まで繰り返しちゃう…
良い例(マスキングあり):
ユーザー: こんにちは
モデル: こんにちは!お元気ですか?
適切な応答だけを生成!
モデルは「プロンプトを読んで理解する」と「適切に応答する」の違いを学習できるんです。
実装のポイント
Hugging FaceのTrainerを使えば、自動的にマスキングが適用されます:
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
per_device_train_batch_size=4,
# その他の設定...
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
# マスキングは自動!
)
trainer.train()
もし手動でやる場合は、チャットテンプレートを適用する際に、ユーザー部分のラベルを-100に設定します。
まとめ:選択的学習の力
アシスタントのみマスキングは:
- ユーザーの質問部分を無視(-100でマーク)
- アシスタントの回答部分だけから学習
- モデルに「読む」と「答える」の違いを教える
これにより:
- プロンプトを模倣しない
- 質問に質問で返さない
- 適切な応答を生成する
チャットボットが作れるようになるんです!
次のレッスンからは、データ型(FP32、FP16、INT8など)や量子化、LoRA/QLoRAといった効率化技術に入っていきます。ファインチューニングの実践がいよいよ近づいてきましたよ。楽しみにしていてくださいね!

コメント