Xiaohei's Blog
headpicBlur image

前言#

需要说明的是,这个系列的博客是由我的幕布笔记转化而来,如果你更喜欢图文并茂的阅读,你可以去我的幕布空间进行阅读,受限于篇幅的原因,第十二章幕布笔记在这。如果你发现有哪些地方由逻辑错误,可以通过评论告知我,十分感谢!

开始#

我当年第一次从 Q-learning 切到策略梯度时,最大的爽点是:我终于不用再绕着 argmax\arg\max 去“间接”得到策略了

在策略梯度里,想法简单到近乎粗暴:

如果某条轨迹的回报是正的,就让这条轨迹里出现过的动作在对应的状态下更容易被采样到;反过来,如果回报是负的,就把这些动作的概率往下压。你可以把它理解成一种“事后表扬/批评”的机制:等整局结束再回头看,整体表现好的轨迹会把里面的决策都带着一起加分。

这一章我们就沿着文档的脉络,把这个想法落到可实现的形式:梯度上升、baseline、为每一步分配合适“分数”(credit assignment),以及最经典的 REINFORCE。

策略梯度的核心直觉#

文档里这段话很关键:在轨迹 τ\tau 中的某一步 (st,at)(s_t, a_t),如果最终发现轨迹奖励是正的,我们就增加在 sts_t 执行 ata_t 的概率;反之减少。

要把它变成可训练的东西,通常我们会:

实现上我们通常先用一个参数化策略 πθ(as)\pi_\theta(a|s)(神经网络输出一个动作分布)来表示“我在某个状态下倾向做什么”,再把目标写成最大化期望回报 J(θ)=E[G]J(\theta)=\mathbb{E}[G],然后用梯度上升去更新参数:

θθ+ηθJ(θ)\theta \leftarrow \theta + \eta \nabla_\theta J(\theta)

这里的 η\eta 就是学习率(可以用 Adam / RMSProp)。

两个常用技巧:baseline 与 credit assignment#

技巧 1:添加基线(baseline)#

文档里提到一个看似反直觉的问题:有些动作没被采样到,并不代表它不好,但它的概率可能会被“挤下去”。更本质的说法是:

回报 GG 的方差往往很大,而你又直接用 GG 去乘 log_prob,这会让更新非常抖。baseline 相当于提供了一个参照系,让你关注“相对这条基线我到底赚没赚”,从而显著降低方差。

baseline 的作用就是“减去一个不影响期望但能降方差的量”。最经典的 baseline 就是状态价值 V(s)V(s),于是出现优势函数:

A(s,a)=Q(s,a)V(s)A(s,a)=Q(s,a)-V(s)

技巧 2:为每一步分配合适的分数#

同一局游戏里,早期动作可能决定路线,后期动作决定收尾。我们希望每一步都乘以不同的权重,反映“这一步对结果贡献有多大”。

最常见的做法就是用每一步的未来折扣回报:

Gt=k=0Tt1γkrt+k+1G_t = \sum_{k=0}^{T-t-1} \gamma^k r_{t+k+1}

这也直接引出 REINFORCE。

REINFORCE:蒙特卡洛策略梯度#

文档的描述很到位:REINFORCE 是回合更新的方式,先收集每一步 reward,再计算每一步 GtG_t,然后用它优化每一步动作输出。

用更“码农”的语言:

你可以把实现想象成一次非常朴素的采样-回传:先 rollout 一整个 episode,把 (st,at,rt+1,logπ(atst))(s_t, a_t, r_{t+1}, \log\pi(a_t|s_t)) 都记下来;然后从后往前把每一步的 GtG_t 算出来;最后把 loss 写成梯度下降形式去反向传播:

L=tlogπθ(atst)Gt\mathcal{L} = - \sum_t \log\pi_\theta(a_t|s_t) \cdot G_t

然后反向传播。

本章小结:先让策略“能学”#

策略梯度的魅力在于它很自然地处理连续动作,也能把探索写进分布本身。但它也更抖、更依赖工程细节。

下一章我们会进入一个在实战里更常用的版本:PPO。你可以把 PPO 当成“给策略梯度加上安全带”:让策略每次更新别跨太大步,这对稳定性是质变。

RL 学习笔记(4):策略梯度
https://xiaohei-blog.vercel.app/blog/rl-learning-4
Author 红鼻子小黑
Published at May 5, 2025
Comment seems to stuck. Try to refresh?✨