跳到内容

第 13 卷 / 第 3 章 / 第 3 课

3.3 Policy Gradient、Actor-Critic 与安全评估:优化回报也会优化奖励漏洞 ​

连续转向角无法逐项放进有限 Q 表,参数化动作分布提供了另一种表示。随机轨迹会让回报和梯度波动;如果奖励允许在终点附近反复领取,策略还可能学会刷奖励而不结束任务。

Policy optimization 可以处理随机和连续动作,却不会自动理解意图。估计方差、动作约束和奖励漏洞都要进入算法设计。

本课目标 ​

  • 推导 REINFORCE 的 log-derivative 更新;
  • 用 baseline/advantage 降低方差;
  • 理解 actor-critic 的 bootstrap 权衡;
  • 设计独立评估、离线检查与安全约束。

1. 直接优化参数化策略 ​

令策略为 πθ(a∣s),目标:

J(θ)=Eτ∼πθ[G0].

对于有限完整轨迹,令 Gt 从第 t 步重新计折扣,并假设环境转移不依赖策略参数,则:

∇θJ(θ)=Eτ∼πθ[∑t=0T−1γtGt∇θlog⁡πθ(At∣St)].

REINFORCE 采集完整轨迹,用 sampled return 加权。这里显式保留 γt,与 J=E[G0] 对齐;若采用折扣状态访问分布,公式可改写,但不能无说明地丢掉权重。单项正回报沿增加所选动作 log probability 的方向贡献梯度;整条轨迹共享参数时,各项贡献还会叠加。

2. 先确认梯度方向 ​

Softmax 线性策略对所选动作的 log-probability 梯度是:

∇Wlog⁡π(a∣s)=s(onehot(a)−π(⋅∣s))T.

下面的 Python 3 + NumPy 片段(partial)使用有限离散动作演示梯度方向,连续动作见第 5 节。features 是固定长度向量,trajectory 是当前策略生成的 (features, action, reward) 列表,必须在真正终局结束;截断片段需要另行估计尾部回报。

python
import numpy as np

class LinearReinforce:
    def __init__(self, feature_dim, n_actions, gamma, lr, seed=0):
        self.w = np.zeros((feature_dim, n_actions))
        self.gamma = gamma
        self.lr = lr
        self.rng = np.random.default_rng(seed)

    def probabilities(self, features):
        logits = features @ self.w
        logits -= logits.max()
        exp = np.exp(logits)
        return exp / exp.sum()

    def act(self, features):
        p = self.probabilities(features)
        return int(self.rng.choice(len(p), p=p))

    def update(self, trajectory, baseline=0.0):
        if not trajectory:
            return
        returns = np.empty(len(trajectory))
        running = 0.0
        for t in reversed(range(len(trajectory))):
            _, _, reward = trajectory[t]
            running = reward + self.gamma * running
            returns[t] = running

        gradient = np.zeros_like(self.w)
        for t, ((features, action, _), g) in enumerate(zip(trajectory, returns)):
            p = self.probabilities(features)
            grad_logits = -p
            grad_logits[action] += 1.0
            gradient += self.gamma ** t * (g - baseline) * np.outer(
                features, grad_logits
            )
        self.w += self.lr * gradient

所有梯度都在采样策略的同一组参数上计算,累加完再更新一次。baseline 是采样前固定的常数,默认 0;不能拿当前轨迹均值冒充动作无关基线。单步轨迹的均值恰好等于自身回报,减完就什么也学不到,训练日志倒是可以照常打印。

最小检查是一个特征、两个动作、零初始权重:动作 0 获得奖励 1 后,其概率应从 0.5 上升;奖励 −1 则应下降。基线条件与采样策略要求可对照 Spinning Up 的策略梯度推导。

3. Baseline 不改变期望梯度的条件 ​

从 return 减去只依赖状态、不依赖所选动作的 baseline:

(Gt−b(St))∇log⁡π(At∣St),

在标准条件下不改变期望梯度,却可降低方差。若 b≈Vπ,差值可视作 advantage 估计。

Return normalization、reward scaling 会改变优化数值;是否保持目标需具体分析,不能和合法 baseline 混为一谈。

4. Actor-Critic ​

  • actor:策略 πθ;
  • critic:估计 Vw 或 Qw;
  • TD error:
δt=Rt+1+γVw(St+1)−Vw(St).

用 δt 近似 advantage 更新 actor,能在线学习且方差更低,但 critic 的 bootstrap bias 会进入策略更新。

n-step/GAE 在 bias 与 variance 间调节。选择参数要通过多 seed 和独立评估,不是“lambda 越大越准确”。

5. 连续动作需要概率分布与边界 ​

常见策略输出 Gaussian 的均值和标准差,再采样动作。需要注意:

  • 标准差保持正值并限制数值范围;
  • 动作有界时 tanh squashing 会改变 log-probability,需要 Jacobian correction;
  • 探索噪声必须符合设备安全范围;
  • 不同维度相关性可能不能用独立 Gaussian 表达;
  • 部署用均值动作与训练采样策略不是同一分布。

“Policy Gradient 天然处理连续动作”只表示易于参数化,不表示约束和训练稳定性自动解决。

6. Trust region 与 clipped objective ​

大策略更新会使新旧轨迹分布差异太大,导致估计失真。TRPO/PPO 等方法限制策略变化。Clipping 是稳定手段,不保证每次性能单调提升,也不能弥补错误 advantage 或数据实现。

监控 approximate KL、clip fraction、entropy、value loss、explained variance 和梯度范数,并用真实回报确认。

7. Offline RL 的分布外动作 ​

只用历史日志训练时,策略不能安全尝试新动作。若 learned Q 对数据中少见动作过估计,策略会利用外推错误。

需要:

  • 明确 behavior policy 与 action propensity(若可得);
  • 覆盖/重叠诊断;
  • 保守价值或策略约束;
  • off-policy evaluation 的假设和区间;
  • 模拟器/小流量上线与安全门;
  • 不把普通监督学习验证分数当策略价值。

缺乏关键动作覆盖时,数据无法回答新策略后果,算法不能创造反事实证据。

8. 安全与约束决策 ​

真实机器人不能靠跌落一千次学习。可使用:

  • simulator 与 domain randomization;
  • action shield/规则约束;
  • constrained MDP 与 cost budget;
  • safe set 和 fallback controller;
  • 分阶段扩大状态/动作范围;
  • 人工审批高风险动作;
  • kill switch 和事件回放。

把事故设置为巨大负奖励不一定足够:探索时仍可能发生,函数近似也可能低估小概率灾难。

9. 评估协议 ​

text
固定策略参数,评估中不学习;按声明协议采样动作或取确定性动作
多个训练 seed 与独立环境 seed
平均、分位数、失败率和最坏场景
训练分布内、分布外和扰动场景
奖励组成与真实任务指标分别报告
约束违反、干预和 fallback 次数
与规则、随机和现有策略基线比较
上线前定义停止与回滚条件

在线 A/B 仍是干预,需考虑单位、溢出、依从和安全暴露。

常见误区 ​

  • Policy Gradient 不需要 value function:纯 REINFORCE 可不用,但 actor-critic 依赖 critic。
  • baseline 会改变优化目标:合法 action-independent baseline 主要降方差。
  • 奖励上升就任务变好:智能体可能利用 proxy 漏洞。
  • 离线日志足够大就能评估任意策略:缺乏动作覆盖时不可识别。

练习 ​

  1. 手推 softmax log-policy gradient,用单步正负奖励检查更新方向。
  2. 比较无 baseline、常数 baseline 与 learned value baseline 的方差。
  3. 为有界连续动作实现 squashed distribution 的 log-probability 校正。
  4. 为机器人设计 cost constraint、shield、fallback 和上线门禁。

小结 ​

Policy gradient 把动作概率变成可优化对象,actor-critic 用价值估计降低方差。越直接地优化长期回报,越需要审查 reward、覆盖和安全边界,因为算法会认真利用你留下的每个漏洞。

下一章进入监督学习基础:数据不再由在线策略持续产生,但切分、标签和评估同样决定模型学到什么。

Built with VitePress | Software Systems Atlas