跳至正文
CoMLRL
多重 LLM RL

多智能体 Actor-Critic

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

Actor-Critic (AC) 方法是广泛使用的策略梯度方法,使用 critics 来支持训练。 AC 方法可以实现比 REINFORCE 更低的方差和更好的样本效率,但这需要仔细设计和调整 critic,以确保稳定的训练。 在多智能体强化学习 (MARL) 中,Actor-Critic 方法包括多智能体 Actor-Critic (MAAC) 和独立式 Actor-Critic (IAC)。

两个模型同时部署智能体,并根据奖励函数对它们的联合响应进行评分,但它们使用 critics 方式不同。 MAAC 训练一个 critic,使其基于联合历史,因此每个智能体共享其 TD 误差。 IAC 训练每个智能体一个 critic,基于该智能体的历史,因此每个智能体获得自己的 TD 误差。

Actor-critic 训练流程 MAAC 的集中式 critic 使得所有智能体获得相同的 TD 误差; IAC 的独立式 critics 使得每个智能体获得自己的。

MAAC#

多智能体 Actor-Critic (MAAC) 使用一个集中的 Critic (CC) 来评估联合历史 \( V_{\boldsymbol{\phi}}(\mathbf{h}_t) \) 与 critic_type="v" 的值,或联合历史-动作对 \( Q_{\boldsymbol{\psi}}(\mathbf{h}_t, \mathbf{a}_t) \) 与 critic_type="q" 的值。 critic 接收来自智能体的提示,并将它们组合成一个单一的文本序列;Q 模式还包括它们的生成完成。 每个智能体的策略梯度为:

\[ \nabla_{\theta_i} J(\theta_i) = \mathbb{E}_{\boldsymbol{\pi}}\left[\sum_{t=0}^{H-1} \nabla_{\theta_i} \log \pi_{\theta_i}(a_{i,t}|h_{i,t})\,\boldsymbol{\delta}_t\right] \]

其中 \( \boldsymbol{\delta}_t = r_t + \gamma V_{\boldsymbol{\phi}}(\mathbf{h}_{t+1}) - V_{\boldsymbol{\phi}}(\mathbf{h}_{t}) \),并且 critic 被更新为:

\[ \mathcal{L}(\boldsymbol{\phi}) = \mathbb{E}_{\boldsymbol{\pi}}\left[\sum_{t=0}^{H-1} \big(r_t + \gamma V_{\phi}(\mathbf{h}_{t+1}) - V_{\phi}(\mathbf{h}_{t})\big)^2\right]. \]

这里 \( r_t \) 是经过处理的奖励,包含可选的参考-KL 惩罚,如果启用;奖励可以共享给多个智能体或按智能体单独提供。 最终收集到的回合,包括提前终止或单回合 rollout, 仅使用奖励作为目标,不进行 bootstrapping。 生成的-token log-概率之和是完成的 log-概率;提示和尾部填充 tokens 被排除。 损失则在样本上进行平均。 缓冲区按智能体和回合进行分组后再更新,并且 advantage_normalization 对 TD 进行归一化。 目标和优势在更新期间保持不变。 共享的 critic 与每个智能体的批次按顺序更新,并且 value_loss_coef 缩放其损失.

在 Q 模式下,实现使用相同的 TD-残差 actor 权重,并使用从 bootstrap 中采样的下一个动作。 它不实现直接由 Q 或仅基于状态的 Q 基线的权重,也不实现单独的 actor 目标。

MAACConfig 参数
  • num_agents: 智能体的数量
  • num_turns: 回合的数量
  • critic_type: Critic 目标类型 (v 用于 V(h), q 用于 Q(h,a))
  • num_train_epochs: 训练 epochs 的数量
  • agent_learning_rate: 智能体的学习率
  • critic_learning_rate: 共享的 critic 的学习率
  • value_loss_coef: critic 损失的权重
  • advantage_normalization: 是否在更新前对优势进行归一化
  • rollout_buffer_size: 每个智能体在更新前收集的样本数量
  • train_batch_size: 每个更新中的最小批次大小
  • max_new_tokens: 每完成一次时生成的最大 tokens
  • temperature: 采样时的温度
  • top_p: 用于核采样时的 Top-p
  • top_k: 采样时的 Top-k
  • num_generations: 每个提示的生成次数
  • external_prompt_passthrough: 是否直接使用外部提示在多轮训练中
  • discount: 下一个回合的 critic 预测的折扣因子,在 TD 目标中; logged expected_return 使用未折扣的奖励和
  • early_termination_threshold: 一个 rollout 在回合的平均处理奖励超过此阈值时结束; None 禁用提前停止
  • eval_interval: 评估间隔(在训练批次中)
  • eval_num_samples: 每个间隔的评估样本数
  • eval_batch_size: 评估 DataLoader 批次大小
  • logging_steps: 联合行动奖励评估的最小次数,记录在训练指标日志中
  • parallel_training: none 针对单个设备或 mp 针对明确的智能体/critic 设备放置
  • agent_devices, critic_devices:设备分配,需要在 mp 模式下使用
  • reference_kl_enabled, reference_kl_coef:是否启用冻结参考 KL 奖励惩罚,以及其权重(默认禁用)
  • reference_devices:可选的参考模型放置
MAACTrainer 参数
  • agent_model 或 agents:同构智能体的 Actor 模型标识符字符串,或智能体模型列表(多智能体 agent_model 必须是字符串)
  • critic_model 或 critics:必需的单个共享 critic,作为标识符、模型实例或 1 个元素的列表
  • tokenizer:共享 tokenizer,或使用 agents 时,按智能体列表;需要与 agents 或模型实例一起使用,否则从 agent_model 加载
  • reward_func:返回奖励的函数(必需)
  • reward_processor:可选的奖励后处理器
  • formatters:单个函数或按智能体列表的格式化
  • args: MAACConfig 的实例 (可选)
  • train_dataset: 训练数据集 (必需)
  • eval_dataset: 可选评估数据集
  • model_config: 模型加载选项; critic_value_head_hidden_dim 配置集中式 critic 的 value head (可选)
  • wandb_config: Weights & Biases 日志配置 (可选)
  • metrics_callback: 可选的回调函数,接收 rollout 样本并返回标量指标的字典
  • external_transition: 当使用 num_turns > 1 时,所需的转换函数

MAAC 在不进行重要性采样或策略比率裁剪的情况下更新收集的样本。 MAACConfig 没有 value_clip_range 选项。 共享的 critic 使用第一个智能体的 tokenizer,该智能体必须与 critic 模型兼容。

trainer 使用固定训练 DataLoader 批次大小为 1。对于 num_turns > 1,需要 external_transition 和 num_generations=1。 train_batch_size 默认为 rollout_buffer_size;实际更新使用每个智能体/回合组中的可用样本,包括在缓冲区刷新时的小组。

IAC#

独立的 Actor-Critic (IAC) 独立优化每个智能体的策略,同时使用来自多个智能体的联合响应。 每个智能体维护自己的 actor 和 critic,而其他智能体作为环境的一部分。 奖励可以共享或特定于智能体。 critic 根据 V 模式下该智能体的提示/历史记录,或在 Q 模式下根据其提示和完成进行条件。 每个智能体的策略梯度为:

\[ \nabla_{\theta_i} J(\theta_i) = \mathbb{E}_{\boldsymbol{\pi}}\left[\sum_{t=0}^{H-1} \nabla_{\theta_i} \log \pi_{\theta_i}(a_{i,t}|h_{i,t})\,\delta_{i,t}\right] \]

在哪里 \( \delta_{i,t} = r_t + \gamma V_{\phi_i}(h_{i,t+1}) - V_{\phi_i}(h_{i,t}) \). The actor 使用相同的样本平均损失和完成-token 和 MAAC, 以及可选的每个智能体/回合组内的归一化。Q-模式 actor 也使用这个 TD 误差.

CoMLRL 支持两种 IAC 变体:

  • 独立使用 Critic: 使用独立的模型进行价值估计。 Actor 和 critic 的参数分别进行优化,但需要存储额外的模型。

  • 共享模型: 将一个小的 value head 连接到 transformer backbone,共享 actor 模型的历史(或历史-动作)表示,以减少空间需求。

critics 通过最小化 TD 误差进行更新:

\[ \mathcal{L}(\phi_i) = \mathbb{E}_{\boldsymbol{\pi}}\left[\sum_{t=0}^{H-1} \big(r_t + \gamma V_{\phi_i}(h_{i,t+1}) - V_{\phi_i}(h_{i,t})\big)^2\right]. \]

当使用共享模型 (use_separate_critic=False) 时,actor 和 value head 优化 actor 损失加上 critic 损失,权重为 value_loss_coef。 除非 value_clip_range=None,否则会应用值截断以提高训练稳定性:

\[ L(\phi_i) = \max\Big( (V_{\phi_i}(h_t) - \hat{V}_t)^2,\ (V_{\phi_i}^{\text{clip}}(h_t) - \hat{V}_t)^2 \Big) \\ V_{\phi_i}^{\text{clip}}(h_t) = V_{\phi_i}^{\text{old}}(h_t) + \mathrm{clip}(V_{\phi_i}(h_t) - V_{\phi_i}^{\text{old}}(h_t), -\epsilon, \epsilon), \]

在哪里 \( \hat{V}_t \) 是 TD 目标, \( \epsilon \) 是 value_clip_range, 并且错误在 mini-batch 上进行平均。 独立 critics 使用未截断的平方误差.

IACConfig 参数
  • num_agents: 智能体的数量
  • num_turns: 轮数
  • num_train_epochs: 训练 epochs 的数量
  • agent_learning_rate: 智能体的学习率
  • critic_learning_rate: critics 的学习率; 共享模型使用 agent_learning_rate 用于 actor 和 value head
  • value_loss_coef: 价值损失的系数
  • value_clip_range: 在共享模型模式下,价值截断范围;None 禁用截断
  • advantage_normalization: 是否对优势进行归一化
  • rollout_buffer_size: 在更新前收集的样本数量
  • train_batch_size: 策略更新的迷你批次大小
  • max_new_tokens: 生成的最大新 tokens
  • temperature: 采样温度
  • top_p: Top-p 用于核采样
  • top_k: Top-k 用于采样
  • num_generations: 每个提示的生成次数(每个智能体)
  • use_separate_critic: 是否使用单独的 critic 模型
  • critic_type: Critic 目标类型(v 用于 V(h),q 用于 Q(h,a))
  • critic_value_head_hidden_dim: critic, value head 的隐藏维度
  • value_head_hidden_dim: value head 在共享模型模式下的隐藏维度
  • external_prompt_passthrough: 是否直接使用外部提示在多轮训练中
  • discount: TD 目标中的折扣因子; expected_return 使用未折扣的奖励和
  • early_termination_threshold: rollout 结束时,该轮平均处理后的奖励超过此阈值; None 禁用提前停止
  • eval_interval: 评估间隔 (在训练批次)
  • eval_num_samples: 每个间隔的评估样本数量
  • eval_batch_size: 评估 DataLoader 批次大小
  • logging_steps: 训练指标日志之间的最小联合行动奖励评估数量
  • parallel_training: none 针对单个设备或 mp 针对明确的智能体/critic 设备放置
  • agent_devices, critic_devices: 设备分配; mp 需要 agent_devices,以及对于独立的 critics, critic_devices
  • reference_kl_enabled, reference_kl_coef: 是否启用冻结参考 KL 奖励惩罚,以及其权重 (默认禁用)
  • reference_devices: 可选的参考模型放置设备
IACTrainer 参数
  • agent_model 或 agents: 同构智能体的模型标识字符串,或智能体模型列表 (多智能体 agent_model 必须是字符串)
  • critic_model 或 critics: Critic 标识符、模型实例或 critic 模型列表,当使用 use_separate_critic=True 时
  • tokenizer: 共享的 tokenizer,或使用 agents 时,按智能体列表; 必须与 agents 或模型实例一起使用,否则从 agent_model 加载
  • reward_func: 返回浮点数列表的函数 (必需)
  • reward_processor: 可选的处理器,用于应用到奖励
  • formatters: 单个函数或按智能体函数列表,用于将数据集项格式化为提示
  • args: IACConfig 的实例 (可选)
  • train_dataset: 训练数据集 (必需)
  • eval_dataset: 评估数据集 (可选)
  • model_config: 模型配置字典 (可选)
  • wandb_config: 配置 Weights & Biases 日志记录 (可选)
  • metrics_callback: 可选的回调函数,接收 rollout 样本并返回标量指标的字典
  • external_transition: 必需的过渡函数,用于多轮训练

IAC 在不使用重要性采样或策略-比率裁剪的情况下,更新已收集的样本。在共享模型模式 (use_separate_critic=False) 中,value heads 连接到 actor 模型;传递 critic_model 或 critics 会引发错误,而 value_clip_range 仅在该模式下有效。智能体可以是同构或异构。在独立模式 (critic) (use_separate_critic=True) 中,用户可以提供一个长度为 num_agents 的 critics 列表,或一个单一的 critic_model 源进行广播。 不同的模型实例或为每个 critic 独立加载的标识符,保持其参数独立;广播一个预加载的模型对象会重用其参数。 每个 critic 消耗其 actor 的 token IDs,因此不同的 critic 模型必须与该 actor 的 tokenizer 兼容。

The trainer 使用固定训练 DataLoader 批次大小为 1。对于 num_turns > 1, an external_transition 和 num_generations=1 需要. train_batch_size 默认值为 rollout_buffer_size; 实际更新使用每个智能体/回合组中的可用样本,包括在缓冲区刷新时使用较小的组.