マルチエージェント PbRL は、共同応答間の選好に基づいて、協力する LLM エージェントを学習します。 CoMLRL は、タスクアイテムから選好データを構築し、以下のいずれかのアルゴリズムを使用して学習します: MARLHF は共同報酬モデルを適合させ、RL を使用してポリシーを学習し、MADPO は選好からポリシーを直接最適化します。 MARLHFTrainer、MADPOTrainer、およびそれらの反復的なバリエーション MARLHFIterTrainer および MADPOIterTrainer は、comlrl.trainers.preference から入手可能です。
trainers の4つすべては、
num_turns=1と整合性の取れた共同応答 (joint_mode="aligned") を必要とします。trainers の反復は、データ収集とトレーニングのラウンドであり、対話のターンではありません。
選好データ#
各エージェント \( i\in\mathcal{I}=\{1,\ldots,n\} \) は、ローカル履歴から \( a_{i,t}\sim\pi_{\theta_i}(\cdot\mid h_{i,t}) \) をサンプリングし、応答が共同行動 \( \mathbf{a}_t=\{a_{1,t},\ldots,a_{n,t}\} \) と共同履歴 \( \mathbf{h}_t \) を形成します。単一ターン (\( H=1 \)) では、\( h_{i,0} \) はエージェント \( i \) のプロンプトであり、\( \mathbf{a}_0 \) は共同応答です。
ユーザーはタスクアイテムを提供し、選好データではありません。trainers は共同応答をサンプリングし、オラクル関数で評価し、評価値を選好ペアに変換します。
オラクル関数#
オラクル関数は、各共同応答を単一の値で評価します。デフォルトでは、これはタスク報酬 reward_func であり、オプションの reward_processor の後に使用されます。また、ルールに従ったり、Training Initialization で説明されている LLM 報酬モデルを呼び出すこともできます。両方のアルゴリズムは、どの共同応答が勝ったかのみから学習するため、スコアの値はペアの選択にのみ影響します。MARLHFIterTrainer では、preference_scoring_reward="reward_model" は、新しい比較のために最も最近適合した報酬モデルをオラクルとして使用し、存在しない場合はタスク報酬を使用します。
選好基準#
各タスクアイテムに対し、各エージェントは自身のプロンプトに対する preference_num_candidates の応答をサンプリングし、同じ候補インデックスを持つ応答は共同応答を形成します。異なるスコアを持つ任意の2つの共同応答のうち、より高いスコアを持つものが優先されます: それは勝者 \( w \) であり、もう一つは敗者 \( l \) です。引き分けは破棄されます。pair_selection と preference_pairs_per_sample は、各タスクに保持するペアを決定します。反復的なトレーニングでは、各比較は現在のエージェントの共同応答と、同じ候補インデックスにある 比較器 の共同応答との間で行われます。どちらの側でも勝利できます。
preference_num_candidates: タスクごとのサンプル数と actor; 少なくとも 2 (デフォルト 80)preference_pairs_per_sample: タスクごとの保持するペアの最大数、またはNoneで無制限 (デフォルト 16)pair_selection:"reward_gap"(デフォルト) は、最大の報酬ギャップを持つペアを保持し、"random"はランダムなサブセット、"all"はすべてのタイのないペアを保持します。これにはpreference_pairs_per_sample=Noneが必要です。反復的な trainers は"comparator_reward"を追加し、デフォルトでは、より高い比較報酬を優先し、次に大きな報酬ギャップを優先しますmax_new_tokens,temperature,top_p,top_k: 候補生成設定
データ形式#
ペア \( (\mathbf{h}_H^{w},\mathbf{h}_H^{l}) \) は、1 つのタスクの 2 つの共同履歴を含みます。各ペアは、リスト内の各エージェントのエントリを含む、次の形式のレコードです:
{
"prompts": ["<agent 1 prompt>", "<agent 2 prompt>"],
"winner_completions": ["<agent 1 response>", "<agent 2 response>"],
"loser_completions": ["<agent 1 response>", "<agent 2 response>"],
"winner_reward": 0.92,
"loser_reward": 0.41,
"candidate_reward_mean": 0.63,
"raw_rewards": [0.92, 0.41],
"target_raw_reward": 0.92,
"comparator_raw_reward": 0.41
}winner_reward と loser_reward は、2 つの共同応答のオラクルスコアであり、candidate_reward_mean はタスクの比較された候補の平均スコアです。最後の 3 つのフィールドは反復的なトレーニングから来ています: raw_rewards は、reward_processor の勝者と敗者のスコアを保持し、target_raw_reward と comparator_raw_reward は現在のエージェントのサンプルと比較器のサンプルのスコアを保持します。反復的な trainers は、iteration_0001.json、iteration_0002.json などの各ラウンドのペアを preference_replay_dir の下で書き込みます。{"iteration": 1, "num_pairs": ..., "pairs": [...]}。
トレーニングパイプライン#
LLM に基づく協調マルチエージェントシステムをトレーニングするには、PbRL は、現在のエージェントから選好データを収集し、MARLHF または MADPO で学習を繰り返します。
- ベース trainers (
MARLHFTrainer,MADPOTrainer) はペアを 1 回収集し、それらでトレーニングします。タスクがタイのないペアを生成しない場合、トレーニングはポリシーの更新なしで終了します。 - 反復 trainers (
MARLHFIterTrainer,MADPOIterTrainer) サイクルを繰り返すnum_iterationsラウンド。ラウンド \( \nu \) 現在のエージェントを 比較器, 新しいペアを 再プレイバッファ \( \mathcal{D}^{(\nu)} \), から選択し、トレーニング から選択し、これらを使用してトレーニング \( \mathcal{B}^{(\nu)} \) ラウンドごとに. MADPO 実行num_train_epochsごとに. MARLHF 新しい初期化された報酬モデルを適合させ、その後ポリシー学習.
評価は常に、現在のポリシーからサンプリングし、タスク報酬 (reward_func および reward_processor) で評価し、学習された報酬モデルで評価しません。
agent_modelまたはagents: 同種エージェントのモデル識別子、またはモデル識別子のリストまたはインスタンスnum_agents: エージェントまたはタスクの役割の数;args.num_agentsと一致する必要がありますtokenizer: 1 つの tokenizer、または actor ごとに 1 つtrain_dataset: 優先順位収集および、MARLHF ではポリシー学習のためのタスクアイテムeval_dataset: オプションの評価データセットreward_func: 1 つの共有タスク報酬を返す、必須の呼び出し可能な関数reward_processor: タスク報酬のオプションのポストプロセッシングformatters: すべての役割で共有されるプロンプトフォーマター、または役割固有のフォーマターのリストargs: trainer の構成インスタンスmodel_config: モデルの読み込み設定のオプションwandb_config: Weights & Biasesの設定のオプションeval_logger,eval_aggregator: 評価指標のフックのオプション、MAGRPOTrainerの例を参照centralized_comparator_adapter: 集中型のactorまたは比較器のための共同プロンプトビルダーと役割解析器; デフォルトではインデックスされた<agent_0>...</agent_0>セクションを書き込みますcritic_modelまたはcritics(MARLHFのみ): MAACまたはIACバックエンドのためのcriticソースのオプション。critic_modelはモデル識別子文字列である必要があります。ユーザーはcriticsを使用してロードされたモデルインスタンスを提供でき、MAACまたは1つのエントリごとにactorまたは別個のcritic、IACを使用します。明示的なソースがない場合、critic_model_nameまたはactorモデル識別子が使用されますmetrics_callback(MARLHFのみ): actor-criticバックエンドのためのカスタム指標コールバックのオプション
- MARLHFの設定を
num_iterationsと比較器およびリプレイ設定と組み合わせます preference_scoring_reward:"task"(デフォルト) は、タスク報酬に基づいて新しい比較を行います;"reward_model"は、既存の報酬モデルを使用しますreward_num_train_epochs: 報酬モデルの学習 epochs は、各反復で (デフォルト 2) 実行されます
比較器#
反復的な学習において、比較器は各比較の反対側を供給します。現在のエージェントと比較器は同じタスクに反応し、オラクル関数で明確な勝者が存在するすべての同じインデックスの比較はペアとなり、どちらかの側が勝つ
comparator_policy は、比較器のソースを選択します:
comparator_policy="current"(デフォルト): アクティブな actor の重み、別々の乱数ストリームでサンプリング
comparator_policy="current_copy": 現在の actor の重み、comparator_devicesにコピー、actor デバイスと異なる場合に各コレクションフェーズで
comparator_policy="model":comparator_model_nameまたはcomparator_agentsからの明示的なモデル
comparator_policy="history": actor チェックポイントをcomparator_history_kからの反復回数バックから保存; 既存のポリシーまで
comparator_policy="api": リモートモデルエンドポイント
history のソースは、ポリシーチェックポイントを自動的に保存します。両方の側は異なる数の候補をサンプリングできます; 存在するインデックスのみが比較され、pair_selection="comparator_reward" は比較器が勝つことを前提としません。デフォルトでは、比較器は 1 つの応答を生成します; comparator_generation_mode="centralized" では、1 つの比較器モデルがすべての役割の応答を単一の共同応答に書き込み、その応答は役割の応答に解析され、ペアが構築されます
comparator_policy:"current","current_copy","model","history", または"api"comparator_num_candidates: 比較器のサンプル数; デフォルトはpreference_num_candidatescomparator_model_nameまたはcomparator_agents: 共有モデルソース、または役割ごとに 1 つ、"model"用comparator_history_k:"history"への反復回数; デフォルトは 1comparator_devices: ローカル比較器モデルのデバイス配置comparator_generation_mode:"decentralized"(デフォルト) または"centralized"comparator_centralized_agent_index: 役割の actor、チェックポイント、またはモデルが、中央比較器の共同応答を書き込みます; デフォルトは 0 で、中央の actor が必要policy_checkpoint_dir: 任意 actor チェックポイント場所; 設定すると、他のソースにもチェックポイントを保存します
モデルソースは、モデルリポジトリまたはローカルチェックポイントであり、Training Entities で説明されています
comparator_policy=model
comparator_model_name=/path/to/comparator-checkpoint
comparator_generation_mode=centralized
comparator_centralized_agent_index=0
comparator_devices=cuda:1API 比較器#
comparator_policy="api" を使用する場合、比較器はリモートモデルをクエリします。 comparator_api_format はリクエスト形式を選択します:
comparator_api_format="generic"(デフォルト): リクエストには、プロンプト、actor インデックス、タスクアイテム、候補数、および生成設定が含まれます。 完了はcomparator_api_response_fieldから読み取られます。
comparator_api_format="openai": チャット完了、および DeepSeek のような互換性のあるエンドポイントで使用される。
comparator_api_format="anthropic": Anthropic メッセージ API (https://api.anthropic.com/v1/messages,ANTHROPIC_API_KEY)。
comparator_api_format="openai_responses"(別名responsesまたはcodex): OpenAI の応答 API (https://api.openai.com/v1/responses,OPENAI_API_KEY)。
Anthropic と Responses の形式には n パラメータは含まれていないため、各候補に対して 1 つのリクエストのみを送信します。リクエストには、標準的な集中型または分散型比較プロンプトを使用します。
comparator_policy=api
comparator_api_format=anthropic
comparator_api_url=https://api.anthropic.com/v1/messages
comparator_api_model=claude-sonnet-4-20250514
comparator_api_key_env=ANTHROPIC_API_KEYcomparator_api_url: エンドポイント URL;"api"のために必要comparator_api_format:"generic"(デフォルト),"openai","anthropic", または"openai_responses"comparator_api_model: エンドポイントに渡されるモデル名comparator_api_key_envまたはcomparator_api_key: キーを保持する環境変数、またはキー自体comparator_api_headers: 追加のリクエストヘッダーcomparator_api_key_header,comparator_api_key_prefix: 認証ヘッダーとプレフィックス; デフォルト"Authorization"と"Bearer"、およびネイティブな Anthropic ヘッダー処理comparator_api_timeout: リクエストタイムアウト (秒); デフォルト 120comparator_api_max_n_per_request: Chat Completions 呼び出しあたりの最大候補数、特定のエンドポイントで適用されるnに基づくcomparator_api_response_field: 一般的な応答における Completions フィールド、デフォルト"completions"comparator_api_extra_body: 追加のリクエストボディフィールド
Replay バッファ#
Replay バッファは、各ラウンドで使用される保存されたペアを選択します。現在のラウンドのデータセットが最初に保存されるため、以前のラウンドと並行して使用可能です。preference_replay_mode で、どのラウンドが使用可能かを設定します:
preference_replay_mode="current"(デフォルト): 現在のラウンドのすべてのペア、歴史的なサンプリングなし
preference_replay_mode="nearest_k": 最新のpreference_replay_k空ではないラウンドデータセット、現在のものを含む
preference_replay_mode="all_history": 現在の trainer 実行のすべての空でないラウンドデータセット
preference_replay_mode="lambda_decay": 同じ履歴、最近のラウンドに重点を置く
図の各行は、モードが利用できるラウンドデータセットと、それぞれの重みを表示し、最新のラウンドが右側に表示されます
nearest_k は、最近のラウンドを意味し、近傍検索ではありません。nearest_k および all_history では、有効なデータセットはサイズに関係なく、同じ重みでサンプリングされます。再トークン化されたペアは、保存されたラウンドファイルから再取得されます。preference_replay_dir を以前の実行に設定するだけでは、そのファイルのインポートは行われず、トレーニングチェックポイント は再プレイインデックスと、そのデータを復元します。
Lambda Decay#
\( a=0 \)、最新の \( K \) および preference_replay_lambda (\( \lambda \)) のデータセットの選択重みを決定します。
\( \lambda=0 \) は最新のデータセットのみを保持し、小さい値は最近のラウンドを優先し、\( \lambda=1 \) はすべてのデータセットを同じ重みで扱います。
サンプリング#
歴史的モードでは、各 preference_replay_sample_size の抽出を、重みに基づいてデータセットに割り当て、次に各データセット内でペアをサンプリングします。 割り当てられた数がデータセットサイズを超えない場合、サンプリングは繰り返しが行われません。 より大きな数は、シャッフルされたコピーを循環させます。 組み合わせたサンプルはシャッフルされます。 デフォルトのサンプルサイズは、現在のラウンドのペア数、または現在のラウンドが空の場合、最新の非空データセットのサイズです。
preference_replay_mode:"current"(デフォルト),"nearest_k","all_history", または"lambda_decay"preference_replay_k: 現在のラウンドの非空データセットの数 ("nearest_k"用); このモードでは必須preference_replay_lambda: [0, 1] の範囲にある減衰パラメータ;"lambda_decay"用に必須preference_replay_sample_size: 歴史的モードによってサンプリングされたペア、または上記のデフォルトのNonepreference_replay_dir: 保存されたラウンドのデータセットのオプションな場所
current は preference_replay_sample_size および preference_replay_lambda を拒否し、preference_replay_k のみを None または 1 として受け入れます。 次の構成では、すべてのラウンドから 256 個のペアをサンプリングし、最近のものに重み付けします:
from comlrl.trainers.preference import MADPOIterConfig
args = MADPOIterConfig(
num_agents=2,
preference_replay_mode="lambda_decay",
preference_replay_lambda=0.8,
preference_replay_sample_size=256,
)MARLHFIterConfig は同じオプションを受け入れます。 最新のラウンドのみを再利用するには、ユーザーは preference_replay_mode="nearest_k" とラウンド数を preference_replay_k で設定できます。
MARLHF#
人間からのフィードバックを用いたマルチエージェント強化学習 (MARLHF) は、選好ペアに共同報酬モデルを適合させ、その後、RL を用いて学習された報酬に基づいてポリシーを訓練します。報酬モデルはチーム全体の応答を評価するため、別々の actors は共有された報酬から学習します。
報酬学習#
The JointRewardModel \( \widetilde{R}_{\psi}(\mathbf{h}_t,\mathbf{a}_t) \) すべてのエージェントのプロンプトと応答を1つのテキストとして読み取り、それにスカラーヘッドを適用する-LM backbone’最終的なパディングでない最後の隠れ状態 token. トレーニングペアに対して、ブラッドリー–テリーの損失を最小化する \( \mathcal{B} \):
ここで、\( \sigma \) はシグモイド関数です。損失は、勝者のスコアを敗者のスコアと比較します。タスク報酬に戻ることはありません。トレーニング対象 は、報酬モデルのロード方法を説明しています。
ポリシー学習#
報酬学習の後、\( \widetilde{R}_{\psi} \) は固定され、タスク報酬の代わりに使用されます。ポリシーは、各タスクに対して新しい共同応答をサンプリングし、\( \widetilde{R}_{\psi} \) は勾配なしで評価し、MARL のバックエンドは、学習されたリターンを最大化するために各エージェントのポリシーを更新します。
rl_algorithm はバックエンドを選択します:
rl_algorithm="magrpo"(デフォルト): MAGRPO、グループ平均ベースを使用。
rl_algorithm="mareinforce": MAREINFORCE、生の報酬を使用。
rl_algorithm="marloo": MARLOO、leave-one-out ベースを使用。
rl_algorithm="maremax": MAReMax、グループ最大ベースを使用。
rl_algorithm="maac": MAAC、中心化された critic との連携。
rl_algorithm="iac": IAC, 1つまたは添付された actor, critics, value heads を使用。
マルチエージェント REINFORCE および マルチエージェント Actor-Critic がこれらの更新内容を記述し、\( \widetilde{R}_{\psi}(\mathbf{h}_t,\mathbf{a}_t) \) が reward \( r_t \) の代わりに使用されます。オプションの固定参照 KL 正則化 (reference_kl_enabled, reference_kl_coef, reference_devices) は、ポリシー学習にのみ適用されます。各エージェントのサンプリングされた KL 推定値を、reference_kl_coef でスケーリングしたものが、報酬信号から差し引かれます。
- 親から受け継ぐ MADPOConfig および 選好データ 設定、ただし
dpo_beta, これは使用しません MARLHF を使用しません reward_model_name: 報酬モデル backbone のモデル識別子; 利用可能な場合は actor のモデル識別子にデフォルトreward_model_device: 報酬モデルデバイス; デフォルトは"cuda:0"、またはNoneで trainer デバイスを使用。reward_learning_rate,reward_num_train_epochs,reward_train_batch_size: 報酬モデル最適化設定reward_max_length: 組み合わせられた報酬モデル入力に対するオプションの token 制限reward_freeze_backbone:Trueの場合に、スカラー報酬ヘッドのみをトレーニングrl_algorithm: ポリシー学習のバックエンド; デフォルトは"magrpo"num_generations, actor (グループサイズ): MAGRPO ファミリーの場合は少なくとも 2、または MAAC/IAC の場合は少なくとも 1num_train_epochs,agent_learning_rate: ポリシー学習 epochs と学習率rollout_buffer_size,train_batch_size: ポリシー学習 rollout バッファと更新バッチサイズ;train_batch_sizeはrollout_buffer_sizeにデフォルトcritic_model_name,critic_learning_rate,critic_devices: Critic 設定による actor-critic バックエンドcritic_type:"v"または"q"による actor-critic バックエンドuse_separate_critic: 独立した critics または actor に接続された value heads を IAC 用に選択value_loss_coef,value_clip_range: Critic 損失重みと IAC 共有-value-head クリップ、Multi-Agent Actor-Critic で説明されている通りreference_kl_enabled,reference_kl_coef,reference_devices: ポリシー学習のためのオプションの固定参照正則化
reward_model_nameは、actors がモデルオブジェクトであり、モデル識別子を持たない場合に必要です。MAAC および別個の critic、IAC も、明示的な critic ソースまたは使用可能な critic モデル識別子が必要です。
MADPO#
Multi-Agent Direct Preference Optimization (MADPO) は、報酬モデルや RL を使用せずに、ペアごとの選好から直接ポリシーを学習させる。その損失関数は、すべてのエージェントの選好 margins を統合しており、各ポリシーはチームの結果に基づいて学習する。
各エージェントの margin は、その勝つ応答と負ける応答の対数確率の差であり、共同応答 margin は、エージェント間でこれらの合計を計算します:
MADPO は最小化
\( \eta>0 \) が dpo_beta (デフォルト 0.1) である場合。タスクの報酬は各ペアのみを評価し、損失関数はポリシーの対数確率を使用します。エージェント \( i \) の勾配は
重み \( \sigma(-\eta\,\Delta_{\boldsymbol{\theta}}) \) はチームの共同 margin に依存し、勾配はエージェント \( i \) の独自の margin を通してのみ流れます。各バッチで、trainer は勾配なしで、すべての margins を一度計算し、その後、各エージェントは自身の微分可能な margin と他のエージェントの分離された margins で更新します。
目的は参照なし: 継承された reference_kl_enabled、reference_kl_coef、reference_devices の設定は、MADPO の損失に参照項を追加しません。トレーニング指標 turn_1/reward_mean と turn_1/expected_return は、ペアが収集された際に記録された候補報酬の平均であり、更新されたポリシーを反映していません。
分散型スコアは、パディングのトリミング後に最後の完了 token を除外するため、各エージェントの margin はその token の対数確率を省略します。中央集約型スコアは、完全な共同完了をカバーします。
num_agents: エージェントの数、または中央集約型 actor を持つタスクの役割の数collaboration_mode:"decentralized"(デフォルト) は、エージェントごとに 1 つの actor をトレーニングします。"centralized"は、完全な共同応答を書き出す 1 つの actor をトレーニングし、max_new_tokensは、その共同応答全体をカバーします。num_train_epochs: epochs を収集された選好ペアに対して最適化agent_learning_rate: ポリシー学習率dpo_beta: 共同の margin (デフォルト 0.1) への正の係数train_batch_size: 1回の更新あたりの好みのペア数; デフォルトはrollout_buffer_sizeparallel_training,agent_devices: ポリシーの実行モードとデバイスの配置eval_interval,eval_num_samples,eval_batch_size: 評価スケジュールとサンプルサイズ; MADPO はeval_intervalを選好学習の更新にカウントlogging_steps: 訓練ログ記録間隔environment_steps_per_pair: 1つの選好ペアあたり環境ステップ数 (デフォルト 2)- 設定 選好データ 設定