20. 命令ファインチューニングの秘密!アシスタントのみマスキング

スポンサーリンク

トークン化とパディングを学んで、テキストがモデルに読める形になりました。でも、まだ大事な課題が残っています。

「モデルに会話の正しい部分からだけ学習させる」ってどうやるの?

今回は、命令ファインチューニングの核心技術「アシスタントのみマスキング」について学びます!

復習:言語モデルの学習方法

言語モデルは、一度に1つの位置で次のトークンを予測して学習します。

「The cat sat on the mat」というシーケンスがあったら:

  1. 「The」が与えられた → 「cat」を予測
  2. 「The cat」が与えられた → 「sat」を予測
  3. 「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といった効率化技術に入っていきます。ファインチューニングの実践がいよいよ近づいてきましたよ。楽しみにしていてくださいね!

コメント

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