今回のコードでは「文章を GPT-2 に微調整して、一文にまとめる」という小規模学習を体験するためのサンプルを作成しました。本格的にニュース記事要約をする場合は、もっと大きなデータセットやエンコーダ・デコーダモデルが必要になるイメージです。
なかなか意図した動きまで辿り着けなかったですが、処理の流れなど学習用に記載します。
前提
- 実行環境はGoogle Colab。ランタイムはPython3(T4 GPU)を使用
※ 参照:機械学習・深層学習を勉強する際の検証用環境について - 本記事のコード全容はこちらからダウンロード可能。ipynbファイルであり、そのまま自身のGoogle Driveにアップロードして実行可能
- 数学的知識や用語の説明について、参考文献やリンクを最下部に掲載 (本記事内で詳細には解説しませんが、流れや実施内容がわかるようにしたいと思います)
全体の流れ
- 上段で「文章を機械が理解できる形に変換」
- 真ん中で「GPT-2にニュース文章の特徴を覚えさせる」
- 下段で「生成パラメータを工夫して、文章を途中で切らずに自然に出力」
入力文章
▼
トークナイズ(文章 → トークンID)
▼
データ整形・バッチ化(DataCollator)
▼
GPT-2微調整(Trainerで少量ニュース文章を学習)
▼
要約生成プロンプト作成
「次の文章を一文で簡潔にまとめてください: ...」
▼
文章生成(model.generate)
・ビーム探索(num_beams=5)
・n-gram繰り返し防止
・max_lengthで途中切れ防止
▼
トークン → 文章に変換(tokenizer.decode)
▼
最終要約文章
「東京では先週末、大雪の影響で鉄道やバスが一部運休し…」
実装
1. ライブラリのインポートとデバイス設定
- PyTorch と Hugging Face Transformers を使ってモデルを操作する準備。
- GPU が使える場合は GPU、なければ CPU で実行。
- Dataset は文章を扱いやすくするためのデータ構造。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments, DataCollatorForLanguageModeling
from datasets import Dataset
device = "cuda" if torch.cuda.is_available() else "cpu"
2. モデルとトークナイザーの準備
- 日本語 GPT-2 モデル (rinna/japanese-gpt2-medium) を読み込み。
- トークナイザー:文章をモデルが扱えるトークンに変換。
- モデル:トークン列を受け取り、次のトークンを生成できる。
- GPT-2 は PAD トークンを持たないため、EOS トークンを代用。
- バッチ処理時の警告を防ぐ。
model_name = "rinna/japanese-gpt2-medium"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name).to(device)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
model.config.pad_token_id = tokenizer.pad_token_id
3. 訓練用データの作成
- 少し長めのニュース文章をサンプルとして用意。
- Dataset に変換してモデル学習用に扱いやすくする。
texts = [
"""文部科学省は2026年度の予算で科学技術分野に9863億円を計上した。
科学研究費助成事業(科研費)は101億円増の2479億円で、基礎研究支援を強化する方針である。
また、有人月探査「アルテミス計画」関連の予算も増額され、大学や企業による研究開発が活発化する見込みである。""",
"""東京では先週末、大雪の影響で交通機関に大きな遅れが発生した。
鉄道やバスは一部運休となり、通勤・通学に大幅な影響が出た。
道路の渋滞や滑りやすい路面により、事故防止の呼びかけも行われた。
市民生活や物流にも影響が広がり、交通当局は注意を呼びかけた。""",
"""人気のAI家電が市場に登場した。
音声操作や自動清掃機能を搭載し、家庭の利便性向上が期待されている。
一部製品ではAIがユーザーの生活習慣を学習し、自動で家事の最適化を行う機能も搭載されている。"""
]
dataset = Dataset.from_dict({"text": texts})
4. トークナイズ(文章→トークン)
- 各文章をトークンに変換。
- max_length=128 で長さをそろえ、短い文章は PAD。
def tokenize_function(examples):
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128)
tokenized_datasets = dataset.map(tokenize_function, batched=True, remove_columns=["text"])
5. データコラトルの準備
- バッチをまとめるときにパディングやラベルを整形。
- mlm=False → GPT-2 は自己回帰型なので、マスク予測不要。
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
6. 学習設定
- 学習の詳細設定:
- エポック数(全データを何回回すか)
- バッチサイズ
- 保存・ログ間隔
- WandB レポートを無効化
training_args = TrainingArguments(
output_dir="./gpt2_finetuned",
overwrite_output_dir=True,
num_train_epochs=2,
per_device_train_batch_size=2,
save_steps=50,
save_total_limit=2,
logging_steps=10,
report_to=[], # wandb 無効化
)
7. Trainer 準備と学習開始
- Hugging Face の Trainer で簡単に微調整。
- 文章が少ないため学習は軽めで終了。
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets,
tokenizer=tokenizer,
data_collator=data_collator
)
trainer.train()
8. 要約生成関数
- プロンプト作成:モデルに「一文でまとめて」と指示。
- generate の設定:
- max_length…最大トークン数
- num_beams…ビーム探索でより良い文章を探索
- no_repeat_ngram_size…同じフレーズの繰り返しを防ぐ
- early_stopping…生成が安定したら早めに終了
- 出力トークン列を文字列に戻して返す。
- これで「途中で切れにくい」要約が生成できるようになった。
def generate_summary(text, max_length=120, num_beams=5):
prompt = f"次の文章を一文で簡潔にまとめてください:\n\n{text}\n\n要約:"
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, padding=True).to(device)
outputs = model.generate(
**inputs,
max_length=max_length,
num_beams=num_beams,
no_repeat_ngram_size=2,
early_stopping=True,
pad_token_id=tokenizer.eos_token_id
)
summary = tokenizer.decode(outputs[0], skip_special_tokens=True)
return summary
9. 要約生成関数
- 実際にモデルに文章を投げて、一文にまとめる。
- GPT-2 自己回帰型でも、max_length や no_repeat_ngram_size の設定で途中切れをかなり防げる。
- 結果として、短くて読みやすいニュース風要約が出力される(が、内容にズレがある)。
sample_text = """
東京では先週末、大雪の影響で交通機関に大きな遅れが発生した。
鉄道やバスは一部運休となり、通勤・通学に大幅な影響が出た。
道路の渋滞や滑りやすい路面により、事故防止の呼びかけも行われた。
市民生活や物流にも影響が広がり、交通当局は注意を呼びかけた。
"""
summary = generate_summary(sample_text)
print("=== 要約結果 ===")
print(summary)
参考文献、リンク
- ゼロからつくるPython機械学習プログラミング入門
-
詳解ディープラーニング第2版
※ 詳解とありますが、入門的な内容から丁寧に解説してあります。 -
YouTubeチャンネル - 予備校のノリで学ぶ「大学の数学・物理」
※ 数学的知識の学習としては、世界一わかりやすかったです。