返回专辑
·Johan·19 分钟阅读

AWAC 优势加权行为克隆:温度把坏动作压住之后

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

AWAC 优势加权行为克隆:温度把坏动作压住之后

一份机器人操作日志里,通常既有顺利抓取,也有末端抖动、碰撞前急停和人工接管。纯行为克隆会把它们都当成同等正确的标签;纯粹追逐最大 的策略又会钻到日志没有覆盖的动作区域。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 的历史和不同批次的相对贡献。实现中应把它视为优化稳定措施并固定下来,而不是无关紧要的代码细节。至少记录:

\mathrm{ESS}w=\frac{\left(\sum_i w_i\right)^2}{\sum_i w_i^2},\qquad\mathrm{topMass}{1%}=\frac{\sum_{i\in\text{最大 }1%}w_i}{\sum_i w_i}.

同时报告截断命中率、权重的 p50/p90/p99、正优势比例和按场景分组的 。平均权重在归一后恒为 1,几乎不提供诊断信息。若全局 ESS 尚可而碰撞前状态的 ESS 接近几个样本,危险场景的更新仍由偶然 Q 误差支配。

6. 纯 BC、AWR 与 AWAC 到底差在哪

三者的 actor 都能写成监督学习外形,关键差异是权重从哪里来、评价的是谁,以及训练能否随着当前策略更新。

方法actor 的样本权重或优势来源critic/价值的角色主要边界
BC数据动作全部为 1不需要稳定但复制所有数据质量,上限受行为策略限制
AWR数据动作轨迹回报或 TD 回报减 用回报回归出基线不必对数据外动作求 Q,但长回报方差大、依赖完整轨迹
AWACreplay 中的数据动作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 的 samplelog_prob 都针对环境实际执行的有界动作;若使用 tanh Gaussian,log_prob 必须包含变换 Jacobian,并对动作维求和。

python
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. 固定一个足够高、很少命中的 ,扫描
  2. 在候选温度附近固定 ,扫描
  3. 额外保留 或全权重为 1 的 BC 退化检查;
  4. AWR 使用相同轨迹切分,并明确 Monte Carlo、GAE 或 TD 回报构造;
  5. 每个配置保存优势直方图、权重 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作为距离基线10记录
AWR实测实测实测实测实测不适用或另记
AWAC实测实测实测实测实测实测

合理的发布门应在实验前确定,而不是看到曲线后移动。核心条件可以写成:

\mathrm{LCB}{95%}!\left[J(\pi{\mathrm{AWAC}})-J(\pi_{\mathrm{BC}})\right]>0,

并同时要求

\mathrm{UCB}{95%}!\left[D{\mathrm{KL}}(\pi_{\mathrm{AWAC}}|\hat\mu)\right]\le\kappa .

没有跨任务通用数值。它应由已有可部署策略之间的距离、动作扰动测试和安全控制器容忍范围校准;机械臂关节速度与推荐系统离散动作不可能共享一个阈值。对关键场景还要单设 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,以及带不确定性的回报证据共同决定。

相关

也可以看看

← 全部文章

johan's blog