AWAC 优势加权行为克隆:温度把坏动作压住之后
从优势加权策略更新与离线约束出发,说明温度/权重截断如何决定保守程度;对比纯 BC、AWR 与 AWAC,用离线数据集上的回报与动作 KL 验收。

一份机器人操作日志里,通常既有顺利抓取,也有末端抖动、碰撞前急停和人工接管。纯行为克隆会把它们都当成同等正确的标签;纯粹追逐最大 的策略又会钻到日志没有覆盖的动作区域。AWAC(Advantage Weighted Actor-Critic)的折中很直接:actor 仍只拟合数据里真实出现过的动作,但让 critic 判断这些动作相对当前策略有多好,再用指数权重决定每条监督信号的话语权。
这句话容易产生一个危险误解:只要用了优势权重,坏动作就会自动消失。实际上,温度决定好坏样本的赔率,权重上限决定单个可疑优势能放大到什么程度,而 critic 的偏差决定算法究竟压住了坏动作,还是把估错的动作推到最前面。要把 AWAC 用稳,必须把策略更新、价值估计、权重统计和离线验收放在同一条链路上。
1. AWAC 解决的是两种失败之间的空隙
设离线数据集为 ,由未知或混合的行为策略 产生。行为克隆最小化
它的优点是 actor 的监督动作始终来自数据支持集,缺点是无法区分「专家平稳通过」和「接管前打满方向」:只要二者出现在日志里,最大似然都会努力复现。若数据是多版本控制器、探索策略和人工示范的混合,BC 学到的往往是条件均值;在多峰动作分布中,这个均值甚至不属于任何一种有效模式。
另一端是标准 actor-critic。它直接提高 ,策略会主动寻找 critic 预测较高的动作。在线训练还能执行该动作并纠正错误,纯离线训练却没有这条反馈;函数逼近器在数据稀薄处给出的虚高值,会被 actor 当成改进方向。AWAC 的 actor 不直接对 求梯度,而是在数据动作上做加权最大似然,因此比无约束的策略梯度更难一步跳出行为支持。
这个约束并非绝对安全。AWAC 的 critic 仍会在 Bellman 目标中查询当前策略动作,而且数据状态本身也可能偏离部署状态。准确的表述应是:AWAC 收窄了 actor 的动作更新通道,但没有消除离线价值外推。
2. 从 KL 约束策略改进推到加权行为克隆
在当前策略 下,先考虑每个数据状态上的非参数策略改进。希望新策略选择高优势动作,同时不离行为策略太远:
把 KL 约束与归一化约束写进拉格朗日函数,对 求驻点,可得
其中
是 KL 约束对应的对偶变量。它不是装饰性的 softmax 温度,而是「愿意用多大策略偏移换取优势」的价格。优势相同的动作保持行为概率比例;优势更高的动作按指数倍放大;行为策略概率为零的动作仍然为零。最后将无法直接部署的 投影到参数化策略 :
去掉与 无关的项,并用数据动作采样 ,得到 AWAC 常见的 actor 目标:
实际实现往往不估每个状态的 ,而是对批内权重做均值归一或直接交给优化器。这保持了「高优势样本梯度更大」的方向,却不再等价于精确的逐状态非参数投影。再加上有限数据、近似 critic 和参数共享,上面的推导只能解释更新结构,不能提供单调策略改进保证。
3. 优势不是回报,它取决于当前策略
AWAC 常用 off-policy critic 估计当前策略的动作价值。以双 critic 为例,价值目标可写为
这里应只用真正的环境终止 截断 bootstrap;因时间上限造成的 truncated transition 是否 bootstrap,要遵守任务定义,不能把两种 done 混成一个字段。critic 在数据动作上拟合
actor 所需的优势则是
第一项评价日志中真正执行的动作,第二项近似 ,回答「如果沿用当前策略,在这个状态通常能做到什么」。因此正优势不等于高绝对回报:在一个不可避免损失的状态,少损失的动作也可能是正优势;在一个本来很容易的状态,虽有正回报但低于当前策略预期的动作仍是负优势。这种相对比较正是 AWAC 能从混合质量数据中筛选动作的原因。
基线动作来自当前 actor,仍可能落在数据边缘。如果 被高估,基线被抬高,几乎所有数据动作都会得到负优势;若某个数据动作的 Q 被偶然抬高,它又会获得指数级权重。双 Q 取最小值、目标网络、多个基线动作样本都能降低方差或部分过估计,却不能创造缺失的支持。纯离线场景中,critic 还应配合保守 Q、IQL 式数据内价值备份,或至少用覆盖率探针检查当前策略动作,而不能把所有安全责任交给 actor 权重。
4. 温度控制的是优势赔率,不是抽象的“保守度”
取同一状态的两个数据动作 ,忽略归一化后,它们的权重比为
若优势差为 ,降低 会指数放大赔率。极限情况下, 时所有权重趋近于 1,actor 退化为 BC; 时,每个批次几乎只剩最高估优势的少数动作,训练变成由 critic 排名控制的近似精英筛选。后者看似更积极,实际上也把优势误差 放大为 的乘性误差。
温度和奖励量纲绑定。把所有奖励乘 100,Q 与优势也近似乘 100;若 不变,原来温和的更新会突然接近赢家通吃。因此实验必须冻结奖励变换、折扣因子和回报归一化,并报告优势分布相对于 的尺度。仅记录 temperature=1.0 没有可复现意义。
可以用训练折上固定的稳健尺度 ,例如优势绝对中位差,报告 。这有助于跨任务比较,但不应在每个 minibatch 动态标准化优势:动态标准化会让同一个 随批次组成改变含义,也会把「critic 已经收敛、优势整体变小」重新放大成强更新。更稳妥的做法是先固定奖励尺度,再对 做预注册扫描,并直接观察策略与行为的动作 KL。
温度也不是 KL 的一一映射。非参数、精确优势和精确 下,较大 通常对应更紧的 KL 约束;神经网络策略共享参数、权重截断、有限优化步和混合行为数据都会破坏这层单调关系。工程上只能把温度当作候选控制量,把实测 KL 当作最终策略距离。
5. 权重截断决定单个 critic 错误能造成多大伤害
直接计算 会溢出,也会让极少数样本占据整个梯度。常见实现是在 log 权重上截断:
是一道影响上界:无论 critic 把某条动作高估多少,它相对未归一权重 1 的样本最多放大到 。它和升高温度并不等价。升高温度会压缩全部动作之间的赔率;截断只把上尾削平,中间优势的相对次序和斜率保持不变。若大量样本撞到上限,actor 看见的是一大片同权「优质动作」,此时继续调小温度不会增强排序,只会让更多样本饱和。
指数权重对负优势样本只会趋近零,不会真的给出负梯度去“反向学习”。这意味着 AWAC 不是在显式教策略避开坏动作,而是在有限梯度预算里减少对它们的模仿。若所有动作都很差,批内均值归一后仍会从这些动作中选相对不差者;数据没有恢复动作时,算法不会凭空产生恢复能力。
批内除以 w.mean() 不改变一个固定批次加权似然的最优点,但会改变梯度尺度、Adam 的历史和不同批次的相对贡献。实现中应把它视为优化稳定措施并固定下来,而不是无关紧要的代码细节。至少记录:
同时报告截断命中率、权重的 p50/p90/p99、正优势比例和按场景分组的 。平均权重在归一后恒为 1,几乎不提供诊断信息。若全局 ESS 尚可而碰撞前状态的 ESS 接近几个样本,危险场景的更新仍由偶然 Q 误差支配。
6. 纯 BC、AWR 与 AWAC 到底差在哪
三者的 actor 都能写成监督学习外形,关键差异是权重从哪里来、评价的是谁,以及训练能否随着当前策略更新。
| 方法 | actor 的样本 | 权重或优势来源 | critic/价值的角色 | 主要边界 |
|---|---|---|---|---|
| BC | 数据动作 | 全部为 1 | 不需要 | 稳定但复制所有数据质量,上限受行为策略限制 |
| AWR | 数据动作 | 轨迹回报或 TD 回报减 | 用回报回归出基线 | 不必对数据外动作求 Q,但长回报方差大、依赖完整轨迹 |
| AWAC | replay 中的数据动作 | off-policy | 持续评价当前策略并 bootstrap | 可接离线预训练与在线微调,但 critic 外推会污染指数权重 |
AWR(Advantage-Weighted Regression)通常从已有轨迹构造回报 或 -return,再拟合 ,使用
做加权回归。它不需要先对当前 actor 采样动作再查询 Q,因而少了一条动作外推路径;代价是回报估计受 horizon、轨迹截断和行为策略后续动作影响。数据只有打散 transition、没有可靠 episode 边界时,AWR 的优势很难正确重建。
AWAC 用 TD critic 评价 ,优势随当前策略变化,适合把离线 replay 与新收集的在线数据放在同一个 actor-critic 循环中。它能问「这个旧动作对今天的策略是否仍值得模仿」,而不是永远沿用采集时的 return 排名。代价是 bootstrap 偏差和策略动作 OOD。纯离线数据很窄、轨迹回报可信时,AWR 可能比 AWAC 更省心;需要后续在线适应、日志规模大且 transition 可持续加入 replay 时,AWAC 的接口更自然。
不要把「优势加权 BC」当成一个足以唯一指认算法的名字:AWR、AWAC、IQL 的策略头都可能出现指数优势权重,区别主要藏在价值学习和优势定义里。评审实现时必须追到 的来源,而不是只看 actor loss 的最后一行。
7. 一个可审查的 PyTorch 更新骨架
下面省略网络结构与分布类,只保留数据流。假设 actor 的 sample 和 log_prob 都针对环境实际执行的有界动作;若使用 tanh Gaussian,log_prob 必须包含变换 Jacobian,并对动作维求和。
import math
import torch
import torch.nn.functional as F
def critic_step(batch, actor, q1, q2, q1_targ, q2_targ,
q_optim, gamma):
s, a = batch.obs, batch.action
r, s2 = batch.reward, batch.next_obs
# 只让真正 terminated 的转移停止 bootstrap。
not_terminal = 1.0 - batch.terminated.float()
with torch.no_grad():
a2 = actor.sample(s2).action
q2_min = torch.minimum(q1_targ(s2, a2), q2_targ(s2, a2))
target = r + gamma * not_terminal * q2_min
loss_q = F.mse_loss(q1(s, a), target) + F.mse_loss(q2(s, a), target)
q_optim.zero_grad(set_to_none=True)
loss_q.backward()
q_optim.step()
return loss_q.detach()
def actor_step(batch, actor, q1, q2, actor_optim,
temperature, max_weight, baseline_samples=4):
s, a_data = batch.obs, batch.action
# 优势只产生权重,不允许 actor 通过权重反向修改 critic。
with torch.no_grad():
q_data = torch.minimum(q1(s, a_data), q2(s, a_data))
q_baselines = []
for _ in range(baseline_samples):
a_pi = actor.sample(s).action
q_pi = torch.minimum(q1(s, a_pi), q2(s, a_pi))
q_baselines.append(q_pi)
v_pi = torch.stack(q_baselines, dim=0).mean(dim=0)
advantage = q_data - v_pi
log_w = advantage / temperature
log_w = torch.clamp(log_w, max=math.log(max_weight))
weight = torch.exp(log_w)
weight = weight / weight.mean().clamp_min(1e-6)
log_prob = actor.log_prob(s, a_data) # shape: [batch]
loss_actor = -(weight * log_prob).mean()
actor_optim.zero_grad(set_to_none=True)
loss_actor.backward()
actor_optim.step()
ess = weight.sum().square() / weight.square().sum().clamp_min(1e-12)
clip_rate = (log_w >= math.log(max_weight) - 1e-7).float().mean()
return {
"loss_actor": loss_actor.detach(),
"advantage": advantage.detach(),
"weight": weight.detach(),
"weight_ess_ratio": (ess / weight.numel()).detach(),
"clip_rate": clip_rate.detach(),
}这段代码有几个刻意保留的契约。第一,actor 拟合的是 a_data,不是 a_pi;后者只用于构造当前策略基线。第二,优势与权重必须 detach,否则 actor 可能通过改变基线动作来操纵自己的监督权重,目标已不再是加权行为克隆。第三,双 Q 的组合要在 critic target、数据动作 Q 和基线 Q 中一致;一处取最小、另一处取均值,会给优势引入系统偏移。
实际训练还要软更新 target、固定 actor/critic 更新频率、保存动作归一化统计。若 q_data 形状为 [B,1] 而 log_prob 为 [B],直接相乘会广播成 [B,B],loss 仍能下降却完全错误;接口层应断言二者都为 [B]。混合精度下指数计算最好保留 float32,不能依赖半精度替你发现权重溢出。
8. 纯离线使用时,温度救不了错误的 critic
AWAC 最初的强项之一是先利用离线数据,再通过在线交互快速微调。若训练始终不能与环境交互,以下风险必须单独处理。
Bellman target 仍查询策略动作。 actor 更新使用数据动作,不代表 critic target 也在数据内。随着策略均值向高优势样本移动, 可能进入行为密度较低区域,虚高 Q 经 bootstrap 回流。可以加入保守 critic 正则、限制目标策略噪声,或改用更偏数据内的价值学习;无论采用哪种方式,都要在相同状态上监控 的上分位数。
混合日志没有单一、易拟合的行为策略。 数据可能来自多个控制器版本, 是带隐藏版本变量的混合分布。单高斯行为模型会把两个模式之间的低密度动作误认为高密度均值,动作 KL 也会失真。应把可用的策略版本、模式和安全接管标记放进条件变量,或使用能表达多峰的 mixture/flow,并在 held-out 轨迹上校准 NLL。
优势会继承奖励定义错误。 动作延迟错一帧、终止奖励重复记账、超时被当失败、不同设备奖励尺度不一致,都会让 critic 给错误动作高权重。BC 只会暴露动作拟合异常,AWAC 却可能把数据管线错误指数放大。训练前应在若干完整 episode 上重算 discounted return,核对 reward、timestamp、executed action 和终止原因。
数据支持决定能力上限。 如果所有碰撞前状态只有急停,没有绕行动作,AWAC 最多学会更稳定地急停;若日志只含成功专家轨迹,它也学不到偏离后的恢复。降低温度不会产生新行为,只会更确信地挑选已有动作。此时正确动作是补充覆盖或接受 BC 级保守策略,而不是继续扩大权重上限。
9. 离线数据集上的对照实验应该隔离什么
要判断改进来自优势加权而不是训练预算,至少同时训练 BC、AWR 和 AWAC。三者使用同一 observation/action 预处理、同一 actor 容量、相同训练 transition 数和评估协议。数据按完整轨迹切 train/validation,不能随机打散 transition;否则同一 episode 的相邻状态会跨折,行为模型 NLL、FQE 与动作误差都过度乐观。
建议把实验拆成两个正交扫描:
- 固定一个足够高、很少命中的 ,扫描 ;
- 在候选温度附近固定 ,扫描 ;
- 额外保留 或全权重为 1 的 BC 退化检查;
- AWR 使用相同轨迹切分,并明确 Monte Carlo、GAE 或 TD 回报构造;
- 每个配置保存优势直方图、权重 ESS、截断率、critic Q gap 和策略 KL。
可以从固定 pilot checkpoint 的训练折优势估计一次,此后不随 seed 和配置重新定义。温度与截断若同时大范围搜索,很难解释某次改进究竟来自全局赔率变平,还是少数错误高权重被削掉。先做正交扫描,再在小邻域联合确认,才能得到可迁移的判断。
若使用 D4RL 一类带模拟器的离线基准,环境只用于最终 rollout 评估,不能把评估轨迹放回 replay。报告原始 episodic return、对应基准版本的 normalized score、episode 长度与失败原因;只写归一化分数会掩盖版本和参考上下界差异。若真实系统完全禁止 rollout,则不能声称测得目标策略真实回报,只能报告 FQE、DR 等 OPE 估计及区间,并把结论写成「离线证据支持」,而不是「回报已经提高」。
随机性也要分层:训练 seed 反映优化波动,环境初始条件 seed 反映任务波动。每个训练 seed 应评估一组共同的环境 seed,比较 AWAC 与 BC 的配对回报差;再对训练 seed 与 episode 做分层 bootstrap。把所有 episode 混成独立样本会低估同一 checkpoint 内的相关性,给出过窄区间。
10. 动作 KL 要在正确方向、正确坐标里计算
AWAC 推导中的约束是 ,它直接惩罚目标策略把概率放到行为策略低密度处。验收时在 held-out 数据状态 上估计
这需要一个在训练折拟合、在验证折校准的行为密度 。同时报告反向
有助于发现 mode dropping,但不能用它替代前向 KL:反向 KL 较小只说明策略能解释常见行为动作,不保证策略采样不会跑到行为低密度区。
连续动作必须在同一坐标和同一参考测度下比较。若 ,环境动作密度包含
两策略使用完全相同的可逆变换时,Jacobian 在 log ratio 中可抵消,但代码仍应通过同一个 transformed-distribution 接口计算。硬 clipping 不是可逆变换,边界上有点质量;把裁剪后的动作塞回普通高斯 log_prob 会得到没有统计意义的 KL。还要分别给出状态平均、p90/p99 以及安全关键场景切片,因为少数高 KL 状态正可能是碰撞前、接管前和动作饱和区。
行为模型若在 held-out 数据上的 NLL、覆盖率或概率积分变换检查不过关,KL 只能当相对探针。尤其是多峰日志,单高斯 会系统性惩罚合法模式。此时应先修行为密度,再讨论 AWAC 是否越界;不能因为一个失配模型报出大 KL 就武断地升高温度。
11. 用回报与动作 KL 组成双门验收
选择超参时不要只取平均回报最高点,而应看回报—KL 的 Pareto 前沿。对每个 checkpoint 保存以下最小表格:
| 配置 | 回报均值与区间 | 相对 BC 的配对回报差 | 前向 KL 中位数/p95 | 权重 ESS 比 | 截断率 | Q gap p95 |
|---|---|---|---|---|---|---|
| BC | 作为基线 | 0 | 作为距离基线 | 1 | 0 | 记录 |
| AWR | 实测 | 实测 | 实测 | 实测 | 实测 | 不适用或另记 |
| AWAC | 实测 | 实测 | 实测 | 实测 | 实测 | 实测 |
合理的发布门应在实验前确定,而不是看到曲线后移动。核心条件可以写成:
并同时要求
没有跨任务通用数值。它应由已有可部署策略之间的距离、动作扰动测试和安全控制器容忍范围校准;机械臂关节速度与推荐系统离散动作不可能共享一个阈值。对关键场景还要单设 KL 门,不能让大量静止状态稀释接触阶段的偏移。
若没有真实 rollout,第一条中的 应替换成预先选定的 OPE 下置信界,并要求至少两类误差结构不同的估计器结论同向。例如 FQE 与带有效样本量报告的 DR 同时优于 BC;支持集不足、重要性权重退化时,结论应是「不可识别」,而不是用更强 clipping 做出漂亮数字。
双门会拒绝两种常见伪进步:一种是 Q 预测和回报均值升高,但动作 KL 暴涨,说明策略可能靠数据外动作投机;另一种是 KL 极低、权重 ESS 接近满批,但回报与 BC 无差异,说明温度或截断过于保守。最终候选应在满足 KL 上限的集合中最大化回报下界,而不是追逐单个 seed 的峰值。
12. 从曲线反推该调温度、截断还是 critic
当实验失败时,先根据联动指标定位,不要把所有问题都归结为温度。
- KL 高、权重上尾长、截断率低:先增大 ;这说明整个优势赔率过陡,而非只有少量异常点。
- KL 高、截断率高、多个样本共享 :提高温度并检查 critic 排名;单纯降低 只能削平上尾,可能把一群误判动作变成同权。
- 回报方差大、KL 中等、权重 ESS 很低:降低 、增加 baseline 动作样本,并按场景检查少数高权重 transition 是否有时间对齐或奖励错误。
- 训练 Q 持续升、真实回报降、 扩大:这是 critic 外推,调 actor 温度只能减缓症状;应改价值备份、加保守约束或补数据覆盖。
- 回报与 BC 相同、KL 也接近 BC:检查优势是否几乎为零、温度是否相对奖励尺度过大,以及 actor 是否真的读到了权重。不要先扩大网络。
- 总体回报提高、关键场景 KL 或失败率恶化:全局指标掩盖了尾部风险,应按场景收紧门限或增加安全关键数据,不能用平均收益抵消碰撞。
AWAC 真正有价值的地方,不是给 BC 乘了一个指数,而是把「留在数据里」与「优先模仿相对更好的动作」组合成可持续的 actor-critic 接口。温度决定全局优势赔率,权重截断限制单点错误的影响,critic 决定排序是否可信;三者缺一不可。最终是否足够保守,不由超参名字决定,而由离线数据上的权重统计、正确计算的动作 KL,以及带不确定性的回报证据共同决定。
相关
也可以看看
- ·16 分钟阅读
约束 MDP 的代价估计偏差:安全层看起来在工作
区分期望约束、条件风险与硬屏蔽,解释代价 critic 偏差如何让可行集虚胖;用约束违反轨迹占比、拉格朗日乘子轨迹和安全层旁路注入验收。
- ·17 分钟阅读
离线强化学习的支持集外动作:为什么 Q 值会自我抬高
从 Bellman backup 的分布外 maximization 解释外推误差;比较行为约束、保守价值与策略正则,并用覆盖率切片与 FQE 交叉验证部署边界。
- ·10 分钟阅读
离策略评估:部署前别只看行为数据上的平均回报
从重要性采样的支持集与方差出发,比较 self-normalized、per-decision、DR 和 FQE,并建立部署前的统计验收。
johan's blog