策略梯度 (Policy Gradients)
不学价值表,直接调控制器:把策略写成带参数的概率分布 \(\pi_\theta(a\mid s)\),让它多做带来高回报的动作、少做带来低回报的动作。对数导数技巧让我们只靠试出来的回报就能估计梯度,不需要环境模型,也不需要奖励可导。本节在浏览器里实时训练:一个高斯策略学会抓取偏移,REINFORCE 在不知道动力学的情况下找回一个关节的 LQR 增益,再看这个估计为什么噪声很大、reward-to-go、基线和优势函数怎样把方差压下来,它和参数空间里的进化策略(6.11 节)是什么关系,最后用一个神经网络策略控制受重力的机械臂。
1为什么机器人需要它
20.2 节的 Q-learning 和 DQN 先学 \(Q(s,a)\),再在每一步取 \(\arg\max_a Q(s,a)\)。动作只有几个离散选项时这很自然;可机器人的动作是连续的:一个 7 关节机械臂每一步要给出 7 个力矩,在 \(\R^7\) 里求最大值本身就是一个优化问题,每个控制周期都要解一次。而且机器人工程师手里的控制器本来就是“带参数的策略”:PD 增益(13.1 节)、步态参数、一个神经网络。直接调这些参数、让任务回报变大,叫作策略搜索(policy search)。
难点在于回报对参数的依赖要经过整个环境:仿真器里的接触、真实的电机、一个“抓住了 / 没抓住”的二值结果。这些我们没法求导,常常连模型都没有。策略梯度绕开了这一点:只要策略是随机的,回报的期望就是参数的光滑函数,它的梯度可以只用“试了哪些动作、得了多少回报”来估计,不需要环境的导数,也不需要奖励的导数。这就是 REINFORCE(Williams 1992),后面的 actor-critic、PPO(20.4 节)和今天腿式机器人的大规模仿真训练(23.1 节)都建立在它上面。
本节的顺序:先在一个一步就结束的任务上看清“对数导数技巧”在做什么;再让 REINFORCE 调一个关节的 PD 增益,看它在不知道模型的情况下找到 LQR 的答案;然后正面处理它最大的问题——方差,以及它和 6.11 节进化策略的关系;最后用神经网络策略控制一条受重力的机械臂。
2直觉:试一试,再让做得好的动作更常出现
最简单的情形:只有一步,没有状态。机械手要决定抓取的横向偏移 \(a\)(单位 cm),奖励 \(r(a)\) 告诉它抓得怎样。策略是一个高斯分布 \(a\sim\mathcal N(\mu,\sigma^2)\),参数是均值 \(\mu\) 和 \(\log\sigma\)。目标是期望奖励 \(J(\mu,\sigma)=\mathbb E[r(a)]\)。最难的预设是“二值成功”:只有偏移落在 \([1.5,2.5]\) 里才算抓住(\(r=1\)),否则 \(r=0\)。这个 \(r\) 在几乎所有地方导数都是零,对它求导毫无用处;但 \(J\) 是 \(\mu\) 的光滑函数,因为改变 \(\mu\) 会改变“落进窗口”的概率。
REINFORCE 每轮做三件事:从当前策略抽 \(N\) 个动作,看每个动作的奖励;给每个样本一个权重 \(r_i-\hl{base}{b}\)(\(b\) 是基线,这里取其余样本奖励的平均);然后把每个样本的 \(\hl{score}{\log\pi(a_i)}\) 按权重往上推。权重为正的样本(比平均好)概率变大,为负的变小。“把 \(\log\pi(a_i)\) 往上推”具体就是:\(\mu\) 朝 \(a_i\) 移动,移动量正比于 \((a_i-\mu)/\sigma^2\);而 \(\log\sigma\) 在样本离均值远于 \(\sigma\) 时变大、近于 \(\sigma\) 时变小。
- “二值成功”、默认设置,按“训练”:开始时成功率只有 6%,大约 80 次更新后 \(J\ge0.9\)。读数里“逐样本求导”的估计始终是 0:奖励的导数帮不上忙。
- 还是“二值成功”,把基线关掉(“无”),重置再训练:它照样找到窗口(\(J\ge0.9\)),可接下来又被“踢”出去,\(J\) 掉回 0.1 以下。原因:每个样本都成功时,没有基线的权重全是 1,\(\mu\) 被这些样本的随机位置来回拽。
- 基线关掉,把奖励偏移 \(c\) 拉到 4.5 以上(每个奖励都加上 \(c\),最优动作不变):读数里 \(\hat g_\mu\) 的离散程度变成 \(c=0\) 时的好几倍(初始策略下 \(c=5\) 时约 10 倍);再把基线打开:离散程度回到 \(c=0\) 的水平,与 \(c\) 无关。
- 选“两个峰”并训练:策略收缩到离起点近的矮峰上(\(J\approx0.49\)),\(\sigma\) 变得很小,梯度也几乎为零。然后把 \(\mu\) 拖到 0.5 右边,用滑块把 \(\sigma\) 调回 1 左右,再训练:它爬上高峰,\(J\ge0.9\)。策略梯度是局部方法,探索靠 \(\sigma\)。
3动手:让 REINFORCE 调一个关节的 PD 增益
现在有了状态和时间。一个水平放置的关节(没有重力,单位惯量)要在 3 秒内从离目标 1 rad 的地方转到目标并停住。状态是角度误差和角速度 \(s=(e,\dot q)\),动作是力矩 \(a\),控制周期 \(\Delta t=0.1\) s,共 \(T=30\) 步。第 \(t\) 步的奖励是负的代价 \(r_{t+1}=-\Delta t\,(e_t^2+0.1\,\dot q_t^2+0.01\,a_t^2)\)(下标沿用 20.1 节:动作 \(a_t\) 换来 \(r_{t+1}\)),回报是 30 步奖励之和(有限时域,不打折扣)。起点误差每次随机,均值 −1 rad、标准差 0.2 rad。
策略是加了噪声的 PD 控制器:\(a=-k_p e-k_d\dot q+\sigma\epsilon\),\(\epsilon\sim\mathcal N(0,1)\),参数 \(\theta=(k_p,k_d)\)。因为系统是线性的、代价是二次的,这个页面能精确算出每组增益的期望回报 \(J(\theta)\)(传播状态的均值和协方差),画成背景的地形图,还能算出精确梯度 \(\hl{grad}{\nabla_\theta J}\) 作对照。REINFORCE 本身完全不用这些:它只看 \(N\) 条采样出来的轨迹和它们的奖励,用下面第 5 节的公式算出估计 \(\hl{ghat}{\hat g}\),然后做梯度上升 \(\theta\leftarrow\theta+\alpha\hat g\)。估计方式先选“reward-to-go − 基线”(第 4 节解释),再换成“完整回报”对比。
- 默认设置(reward-to-go − 基线,\(N=10\),\(\alpha=2\))按“训练”:不到 20 次更新(本页的随机种子下是 17 次)\(J\) 就进入最优值 0.05 以内,路径停在绿色星号附近,而算法从没见过动力学方程。
- 把估计方式换成“完整回报 \(G_0\)”,其余不变,再训练至少 100 次更新:路径在地形上乱走,最近 50 次更新的平均 \(J\) 比最优值差 0.3 以上。同样的期望方向,噪声却大得多。
(1) 星号处的增益 \((7.60,\,4.22)\) 是 13.3 节的离散 LQR 用模型和 Riccati 方程解出来的;REINFORCE 只用试验就走到了同一个地方。代价是样本:每次更新 10 条轨迹,走到星号附近就用了一两百条,之后在山脊上的每一步还要继续花,而 LQR 一条都不需要。 (2) 起点 \((1,0.2)\) 处 \(J=-1.37\),最优值 \(J^\star=-0.589\)(\(\sigma=0.5\));最优附近是一条又长又平的山脊,精确梯度很小,噪声的影响就相对变大,所以路径到了山脊上会来回晃。 (3) 学习率 \(\alpha\) 在这里是“回报单位”的:奖励放大 10 倍,同样的 \(\alpha\) 步长也放大 10 倍。这是实际实现里普遍把优势归一化(FIG 5)或用 Adam 的原因之一。
4另外两个视角:方差从哪来,以及在哪个空间里探索
方差的阶梯:reward-to-go、基线、价值函数
FIG 2 里“完整回报”和“reward-to-go − 基线”在期望上给出同一个梯度,差别全在噪声。下图把它量出来:固定一组增益,用同一个 \(N\) 重复估计 200 次,把每次的 \(\hat g\) 画成梯度平面上的一个点,再和精确梯度比较。四种估计一个比一个好,每一级都只是去掉了一部分“与这个动作无关”的随机性:
- 完整回报 \(G_0\):第 \(t\) 步动作的得分乘以整条轨迹的回报。可 \(t\) 之前的奖励不可能受第 \(t\) 步动作影响,它们只贡献噪声。
- reward-to-go \(G_t\):只乘从 \(t\) 开始的奖励 \(\hl{rtg}{G_t=\sum_{t'\ge t}r_{t'+1}}\)(“因果性”,期望不变,见第 5 节)。
- \(G_t-b_t\):再减去一个与动作无关的基线,这里是同一批里其余轨迹在第 \(t\) 步的 \(G_t\) 的平均(留一法,保证无偏)。它去掉的是“这一时刻大家都差不多会拿到的回报”。
- \(G_t-V(s_t)\):基线换成当前策略的真实价值函数 \(V^\pi(s_t)\)(20.1 节)。这里线性二次的系统能精确算出它,相当于一个“完美的 critic”。\(G_t-V(s_t)\) 是优势 \(A(s_t,a_t)=Q(s_t,a_t)-V(s_t)\) 的一个无偏样本:这个动作比“这个状态下的平均水平”好多少。20.4 节的 actor-critic 就是用一个学出来的 \(V\) 去近似这一级。
- 在 B 点、\(N=10\) 下依次看四种估计:相对误差大约是 88、20、3、0.3,余弦从 0.05 升到 0.94。选“\(G_t-V(s_t)\)”并保持 \(N\le10\),看到余弦 \(\ge0.9\)。
- 在 B 点选“完整回报 \(G_0\)”,把 \(N\) 拉到 100:轨迹多了 10 倍,余弦也只有约 0.31,仍不如 \(N=10\) 的“\(G_t-b_t\)”(约 0.61)。方差按 \(1/N\) 下降,减少方差的技巧却能一下子省掉一个数量级的样本。
还有一个旋钮:探索噪声 \(\sigma\)。得分 \((a-\mu)/\sigma^2\) 的大小正比于 \(1/\sigma\),\(\sigma\) 越小,每个样本的梯度信号越强,可随机性也越大:B 点、\(N=10\) 时,\(\sigma\) 从 0.5 降到 0.2,“\(G_t-b_t\)”的相对误差从 3.0 涨到 16.5;“\(G_t-V(s_t)\)”却几乎不变(0.28 → 0.26)。好的基线把与动作无关的部分全去掉之后,剩下的才是真正由探索噪声带来的信号。
在动作空间还是参数空间里探索:与进化策略的关系
6.11 节里有一个恒等式:高斯平滑后的函数的梯度是 \(\nabla f_\sigma(\theta)=\tfrac1\sigma\mathbb E[f(\theta+\sigma\boldsymbol\epsilon)\boldsymbol\epsilon]\)。把 \(f\) 换成“确定性策略 \(\theta\) 跑一整条轨迹的回报”,这就是进化策略(ES):在参数空间里加噪声,每条轨迹只用一组扰动后的增益,整条轨迹不再加任何动作噪声。它其实也是对数导数技巧,只不过“策略”是参数的高斯分布 \(\theta'\sim\mathcal N(\theta,\sigma_\theta^2I)\),每条轨迹只做一次“动作”(选一组参数)。CEM 和 MPPI 是同一家族:用回报给参数样本加权平均。
两者的方差来源不同。REINFORCE 每一步都注入新的动作噪声,第 \(t\) 步噪声的影响要从后面所有步的奖励里“分辨”出来;控制频率越高,一条轨迹里的噪声越多,每一份的影响越小,这个信用分配问题越难。ES 根本不关心一条轨迹有多少步,只关心参数有几维:方差随参数维数增长。下图在 B 点比较三者,每次估计都用 10 条轨迹(ES 用 5 对正负对称的扰动,每对共用同一个起点)。
- 把控制频率从 10 Hz 换到 50 Hz:“\(G_t-b_t\)”的余弦从约 0.61 掉到约 0.35,ES 稳定在约 0.88,带精确 \(V\) 的 REINFORCE 保持约 0.94。
蒙特卡洛:\(\nabla J\) 是一个期望,用样本平均估计(4.9 节);整节课的问题都是“怎样让这个平均的方差小”。 得分函数估计:19.1 节比较过的“得分函数(REINFORCE)对重参数化”就是它;策略梯度选择前者,是因为环境不可导。 加权最大似然:对样本做 \(\sum_iw_i\log\pi(a_i)\) 的极大似然,权重是优势。 平滑:随机策略把一个不可导、甚至不连续的回报变成参数的光滑函数,6.11 节的 ES 在参数空间做同一件事。 行为克隆:所有权重为 1、动作来自专家,就是 22.1 节的 BC。
5再看数学
提示:把鼠标悬停在公式中带底色的符号上,图中对应的元素会被高亮(得分曲线、基线、\(\sigma\) 括号、精确梯度与估计的箭头、ES 的点云)。
目标与对数导数技巧
沿用 20.1 节的记号:策略 \(\pi_\theta(a\mid s)\),转移 \(P(s'\mid s,a)\),初始分布 \(\rho_0\),奖励 \(r_{t+1}\)(动作 \(a_t\) 之后得到),折扣 \(\gamma\)。一条轨迹 \(\tau=(s_0,a_0,s_1,a_1,\dots)\) 的概率和回报是
对 \(J=\int p_\theta(\tau)G_0(\tau)\,d\tau\) 求导,\(G_0\) 不依赖 \(\theta\),导数全落在概率上。用恒等式 \(\nabla p=p\,\nabla\log p\)(对数导数技巧)把它变回一个期望:
第二个等式是整个方法的关键:\(\log p_\theta(\tau)\) 是 \(\log\rho_0+\sum_t\log\pi_\theta+\sum_t\log P\) 的和,而 \(\rho_0\) 和 \(P\) 与 \(\theta\) 无关,求导后消失。所以梯度里没有动力学:只需要能对自己的策略求 \(\log\) 概率的导数。用 \(N\) 条采样轨迹的平均代替期望,就是 REINFORCE:
四种 \(\Psi_t\) 就是 FIG 3 的四级阶梯,期望都等于 \(\nabla J\)(\(\gamma<1\) 时还要乘 \(\gamma^t\),见误区 5)。FIG 2 到 FIG 4 用 \(\gamma=1\)。
高斯策略的得分
连续动作最常用的是高斯策略:网络(或任意可导函数)给出均值 \(\mu_\theta(s)\),标准差 \(\sigma\) 用一个独立参数 \(\log\sigma\) 表示(取对数保证 \(\sigma>0\),也让步长与尺度无关)。\(\log\pi=-\tfrac{(a-\mu)^2}{2\sigma^2}-\log\sigma-\tfrac12\log2\pi\),于是
其中 \(\epsilon=(a-\mu)/\sigma\) 是这一步实际抽到的标准噪声。对 FIG 2 的 PD 策略,\(\mu=-k_pe-k_d\dot q\),所以 \(\nabla_\theta\mu=(-e,-\dot q)\):某一步的噪声 \(\epsilon_t\) 推了关节一下,如果之后的回报好,\(k_p\) 就朝 \(-\epsilon_te_t\) 的方向调。对神经网络,\(\nabla_\theta\mu\) 由反向传播(16.3 节)给出:把 \((a-\mu)/\sigma^2\) 乘以权重作为输出端的梯度回传就行。最后一个式子也说明了 \(\sigma\to0\) 时为什么不能直接用:得分按 \(1/\sigma\) 放大,估计的方差发散。确定性策略的梯度要换一条路,用 critic 对动作的导数 \(\nabla_aQ\)(DDPG/TD3,20.4 节)。
实现时从不手写这些梯度,而是构造一个“伪损失”,它的梯度恰好是 \(-\hat g\),交给自动求导(FIG 5 的代码就是这样,只是手写了反向传播):
# 一次 REINFORCE 更新(PyTorch 风格的伪代码)
batch = [rollout(policy) for _ in range(N)] # N 条轨迹: s_t, a_t, r_{t+1}
G = reward_to_go(batch.r) # G_t = r_{t+1} + r_{t+2} + ...
adv = G - baseline(batch) # 基线: 同一时刻其余轨迹的平均,或学到的 V(s_t)
adv = adv / (adv.std() + 1e-8) # 归一化(可选)
logp = policy.dist(batch.s).log_prob(batch.a) # 高斯: -(a-mu)^2/(2 sigma^2) - log sigma
loss = -(logp * adv.detach()).mean() # 伪损失:它的梯度是 -g_hat
opt.zero_grad(); loss.backward(); opt.step() # 用过的样本随即丢弃(on-policy)
为什么可以只用 reward-to-go,为什么基线不引入偏差
两件事都来自同一个事实:得分的期望为零。对任意状态 \(s\),
因果性:对 \(t'<t\),奖励 \(r_{t'+1}\) 在第 \(t\) 步的动作之前就已确定。先对 \(a_t\) 求条件期望,\(r_{t'+1}\) 是常数,可以提出来,剩下的得分期望为零,所以 \(\mathbb E[r_{t'+1}\nabla\log\pi(a_t\mid s_t)]=0\)。从 \(G_0\) 里删掉这些项,期望不变,方差变小:这就是 reward-to-go。基线:任何只依赖 \(s_t\)(不依赖 \(a_t\) 及之后)的 \(b(s_t)\) 同理,\(\mathbb E[b(s_t)\nabla\log\pi(a_t\mid s_t)]=0\)。FIG 1 的“留一法”基线只用其他样本,与本样本的动作独立,所以严格无偏;如果用包括自己在内的批平均,会有一个 \(1/N\) 量级的偏差。基线依赖本步动作就不行了:那会改变期望。
优势与策略梯度定理:给定 \((s_t,a_t)\),\(G_t\) 的条件期望就是 \(Q^\pi(s_t,a_t)\),所以 \(G_t\) 可以换成 \(Q^\pi\),基线取 \(V^\pi\),得到
这是 Sutton 等人(1999)的策略梯度定理的轨迹形式。优势的均值为零:它只回答“这个动作比这个状态下的平均好多少”,把状态本身好坏带来的方差全部去掉。实际中 \(V^\pi\) 未知,用一个网络去学它就是 actor-critic;用 TD 误差 \(r_{t+1}+\gamma V(s_{t+1})-V(s_t)\) 代替 \(G_t-V(s_t)\),方差更小但有偏,GAE 在两者之间插值(20.4 节)。
最优常数基线:在所有常数 \(b\) 里,使方差最小的是 \(b^\star=\mathbb E[\|\nabla\log p_\theta\|^2G_0]/\mathbb E[\|\nabla\log p_\theta\|^2]\),即按得分平方加权的平均回报(Greensmith 等,2004)。平均回报本身是一个简单且常常够好的近似。
方差的来源,以及 ES 的公式
一条轨迹的 \(\hat g\) 是 \(T\) 项之和,每项是一个均值为零、大小约 \(1/\sigma\) 的得分乘以一个回报。没有好的基线时,每一项都把整条轨迹的随机性(起点、其他步的噪声)带进来,方差大致随 \(T\) 增长;控制频率翻倍,\(T\) 翻倍,每一步噪声对回报的影响却减半,信噪比变差(FIG 4)。ES 的估计是
它估计的是平滑后的 \(J_{\sigma_\theta}(\theta)=\mathbb E[J(\theta+\sigma_\theta\boldsymbol\epsilon)]\) 的梯度(6.11 节),每对扰动只看到 \(\boldsymbol\epsilon_j\) 方向上的一个差分,要拼出 \(d\) 维的梯度至少需要 \(d\) 量级的样本:方差随 \(d\) 线性增长,与 \(T\) 无关。所以二者各有地盘:参数少(几十维的步态参数、线性策略)而控制频率高时,ES 和随机搜索非常有竞争力(Mania 等,2018);参数是百万维的神经网络时,在动作空间探索、配上学到的 critic 的策略梯度通常更好。Salimans 等(2017)用大量并行 worker 的 ES 训练过神经网络策略,靠的是并行规模。
步长:为什么还需要 20.4 节
REINFORCE 是 on-policy 的:\(\hat g\) 是当前策略下的期望,更新一次之后,旧样本就不再来自当前策略,只能丢掉(或者用重要性权重 \(\pi_{\theta'}/\pi_{\theta}\) 修正,4.9 节)。而 \(\theta\) 空间里的“一步”在策略空间里可能很大,也可能很小,取决于参数化:FIG 2 里 \(\alpha\) 稍大,路径就开始在山脊上大幅跳动。自然梯度(Kakade 2001)用策略分布之间的 KL 散度(4.11 节)来度量步长,TRPO 把它变成约束,PPO 用裁剪的概率比近似它:这些都在 20.4 节。
6机器人中的它:一个神经网络策略控制受重力的机械臂
把前面的东西放到一个非线性任务上。一根竖直平面里的连杆(单位惯量)从自然下垂开始,要在 3 秒内转到每次随机给出的目标角 \(q^\star\in[-2.4,2.4]\) rad 并停住:\(\ddot q=\tau-5\sin q-0.5\,\dot q\),电机力矩被饱和在 \(|\tau|\le8\)(策略并不知道)。目标越高,需要的重力补偿 \(5\sin q^\star\) 越大,而且它随 \(q^\star\) 非线性变化,接近水平时最大。策略是 \(\mu_\theta(s)=4\,f_\theta(e,\dot q/3,q^\star/2)\),\(f_\theta\) 是一个两层各 24 个 tanh 单元的 MLP,加上一个可学习的 \(\log\sigma\),初始 \(\sigma=2\)。每次更新抽 \(N\) 条轨迹,优势是 reward-to-go 减去时间基线、再标准化(减去均值、除以标准差),网络用 Adam 更新:这就是第 5 节那段伪代码,只是反向传播是手写的(nn.js)。
- 按“训练”:一开始连杆乱晃(测试误差约 1 rad 量级),几千条轨迹之后测试误差降到 0.1 rad 以下。注意曲线不是单调的:一次运气不好的更新可以让策略暂时变差。
- 训练之后,把目标拖到 \(|q^\star|\ge2\) rad(越过水平、举到转轴上方,需要很大的重力补偿):均值策略 3 秒末的误差通常小于 0.15 rad(这个误差随每次更新漂移;如果还不够小,保持目标继续训练一会儿,或试试另一侧的对称目标)。网络从没被告诉过 \(5\sin q\) 这一项,它是从回报里自己学出来的。
和 FIG 2 相比有几处变化,都是实际代码里的标准做法:优势除以标准差,学习率因此与奖励的尺度无关;\(\log\sigma\) 是与状态无关的独立参数;动作超出电机范围时由环境截断,而 \(\log\pi\) 按截断前的动作计算,这样估计仍然无偏(被截断的部分对回报的影响照样被正确地记账)。你也会注意到 \(\sigma\) 降得很慢:这个任务里力矩噪声的代价很小,梯度几乎不催 \(\sigma\) 变小。
早期的真机策略搜索:Kohl 和 Stone(ICRA 2004)让 Sony AIBO 机器狗自己在场地上计时行走,通过扰动一个参数化小跑步态的参数来估计梯度,学出了比当时手调步态更快的步态,这在本质上就是参数空间的探索(FIG 4 的 ES 一侧)。Tedrake、Zhang 和 Seung(IROS 2004)在一台简单的三维双足机器人上用随机策略梯度在线学习行走,没有用模型。 运动基元:Peters 和 Schaal(2008)把策略梯度与自然梯度用在运动基元的参数上,在拟人机械臂上学习击球这类动作;Kober 和 Peters(2008)在 Barrett WAM 上从人的示教出发学会了“杯中球”。参数维数小、从模仿出发,正是策略梯度在真机上最能发挥作用的条件。 现在:腿式机器人的运动控制大多用 PPO(20.4 节)在 Isaac Gym/Lab 这类大规模并行仿真里训练(23.1 节),PPO 的核心仍是本节的 \(\nabla\log\pi\cdot A\),加上学到的 critic 和受控的步长。大语言模型的 RLHF 也用策略梯度:RLOO 就是本页的留一法基线(Kool 等,2019),DeepSeekMath 提出的 GRPO 用同一问题多次采样的组内均值做基线、再除以组内标准差,和 FIG 5 的做法如出一辙。
7常见误区
基线只能依赖状态(以及与本样本动作独立的东西,比如其他轨迹)。用 \(Q(s_t,a_t)\) 本身、或者包含本步之后奖励的量做“基线”,期望就变了,算法会稳定地朝错误方向走。反过来,不用基线虽然无偏,FIG 1 已经演示了后果:奖励整体平移一下方差就放大十倍,所有样本都成功时策略还会被随机地踢来踢去。
REINFORCE 的梯度是当前策略下的期望。把上一轮的轨迹存起来再用(像 DQN 的回放缓存那样),就是在用别的策略的样本估计这个策略的梯度,有偏;要复用必须乘重要性权重,而权重一大方差就爆炸,PPO 的裁剪就是为此设计的。步长同理:一次太大的更新会让策略跳到地形上很差的地方,之后采到的数据也随之变差,很难恢复。
\(\sigma\) 也是被梯度优化的,它会朝“当前附近最好”的方向收缩。FIG 1 的“两个峰”里策略缩到矮峰上,\(\sigma\) 一小,远处的高峰就再也看不见了,梯度为零,学习停止。常见对策:给 \(\log\sigma\) 设下限、在目标里加一项熵奖励 \(\beta\,\mathcal H(\pi)\)(对高斯就是 \(\beta\log\sigma\)),或者干脆把熵作为目标的一部分,后者就是 20.4 节的 SAC。也别走到另一头:\(\sigma\) 太大,动作大多被电机饱和截断,信号反而少了。
电机力矩、关节速度都有上下限。两种正确做法:像 FIG 5 那样从无界高斯采样,由环境截断,\(\log\pi\) 按截断前的样本算;或者把样本过一个 \(\tanh\) 压进范围,这时 \(\log\pi\) 必须加上变量替换的雅可比修正 \(-\sum\log(1-\tanh^2u)\)(19.3 节的变量替换,SAC 就这样做)。错误做法是按截断后的动作去算未截断高斯的 \(\log\pi\):边界上的大量样本会得到错误的得分。
对折扣目标 \(\mathbb E[\sum\gamma^tr_{t+1}]\),严格的梯度在第 \(t\) 项上还有一个因子 \(\gamma^t\)。几乎所有实现都把它省掉、只在 \(G_t\) 里用 \(\gamma\):这时算出来的已经不是任何目标的精确梯度,\(\gamma\) 实际上成了一个“只看未来多远”的降方差旋钮。这通常没问题,但要清楚自己优化的是什么,比较不同 \(\gamma\) 时要用同一个未打折的指标。另外,学习曲线本身就很吵(FIG 5),只看一个随机种子的一条曲线下结论很危险:至少比较几个种子,并在固定的测试状态上评估均值策略。
8小练习
9延伸阅读
- R. J. Williams, Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning, Machine Learning 8, 1992 — REINFORCE 的原始论文,包括基线
- R. S. Sutton, D. McAllester, S. Singh & Y. Mansour, Policy Gradient Methods for Reinforcement Learning with Function Approximation, NIPS 1999 — 策略梯度定理与相容的函数近似
- R. S. Sutton & A. G. Barto, Reinforcement Learning: An Introduction, 2nd ed., MIT Press, 2018 — 第 13 章:策略梯度方法
- E. Greensmith, P. L. Bartlett & J. Baxter, Variance Reduction Techniques for Gradient Estimates in Reinforcement Learning, JMLR 2004 — 基线与最优基线的分析
- S. Kakade, A Natural Policy Gradient, NIPS 2001 — 用策略分布的几何度量步长,TRPO 与 PPO 的前身
- J. Peters & S. Schaal, Reinforcement Learning of Motor Skills with Policy Gradients, Neural Networks 21(4), 2008 — 机器人运动技能上的策略梯度与自然 actor-critic 综述
- N. Kohl & P. Stone, Policy Gradient Reinforcement Learning for Fast Quadrupedal Locomotion, ICRA 2004 — 在真实 AIBO 上学步态
- R. Tedrake, T. W. Zhang & H. S. Seung, Stochastic Policy Gradient Reinforcement Learning on a Simple 3D Biped, IROS 2004 — 在真机上在线学习双足行走
- J. Kober & J. Peters, Policy Search for Motor Primitives in Robotics, NIPS 2008 — PoWER 与 Barrett WAM 上的杯中球
- M. P. Deisenroth, G. Neumann & J. Peters, A Survey on Policy Search for Robotics, Foundations and Trends in Robotics, 2013 — 机器人策略搜索的全景:策略梯度、EM 类方法、基于模型的方法
- T. Salimans, J. Ho, X. Chen, S. Sidor & I. Sutskever, Evolution Strategies as a Scalable Alternative to Reinforcement Learning, arXiv:1703.03864, 2017 — 大规模并行的参数空间探索
- H. Mania, A. Guy & B. Recht, Simple Random Search of Static Linear Policies is Competitive for Reinforcement Learning, NeurIPS 2018 — 线性策略加随机搜索在连续控制基准上的表现
- J. Schulman, P. Moritz, S. Levine, M. Jordan & P. Abbeel, High-Dimensional Continuous Control Using Generalized Advantage Estimation, ICLR 2016 — GAE:优势估计的偏差与方差折中(20.4 节)
- S. Mohamed, M. Rosca, M. Figurnov & A. Mnih, Monte Carlo Gradient Estimation in Machine Learning, JMLR 2020 — 得分函数、重参数化等梯度估计方法的系统综述
- W. Kool, H. van Hoof & M. Welling, Buy 4 REINFORCE Samples, Get a Baseline for Free!, ICLR 2019 Workshop — 留一法基线(RLOO)