Amazon Nova モデルの強化ファインチューニング (RFT) - Amazon Bedrock

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Nova モデルの強化ファインチューニング (RFT)

概要:

RFT とは

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

RFT を使用するタイミング

明確で測定可能な成功基準を定義できるが、トレーニングのための正確な出力の提供に苦労する場合は、RFT を使用します。これは、以下に最適です。

  • 品質が主観的または多面的であるタスク (創造的な記述、コードの最適化、複雑な推論)

  • 複数の有効なソリューションがあり、一部のソリューションが他のソリューションよりも明らかに優れているシナリオ

  • 反復的な改善、パーソナライゼーション、または複雑なビジネスルールの遵守を必要とするアプリケーション

  • 高品質のラベル付き例の収集が高価または実用的でないケース

ベストプラクティス

RFT は、出力品質を客観的に測定できるが、最適なレスポンスを事前に定義することが難しいドメインに優れています。

  • 数学的な問題解決とコード生成

  • 科学的推論と構造化データ分析

  • step-by-stepの推論または複数ターンの問題解決を必要とするタスク

  • 複数の目標 (精度、効率、スタイル) のバランスを取るアプリケーション

  • 実行結果またはパフォーマンスメトリクスを通じてプログラムで成功を検証できるシナリオ

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

Amazon Nova Lite 2.0

[Data format] (データ形式)

RFT トレーニングデータは、OpenAI 強化ファインチューニング形式に従う必要があります。各トレーニング例は、以下を含む JSON オブジェクトです。

  • system および userロールを使用した会話ターンのmessages配列

  • 報酬計算に期待される出力または評価基準を含むreference_answerフィールド

注記

現在の制限: テキストのみ。マルチモーダル入力は RFT ではサポートされていません。

例: 数学の問題

{ "id": "sample-001", "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"] } }

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

データセットサイズの推奨事項

開始点

  • 最小 100 個のトレーニング例

  • 最小 100 の評価例

評価ファーストのアプローチ

大規模な RFT トレーニングに投資する前に、モデルのベースラインパフォーマンスを評価します。

  • 高パフォーマンス (95% を超える報酬) – モデルがすでにうまく機能しているため、RFT は不要である可能性があります

  • パフォーマンスが非常に低い (0% の報酬) — まず SFT に切り替えて基本的な機能を確立する

  • 中程度のパフォーマンス – RFT は適切である可能性が高い

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

効果的なトレーニングデータの特徴

明確性と一貫性

優れた RFT の例には、さまざまなモデル出力にわたって正確な報酬計算を可能にする明確であいまいな入力データが必要です。一貫性のないフォーマット、矛盾するラベルや指示、あいまいなプロンプト、矛盾する参照回答など、データのノイズを避けます。あいまいさがあると、トレーニングプロセスが誤解され、モデルが意図しない動作を学習します。

多様性

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

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

効率的なトレーニングのために報酬関数を設計します。数秒以内 (数分ではなく) に実行し、 と効果的に並列化しAWS Lambda、一貫性があり信頼性の高いスコアを返し、さまざまなタイプのモデル出力を適切に処理する必要があります。高速でスケーラブルな報酬関数により、迅速な反復と費用対効果の高い実験が可能になります。

その他のプロパティ

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

注記

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

一般的な追加プロパティ

  • task_id – 追跡用の一意の識別子

  • difficulty_level – 問題の複雑さインジケータ

  • domain – サブジェクトエリアまたはカテゴリ

  • expected_reasoning_steps – ソリューションのステップ数

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

追加プロパティの例

Chemistry problem
{ "id": "chem-001", "messages": [ { "role": "system", "content": "You are a helpful chemistry assistant" }, { "role": "user", "content": "Predict hydrogen bond donors and acceptors for this SMILES: CCN(CC)CCC(=O)c1sc(N)nc1C" } ], "reference_answer": { "donor_bond_counts": 2, "acceptor_bond_counts": 4 } }

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

Math problem with metadata
{ "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 }

報酬関数の実装

報酬関数は、モデルレスポンスを評価し、数値スコアを返す Lambda 関数として実装されます。Lambda 関数は OpenAI 形式でメッセージとグラウンドトゥルースを受け取り、スコアをディクショナリとして返す必要があります。

IAM アクセス許可

SageMaker AI 実行ロールに Lambda 関数のInvokeFunctionアクセス許可があることを確認します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-reward-function-lambda" } ] }

設計のガイドライン

報酬関数を記述する場合は、次の操作を行います。

  • 回答をランク付けする – 最良の回答に明らかに高いスコアを付けます

  • 一貫したチェックを使用する – タスクの完了、形式の遵守、安全性、妥当な長さを評価する

  • 安定したスケーリングを維持する – スコアを正規化し、爆発させない

インターフェイス形式

報酬関数は、次の形式でデータを受け入れて返す必要があります。

入力構造

[{ "id": "123", "messages": [ { "role": "user", "content": "Do you have a dedicated security team?" }, { "role": "assistant", "content": "As an AI developed by Amazon, I don not have a dedicated security team..." } ], "metadata": { "reference_answer": { "compliant": "No", "explanation": "As an AI developed by Company, I do not have a traditional security team..." }, "my_key": "sample-001" } }]

出力構造

[{ "id": "123", "aggregate_reward_score": 0.85, "metrics_list": [ { "name": "accuracy", "value": 0.9, "type": "Reward" }, { "name": "policy_compliance", "value": 0.8, "type": "Metric" } ] }]

Lambda 関数の例

from typing import List import json from dataclasses import asdict, dataclass @dataclass class RewardOutput: """Reward service output.""" id: str aggregate_reward_score: float def lambda_handler(event, context): """Main lambda handler""" return lambda_grader(event) def lambda_grader(samples: list[dict]) -> list[dict]: """Core grader function""" scores: List[RewardOutput] = [] for sample in samples: idx = sample["id"] ground_truth = sample.get("metadata", {}).get("reference_answer") if "messages" not in sample: print(f"Messages is None/empty for id: {idx}") ro = RewardOutput(id=idx, aggregate_reward_score=0.0) scores.append(ro) continue if ground_truth is None: print(f"No answer found in ground truth for id: {idx}") ro = RewardOutput(id=idx, aggregate_reward_score=0.0) scores.append(ro) continue # Get model's response (last turn is assistant turn) last_message = sample["messages"][-1] assert last_message["role"] == "assistant", "Last message must be from assistant" model_text = last_message["content"] ground_truth_text = _extract_ground_truth_text(ground_truth) if model_text.lower() == ground_truth_text.lower(): score = 1.0 else: score = 0.0 ro = RewardOutput(id=idx, aggregate_reward_score=score) scores.append(ro) return [asdict(score) for score in scores] def _extract_ground_truth_text(ground_truth) -> str: """Turn the ground_truth field into a plain string.""" if isinstance(ground_truth, str): return ground_truth if isinstance(ground_truth, dict): if "explanation" in ground_truth and isinstance(ground_truth["explanation"], str): return ground_truth["explanation"] if "answer" in ground_truth and isinstance(ground_truth["answer"], str): return ground_truth["answer"] return json.dumps(ground_truth, ensure_ascii=False) return str(ground_truth)

トレーニング設定

SageMaker AI トレーニングジョブノートブックテンプレートを使用して、トレーニングジョブを開始します。詳細については、「トレーニングジョブを作成する」を参照してください。

トレーニングコンテナ

708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-TJ-RFT-latest

インスタンスの要件

コンテナは、フルランクトレーニングと LoRA トレーニングの両方をサポートしています。

  • LoRA トレーニング – 2/4/6/8 × p5.48xlarge または p5en.48xlarge インスタンス

  • フルランクトレーニング – 2/4/6/8 × vv48xlarge インスタンス (必須)

推論モードの選択

使用可能なモード

  • none – 理由なし ( reasoning_effortフィールドを省略)

  • low – 推論オーバーヘッドを最小限に抑える

  • high – 最大推論機能 ( が指定されている場合reasoning_effortのデフォルト)

注記

RFT にメディアオプションはありません。設定に reasoning_effortフィールドがない場合、推論は無効になります。推論が有効になっている場合は、拡張推論出力に対応するように max_new_tokensを 32768 に設定する必要があります。

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

複雑な分析タスク、数学的問題解決、複数ステップの論理的減算、step-by-stepの思考が価値を付加するタスクにはhigh推論を使用します。

単純な事実クエリ、直接分類、速度とコストの最適化、簡単な質疑応答には、 none ( を省略) reasoning_effortまたはlow推論を使用します。

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

推論モードが高いほど、トレーニングの時間とコスト、推論のレイテンシーとコスト、複雑な推論タスクのモデル機能が向上します。

トレーニングのモニタリング

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

  • 報酬メトリクスcritic/rewards/meancritic/rewards/maxcritic/rewards/min (報酬分散)、 val-score/rewards/mean@1 (検証報酬)

  • モデルの動作actor/entropy (ポリシーのバリエーション、高いほど探索的)

  • トレーニングの状態actor/pg_loss (ポリシー勾配損失)、 actor/pg_clipfrac (クリップされた更新の頻度)、 actor/grad_norm (勾配の大きさ)

  • レスポンス特性prompt_length/meanprompt_length/maxprompt_length/min (入力トークン統計)response_length/meanresponse_length/max、、、 response_length/min (出力トークン統計)、 response/aborted_ratio (不完全な生成レート、0 はすべての完了に等しくなります)

  • パフォーマンスperf/throughput (トレーニングスループット)、 perf/time_per_step (トレーニングステップあたりの時間)、 timing_per_token_ms/* (トークンあたりの処理時間)

  • リソース使用量perf/max_memory_allocated_gbperf/max_memory_reserved_gb (GPU メモリ)、 perf/cpu_memory_used_gb (CPU メモリ)

微調整されたモデルの使用

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

制限とベストプラクティス

制限事項

  • Lambda タイムアウト – 報酬関数は 15 分以内に完了する必要があります (暴走プロセスを防ぎ、コストを管理します)

  • シングルターンのみ — マルチターン会話はサポートされていません

  • データ要件 – 十分な多様性が必要で、報酬がまばらである (肯定的な例は 5% 未満)

  • 計算コスト – 教師ありファインチューニングよりも高価

ベストプラクティス

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

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

  • トレーニングのモニタリング – 平均報酬スコアと分布を追跡します。オーバーフィットに注意します (トレーニング報酬は増加し、検証報酬は減少します)。報酬が 0.15 を下回る、時間の経過とともに報酬の変動が増加する、検証パフォーマンスが低下するなどのパターンを探します。

  • 報酬関数の最適化 – 数秒 (数分ではなく) で実行し、外部 API コールを最小限に抑え、効率的なアルゴリズムを使用し、適切なエラー処理を実装し、Lambda の並列スケーリングを活用します。

  • 反復戦略 – 報酬が改善されない場合は、報酬関数の設計を調整し、データセットの多様性を高め、より代表的な例を追加し、報酬シグナルが明確で一貫していることを確認します。