Actor-Critic (AC) 方法是广泛使用的策略梯度方法,使用 critics 来支持训练。 AC 方法可以实现比 REINFORCE 更低的方差和更好的样本效率,但这需要仔细设计和调整 critic,以确保稳定的训练。 在多智能体强化学习 (MARL) 中,Actor-Critic 方法包括多智能体 Actor-Critic (MAAC) 和独立式 Actor-Critic (IAC)。
两个模型同时部署智能体,并根据奖励函数对它们的联合响应进行评分,但它们使用 critics 方式不同。 MAAC 训练一个 critic,使其基于联合历史,因此每个智能体共享其 TD 误差。 IAC 训练每个智能体一个 critic,基于该智能体的历史,因此每个智能体获得自己的 TD 误差。
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 模式还包括它们的生成完成。 每个智能体的策略梯度为:
其中 \( \boldsymbol{\delta}_t = r_t + \gamma V_{\boldsymbol{\phi}}(\mathbf{h}_{t+1}) - V_{\boldsymbol{\phi}}(\mathbf{h}_{t}) \),并且 critic 被更新为:
这里 \( r_t \) 是经过处理的奖励,包含可选的参考-KL 惩罚,如果启用;奖励可以共享给多个智能体或按智能体单独提供。 最终收集到的回合,包括提前终止或单回合 rollout, 仅使用奖励作为目标,不进行 bootstrapping。 生成的-token log-概率之和是完成的 log-概率;提示和尾部填充 tokens 被排除。 损失则在样本上进行平均。 缓冲区按智能体和回合进行分组后再更新,并且 advantage_normalization 对 TD 进行归一化。 目标和优势在更新期间保持不变。 共享的 critic 与每个智能体的批次按顺序更新,并且 value_loss_coef 缩放其损失.
在 Q 模式下,实现使用相同的 TD-残差 actor 权重,并使用从 bootstrap 中采样的下一个动作。 它不实现直接由 Q 或仅基于状态的 Q 基线的权重,也不实现单独的 actor 目标。
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: 每完成一次时生成的最大 tokenstemperature: 采样时的温度top_p: 用于核采样时的 Top-ptop_k: 采样时的 Top-knum_generations: 每个提示的生成次数external_prompt_passthrough: 是否直接使用外部提示在多轮训练中discount: 下一个回合的 critic 预测的折扣因子,在 TD 目标中; loggedexpected_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:可选的参考模型放置
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 模式下根据其提示和完成进行条件。 每个智能体的策略梯度为:
在哪里 \( \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 误差进行更新:
当使用共享模型 (use_separate_critic=False) 时,actor 和 value head 优化 actor 损失加上 critic 损失,权重为 value_loss_coef。 除非 value_clip_range=None,否则会应用值截断以提高训练稳定性:
在哪里 \( \hat{V}_t \) 是 TD 目标, \( \epsilon \) 是 value_clip_range, 并且错误在 mini-batch 上进行平均。 独立 critics 使用未截断的平方误差.
num_agents: 智能体的数量num_turns: 轮数num_train_epochs: 训练 epochs 的数量agent_learning_rate: 智能体的学习率critic_learning_rate: critics 的学习率; 共享模型使用agent_learning_rate用于 actor 和 value headvalue_loss_coef: 价值损失的系数value_clip_range: 在共享模型模式下,价值截断范围;None禁用截断advantage_normalization: 是否对优势进行归一化rollout_buffer_size: 在更新前收集的样本数量train_batch_size: 策略更新的迷你批次大小max_new_tokens: 生成的最大新 tokenstemperature: 采样温度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_devicesreference_kl_enabled,reference_kl_coef: 是否启用冻结参考 KL 奖励惩罚,以及其权重 (默认禁用)reference_devices: 可选的参考模型放置设备
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, anexternal_transition和num_generations=1需要.train_batch_size默认值为rollout_buffer_size; 实际更新使用每个智能体/回合组中的可用样本,包括在缓冲区刷新时使用较小的组.