japanese-gpt2-medium-formal-fullft
rinna/japanese-gpt2-medium(GPT-2アーキテクチャ、336M)を、カジュアルな日本語文をフォーマルな日本語文に変換する指示応答データでフルファインチューニングしたモデルです。
学習データはMAGPIE(arXiv:2406.08464)の手法で Qwen/Qwen2.5-7B-Instruct を使い1,000件合成し、日本語純度・フォーマット・長さ比・疑問形保持・重複でフィルタしたものを使用しています。
同じデータ・同条件でLoRAのみを学習した Sapolas0730/japanese-gpt2-medium-formal-lora との比較実験の詳細はZenn記事を参照してください。
使い方
Hugging Face transformers の標準形式で保存されているため、そのまま読み込めます。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "Sapolas0730/japanese-gpt2-medium-formal-fullft"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
model.eval()
instruction = "次の文をフォーマルな言い方に変換してください:明日暇?"
prompt = f"以下はタスクを説明する指示です。指示に従って応答を書いてください。\n\n### 指示:\n{instruction}\n\n### 応答:\n"
input_ids = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).input_ids
output_ids = model.generate(
input_ids,
max_new_tokens=100,
min_new_tokens=5,
pad_token_id=tokenizer.pad_token_id or tokenizer.eos_token_id,
eos_token_id=tokenizer.eos_token_id,
repetition_penalty=1.3,
no_repeat_ngram_size=3,
)
print(tokenizer.decode(output_ids[0][input_ids.shape[-1]:], skip_special_tokens=True))
学習詳細
- ベースモデル:
rinna/japanese-gpt2-medium(学習可能パラメータ 336,128,000 = 100%) - 学習率: 5e-5 / バッチサイズ4 × 勾配累積4(実効バッチサイズ16)
- 検証データ10%を分け、Early Stopping(patience=3)で最良時点のモデルを採用
- 採用エポック: 2.0(eval_loss 1.021)。以降のエポックでeval_lossが悪化し過学習
- ピークGPUメモリ: 6.84GB / 学習時間: 67.3秒
既知の制約
- 学習データは1,000件の合成データのみで、実運用の日本語表現を網羅していません。
- エポック数を増やすと過学習しやすく、汎化性能は限定的です。
- 推論時に貪欲法(greedy decoding)を使うと同一フレーズを繰り返すことがあるため、
repetition_penaltyやno_repeat_ngram_sizeの使用を推奨します。
ライセンス
ベースモデル(rinna/japanese-gpt2-medium)・学習データ生成に使用したQwen/Qwen2.5-7B-Instructはいずれも寛容なオープンライセンス(MIT / Apache 2.0)で公開されています。本モデルもこれに従います。