

# Amazon Nova モデルによる強化ファインチューニング (RFT)
<a name="nova-reinforcement-fine-tuning"></a>

## 概要
<a name="nova-rft-overview"></a>

**RFT とは?**

強化ファインチューニング (RFT) は、正確な回答ではなく、モデルのパフォーマンスを示す測定可能なスコアや報酬などのフィードバックシグナルでトレーニングすることで、モデルのパフォーマンスを向上させます。入出力ペアから学習する教師ありファインチューニング (SFT) とは異なり、RFT は報酬関数を使用してモデルレスポンスを評価し、モデルを繰り返し最適化してこれらの報酬を最大化します。このアプローチは、正確な正解出力を定義することが難しいものの、レスポンスの品質を確実に測定できる場合に優れた効果を発揮します。

**RFT はどのような場合に使用するか**

明確で測定可能な成功基準を定義できるが、トレーニング用に正確な出力を提供することが困難である場合は、RFT を使用します。RFT は以下に最適です:
+ 品質が主観的または多面的であるタスク (創造的な記述、コードの最適化、複雑な推論)
+ 複数の有効なソリューションがあり、一部のソリューションが他のソリューションよりも明らかに優れているシナリオ
+ 反復的な改善、パーソナライゼーション、または複雑なビジネスルールの遵守を必要とするアプリケーション
+ 高品質のラベル付き例の収集が高価または実用的でないケース

**最適なユースケース**

RFT は、出力品質を客観的に測定できるが、最適なレスポンスを事前に定義することが難しいドメインに優れています。
+ 数学的な問題解決とコード生成
+ 科学的推論と構造化データ分析
+ 段階的な推論または複数ターンの問題解決を必要とするタスク
+ 複数の目標 (精度、効率、スタイル) のバランスを取るアプリケーション
+ 実行結果またはパフォーマンスメトリクスを通じてプログラムで成功を検証できるシナリオ

**サポートされているモデル**

Nova Lite 2.0

## データ形式の概要
<a name="nova-rft-data-format"></a>

RFT トレーニングデータは、OpenAI の強化ファインチューニング[形式](https://platform.openai.com/docs/api-reference/fine-tuning/reinforcement-input)に従う必要があります。各トレーニング例は、以下を含む JSON オブジェクトです。
+ `system` および `user` ロールを使用した会話ターンの `messages` 配列
+ 報酬計算に期待される出力または評価基準を含む `reference_answer` フィールド

**現在の制限事項**
+ テキストのみ

### データ形式の例
<a name="nova-rft-data-examples"></a>

各例は、JSONL ファイルの 1 行上にあり、1 行に 1 つの JSON オブジェクトが必要です。

------
#### [ Chemistry problem ]

```
{
  "id": "chem-01",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful chemistry assistant"
    },
    {
      "role": "user",
      "content": "Calculate the molecular weight of caffeine (C8H10N4O2)"
    }
  ],
  "reference_answer": {
    "molecular_weight": 194.19,
    "unit": "g/mol",
    "calculation": "8(12.01) + 10(1.008) + 4(14.01) + 2(16.00) = 194.19"
  }
}
```

------
#### [ Math problem ]

```
{
  "id": "sample-001",  // Optional
  "messages": [
    {
      "role": "system",
      "content": "You are a math tutor"
    },
    {
      "role": "user",
      "content": "Solve: 2x + 5 = 13"
    }
  ],
  "reference_answer": {
    "solution": "x = 4",
    "steps": ["2x = 13 - 5", "2x = 8", "x = 4"]
  }
}
```

------
#### [ Code problem ]

```
{
  "id": "code-002",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful programming assistant"
    },
    {
      "role": "user",
      "content": "Write a Python function that reverses a string without using built-in reverse methods"
    }
  ],
  "reference_answer": {
    "code": "def reverse_string(s):  \n    result = ''  \n    for i in range(len(s) - 1, -1, -1):  \n        result += s[i]  \n    return result",
    "test_cases": [
      {
        "input": "hello",
        "expected_output": "olleh"
      },
      {
        "input": "",
        "expected_output": ""
      },
      {
        "input": "a",
        "expected_output": "a"
      },
      {
        "input": "Python123",
        "expected_output": "321nohtyP"
      }
    ],
    "all_tests_pass": true
  }
}
```

------

`reference_answer` フィールドには、報酬関数がモデルのレスポンスをスコアリングするために使用する期待される出力または評価基準が含まれます。構造化された出力に限定されず、報酬関数が品質を評価するのに役立つ任意の形式を含めることができます。

## データセットサイズの推奨事項
<a name="nova-rft-dataset-size"></a>

**開始点**
+ 最小 100 個のトレーニング例
+ 最小 100 個の評価例

**評価優先アプローチ**

大規模な RFT トレーニングに投資する前に、モデルのベースラインパフォーマンスを評価します。
+ **高パフォーマンス (95% を超える報酬)** – RFT は不要な場合があり、モデルのパフォーマンスは既に良好
+ **パフォーマンスが非常に低い (0% の報酬)**: まず SFT に切り替えて基本的な機能を確立する
+ **中程度のパフォーマンス** – RFT が適切である可能性が高い

小さいデータセットから始めると、次のことが可能になります。
+ 報酬関数にバグがないことを検証する
+ RFT がユースケースに適したアプローチであることを確認する
+ 問題を早期に特定して修正する
+ スケールアップする前にワークフローをテストする

検証後、より大きなデータセットに拡張してパフォーマンスをさらに向上させることができます。

## 効果的なトレーニングデータの特徴
<a name="nova-rft-effective-data"></a>

**明確性と一貫性**

優れた RFT の例には、さまざまなモデル出力にわたって正確な報酬計算を可能にする明確かつ曖昧ではない入力データが必要です。以下を含むデータのノイズを避けます。
+ 不整合なフォーマット
+ 矛盾するラベルまたは指示
+ あいまいなプロンプト
+ 参照回答の競合

あいまいさがあると、トレーニングプロセスが誤った方向に導かれ、モデルが意図しない動作を学習します。

**多様性**

データセットは、堅牢な実際のパフォーマンスを確保するために、本番稼働用ユースケースの完全な多様性をキャプチャする必要があります。以下が含まれます:
+ さまざまな入力形式とエッジケース
+ ログとユーザー分析から実際の本番稼働用使用パターンをマッピングする
+ ユーザータイプ、地理的リージョン、季節的変動をまたいでサンプリングする
+ 単純な問題から複雑な問題まで、難易度レベルを含める

**報酬関数に関する考慮事項**

効率的なトレーニングのために以下のように報酬関数を設計します。
+ (数分ではなく) 数秒以内に実行する
+ Lambda と効果的に並列化する
+ 一貫性のある信頼できるスコアを返す
+ さまざまなタイプのモデル出力を適切に処理する

高速でスケーラブルな報酬関数により、迅速なイテレーションと費用対効果の高い実験が行えます。

## その他のプロパティ
<a name="nova-rft-additional-properties"></a>

RFT データ形式は、コアスキーマ要件 (`messages` および `reference_answer`) を超えるカスタムフィールドをサポートします。この柔軟性により、報酬関数が適切な評価に必要な追加データを追加できます。

**注記**  
レシピでこれを設定する必要はありません。データ形式は本質的に追加のフィールドをサポートします。トレーニングデータ JSON に含めるだけで、`metadata` フィールドの報酬関数に渡されます。

**その他の一般的なプロパティ**

メタデータフィールドの例:
+ `task_id` – 追跡用の一意の識別子
+ `difficulty_level` – 問題の複雑さインジケータ
+ `domain` – サブジェクトエリアまたはカテゴリ
+ `expected_reasoning_steps` – ソリューションのステップ数

**追加プロパティの例**

```
{
  "messages": [
    {
      "role": "system",
      "content": "You are a math tutor"
    },
    {
      "role": "user",
      "content": "Solve: 2x + 5 = 13"
    }
  ],
  "reference_answer": {
    "solution": "x = 4",
    "steps": ["2x = 13 - 5", "2x = 8", "x = 4"]
  },
  "task_id": "algebra_001",
  "difficulty_level": "easy",
  "domain": "algebra",
  "expected_reasoning_steps": 3
}
```

これらの追加フィールドは評価中に報酬関数に渡されるため、特定のユースケースに合わせた高度なスコアリングロジックが可能になります。

## トレーニング設定
<a name="nova-rft-training-config"></a>

**サンプルレシピ**

```
# Note:
# This recipe can run on p5.48xlarge, p5e.48xlarge, and p5en.48xlarge instance types.
run:
  name: "my-rft-run"                           # Unique run name (appears in logs and artifacts).
  model_type: amazon.nova-2-lite-v1:0:256k
  model_name_or_path: nova-lite-2/prod
  data_s3_path: s3://<bucket>/<data-file>      # Training dataset in JSONL format.
  replicas: 4                                   # Number of total training instances.
  generation_replicas: 2                        # Number of total instances dedicated to response generation.
  reward_lambda_arn: arn:aws:lambda:<region>:<account-id>:function:<function-name>

  ## MLFlow configs
  mlflow_tracking_uri: "" # Required for MLFlow
  mlflow_experiment_name: "my-rft-experiment" # Optional for MLFlow. Note: leave this field non-empty
  mlflow_run_name: "my-rft-run" # Optional for MLFlow. Note: leave this field non-empty

## SMTJ RFT training configs
training_config:
  max_length: 8192                              # Context window (tokens) for inputs and prompt.
  global_batch_size: 32                         # Total samples per optimizer step across all replicas (16/32/64/128/256).
  reasoning_effort: high                        # Reasoning mode: high, low, or null for non-reasoning.

  data:
    shuffle: true                               # Shuffle training data each epoch.

  rollout:                                      # Controls how responses are generated for advantage calculation.
    rollout_strategy:
      type: off_policy_async                    # Asynchronous rollout for higher throughput.
      age_tolerance: 2                          # Maximum policy age before regeneration.
    advantage_strategy:
      number_generation: 4                      # Samples per prompt to estimate advantages (higher = lower variance but higher cost).
    generator:
      max_new_tokens: 6000                      # Cap on tokens generated per sample.
      set_random_seed: true                     # Seed generation for reproducibility across runs.
      temperature: 1                            # Softmax temperature for sampling.
    rewards:
      preset_reward_function: null              # Preset reward functions: exact_match or null for custom.
      api_endpoint:
        lambda_arn: arn:aws:lambda:<region>:<account-id>:function:<function-name>
        lambda_concurrency_limit: 12             # Max concurrent Lambda invocations (throughput vs. throttling).
        lambda_batch_size: 128                  # Number of samples per Lambda invocation.

  trainer:
    max_steps: 2                                # Steps to train for. One step = global_batch_size samples.
    save_steps: 5                               # Save a checkpoint every N steps.
    test_steps: 1                               # Run validation every N reference model updates.
    refit_freq: 4                               # Frequency of reference model updates.
    clip_ratio_high: 0.2                        # PPO clip ratio for policy updates.
    loss_scale: 1.0                             # Scaling factor for the policy loss.

    # RL parameters
    ent_coeff: 0.0                              # Entropy bonus added to the policy loss (higher = more exploration).
    kl_loss_coef: 0.0                           # Weight on the KL penalty between the current and reference policy.

    optim_config:                               # Optimizer settings.
        lr: 1e-6                                # Learning rate.
        weight_decay: 0.0                       # L2 regularization strength (0.0 to 1.0).
        adam_beta1: 0.9
        adam_beta2: 0.95

    peft:                                       # Parameter-efficient fine-tuning (LoRA).
        peft_scheme: "lora"                     # Enable LoRA for PEFT.
        lora_tuning:
            alpha: 64                           # LoRA scaling factor.
            lora_plus_lr_ratio: 64.0            # LoRA+ learning rate scaling factor (0.0 to 100.0).
```

## LLM-as-a-judge を使用した RFT トレーニング
<a name="nova-rft-llm-judge"></a>

### 概要
<a name="nova-rft-llm-judge-overview"></a>

大規模言語モデル (LLM) は、強化ファインチューニング (RFT) ワークフローのジャッジとしてますます使用され、モデルの最適化をガイドする自動報酬シグナルを提供します。このアプローチでは、LLM は、正確性、品質、スタイルの準拠性、セマンティック同等性など、指定された基準に照らしてモデル出力を評価し、強化学習プロセスを推進する報酬を割り当てます。

これは、従来の報酬関数をプログラムで定義することが難しいタスクに特に役立ちます。これには、さまざまな表現 (「1/3」、「0.333」、「3 分の 1」など) が意味的に同等かどうかを判断するタスク、一貫性や関連性などの微妙な性質を評価するタスクなどがあります。LLM ベースのジャッジを報酬関数として使用することで、広範な人間の注釈を必要とせずに RFT を複雑なドメインにスケールできるため、従来のアラインメントの問題を超えたさまざまなユースケースでモデルの迅速なイテレーションと継続的な改善が可能になります。

### 推論モードの選択
<a name="nova-rft-reasoning-mode"></a>

**利用可能なモード**
+ none – 推論なし (reasoning\_effort フィールドを省略)
+ low – 最小限の推論オーバーヘッド
+ high – 最大限の推論機能 (reasoning\_effort が指定されている場合のデフォルト)

**注記**  
RFT には中程度のオプションはありません。reasoning\_effort フィールドが設定にない場合、推論は無効になります。推論が有効になっている場合は、拡張推論出力に対応するように `max_new_tokens` を 32768 に設定する必要があります。

**各モードを使用するタイミング**

次の場合は、高い推論を使用します。
+ 複雑な分析タスク
+ 数学的な問題解決
+ 複数ステップの論理的演繹
+ ステップバイステップの思考が価値を追加するタスク

以下には、推論なし (reasoning\_effort を省略) または低い推論を使用します。
+ 単純な事実のクエリ
+ 直接的な分類
+ 速度とコストの最適化
+ 簡単な質問への回答

**コストとパフォーマンスのトレードオフ**

高い推論モードは以下を増加させます。
+ トレーニング時間とコスト
+ 推論のレイテンシーとコスト
+ 複雑な推論タスクのモデル機能

### LLM ジャッジの検証
<a name="nova-rft-validating-judge"></a>

LLM-as-a-judge を本番環境にデプロイする前に、ジャッジモデルの評価が人間の判断と一致していることを確認します。これには以下が含まれます。
+ タスクの代表的なサンプルに関する LLM ジャッジと人間の評価者間の合意率を測定する
+ LLM の人間との合意が人間間の合意レート以上であることを確認する
+ ジャッジモデルの潜在的なバイアスを特定する
+ 報酬シグナルがモデルを意図した方向に導くという信頼を構築する

この検証ステップは、自動評価プロセスが本番品質基準を満たすモデルを生成するのに役立ちます。

### LLM ジャッジ向けの Lambda 設定
<a name="nova-rft-lambda-config"></a>

LLM-as-a-judge の使用は、検証可能な報酬による強化学習（RLVR）に Lambda 関数を使用する手法を発展させたものです。Lambda 関数内で、Amazon Bedrock でホストされているいずれかのモデルを呼び出します。

**重要な設定要件:**


| 設定 | 要件 | 詳細 | 
| --- | --- | --- | 
| Amazon Bedrock スループット | 十分なクォータ | 使用する Amazon Bedrock モデルのスループットクォータがトレーニングワークロードに十分であることを確認します | 
| Lambda タイムアウト | 延長タイムアウト | Lambda 関数のタイムアウトを最大 15 分に設定します。デフォルト設定は 3 秒で、Amazon Bedrock モデルレスポンスでは不十分です | 
| Lambda の同時実行 | 同時実行数の増加 | Lambda はトレーニング中に並行して呼び出されます。同時実行数を増やして利用可能なスループットを最大化する | 
| レシピ設定 | Lambda 設定の一致 | 同時実行制限はレシピで設定する必要があります | 

## ジョブの作成と実行
<a name="nova-rft-creating-jobs"></a>

**トレーニングジョブを開始する**

SageMaker トレーニングジョブノートブックテンプレートを使用します: [https://docs.aws.amazon.com/sagemaker/latest/dg/nova-fine-tuning-training-job.html#nova-model-training-jobs-notebook](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-fine-tuning-training-job.html#nova-model-training-jobs-notebook)

**インスタンスの要件**

コンテナは、フルランクトレーニングと LoRA トレーニングの両方をサポートしています。
+ **LoRA トレーニング** – 2/4/6/8 × p5.48xlarge または p5en.48xlarge インスタンス
+ **フルランクトレーニング** – 2/4/6/8 × p5.48xlarge インスタンス (必須)

## トレーニングのモニタリング
<a name="nova-rft-monitoring"></a>

トレーニングログには、各ステップの包括的なメトリクスが含まれています。主要なメトリクスカテゴリ:

**報酬メトリクス**
+ `critic/rewards/mean`、`critic/rewards/max`、 `critic/rewards/min` – 報酬ディストリビューション
+ `val-score/rewards/mean@1` – 検証報酬

**モデルの動作**
+ `actor/entropy` – ポリシーのバリエーション (高 = 探索的)

**トレーニングの状態**
+ `actor/pg_loss` – ポリシーグラデーション損失
+ `actor/pg_clipfrac` – クリップされた更新の頻度
+ `actor/grad_norm` – グラデーションの大きさ

**レスポンスの特性**
+ `prompt_length/mean`、`prompt_length/max`、 `prompt_length/min` – 入力トークン統計
+ `response_length/mean`、`response_length/max`、 `response_length/min` – 出力トークン統計
+ `response/aborted_ratio` – 不完全な生成レート (0 = すべて完了)

**パフォーマンス**
+ `perf/throughput` – トレーニングスループット
+ `perf/time_per_step` – トレーニングステップあたりの時間
+ `timing_per_token_ms/*` – トークンごとの処理時間

**リソースの使用状況**
+ `perf/max_memory_allocated_gb`、`perf/max_memory_reserved_gb` – GPU メモリ
+ `perf/cpu_memory_used_gb` – CPU メモリ

## ファインチューニングされたモデルの使用
<a name="nova-rft-using-models"></a>

トレーニングが完了すると、最終的なモデルチェックポイントが指定された出力場所に保存されます。チェックポイントパスは、次の場所で使用できます。
+ トレーニングログ
+ 出力 Amazon S3 の場所の `manifest.json` ファイル (ノートブックの `output_s3_uri` で定義)

## 制限事項とベストプラクティス
<a name="nova-rft-limitations"></a>

**制限事項**
+ **Lambda タイムアウト** – 報酬関数は 15 分以内に完了する必要があります (暴走プロセスを防ぎ、コストを管理します)
+ **シングルターンのみ** – マルチターン会話はサポートされていません
+ **データ要件** – 十分な多様性が必要で、まばらな報酬で困難 (5% 未満の肯定的な例)
+ **計算コスト** – 教師ありファインチューニングよりも高価
+ **マルチモーダルデータなし** – テキストデータ型のみをサポート

**ベストプラクティス**

**小規模に始める**
+ 100～200 の例から始める
+ 報酬関数の正確性を検証する
+ 結果に基づいて徐々にスケールする

**トレーニング前評価**
+ RFT の前にベースラインモデルのパフォーマンスをテストする
+ 報酬が一貫して 0% の場合、まず SFT を使用して基本的な機能を確立する
+ 報酬が 95% を超えている場合、RFT は不要である可能性あり

**トレーニングのモニタリング**
+ 平均報酬スコアと分布を追跡する
+ オーバーフィットに注意する (トレーニング報酬は増加する一方、検証報酬は減少)
+ 問題のあるパターンを探します:
  + 報酬が 0.15 を下回ったまま横ばいになる
  + 時間の経過に伴い報酬分散が増加する
  + 検証パフォーマンスが低下する

**報酬関数の最適化**
+ (数分ではなく) 数秒以内に実行する
+ 外部 API コールを最小化する
+ 効率的なアルゴリズムを使用する
+ 適切なエラー処理を実装する
+ Lambda の並列スケーリングを活用する

**イテレーション戦略**

報酬が改善されない場合:
+ 報酬関数の設計を調整する
+ データセットの多様性を高める
+ その他の代表的な例を追加する
+ 報酬シグナルが明確で一貫性があることを確認する

## 適応型カリキュラム学習
<a name="nova-rft-adaptive-curriculum"></a>

適応型カリキュラム学習は、RFT 中にモデルに示されるトレーニングプロンプトを動的に選択するオプションの機能です。すべてのプロンプトで均一にトレーニングする代わりに、トレーナーはモデル自体を使用してプロンプトの難易度を予測し、モデルが成功したり、失敗したりする場合がある生産的な難易度範囲内のプロンプトを選択します。これにより、各 GRPO ロールアウトグループ内の結果の分散が最大化され、簡単すぎたり難しすぎたりするプロンプトからのノイズの多い勾配の更新を減らすことで、利点シグナルが高くなり、収束が速くなり、RL トレーニングの安定性が向上します。

### 適応型カリキュラムの仕組み
<a name="nova-rft-adaptive-curriculum-how"></a>

適応型カリキュラムを有効にすると、トレーニングループは各ロールアウトステップの前に予測と選択フェーズを追加します。

1. **予測** — モデルは、数ショットの予測形式を使用して、各候補プロンプトの合格率 (または報酬スプレッド) を予測します。前のトレーニングステップの 3 つの例 (1 つは簡単、1 つは中程度、1 つは困難) はキャリブレーションコンテキストを提供します。

1. **選択** — プロンプトは、予測される難易度が選択ターゲットにどれだけ近いかによってランク付けされます (デフォルト: 50% の合格率)。最適なプロンプトはロールアウトが承認され、残りはロールアウトコンピューティングを消費せずに破棄されます。

1. **トレーニング** — 標準 GRPO トレーニングは、選択されたプロンプトで続行されます。

1. **フィードバック** — ロールアウトからの実際の合格率は予測と比較されます。選択ターゲットは、体系的な予測バイアスを修正するために自動キャリブレーションが行われます。REINFORCE 勾配は、将来の予測を改善するために予測子をトレーニングします。

### 適応型カリキュラムを使用するタイミング
<a name="nova-rft-adaptive-curriculum-when"></a>

適応型カリキュラムは、以下のシナリオで最も効果的です。
+ RL トレーニングの安定性を向上させるには、各トレーニングバッチに有意義な報酬分散を含むプロンプトが含まれることを確保し、学習を不安定にする可能性のあるノイズの多い勾配の更新を減らします。
+ 基本 RFT がターゲットメトリクスを改善することを確認しました。
+ トレーニングコンピューティングを最も生産性の高いプロンプトに集中させることで、収束を加速したいと考えています。
+ データセットが大きく (5,000 以上のプロンプト)、生産的な難易度範囲外のプロンプトが多く含まれているため、コンピューティングが無駄になります。

### 適応型カリキュラムの設定
<a name="nova-rft-adaptive-curriculum-config"></a>

レシピの `trainer` の下に `adaptive_curriculum` ブロックを追加して、適応型カリキュラム学習を有効にします。

```
training_config:
  trainer:
    adaptive_curriculum:
      enable: true                               # Enable adaptive curriculum prompt selection.
      selection_pool_multiplier: 8               # Score 8 x global_batch_size candidates, keep best global_batch_size.
      prediction_mode: pass_rate                 # "pass_rate" for discrete rewards; "spread" for continuous rewards.
      exemplar_history_steps: 1                  # Previous training steps kept in the rolling exemplar history buffer.
      reinforce_coef: 0.01                       # Scale factor for the REINFORCE loss that trains the predictor (0 disables).
      predictor_prompt_column: predictor_prompt  # Dataset field with clean problem text used by the predictor.
      selection_lookahead_steps: 4               # Future training batches pre-approved per curriculum screening pass.
```

次の表に、各適応型カリキュラムパラメータを示します。


| パラメータ | タイプ | デフォルト  | 説明  | 
| --- | --- | --- | --- | 
| enable | ブール値 | false | 適応型カリキュラムプロンプトの選択を有効にするかどうか。 | 
| selection\_pool\_multiplier | 整数 (1～32) | 8 | トレーニングバッチサイズに対してスコア付けされる候補プロンプトの数を制御します。値 8 は、8 × global\_batch\_size プロンプトがスコア付けされ、最適な global\_batch\_size が選択されることを意味します。値が大きいほど選択品質は向上しますが、推論コンピューティングのコストは高くなります。 | 
| prediction\_mode | String | pass\_rate | プロンプトの難易度を推定するための予測モード。予測子が正しい回答の確率を推定する離散的な報酬タスク (正確性チェックなど) には、pass\_rate を使用します。予測子がロールアウト全体での最大と最小の報酬差を推定する連続的な報酬タスクには、spread を使用します。 | 
| exemplar\_history\_steps | 整数 (≥1) | 1 | 例を選択するためにローリング履歴バッファに保持する以前のトレーニングステップの数。予測子は、この履歴の例を使用して、数ショットの予測のキャリブレーションを行います。 | 
| reinforce\_coef | 数値 (≥0) | 0.01 | パスレート予測子をトレーニングする REINFORCE 損失のスケール係数。これにより、予測子がトレーニングの過程で精度を向上させるクローズドループ学習が可能になります。予測子トレーニングを無効にするには、0 に設定します。 | 
| predictor\_prompt\_column | String | predictor\_prompt | 予測子プロンプトとして使用されるクリーンな問題テキストを含むデータセット内のフィールド名。これは、予測子が難易度をすばやく評価できるように、システムプロンプトや書式設定なしで問題の簡潔なバージョンにする必要があります。 | 
| selection\_lookahead\_steps | 整数 (1～16) | 4 | ステップごとに 1 回のカリキュラムスクリーニングパスで事前承認するための将来のトレーニングバッチの数。各パスはステップごとに selection\_pool\_multiplier × global\_batch\_size 候補をスコアリングします。selection\_lookahead\_steps の値を大きくすると、そのパスが複数回繰り返されて承認済みプロンプトのキューが構築され、短いプロンプトデータセットにおけるステップごとの予測子オーバーヘッドが軽減されます。予測子自体の計算コストが高い長いコンテキストデータセットの場合 (推奨事項セクションを参照)、予測子がステップごとに 1 回のみ実行されるようにこれを 1 に設定します。 | 

### 長いコンテキストデータセットの推奨事項
<a name="nova-rft-adaptive-curriculum-long-context"></a>

適応型カリキュラムは、候補プロンプトのプールで軽量のパスレート予測子を実行し、ロールアウトする最も生産性の高いバッチを選択することで機能します。`max_prompt_length` が短い場合 (数千トークン以下)、予測子はスクリーニングパスごとに数秒で実行され、カリキュラムのオーバーヘッドはごくわずかです。プロンプトの長さが増加すると、予測子の推論時間はほぼ 2 乗のオーダーで増加します (注意機構はシーケンス長に対して O(n²) となるため)。そのため、プロンプトが約 8,000 トークンを超えるデータセットでは、スクリーニングがステップ時間の大部分を占める可能性があります。

**注記**  
適応型カリキュラムは、最大 32,768 トークン (32K) で `max_prompt_length` がサポートされています。この長さを超えるデータセットで有効にすることはサポートされていません。適応型カリキュラムを無効にするか、トレーニング前にプロンプトを短くしてください。

以下の設定では、適応型カリキュラムを長いコンテキストのデータセットで使用でき、費用対効果が高くなります。これらを一緒に適用し、スクリーニングコストのさまざまなコンポーネントに対処します。


| 通常 `max_prompt_length` | 推奨される適応型カリキュラムの設定 | 
| --- | --- | 
| 最大 8K トークン | デフォルトを使用する: selection\_pool\_multiplier: 8、selection\_lookahead\_steps: 4。スクリーニングオーバーヘッドは小さく、調整は必要ありません。 | 
| 8K を超えるトークンと最大 16K のトークン | selection\_lookahead\_steps: 2 を設定します。これにより、ロールアウトの枯渇を避けるために、事前に承認された十分なプロンプトをキューに保持しながら、ステップあたりの予測子パスの数が半分になります。 | 
| 16K を超えるトークンと最大 24K のトークン | selection\_lookahead\_steps: 2 を維持し、selection\_pool\_multiplier を 4 に下げます。プールが小さくなると、選択の品質にある程度のコストがかかり、予測子のバッチサイズが半分になります。これらを一緒にすると、ステップごとのスクリーニング時間が制限されたままになります。 | 
| 24K を超えるトークンと最大 32K のトークン | selection\_lookahead\_steps: 1 で selection\_pool\_multiplier: 4 を使用します。予測子は、最小サイズのプールでトレーニングステップごとに 1 回実行されます。これは最も積極的にサポートされている設定です。32K を超える設定はサポートされていません。 | 

長いコンテキストのデータセット (約 24K～32K トークンプロンプト) 用に調整された設定の例:

```
training_config:
  max_length: 32768
  global_batch_size: 32

  trainer:
    adaptive_curriculum:
      enable: true
      selection_pool_multiplier: 4        # Smaller pool keeps predictor prefill bounded.
      selection_lookahead_steps: 1        # Predictor runs once per training step.
      prediction_mode: pass_rate
      exemplar_history_steps: 1
      reinforce_coef: 0.01
      predictor_prompt_column: predictor_prompt
```

### 適応型カリキュラムのデータ準備
<a name="nova-rft-adaptive-curriculum-data"></a>

適応型カリキュラムを使用する場合、トレーニングデータには、問題テキストの簡潔なバージョンを含む `predictor_prompt` フィールド (または `predictor_prompt_column` で指定されたフィールド名) を含める必要があります。このフィールドは、会話コンテキスト全体を処理せずにプロンプトの難易度をすばやく評価するために、パスレート予測子によって使用されます。

予測子プロンプトを含む JSONL エントリの例:

```
{
  "messages": [
    {
      "role": "system",
      "content": "You are a math tutor. Show your work step by step."
    },
    {
      "role": "user",
      "content": "A train travels 120 miles in 2 hours. If it then increases speed by 50%, how far will it travel in the next 3 hours?"
    }
  ],
  "reference_answer": "270 miles",
  "predictor_prompt": "A train travels 120 miles in 2 hours. Speed increases 50%. Distance in next 3 hours?"
}
```

`predictor_prompt` フィールドが存在しない場合、システムは `messages` フィールドから完全なプロンプトを使用するようにフォールバックします。

### 適応型カリキュラムを使用した完全なレシピの例
<a name="nova-rft-adaptive-curriculum-example"></a>

次の例は、適応型カリキュラムが有効になっている完全な LoRA RFT レシピを示しています。

```
run:
  name: "my-rft-adaptive-curriculum"
  model_type: amazon.nova-2-lite-v1:0:256k
  model_name_or_path: nova-lite-2/prod
  data_s3_path: s3://<bucket>/<data-file>
  replicas: 4
  generation_replicas: 2
  reward_lambda_arn: arn:aws:lambda:<region>:<account-id>:function:<function-name>

training_config:
  max_length: 8192
  global_batch_size: 32
  reasoning_effort: null                        # Non-reasoning mode.

  data:
    shuffle: true

  rollout:
    rollout_strategy:
      type: off_policy_async
      age_tolerance: 2
    advantage_strategy:
      number_generation: 16                     # Higher n for better advantage estimates.
    generator:
      max_new_tokens: 6000
      temperature: 1.0
    rewards:
      preset_reward_function: exact_match       # Or null for custom Lambda reward.
      api_endpoint:
        lambda_arn: ${oc.select:run.reward_lambda_arn}   # Reuse the top-level run.reward_lambda_arn so the two stay in sync.
        lambda_concurrency_limit: 12
        lambda_batch_size: 128

  trainer:
    max_steps: 500
    save_steps: 50
    test_steps: 25
    refit_freq: 4
    clip_ratio_high: 0.2
    ent_coeff: 0.0
    kl_loss_coef: 0.0

    optim_config:
      lr: 1e-6
      weight_decay: 0.0

    peft:
      peft_scheme: "lora"
      lora_tuning:
        alpha: 64
        lora_plus_lr_ratio: 64.0

    adaptive_curriculum:
      enable: true
      selection_pool_multiplier: 8
      prediction_mode: pass_rate
      exemplar_history_steps: 1
      reinforce_coef: 0.01
      predictor_prompt_column: predictor_prompt
```

### 適応型カリキュラムのモニタリング
<a name="nova-rft-adaptive-curriculum-monitoring"></a>

適応型カリキュラムを有効にすると、トレーニングステップごとに追加のメトリクスがログに記録されます。
+ **予測パスレートと実際のパスレート** — ロールアウト後に観測された実際のパスレートと比較した、選択したプロンプトの平均予測パスレート。大きなギャップは、予測子がより多くのキャリブレーション時間を必要とすることを示します。
+ **選択ターゲット** — 現在の自動キャリブレーションされた選択ターゲット。これは 0.5 から始まり、予測精度に基づいて調整されます。
+ **マスタリーフィルター数** — モデルが一貫してマスターしたために除外されたプロンプトの数。

**注記**  
最初の 1～2 のトレーニングステップは、適応型選択なしで実行されます (予測子は、見本を構築するために少なくとも 1 つの履歴ステップが必要です)。完全な適応型選択はステップ 3 から始まります。

## 高度な機能: Nova Forge
<a name="nova-rft-advanced"></a>

標準の RFT 制限を超える高度な機能を必要とするユーザー向けに、Nova Forge は有料サブスクリプションサービスとして利用できます。
+ マルチターンの会話のサポート
+ 報酬関数の実行時間が 15 分を超える
+ 追加のアルゴリズムと調整オプション
+ カスタムトレーニングレシピの変更
+ 最新の AI 手法

Nova Forge は SageMaker HyperPod で実行され、エンタープライズのお客様が独自のフロンティアモデルを構築できるように設計されています。

## 便利なコマンドとヒント
<a name="nova-rft-useful-commands"></a>

[オブザーバビリティスクリプト](https://github.com/aws-samples/amazon-nova-samples/tree/main/customization/SageMakerUilts/SageMakerJobsMonitoring)のコレクションは、トレーニングジョブのステータスと進行状況のモニタリングに役立ちます。

使用可能なスクリプトは次のとおりです。
+ トレーニングジョブのステータス更新の E メール通知の有効化
+ ジョブ設定に基づいてトレーニング時間の見積もりを取得する
+ 進行中のジョブのトレーニングにかかると予想される時間の近似値を取得する

**インストール**

**注記**  
以下のスクリプトを使用する前に、必ず AWS 認証情報を更新してください。

```
pip install boto3
git clone https://github.com/aws-samples/amazon-nova-samples.git
cd amazon-nova-samples/customization/SageMakerUilts/SageMakerJobsMonitoring/
```

**基本的な使用法**

```
# Enabling email notifications for training job status updates
python enable_sagemaker_job_notifs.py --email test@amazon.com test2@gmail.com --region us-east-1 --platform SMTJ

Creating resources........
Please check your email for a subscription confirmation email, and click 'Confirm subscription' to start receiving job status email notifications!
You'll receive the confirmation email within a few minutes.
```

```
# Obtaining training time estimates based on job configurations
python get_training_time_estimate.py
```

```
# Obtaining approximations for how long training is expected to take for in-progress jobs
python get-training-job-progress.py --region us-east-1 --job-name my-training-job --num-dataset-samples 1000
```

その他の詳細と例については、[こちら](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/SageMakerUilts/SageMakerJobsMonitoring/README.md)を参照してください。