SAMSum Fine-Tuningプロジェクト:ベースラインパフォーマンスの確立

スポンサーリンク

SAMSum Fine-Tuningプロジェクト:ベースラインパフォーマンスの確立

  • ベースライン評価
  • 評価メトリック
  • Hugging Face
  • LLM Fine-Tuning
  • モデルベンチマーク
  • オープンウェイトモデル
  • パフォーマンス測定
  • パフォーマンスメトリック
  • ROUGE
  • SAMSum
  • 要約
  • Ready Tensor
  • Mohamed Abdelhamid
  • Wasif Mehmood

🏠
ホーム – 全レッスン

⬅️
前へ – Week 3概要

➡️
次へ – GPTモデルのFine-Tuning

データセットをロードし、小規模な評価を実行し、モデルの初期ROUGEスコアを記録します。その数字がリファレンスポイントになります—以降のすべてのfine-tuning実験の基礎となる「前」のスナップショットです。

最終的に、タスク、メトリック、そして閉じることを目指すパフォーマンスギャップを理解できるようになります—最初の完全なfine-tuningプロジェクトで続くすべての基礎となります。

最初のFine-Tuningプロジェクト:対話要約のためのSAMSum

今週は実践的です。Fine-tuningについて学ぶだけでなく、実際に行います。

そして優れた実験と同様に、次のように問うことから始めます:
「ベースラインパフォーマンスは何か – 打ち負かそうとしているものは何か?」

SAMSumデータセットは、人間が書いた要約とペアになった実世界のチャット会話のコレクションです。各例は次のようになります:

dialogue:
Amanda: I baked cookies. Do you want some?
Jerry: Sure!
Amanda: I'll bring you tomorrow :-)

summary:
Amanda baked cookies and will bring Jerry some tomorrow.

モデルのタスクは、対話を入力として受け取り、同様のスタイルで簡潔な要約を生成することです。

これにより、SAMSumは次の理由でプロジェクトに最適です:

  • 具体的で測定可能 — ROUGEメトリックを使用して要約品質を評価できます。
  • 短く効率的 — Colab実験に十分速く実行されます。
  • 現実的 — 実際の会話要約ユースケースを反映しています。

SAMSumがこの演習に適している理由

SAMSumを選んだのは、迅速に実験するのに十分小さく、fine-tuningについて意味のある教訓を教えるのに十分豊かだからです。

これは教師あり要約タスクであり、改善が見やすいです:高いROUGEスコアはより良い要約を意味します。
また、数学推論データセットとは異なり、SAMSumは生成品質を測定します—PPOやGRPOのような強化学習手法を必要とせずに、fine-tuningメカニクスを探索するのに最適です。

ベースモデルの選択

今週の目標は、最高のパフォーマンスを発揮する数学モデルを構築することではなく、fine-tuningのメカニクスを学ぶことです。

つまり、小さく、速く、完全に透明なセットアップに焦点を当てます。そうすれば、プロセスのすべてのステップを理解できます。

Llama 3 1B Instruct、MetaのLlama 3ファミリーで最小のオープンウェイトモデルを使用します。

なぜこれなのか?

  • プレミアムGPUなしでもGoogle Colabで快適に実行できるほど軽量です。
  • 指示追従をサポートしているため、数学スタイルのプロンプトを理解し応答できます。
  • Fine-tuningから測定可能な改善を示すのに十分大きい—しかし実験が妥当な時間で終了するのに十分小さい。

実際の世界では、モデルの選択はタスク、データスケール、パフォーマンスニーズに依存します—エンタープライズグレードのユースケースには7B、13B、またはフロンティアモデルを選ぶかもしれません。

しかしここでは、小さいほど良いです。ワークフローを学んでいます—そして、この1Bモデルで行うすべてが、後でより大きなモデルに直接スケールします。

これが「前」のモデルになります—週の残りを通じてすべての改善を測定する参照点です。

ベースライン評価の実行

データセットをロードし、クイック評価ループを準備し、精度を測定します。

このセクションには最小限のコードが含まれています—ロジックを示すのに十分です。Colabで一緒にフォローするか、完全なウォークスルーのための付随ビデオを見ることができます。

ビデオウォークスルー 🎥

このビデオでは、SAMSumデータセットでLlama 3.2 1B Instructを実行して、ベースライン要約パフォーマンスを測定します。

前提条件 — 依存関係

このベースラインのすべては、pipを通じて利用可能なオープンソースライブラリで実行されます:

pip install -q transformers datasets evaluate accelerate peft bitsandbytes

各ライブラリの機能:

  • transformers — Llama 3.2モデル、トークナイザー、生成パイプラインを提供します。
  • datasets — SAMSumデータのロード、キャッシング、サンプリングを処理します。
  • evaluate — ROUGEおよびその他のメトリックを計算します。
  • accelerate — 効率的なマルチデバイス推論を可能にします(暗黙的に使用)。
  • peft — LoRA/QLoRAをサポートします(まだ使用していませんが、次のレッスンに備えています)。
  • bitsandbytes — 4ビット量子化のオプションライブラリ(後で使用します)。

これらをインストールすれば、Colabまたはローカル環境で全体のパイプラインを再現できます。

ステップ 1 — データセット設定

プロジェクトのconfig.yaml内でデータセットを定義します:

config.yaml

dataset:
 name: knkarthick/samsum
 cache_dir: ../data/datasets
 field_map:
 input: dialogue
 output: summary
 type: completion
 splits:
 train: 200
 validation: 200
 test: 200
 seed: 42

これにより再現性が確保され、重要な設定が1か所に保持されます。週を通じてこの設定ファイルを構築していきます。

ステップ 2 — データセットのロードと準備

ヘルパー関数がダウンロード、キャッシング、サンプリングを処理します:

def load_and_prepare_dataset(cfg):
 """
 設定に従ってデータセット分割をロードします。
 """
 cfg_dataset = cfg["dataset"]
 dataset = load_dataset(cfg_dataset["name"])
 val_key = "validation" if "validation" in dataset else "val"

 train = select_subset(dataset["train"], cfg_dataset["splits"]["train"], seed=42)
 val = select_subset(dataset[val_key], cfg_dataset["splits"]["validation"], seed=42)
 test = select_subset(dataset["test"], cfg_dataset["splits"]["test"], seed=42)

 print(f"📊 Loaded {len(train)} train / {len(val)} val / {len(test)} test samples.")
 return train, val, test

この関数は、迅速なベースラインテストのために分割ごとに正確に200サンプルを提供します。

ステップ 3 — モデルとトークナイザーのロード

量子化とLoRAモードの両方をサポートする統一されたセットアップ関数を使用しますが、ここではシンプルに保ちます:

def setup_model_and_tokenizer(cfg, use_4bit=False, use_lora=False):
 model_name = cfg["base_model"]
 tokenizer = AutoTokenizer.from_pretrained(model_name)
 tokenizer.pad_token = tokenizer.eos_token
 tokenizer.padding_side = "right"

 model = AutoModelForCausalLM.from_pretrained(
 model_name,
 device_map="auto",
 dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
 )

 print("🔹 Using base model only (no LoRA).")
 return model, tokenizer

ステップ 4 — 予測の生成

ロードされたら、各対話を要約するようモデルにプロンプトできます:

def generate_predictions(model, tokenizer, dataset, task_instruction, batch_size=8):
 prompts = []
 for sample in dataset:
 user_prompt = (
 f"{task_instruction}\n\n"
 f"## Dialogue:\n{sample['dialogue']}\n## Summary:"
 )
 messages = [{"role": "user", "content": user_prompt}]
 prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
 prompts.append(prompt)

 pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, do_sample=False)
 preds = []
 for i in tqdm(range(0, len(prompts), batch_size), desc="Generating summaries"):
 batch = prompts[i : i + batch_size]
 outputs = pipe(batch, max_new_tokens=256, return_full_text=False)
 preds.extend([o[0]["generated_text"].strip() for o in outputs])

 return preds

使用した指示:

"You are a helpful assistant who writes concise, factual summaries of conversations. "
"Summarize the following conversation into a single sentence."

ステップ 5 — ROUGEスコアの計算

evaluateパッケージを使用して標準的なメトリックを計算します:

def compute_rouge(predictions, samples):
 rouge = evaluate.load("rouge")
 references = [s["summary"] for s in samples]
 return rouge.compute(predictions=predictions, references=references)

ROUGEとは?

ROUGE (Recall-Oriented Understudy for Gisting Evaluation) は、テキスト要約品質を評価するための標準的なメトリックです。
モデルが生成した要約と参照(正解)要約の間にどれだけの重複があるかを比較します。

各スコアの意味は次のとおりです:

  • ROUGE-2:バイグラム(2語のシーケンス)の重複を測定します。
    → 短いフレーズレベルの一貫性と流暢性を捉えます。
  • ROUGE-L:生成された要約と参照要約の間の最長共通部分列(LCS)に基づいています。
    → モデルが文の構造と順序をどれだけよく保持しているかを反映します。

要約:

  • より高いROUGE-1/2 → より良い語彙の重複(単語とフレーズの選択)。
  • より高いROUGE-L → より良い構造的および意味的アライメント。

すべてをまとめる

最後に、メイン評価がすべてを調整します:

def evaluate_baseline():
 _, val_data, _ = load_and_prepare_dataset(cfg)
 model, tokenizer = setup_model_and_tokenizer(cfg, use_4bit=False, use_lora=False)

 preds = generate_predictions(
 model=model,
 tokenizer=tokenizer,
 dataset=val_data,
 task_instruction=cfg["task_instruction"],
 batch_size=4,
 )

 scores = compute_rouge(preds, val_data)

 print("\n💾 Results:")
 print(json.dumps(scores, indent=2))
 return scores

ベースライン結果

Llama 3.2 1B Instructモデルは次の結果を達成しました:

結果はベースラインパフォーマンスを示しています。次のいくつかのレッスンでは、ROUGEスコアを改善するためにモデルをfine-tuningします。

実践における要約 🎥

このビデオでは、要約が非常に価値のある実世界のLLMアプリケーションである理由を学び、大規模コンタクトセンターシステムでどのように使用されているかを見て、技術的にもビジネス的にも「良い」要約を真に定義するものを理解します。

次は何か

このベースラインは、私たちがどこから始めているかを定義します—fine-tuning前にモデルがすでに何ができるかです。

これは3つのことを提供します:

  • パフォーマンスの現実 — 測定可能で再現可能な参照点。
  • ワークフローの検証 — データ、推論、評価がすべて正しく配線されています。
  • ベンチマーク基盤 — すべてのfine-tuning改善はこれと比較されます。

次のレッスンでは、フロンティアモデル—OpenAIの4o-mini—に切り替えて、同じSAMSumデータセットでどのようにパフォーマンスを発揮するかをテストします。
また、OpenAIのマネージドfine-tuningパイプラインを使用してfine-tuningし、これらのベースラインと結果を比較して、fine-tuningが実際にどのような利益をもたらすかを見ます。

そこから本当の実験が始まります。

  • プロジェクトセットアップ:今週構築するもの

コメント

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