Q-learning 先学哪个动作值钱,再取最大值。另一条路是直接改变选动作的概率:这次比预期好,下次多选一点。难点在于环境不一定可微——梯度从哪里来?
不穿过环境,改走轨迹的概率
先看长度为 $T$ 的有限回合(episode),目标暂时不折扣:$J(\theta)=\mathbb E_{\tau\sim p_\theta}[R(\tau)]$。环境转移和初始分布不依赖 $\theta$:
$$ p_\theta(\tau)=\rho(s_0)\prod_{t=0}^{T-1}\pi_\theta(a_t\mid s_t)P(s_{t+1}\mid s_t,a_t). $$
在允许交换微分与积分的正则条件下,用 $\nabla p=p\nabla\log p$:
$$ \nabla J =\mathbb E_\tau[R(\tau)\nabla\log p_\theta(\tau)] =\mathbb E_\tau\left[\sum_t\nabla\log\pi_\theta(a_t\mid s_t)R(\tau)\right]. $$
环境项不需要求导。策略梯度(policy gradient)改变的是“这类轨迹(trajectory)以后出现的概率”,不是对这一次已经发生的奖励(reward)反传。若动作可用重参数化且 Q 可微,后面 SAC 会用另一种梯度路径。
为什么可以只看未来、再减 baseline
动作不会改变已经发生的奖励,所以可以用从当前步起的回报(reward-to-go)$G_t=\sum_{k=t}^{T-1}r_k$ 替换整段回报。再减去一个只依赖状态的状态基线(state-dependent baseline) $b(s_t)$:
$$ \mathbb E_{a\sim\pi}[\nabla\log\pi(a\mid s)b(s)] =b(s)\nabla\sum_a\pi(a\mid s)=0. $$
因此期望梯度不变;方差(variance)却可能更小。$V^\pi(s)$ 是常见 baseline,不保证在所有梯度加权意义下方差最小。若 baseline 直接依赖当前采样动作,这个证明就失效,不能随便减。
这里的 $b(s_t)$ 在对当前动作取条件期望时必须固定。即使网络只输入状态,用本次样本的回报拟合后再回头给它打分,也可能通过拟合(overfitting)参数依赖本次动作;detach 只断开计算图,不会消除这种统计依赖。例如下文的两动作 bandit 若只采一次,再令基线(baseline)恰好等于该次奖励,advantage 恒为 0,但真实梯度并非 0。可先用采样前固定的 Critic 构造评分,再训练 Critic;GAE 论文 §6.1也说明了这个更新顺序的理由。
折扣也要一致:若目标是 $\mathbb E[\sum_t\gamma^t r_t]$,而 $G_t$ 从当前步重新计折扣,直接按有限轨迹推导时外面还要有 $\gamma^t$。文献有时把它吸收到状态访问分布(state-visitation distribution)里,别把两种约定混起来。
一个只有两种动作的算例
两个动作的奖励分别为 1、3,初始概率各为 0.5。对 softmax 的两个 logits,期望回报是 2,梯度是:
$$ \frac{\partial J}{\partial z_i}=p_i(r_i-\bar r),\qquad \nabla_z J=[-0.5,\ 0.5]. $$
梯度上升会降低第一个 logit、提高第二个。注意奖励 1 也是正的,但相对平均值 2,它应该被减少,而不是“只要得分大于 0 就奖励”。
最小 PyTorch 更新
下面只写一次 on-policy 更新的 loss,不是完整训练器(trainer)。log_prob 是当前策略(policy)对采样动作的对数概率,advantage 是固定的评分信号;两者都是长度相同的一维张量。这里沿用前面的不折扣目标,且 batch 中没有 padding。若采用有限轨迹折扣目标,还要加入前面说的 $\gamma^t$ 权重;变长轨迹也要明确按步还是按整条轨迹归约。
def actor_loss(log_prob, advantage):
if log_prob.ndim != 1 or log_prob.shape != advantage.shape or log_prob.numel() == 0:
raise ValueError("log_prob and advantage must be matching nonempty vectors")
return -(log_prob * advantage.detach()).mean()
负号把梯度上升变成优化器的梯度下降。detach 表示这一步只改变动作概率,不让 Actor 顺着 advantage 的计算图“改评分”。Critic 用自己的 loss 更新。
旧数据为什么不能直接重放
旧策略 $\mu$ 产生的样本分布不等于新策略 $\pi$。理论上可以用重要性采样(importance sampling)重新加权:
$$ w(\tau)=\prod_t\frac{\pi(a_t\mid s_t)}{\mu(a_t\mid s_t)}. $$
前提是目标策略(target policy)可能走到的轨迹在行为分布中有支持。长轨迹的乘积容易导致极大方差;只使用当前动作的 ratio 也不自动修复状态分布偏移(distribution shift)。PPO 的短窗口数据重用与 clipping 是务实折中,不是任意旧数据都能精确校正。
为什么过去的奖励可以从梯度里拿掉?
固定动作发生前的历史 $h_t$,过去奖励 $R_{<t}$ 已经是一个常数。对接下来采样的动作取条件期望:
$$ \mathbb E[\nabla\log\pi(a_t\mid s_t)R_{<t}\mid h_t] =R_{<t}\sum_a\pi(a\mid s_t)\nabla\log\pi(a\mid s_t)=0. $$
所以删除过去奖励不改变期望梯度,却去掉了无法由当前动作解释的随机量。这也是信用分配的一个具体例子:最后一步动作不应该因第一步已经拿到的奖励而被表扬。
再看 baseline 的作用。把前面奖励 $[1,3]$ 全加 100,最优动作不变,但直接用 return 时,两个动作采样一次都可能获得很大的正向更新。减去同样平移的期望回报以后,advantage 仍是 $[-1,1]$。我们保留了相对好坏,减少无用尺度对估计的影响;这不等于任意形式的奖励变换都保持最优策略。
一次 rollout,多次更新,什么时候开始不对?
采样时用 $\pi_{\rm old}$,第一次更新后参数已经变了。继续把同一批样本当作“当前策略刚采到的”,就不再是原来的 on-policy 估计。
| 操作 | 对应的假设 | 常见错误 |
|---|---|---|
| 收集轨迹 | 保存产生动作的策略版本、log-prob 和边界 | 更新后重算 old log-prob,把概率比弄成 1 |
| 构造 return / advantage | 对齐 reward、状态和采样动作 | 误把下一条轨迹的奖励接进来 |
| 更新 Actor | 评分信号固定,loss 的符号与优化器一致 | 让梯度通过 advantage 去修改评分 |
| 再次使用旧数据 | 明确概率比、近似范围和停止条件 | 以为多跑几个 epoch 就只是监督学习 |
最小调试可以先用已知奖励的两动作 bandit:固定种子和数据,检查期望梯度方向是否与手算一致,再加 baseline、Critic 和多步环境。大环境的回报曲线太复杂,不适合拿来辨认一个负号是否写反。
从这一步走向哪里
上面这种直接用采样回报给 log-prob 加权的做法就是 REINFORCE。它不需要学环境,机制直接;代价是 return 方差和样本开销。引入 Critic 是为了更好地估计更新方向,接着读 Actor–Critic 与 GAE。
步长为什么不能只靠一个 learning rate?接着看 Natural Gradient 与 TRPO,从一个硬币策略推到 KL 约束下的更新。
本页术语 15
- 回合 episode
- 从初始状态开始的一次交互过程;采样片段结束不一定代表任务真正结束
- 策略梯度 policy gradient
- 通过改变动作的概率来提高期望回报;不要求环境本身可微
- 轨迹 trajectory
- 与环境交互得到的一串状态、动作和奖励;采样时也可能只保存其中一段
- 奖励 reward
- RL 里指导策略更新的标量信号
- 回报 return
- 从某一步开始,把后续奖励按约定累加;有折扣时还要乘上相应的折扣权重
- 状态基线 state-dependent baseline
- 从策略梯度的评分中减去一个不依赖当前采样动作的量,用于降低方差
- 方差 variance
- 估计量的波动幅度;重要性加权最容易在这里爆炸
- 过拟合 overfitting
- 训练集越来越好,没见过的数据反而变差
- 基线 baseline
- 用来比较新方法的参考方法或配置
- 状态访问分布 state-visitation distribution
- 策略与环境共同决定会遇到哪些状态;折扣和归一化方式也要说明
- 训练器 trainer
- 负责计算 loss、反向传播并更新模型参数的系统
- 策略 policy
- 给定状态,规定怎样选动作;可以输出一个动作,也可以输出动作的概率分布
- 重要性采样 importance sampling
- 用目标分布与采样分布的概率比重新加权;采样分布必须覆盖目标分布需要的区域
- 目标策略 target policy
- 这次希望评估或改进的策略,不一定是收集数据的那个策略
- 分布偏移 distribution shift
- 训练时和使用时的数据分布不一致