跳转至

P4-19.6 补充学习:第一次读 policy gradient

Section ID: P4-19.6 Version: v2026.07.24

副标题: likelihood ratio trick 如何把策略概率变化与期望奖励连接起来?

一旦开始读 P4-19.2 里的策略型强化学习(policy-based reinforcement learning),下面这些名字很快就会跟着出现。

  • policy gradient theorem
  • likelihood ratio trick

这一节不是一路把完整严密证明追到底,而是先去读为什么策略参数的变化会连到期望奖励的变化,以及为什么 log-probability 这种形式会反复出现

本节范围

这一节回答下面这些问题。

  • 为什么 policy gradient 会被读成直接调整策略概率?
  • 为什么 likelihood ratio trick 会把 log-probability 和期望值计算连接起来?
  • 这种公式感觉,又是怎样继续连到 REINFORCE 和 actor-critic 的解释上的?

这一节集中通过 策略概率期望奖励log-probability gradient 这三个把手,建立策略型公式的入门感觉。

用补充学习:如何第一次阅读 policy gradient 和 likelihood ratio trick留下的判断标准

  • 能把 policy gradient 解释成沿着提高期望奖励的方向去调整策略概率的梯度
  • 能把 likelihood ratio trick 解释成把概率分布内部的微分改写成 log-probability gradient,从而让计算更容易读的装置。
  • 能说明为什么在 REINFORCE 和 actor-critic 里会出现 log pi(a|s) 这样的形式。

为什么需要这一节

策略型强化学习用直觉句子来读时并不难,但一旦看见公式,陌生感就会一下子变强。

  • 为什么对期望奖励求微分时会冒出对数?
  • 为什么动作概率的梯度会和奖励相乘?

likelihood ratio trick,正是在这里出现的。

所以,这一节的核心,是第一次把直接调整策略这句话,和公式里的log-probability 的梯度连起来。

policy gradient 到底在对什么求微分

策略型强化学习最终带着的问题是:

如果策略参数发生一点小变化,长程期望奖励会朝哪个方向变得更大?

所以,如果用一句很短的话来讲,policy gradient 就是:

把策略参数朝着提高期望奖励的方向移动所需要的梯度

入门时,只要先抓住下面这些就够了。

阅读问题 policy gradient 在说什么
被改变的是什么 策略参数
为什么要改 为了让期望奖励更大
用什么信号来改 让带来好奖励的动作更常出现,让带来坏奖励的动作更少出现

所以,policy gradient 更应该被读成直接微调策略分布的更新

为什么会出现 likelihood ratio trick

当概率分布坐落在期望值内部时,微分会变得别扭。likelihood ratio trick 就是在这个位置经常出现的一种变形。

它的核心感觉可以压成一句话:

与其直接对概率本身求微分,不如把它改写成 log-probability 的梯度,这样在期望值里面更容易读。

如果只把形式很短地写出来,会像下面这样。

grad p(x) = p(x) * grad log p(x)

这个式子的作用,是让位于期望值内部的概率分布微分,更容易和基于样本的更新连接起来。

所以,对数之所以出现,不是装饰,而是为了改变计算结构本身。

那么,REINFORCE 公式应该怎样来读

REINFORCE 的直觉通常可以读成这样一种形式:

对那些带来好奖励的动作,加强它们的 log-probability 梯度;对那些带来坏奖励的动作,削弱它们的梯度。

在入门层面,最重要的是下面这个比较。

奖励是好的 奖励是差的
朝着让这个动作以后更常出现的方向调整 朝着让这个动作以后更少出现的方向调整
log pi(a|s) 的梯度会被当成强化信号 同样的梯度也可能反向成为削弱信号

而在这里,likelihood ratio trick 扮演的正是桥梁:它解释了为什么这种更新会写成 log-probability 形式

它和 actor-critic 又是怎样连起来的

在 P4-19.2 里看到的 actor-critic,是一种“直接调整策略,同时由 critic 提供更稳定评价信号”的结构。如果从公式感觉来读,它会变成下面这样。

  • actor:仍然沿着策略 log-probability 的梯度去调
  • critic:给出一个不那么抖动的评价信号,说明这个动作到底有多好

所以,actor-critic 并不是放弃了 policy gradient,而更像是让乘在那个梯度上的评价信号变得更稳定的一种方向。

案例与示例

案例 1. 当你想让好的广告展示比例更常出现,而差的比例更少出现时

假设一个广告展示策略会概率性地选择某种比例,比如 折扣横幅 70% / 推荐横幅 30%。人最容易先采用的规则,通常是这次效果好的横幅比例,下次就更常用一点

这个直觉方向是对的,但一旦公式出现,很快就会变得发虚。为什么是在直接改概率?为什么会冒出 log-probability?为什么同一个动作会因为奖励正负而往相反方向调整?这些问题都会马上出现。policy gradient 和 likelihood ratio trick 正是在这里把把好的概率调高,把坏的概率调低这一直觉,接到可读的公式解释上。

flowchart TD
  A["观察到好的横幅比例"]
  B["想让它以后更常出现"]
  C["在公式里遇到 log pi(a|s)"]
  D["连同奖励符号一起读"]
  E["正奖励会强化该概率"]
  F["负奖励会削弱该概率"]
  G["用公式重新读懂策略直觉"]

  A --> B --> C --> D
  D --> E
  D --> F
  E --> G
  F --> G
问题场景 人最容易先采用的规则 很快出现的限制 这一节补上的解释
推荐横幅占比提高后,长期购买增加了 下次更常用这个比例 还说不清概率更新该怎样写进计算 读成沿着提高期望奖励方向移动的 policy gradient
点击升高了,但退款和流失也升高了 把这个比例降下来 很难用公式解释为什么同一个动作现在收到反向信号 通过奖励符号和 log-probability 梯度来读
公式里出现 log pi(a|s) 看起来像困难的数学装饰 概率微分和基于样本的更新之间还没连上 通过 likelihood ratio trick 来读

这个案例真正要确认的结果是:好的比例更常出现,差的比例更少出现这句话,现在能不能通过 期望奖励log-probability gradient奖励符号 这三个把手重新读回来。也就是说,公式不该抹掉策略型直觉,而应该把那种直觉写得更精确。

练习与示例

这个练习的重点,是用很小的数字直接看到:好奖励 -> 强化所选动作概率坏奖励 -> 削弱它,以及为什么 log-probability 会一起出现

问题场景:

  • policy gradient 和 likelihood ratio trick 只看名字会很抽象,但实际是在计算“所选动作的概率该往哪个方向推”

输入(input):

  • 两个 action 的 policy logit
  • 被选择的 action
  • 同一个 action 对应的一次正奖励和一次负奖励

期望输出(output):

  • update 前的 action 概率
  • 被选择 action 的 grad log pi(a|s)
  • 根据 reward 符号变化的 update 后 action 概率

要确认的概念:

  • log-probability 是把所选动作概率连到更新计算上的阅读把手
  • 奖励符号一变,同一个动作的调整方向也会跟着变
import numpy as np


def softmax(logits):
    shifted = logits - np.max(logits)
    exp_values = np.exp(shifted)
    return exp_values / exp_values.sum()


# 两个 action:展示折扣 banner、展示推荐 banner
logits = np.array([0.2, -0.2])
chosen_action = 0
learning_rate = 0.4

for reward in [2.0, -2.0]:
    probs_before = softmax(logits)
    grad_log_prob = -probs_before
    grad_log_prob[chosen_action] += 1.0
    logits_after = logits + learning_rate * reward * grad_log_prob
    probs_after = softmax(logits_after)

    print("reward=", reward)
    print("prob_before=", [round(float(v), 3) for v in probs_before])
    print("grad_log_prob=", [round(float(v), 3) for v in grad_log_prob])
    print("prob_after=", [round(float(v), 3) for v in probs_after])

这个例子的结果可以像下面这样来读。

1
2
3
4
5
6
7
8
reward= 2.0
prob_before= [0.599, 0.401]
grad_log_prob= [0.401, -0.401]
prob_after= [0.739, 0.261]
reward= -2.0
prob_before= [0.599, 0.401]
grad_log_prob= [0.401, -0.401]
prob_after= [0.44, 0.56]

这个例子里最重要的,并不是把符号本身背下来。

  1. grad log pi(a|s) 是把所选动作概率连到更新计算上的阅读把手。
  2. reward 为正时,被选择 action 的概率会从 0.599 -> 0.739 上升。
  3. reward 为负时,即使用同一个 gradient,被选择 action 的概率也会从 0.599 -> 0.44 下降。
  4. likelihood ratio trick 的作用,就是把概率微分改写成log-probability gradient,让这种连接更容易读出来。

直接判断一下

看看下面这些观察,先选哪个解释更安全。

观察 过快下的结论 更安全的解释
log pi(a|s) 是负数 策略错了 只要概率小于 1,对数就可能是负的,真正重要的是它和奖励相乘后的调整方向
给同一个动作分别乘上正奖励和负奖励后,信号符号变了 公式不稳定 奖励符号改变了“这个动作该更常出现还是更少出现”的方向
公式里出现 log-probability 只是数学装饰 它是把期望值内部的概率微分,更容易连接到基于样本更新上的装置

这张表的目的,不是证明公式,而是抓住解释:策略概率到底是怎样被推高或压低的,以及为什么这种连接需要 log-probability

检查清单

  • 你能否说明,policy gradient 是把策略参数往提高期望奖励方向移动的梯度?
  • 你能否说明,likelihood ratio trick 是把概率微分改写成 log-probability gradient,从而让它更容易读?
  • 你能否说明,REINFORCE 和 actor-critic 都建立在这种 log-probability gradient 的直觉之上?
  • 你能否说明,正奖励和负奖励会让所选动作的概率往不同方向调整?

来源与参考资料

  • Ronald J. Williams, Simple statistical gradient-following algorithms for connectionist reinforcement learning, Machine Learning, 1992. 用于确认 REINFORCE 系列算法和 expected reinforcement 的 gradient-following 视角。确认日期: 2026-07-19. https://doi.org/10.1007/BF00992696
  • Richard S. Sutton, David McAllester, Satinder Singh, Yishay Mansour, Policy Gradient Methods for Reinforcement Learning with Function Approximation, NeurIPS 1999. 用于确认 policy gradient theorem、近似 value/advantage function 与经验估计之间的连接。确认日期: 2026-07-19. https://papers.nips.cc/paper/1999/hash/464d828b85b0bed98e80ade0a5c43b0f-Abstract.html
  • Vijay R. Konda, John N. Tsitsiklis, On Actor-Critic Algorithms, SIAM Journal on Control and Optimization, 2003. 用于确认把 actor-critic 连接到 policy-gradient 方法中评价信号稳定化的视角。确认日期: 2026-07-19. https://doi.org/10.1137/S0363012901385691