0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[機械学習/深層学習] GPTモデルを微調整して簡単な日本語ニュース文章を要約(自習用)

Last updated at Posted at 2026-01-06

 今回のコードでは「文章を 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)

参考文献、リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?