はじめに
DPO(Direct Preference Optimization)訓練において、モデルの性能を客観的に評価することは非常に重要です。Trial 17でGPT-4 APIを使った自動評価システムを構築しましたが、JSONDecodeErrorにより2/50評価で停止してしまいました。 そこでTrial 18では、エラー原因を特定して修正し、50/50評価を完全達成することに成功しました。 本記事では、Trial 17での失敗、Trial 18での修正内容、そして完全評価の結果について報告します。 ---実行サマリー
日時: 2025-10-29 実行時間: 22.8分(訓練14.9分 + 評価7.9分) 推定コスト: ~$0.49(GPU: $0.46 + OpenAI API: ~$0.03) インスタンス: gpu_1x_a100_sxm4 (us-east-1, $1.29/時間) 評価完了: 50/50 (100%) ✅ ---Trial 17の失敗
Trial 17では、SFT Model Q2でJSONDecodeErrorが発生し、2/50評価で停止しました。
エラー詳細
json.decoder.JSONDecodeError: Unterminated string starting at: line 3 column 16 (char 31)
原因:
1. GPT-4のmax_tokens=300が不十分で、JSON応答が途中で切れた
2. JSONDecodeErrorがリトライ対象外だった
3. trial17_full_training.shで作業ディレクトリが未設定
---
Trial 18の修正内容
1. max_tokensを300→500に増加
修正箇所: gpt4_evaluator.py:90
completion = self.client.chat.completions.create(
model=self.model,
messages=[...],
temperature=self.temperature,
max_tokens=500, # 300 → 500に増やしてJSONの切り捨てを防ぐ
response_format={"type": "json_object"}
)
2. JSONDecodeErrorをリトライ対象に追加
修正箇所: gpt4_evaluator.py:107
リトライ対象のエラー(JSONDecodeErrorを追加)
if error_type in ["RateLimitError", "APIError", "Timeout", "JSONDecodeError"]: if attempt == max_retries - 1: raise Exception(f"Max retries reached. Last error: {e}")
delay = min(base_delay (2 * attempt), max_delay) print(f" ⚠️ {error_type} (attempt {attempt + 1}/{max_retries}): {e}") print(f" ⏳ Waiting {delay:.1f} seconds...") time.sleep(delay)
3. 作業ディレクトリの明示的設定
修正箇所:trial18_full_pipeline.sh:7
#!/bin/bash
set -e # エラーで即座に終了
ワークディレクトリに移動
cd ~/workspace
echo "=== Step 1: SFT訓練 ==="
python3 train_trial13_sft.py 2>&1 | tee trial13_sft.log
...
---
Trial 18実行結果
50/50評価完了
評価状況:- Base Model: 10/10 ✅
- SFT Model: 10/10 ✅
- DPO Beta=0.05: 10/10 ✅
- DPO Beta=0.03: 10/10 ✅
- DPO Beta=0.01: 10/10 ✅
モデル別スコア
| モデル | 平均スコア | 改善幅 | |--------|-----------|--------| | Base | 2.70/5 | - | | SFT | 3.20/5 | +0.50 ✨ | | DPO (β=0.05) | 4.00/5 | +0.80 ✨ | | DPO (β=0.03) | 3.90/5 | +0.70 | | DPO (β=0.01) | 3.70/5 | +0.50 |
ベストモデル: DPO Beta=0.05(平均スコア4.00/5)訓練ログ
| ステージ | 結果 |
|---------|------|
| SFT訓練 | Loss: 13.4954 → 0.2915 (78.4%削減)
早期停止: epoch 14.62 |
| DPO Beta=0.05 | Accuracy: 100%
Margins: 0.045 → 1.502 (33倍改善) |
技術的成果
✅ GPT-4評価システムの完全動作
- 50/50評価を100%達成
- JSONDecodeError: 0件
- リトライ機構の有効性を実証
✅ DPO訓練の効果を定量化
- Base → SFT: +0.50(18%改善)
- SFT → DPO(β=0.05): +0.80(25%改善)
- Base → DPO(β=0.05): +1.30(48%改善) ✨
✅ Beta値の最適値を特定
Beta=0.05が最良:- 最高スコア: 4.00/5
- Chosenマージン改善: 33倍
- 過学習なし(Trial 13で確認済み)
重要な発見
1. Token制限の重要性
max_tokens=300は不十分。GPT-4のJSON応答には最低500トークンが必要。2. リトライ対象の選定
JSONDecodeErrorは一時的エラーの可能性があるため、リトライ対象に含めるべき。
3. 作業ディレクトリの明示
Lambda Labs自動化では、すべてのシェルスクリプトでcd ~/workspaceを最初に実行すべき。
---
結論
Trial 18の成功要因
1. ✅ max_tokens増加: JSON切り捨て防止 2. ✅ JSONDecodeErrorリトライ: 一時的エラーへの対応 3. ✅ 作業ディレクトリ設定: スクリプト実行の安定化
証明されたこと
- DPOは確実に機能する: Base → DPO で48%改善
- GPT-4評価は信頼できる: 50/50評価を安定して完了
- Beta=0.05が最適: 最高スコアと過学習防止を両立
次のステップ
データセット拡張
- 現在: 50ペア
- 目標: 100〜200ペア
- カテゴリ別の拡充(商品、配送、返品、問い合わせ等)
より大きなモデルでの検証
- 現在: open-calm-3b
- 候補: llm-jp-3-13b、gemma-2-9b
