跳至正文
CoMLRL
多重 LLM RL

多个 LLM PbRL

由 translategemma:4b 自动翻译 英文原文

多智能体 PbRL 训练协作的 LLM 智能体,基于它们之间的联合响应的偏好。 CoMLRL 从任务项中构建偏好数据,并使用以下两种算法之一进行学习:MARLHF 拟合一个联合奖励模型,然后用 RL 训练策略,而 MADPO 则直接从偏好中优化策略。 MARLHFTrainer, MADPOTrainer, 以及它们的迭代变体 MARLHFIterTrainer 和 MADPOIterTrainer 可从 comlrl.trainers.preference 获取。

所有 trainers 目前都需要 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 采样联合响应,使用一个 oracle 函数进行评分,并将评分转换为偏好对。

Oracle 函数#

Oracle 函数为每个联合响应分配一个共享的值。 默认情况下,它是任务奖励 reward_func,在可选的 reward_processor 之后;它可以遵循规则或调用一个 LLM 奖励模型,如 训练初始化 中所述。 两个算法仅从哪个联合响应获胜中学习,因此评分值仅用于选择对。 在 MARLHFIterTrainer 中,preference_scoring_reward="reward_model" 将最新拟合的奖励模型作为新比较的 oracle,直到存在任务奖励作为备用。

偏好标准#

对于每个任务项,每个智能体采样针对其提示的 preference_num_candidates 响应,并且具有相同候选索引的响应形成联合响应。 在任何两个具有不同评分的联合响应中,评分更高的响应优先:它是获胜的响应 \( w \),而其他响应是失败的响应 \( l \)。 平局将被丢弃。 pair_selection 和 preference_pairs_per_sample 决定每个任务保留哪些对。 在迭代训练中,每次比较都是当前智能体联合响应与 比较器 在相同候选索引处的联合响应之间的比较,并且任何一方都可以获胜。

Preference Data 参数
  • 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}) \) 包含一个任务的两个联合历史。每个对都是一个记录,如以下示例,每个列表中的一个代理:

{
  "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 是两个联合响应的 oracle 分数,candidate_reward_mean 是任务中候选的平均分数。后三个字段来自迭代训练: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) 收集对,然后进行训练。如果没有任何任务产生非平局对,则训练会返回,而不会更新策略。
  • 迭代 trainers (MARLHFIterTrainer, MADPOIterTrainer) 重复循环 num_iterations 轮次。 轮 \( \nu \) 比较当前智能体与 比较器, 存储新的组合为 \( \mathcal{D}^{(\nu)} \), 让 重放缓冲区 选择训练组合 \( \mathcal{B}^{(\nu)} \) 来自本次和之前的轮次,并在此基础上进行训练. MADPO 执行更新 num_train_epochs 每轮. MARLHF 在它们上拟合一个新的奖励模型,然后执行策略学习.
一个迭代训练回合 任务奖励将每次与比较器的比较转化为偏好对,重放从这个和之前的回合中选择训练对,并且 MADPO,或一个奖励模型后跟 RL,产生下一批策略。
One iterative training round Current actors and a comparator produce responses. Reward ranking creates preference pairs, replay selects training pairs, and either MADPO or reward-model training followed by RL updates the actors for the next round. Current actors Comparator Rank pairs Replay MADPODirect update MARLHFReward model → RL Updated actors · next round

评估始终从当前策略中采样,并使用任务奖励 (reward_func 和 reward_processor) 进行评分,而不是使用学习过的奖励模型。

PbRL Trainer 参数
  • agent_model 或 agents: 同构智能体的模型标识符,或模型标识符或实例的列表
  • num_agents: 智能体或任务角色的数量;必须与 args.num_agents 匹配
  • tokenizer: 一个 tokenizer,或一个 actor
  • train_dataset: 任务项,用于偏好收集和,在 MARLHF 中,策略学习
  • eval_dataset: 可选的评估数据集
  • reward_func: 必需的函数,返回一个与每个对齐联合响应共享的任务奖励
  • 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 或一个 actor 条目,用于单独的 critic IAC。 如果没有明确的来源,则使用 critic_model_name 或 actor 模型标识符
  • metrics_callback (仅限 MARLHF): 用于 actor-critic 后端的自定义指标回调
MADPOIterConfig 参数
  • 继承 MADPOConfig; num_train_epochs 应用于每个迭代
  • num_iterations: 收集和训练轮数的数量 (默认 6)
  • 比较器和重放设置:参见 比较器 和 重放缓冲区
MARLHFIterConfig 参数
  • 结合 MARLHF 设置、num_iterations 和比较器和重放设置
  • preference_scoring_reward: "task" (默认) 标记新的比较,与任务奖励相关;"reward_model" 使用前一迭代的奖励模型,如果存在
  • reward_num_train_epochs: 奖励模型训练 epochs 每次迭代 (默认 2)

比较器#

在迭代训练中,比较器提供每个比较的另一侧。当前智能体和比较器响应相同的任务,并且在 oracle 函数下,具有明确获胜的相同索引比较,成为一对,无论哪个侧获胜。

比较器对 当前 actors 和与相同任务的比较器样本;任务奖励决定在任何方向上的相同索引比较,并且决定的比较形成迭代的偏好对。
Comparator preference pairs Current actors and a comparator respond to the same task. Same-index candidates are ranked by the task reward. Either side can become the winner; ties are skipped. Task Current actors Comparator Task reward Winner · loserEither side can win Ties skipped

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" 不假设比较器获胜。默认情况下,比较器生成一个响应,每个角色;使用 comparator_generation_mode="centralized",一个比较器模型将每个角色的响应写入一个联合响应,然后解析成角色响应,再构建成对。

Comparator 参数
  • comparator_policy: "current", "current_copy", "model", "history", 或 "api"
  • comparator_num_candidates: 比较器样本计数; 默认为 preference_num_candidates
  • comparator_model_name 或 comparator_agents: 一个共享的模型源,或每个角色一个,用于 "model"
  • comparator_history_k: 迭代次数用于 "history"; 默认为 1
  • comparator_devices: 本地比较器模型的位置
  • comparator_generation_mode: "decentralized" (默认) 或 "centralized"
  • comparator_centralized_agent_index: 角色,其 actor、检查点或模型写入一个中心比较器的联合响应; 默认为 0,这需要一个中心 actor
  • policy_checkpoint_dir: 可选的 actor-检查点位置; 设置它还会保存其他源的检查点

模型源可以是模型仓库或本地检查点,如 训练实体 中所述:

comparator_policy=model
comparator_model_name=/path/to/comparator-checkpoint
comparator_generation_mode=centralized
comparator_centralized_agent_index=0
comparator_devices=cuda:1

API 比较器#

与 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 参数,因此发送一个请求用于每个候选。请求使用标准的集中式或分布式比较器提示。

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_KEY
Comparator API 参数
  • comparator_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: 请求超时时间,单位为秒; 默认 120
  • comparator_api_max_n_per_request: 每一次 Chat Completions 调用中允许的最大候选数量,适用于限制 n 的端点
  • comparator_api_response_field: 通用响应中的 Completions 字段;默认值 "completions"
  • comparator_api_extra_body: 额外的请求体字段

重放缓冲区#

重放缓冲区选择用于训练的存储对。当前轮的数据集首先保存,因此它与之前的轮的数据集同时有效。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": 相同的历史,优先考虑最近的轮。

图表中的每一行显示一个模式可以从中选择的轮数据集,以及每个数据集的权重,最新的轮位于右侧。

重放模式 重放模式从五个回合的数据集中选择,以及使用什么权重,在选择训练对之前。
Replay selection modes Five round datasets run from oldest to newest. Current uses every current-round pair. Nearest-k samples the latest two non-empty rounds here; all-history samples all stored non-empty rounds equally; lambda-decay favors more recent rounds. OldestNewest current All pairs nearest_kLatest 2 rounds Sample all_history Sample lambda_decay Sample Eligible rounds · selection weight

nearest_k 表示最近的轮,而不是最近邻检索。在 nearest_k 和 all_history 中,有效的数据集具有相同的权重,无论大小如何,历史模式从它们中采样,而不是对每个存储的对进行训练。重放的对是从保存的轮文件中重新分词的。仅将 preference_replay_dir 设置为较早的运行,不会导入其文件,而 训练检查点 恢复重放索引及其数据。

Lambda Decay#

随着 \( a=0 \) 为最新 \( K \) 适用的数据集,preference_replay_lambda (\( \lambda \)) 设置选择权重:

\[ w_a = \frac{\lambda^a}{\sum_{j=0}^{K-1}\lambda^j}, \qquad 0 \leq \lambda \leq 1. \]

\( \lambda=0 \) 仅保留最新数据集,较小的值偏向于最近的轮次,而 \( \lambda=1 \) 平等地对每个数据集进行权重设置。

采样#

历史模式将每个 preference_replay_sample_size 的抽样分配给数据集,然后对每个数据集内的样本进行配对。当分配的数量不超过数据集大小时,采样不会重复;如果数量较大,则会循环使用打乱的副本。组合后的样本会进行打乱。默认的样本大小为当前轮次的样本数量,或如果当前轮次为空,则为最新非空的数据集的大小。

Replay Buffer 参数
  • 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: 历史模式采样得到的样本对,或 None 用于上述默认值
  • preference_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 从一个共享奖励中学习。

MARLHF 训练流程 偏好对拟合一个联合奖励模型,其冻结的分数然后用 RL 训练所有策略。
1 · Reward learning 2 · Policy learning Pairs Reward model New samples Shared reward RL update Agents Frozen

奖励学习#

JointRewardModel \( \widetilde{R}_{\psi}(\mathbf{h}_t,\mathbf{a}_t) \) 读取所有智能体的提示和响应为一个文本,并将因果-LM backbone 的最后一个隐藏状态应用于最终非填充 token。它最小化在训练对 \( \mathcal{B} \) 上定义的 Bradley–Terry 损失:

\[ \mathcal{L}_{\mathrm{RM}}(\psi) =-\mathbb{E}_{(\mathbf{h}_H^{w},\mathbf{h}_H^{l})\sim\mathcal{B}} \left[\log\sigma\left(\sum_{t=0}^{H-1}\Big[\widetilde{R}_{\psi}(\mathbf{h}_t^{w},\mathbf{a}_t^{w})-\widetilde{R}_{\psi}(\mathbf{h}_t^{l},\mathbf{a}_t^{l})\Big]\right)\right], \]

其中 \( \sigma \) 是 sigmoid 函数。损失将获胜者的得分与失败者的得分进行比较;它不回退到任务奖励。训练实体 描述了如何加载奖励模型。

策略学习#

在奖励学习之后,\( \widetilde{R}_{\psi} \) 被固定,并取代任务奖励。策略对每个任务采样新的联合响应,\( \widetilde{R}_{\psi} \) 评估它们,但不使用梯度,并且 MARL 后端更新每个智能体的策略,以最大化学习到的回报:

\[ J(\theta_i) = \mathbb{E}_{\mathbf{o}_0 \sim \mathcal{D}, \mathbf{h}_t \sim \boldsymbol{\pi}_{\boldsymbol{\theta}}} \Bigg[\sum_{t=0}^{H-1} \widetilde{R}_{\psi}(\mathbf{h}_t,\mathbf{a}_t)\Bigg]. \]

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, 与 per-actor critics 或附加 value heads.

多智能体 REINFORCE 和 多智能体 Actor-Critic 描述这些更新,其中 \( \widetilde{R}_{\psi}(\mathbf{h}_t,\mathbf{a}_t) \) 替代了 \( r_t \)。可选的冻结参考 KL 正则化 (reference_kl_enabled, reference_kl_coef, reference_devices) 仅适用于策略学习:每个智能体的采样 KL 估计,乘以 reference_kl_coef,从其奖励信号中减去。

MARLHFConfig 参数
  • 继承 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,至少为 1
  • num_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 裁剪,如 多智能体 Actor-Critic 中所述
  • reference_kl_enabled, reference_kl_coef, reference_devices: 策略学习的 选用的冻结参考正则化

当 actors 是没有模型标识符的模型对象时,需要使用 reward_model_name。 此外,MAAC、单独的 critic 和 IAC 也需要明确的 critic 源或可用的 critic 模型标识符。

MADPO#

多智能体直接偏好优化 (MADPO) 直接从偏好对中训练策略,无需奖励模型或 RL 阶段。 它的损失组合了所有智能体的偏好 margins,因此每个策略都从团队的结果中学习。

MADPO 训练流程 代理的 margins 在每个偏好对上相加,形成一个联合损失,直接更新所有策略。
Pairs Policy scores Joint loss UpdateEach agent Per agent No reward model

每个智能体的 margin 是其对获胜和失败响应的对数概率之差,而联合 margin 将这些值在所有智能体上求和:

\[ \Delta_{\theta_i}=\sum_{t=0}^{H-1}\Big(\log\pi_{\theta_i}(a_{i,t}^{w}\mid h_{i,t}^{w})-\log\pi_{\theta_i}(a_{i,t}^{l}\mid h_{i,t}^{l})\Big), \qquad \Delta_{\boldsymbol{\theta}}=\sum_{i\in\mathcal{I}}\Delta_{\theta_i}. \]

MADPO 最小化

\[ \mathcal{L}_{\mathrm{MADPO}}(\boldsymbol{\theta}) =-\mathbb{E}_{(\mathbf{h}_H^{w},\mathbf{h}_H^{l})\sim\mathcal{B}} \Big[\log\sigma\big(\eta\,\Delta_{\boldsymbol{\theta}}\big)\Big], \]

其中 \( \eta>0 \) 等于 dpo_beta (默认 0.1)。 任务奖励仅对每对进行排序;损失函数使用策略的对数概率。 智能体 \( i \) 的梯度为

\[ \nabla_{\theta_i}\mathcal{L}_{\mathrm{MADPO}}(\boldsymbol{\theta}) =-\eta\,\mathbb{E}_{\mathcal{B}} \Big[\sigma\big(-\eta\,\Delta_{\boldsymbol{\theta}}\big)\,\nabla_{\theta_i}\Delta_{\theta_i}\Big]. \]

权重 \( \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 的对数概率。 集中式评分器覆盖完整的联合完成。

MADPOConfig 参数
  • num_agents:智能体的数量,或具有集中式 actor 的任务角色
  • collaboration_mode: "decentralized" (默认) 训练一个 actor 智能体; "centralized" 训练一个 actor,该智能体生成完整的联合响应,而 max_new_tokens 则覆盖整个联合响应
  • num_train_epochs: 优化 epochs
  • agent_learning_rate:策略学习率
  • dpo_beta:联合 margin 的正系数 (默认 0.1)
  • train_batch_size:每次更新的偏好对数量;默认值为 rollout_buffer_size
  • parallel_training、agent_devices:策略执行模式和设备放置
  • eval_interval, eval_num_samples, eval_batch_size: 评估时间表和样本大小; MADPO 统计 eval_interval 在偏好更新中的数量
  • logging_steps: 训练日志记录间隔
  • environment_steps_per_pair: 每次偏好对中,环境步骤数量(默认 2)
  • 偏好数据 设置