はじめに

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
JSONDecodeError: 0件(100%成功)

モデル別スコア

| モデル | 平均スコア | 改善幅 | |--------|-----------|--------| | 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
--- 関連記事: プロジェクトリポジトリ: dpo-rlhf-demo