3.3 Policy Gradient、Actor-Critic 与安全评估:优化回报也会优化奖励漏洞
连续转向角无法逐项放进有限 Q 表,参数化动作分布提供了另一种表示。随机轨迹会让回报和梯度波动;如果奖励允许在终点附近反复领取,策略还可能学会刷奖励而不结束任务。
Policy optimization 可以处理随机和连续动作,却不会自动理解意图。估计方差、动作约束和奖励漏洞都要进入算法设计。
本课目标
- 推导 REINFORCE 的 log-derivative 更新;
- 用 baseline/advantage 降低方差;
- 理解 actor-critic 的 bootstrap 权衡;
- 设计独立评估、离线检查与安全约束。
1. 直接优化参数化策略
令策略为
对于有限完整轨迹,令
REINFORCE 采集完整轨迹,用 sampled return 加权。这里显式保留
2. 先确认梯度方向
Softmax 线性策略对所选动作的 log-probability 梯度是:
下面的 Python 3 + NumPy 片段(partial)使用有限离散动作演示梯度方向,连续动作见第 5 节。features 是固定长度向量,trajectory 是当前策略生成的 (features, action, reward) 列表,必须在真正终局结束;截断片段需要另行估计尾部回报。
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:
在标准条件下不改变期望梯度,却可降低方差。若
Return normalization、reward scaling 会改变优化数值;是否保持目标需具体分析,不能和合法 baseline 混为一谈。
4. Actor-Critic
- actor:策略
; - critic:估计
或 ; - TD error:
用
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. 评估协议
固定策略参数,评估中不学习;按声明协议采样动作或取确定性动作
多个训练 seed 与独立环境 seed
平均、分位数、失败率和最坏场景
训练分布内、分布外和扰动场景
奖励组成与真实任务指标分别报告
约束违反、干预和 fallback 次数
与规则、随机和现有策略基线比较
上线前定义停止与回滚条件在线 A/B 仍是干预,需考虑单位、溢出、依从和安全暴露。
常见误区
- Policy Gradient 不需要 value function:纯 REINFORCE 可不用,但 actor-critic 依赖 critic。
- baseline 会改变优化目标:合法 action-independent baseline 主要降方差。
- 奖励上升就任务变好:智能体可能利用 proxy 漏洞。
- 离线日志足够大就能评估任意策略:缺乏动作覆盖时不可识别。
练习
- 手推 softmax log-policy gradient,用单步正负奖励检查更新方向。
- 比较无 baseline、常数 baseline 与 learned value baseline 的方差。
- 为有界连续动作实现 squashed distribution 的 log-probability 校正。
- 为机器人设计 cost constraint、shield、fallback 和上线门禁。
小结
Policy gradient 把动作概率变成可优化对象,actor-critic 用价值估计降低方差。越直接地优化长期回报,越需要审查 reward、覆盖和安全边界,因为算法会认真利用你留下的每个漏洞。
下一章进入监督学习基础:数据不再由在线策略持续产生,但切分、标签和评估同样决定模型学到什么。