Skip to content

路线二:J(θ)——直接优化策略

本节导读

核心内容

  • 掌握参数化策略 πθ(as)\pi_\theta(a\mid s) 如何直接表示"看到什么做什么"。
  • 理解策略目标 J(θ)J(\theta) 如何衡量一个策略的平均长期回报。
  • 知道策略梯度的直觉:提高带来高回报动作的概率,降低带来低回报动作的概率。

核心公式

πθ(as)=Pθ(At=aSt=s)(参数化随机策略:用 θ 表示动作分布)\pi_\theta(a\mid s) = P_\theta(A_t=a\mid S_t=s) \quad \text{(参数化随机策略:用 }\theta\text{ 表示动作分布)}

参数化随机策略 (Parameterized Stochastic Policy):

  • πθ\pi_\theta:带参数 θ\theta 的策略函数(比如一个神经网络)。
  • PθP_\theta:由参数 θ\theta 决定的概率分布。这个公式说明,策略本质上就是一个输出“在状态 ss 下选动作 aa 的概率”的模型。

J(θ)=Eπθ[G0]=Eπθ[t=0γtrt](策略目标函数:衡量策略平均回报)J(\theta) = \mathbb{E}_{\pi_\theta}\left[G_0\right] = \mathbb{E}_{\pi_\theta}\left[\sum_{t=0}^{\infty}\gamma^t r_t\right] \quad \text{(策略目标函数:衡量策略平均回报)}

策略目标函数 (Policy Objective Function):

  • J(θ)J(\theta):目标函数(Objective Function),衡量当前这套参数 θ\theta 打出的总成绩。
  • Eπθ\mathbb{E}_{\pi_\theta}:在策略 πθ\pi_\theta 控制下,跑出各种可能轨迹的平均期望。
  • G0G_0:从初始状态开始的整局游戏总回报。

θ=argmaxθJ(θ)(最优策略参数:把学习写成最大化问题)\theta^* = \arg\max_\theta J(\theta) \quad \text{(最优策略参数:把学习写成最大化问题)}

最优策略参数 (Optimal Policy Parameters):

  • θ\theta^*:最优参数,能让总成绩 J(θ)J(\theta) 达到最大值的那组神经网络权重。

θJ(θ)Eπθ[tθlogπθ(atst)Gt](策略梯度估计式:提高高回报动作概率)\nabla_\theta J(\theta) \propto \mathbb{E}_{\pi_\theta}\left[ \sum_{t} \nabla_\theta\log\pi_\theta(a_t\mid s_t)\cdot G_t\right] \quad \text{(策略梯度估计式:提高高回报动作概率)}

策略梯度估计式 (Policy Gradient Estimator):

  • θ\nabla_\theta:对参数 θ\theta 求梯度(求导),指明了参数应该往哪个方向调整。
  • \propto:正比于,表示等式两边虽然不完全相等(差个常数项),但方向是一致的。
  • logπθ\log\pi_\theta:对数概率,求导后用来表示“增加选这个动作的概率”的方向。

为什么需要这些公式

上一节的 Q 路线很直观:给每个动作打分,选最高的。但如果动作不是"左/右"两个按钮,而是机械臂每个关节的连续力矩呢?动作太多了,根本没法一个个打分。于是第二条路线出现了:不先做完整打分表,而是直接训练一个会行动的策略 πθ\pi_\thetaJ(θ)J(\theta) 就像这套策略的总成绩,θ\theta^* 表示我们要找到成绩最高的那组参数,策略梯度告诉我们怎么把带来高分的动作概率调大。读到这里会发现:Policy-based 方法不是比 Q 更玄,而是在动作太多、没法枚举时,换了一种更合适的学习方式。

控制一个机械臂需要给 6 个关节各施加一个力矩。力矩可以是 0 到 10 牛顿米之间的任何实数——动作空间是一个 6 维连续空间,包含无穷多个可能的动作。路线一的思路是给每个动作打分再选最高的,但无穷多个动作意味着无穷多次打分,argmax\arg\max 彻底失灵。

路线二提供了一种完全不同的思路:跳过打分,直接学"在什么情况下该做什么"。

从“打分再选”到“直接学行为”

还是拿走迷宫来举例。 路线一的做法是:给每条岔路挂个牌子打个分,然后智能体每次走到岔路口,都停下来看看所有的牌子,挑分数最高的走。 路线二的做法是:我不挂牌子了,我直接反复走这个迷宫。 如果这次走到了终点拿了高分,我就把刚才沿途做过的每一个选择的“信心”都增强一点;如果这次掉进了陷阱,我就把刚才沿途的选择的“信心”都削弱一点。走得多了,在某个岔路口往右走的“直觉”(概率)自然就上升了,往左走的概率自然就下降了。

这两种做法可以用一个更日常的类比来理解。想象你去一家有几百道菜的餐厅:

  • 路线一就像是你必须先给每道菜打分——“宫保鸡丁 8 分,麻婆豆腐 7.5 分,红烧肉 9 分”——然后你每次都点分数最高的那道。打分系统越准确,你吃得越爽。但问题是:如果菜单上有几万道菜呢?你不可能每道菜都尝过,你永远建不完这张打分表。
  • 路线二就像是凭直觉点菜——每次随机点几道,如果吃得开心,你的大脑就会留下一个印象:“下次来我还点这个”;如果难吃,就记住“下次避开”。你脑子里根本没有一张写着分数的表格,你只是形成了一种条件反射(策略)

为什么需要路线二:面对无尽的连续空间

路线一的核心操作是 argmaxaQ(s,a)\arg\max_a Q(s,a)——把所有动作的分数算出来,挑最大的。这在动作只有“左、右、上、下”这几个离散按钮时,完全没问题。

但如果动作空间变成了连续的呢? 假设你要控制一个 6 个自由度的机械臂。你需要同时给 6 个关节发送力矩指令,每个力矩可以是 0 到 10 牛顿米之间的任何带小数点的实数。这就意味着,动作空间是一个 6 维的连续空间,包含无穷多个可能的动作。

在这种情况下,你想用 argmaxa\arg\max_a 把所有动作都打个分再挑最大值?这在数学上相当于对一个 6 维连续函数求全局最大值,在计算上几乎是不可能的。 更不用说现在火热的大语言模型(LLM)了:每一步它都要从几万个词(token)组成的词表中采样,它的动作本身就是一个连续的概率分布。

路线二完美绕过了这个硬伤:它不计算 argmax\arg\max。它直接训练一个神经网络,输入当前的局面,输出“该采取每个动作的概率分布” πθ(as)\pi_\theta(a|s)。然后你直接根据这个概率分布扔骰子(采样)就行了。

策略 πθ\pi_\theta:参数化的“行为手册”

在前面 3.2 节中,我们定义过策略 π\pi:它就是一个函数,输入状态,输出动作。 现在,我们要让这个函数变得可学习:我们用一组参数 θ\theta(比如神经网络的几百万个权重)来代表这个函数,写成 πθ(as)\pi_\theta(a|s)

刚开始训练时,这组参数 θ\theta 是随机的,智能体就像个婴儿,动作完全混乱。但随着训练的进行,我们不断调整 θ\theta,让这本“行为手册”越来越完善——导致好结果的动作概率上升,导致坏结果的动作概率下降。

把策略参数化,带来了一个巨大的认知视角的转变:我们不再需要在庞大的动作空间里大海捞针,而是直接在参数空间 θ\theta 里,顺着梯度的方向往上爬。

J(θ)J(\theta):这本手册的总成绩

既然策略是由参数 θ\theta 决定的,那我们怎么衡量这套参数 θ\theta 到底好不好? 我们需要一个目标函数 J(θ)J(\theta)

J(θ)=Eπθ[Gt]=Eπθ[t=0γtrt](3.8)J(\theta) = \mathbb{E}_{\pi_\theta} \left[ G_t \right] = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{\infty} \gamma^t r_t \right] \tag{3.8}

J(θ)J(\theta) 的物理意义非常直白:如果智能体按照当前这套参数 πθ\pi_\theta 去行动,平均能拿多少总分。 J(θ)J(\theta) 越高,说明这套参数越好。

你可能会疑惑:我们之前不是已经有了 V(s)V(s) 来给策略打分吗?为什么又搞出一个 J(θ)J(\theta)? 其实它们的角色不同:

  • V(s)V(s) 是“裁判”:它评估的是一个固定不变的策略。它只负责打分,不管怎么改进。
  • J(θ)J(\theta) 是“教练”:它是以参数 θ\theta 为自变量的函数。只要有了这个函数,我们就可以对它求导(求梯度),从而知道“我该把 θ\theta 往哪个方向调,才能让总分变高”。

所以,路线二的终极目标,就是找到能让总成绩 J(θ)J(\theta) 达到最大的那组参数:

θ=argmaxθJ(θ)(3.9)\theta^* = \arg\max_\theta \, J(\theta) \tag{3.9}

这和路线一的逻辑形成鲜明对比:

路线一(Value-Based)路线二(Policy-Based)
学什么Q(s,a)Q(s,a):每个动作值多少分πθ(as)\pi_\theta(a|s):看到什么做什么
怎么决策argmaxaQ(s,a)\arg\max_a Q(s,a)(选最高分)πθ\pi_\theta 采样
优化目标找到最优 QQ^*找到最优 θ\theta^*
动作空间只能处理离散动作天然支持连续动作
探索机制需要人工补丁(ε-贪婪)随机性策略天然探索

策略梯度的直觉:好就多做,坏就少做

怎么求这个梯度 θJ(θ)\nabla_\theta J(\theta) 呢?在第 5 章,我们会带你从头推导这个公式。但在这里,为了让你更直观地理解路线二在干什么,我们先用一个极其平缓的坡度,把推导过程过一遍。不需要任何高深微积分,只要高中的概率知识就够了。

1. 什么是轨迹(Trajectory)?

我们先回忆一下目标函数 J(θ)J(\theta),它的物理意义是“在当前策略 πθ\pi_\theta 下,你能拿到的平均总分”:

J(θ)=Eπθ[Gt]J(\theta) = \mathbb{E}_{\pi_\theta} \left[ G_t \right]

如果把这个期望(E\mathbb{E})拆开,其实就是在算所有可能跑出来的轨迹的加权平均。 什么是轨迹?就是从游戏开始到结束,你走过的每一个状态和动作。我们可以把它记为一个序列 τ\tau(Trajectory):

τ=(s0,a0,s1,a1,,sT,aT)\tau = (s_0, a_0, s_1, a_1, \dots, s_T, a_T)

对于任意一条轨迹 τ\tau,它有两个最重要的属性:

  1. 它的总得分 G(τ)G(\tau):这取决于环境的奖励规则(你一路拿了多少金币,扣了多少血)。
  2. 它发生的概率 Pθ(τ)P_\theta(\tau):这取决于你的策略 πθ\pi_\theta(你越喜欢选某个动作,包含这个动作的轨迹发生的概率就越高)和环境的物理法则。

既然期望就是“把每种可能的结果乘以它发生的概率,然后全加起来”,那么目标函数就可以直白地写成:

J(θ)=τPθ(τ)G(τ)J(\theta) = \sum_{\tau} P_\theta(\tau) \cdot G(\tau)

2. 对参数求导

我们的目标是找到能让 J(θ)J(\theta) 达到最大的参数 θ\theta。怎么找最大值?当然是对 θ\theta 求导(求梯度),然后顺着梯度的方向去更新参数。

我们直接对上面的公式两边求梯度:

θJ(θ)=θτPθ(τ)G(τ)\nabla_\theta J(\theta) = \nabla_\theta \sum_{\tau} P_\theta(\tau) \cdot G(\tau)

这里有一个非常关键的观察:得分 G(τ)G(\tau) 是环境给的,它只跟这条轨迹本身有关,完全不依赖于你脑子里的神经网络参数 θ\theta 所以,对 θ\theta 来说,G(τ)G(\tau) 就像个常数。求导符号可以直接穿过求和号和常数,只作用在概率 Pθ(τ)P_\theta(\tau) 上:

θJ(θ)=τθPθ(τ)G(τ)\nabla_\theta J(\theta) = \sum_{\tau} \nabla_\theta P_\theta(\tau) \cdot G(\tau)

3. Log-Derivative Trick(对数求导技巧)

上面的公式虽然严谨,但在计算机里没法算。因为这里有个 τ\sum_\tau,也就是要把宇宙中所有可能的轨迹都穷举一遍,这显然不可能。我们真正想要的是一个能用采样(蒙特卡洛方法)来估算的期望形式 E[]\mathbb{E}[\dots]

要把 \sum 变回 E\mathbb{E},公式里必须有一个概率项 Pθ(τ)P_\theta(\tau) 作为权重。但现在的公式里,概率项被求导符号包裹着(θPθ(τ)\nabla_\theta P_\theta(\tau)),没办法直接提出来。

怎么办?这里我们要借用高中数学里的复合函数求导公式(链式法则): 我们知道,log(x)\log(x) 的导数是 1x\frac{1}{x}。所以,如果对 log(f(x))\log(f(x)) 求导,结果是 f(x)f(x)\frac{f'(x)}{f(x)}。 把这个公式稍微变一下形,把分母乘过去,就得到了机器学习里大名鼎鼎的对数求导技巧:

f(x)=f(x)logf(x)\nabla f(x) = f(x) \cdot \nabla \log f(x)

我们把 Pθ(τ)P_\theta(\tau) 当作这里的 f(x)f(x),代入到上面的梯度公式里,奇迹发生了:

θJ(θ)=τPθ(τ)我们想要的权重θlogPθ(τ)G(τ)\nabla_\theta J(\theta) = \sum_{\tau} \underbrace{P_\theta(\tau)}_{\text{我们想要的权重}} \cdot \nabla_\theta \log P_\theta(\tau) \cdot G(\tau)

你看,式子里又出现了 τPθ(τ)()\sum_\tau P_\theta(\tau) \cdot (\dots),这不正是求期望的标准定义吗! 于是,我们可以名正言顺地把它变回期望的写法:

θJ(θ)=Eτπθ[θlogPθ(τ)G(τ)]\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \nabla_\theta \log P_\theta(\tau) \cdot G(\tau) \right]

这意味这什么?意味着我们不需要穷举所有轨迹了!我们只需要用当前的策略去游戏里玩几局(采样几条轨迹 τ\tau),算一下中括号里的值求个平均,就能得到梯度的近似值。

4. 拆解轨迹概率

最后一步,也是最符合直觉的一步。 一条轨迹 τ\tau 发生的概率 Pθ(τ)P_\theta(\tau) 到底是怎么算出来的? 它其实就是从头到尾,每一步发生概率的连乘。

在任意一步 tt,发生两件事:

  1. 智能体根据策略,决定做一个动作,概率是 πθ(atst)\pi_\theta(a_t|s_t)
  2. 环境根据物理法则,跳到下一个状态,概率是 P(st+1st,at)P(s_{t+1}|s_t, a_t)

所以,整条轨迹的概率就是:

Pθ(τ)=P(s0)πθ(a0s0)P(s1s0,a0)πθ(a1s1)P_\theta(\tau) = P(s_0) \cdot \pi_\theta(a_0|s_0) \cdot P(s_1|s_0,a_0) \cdot \pi_\theta(a_1|s_1) \dots

回忆一下高中的对数运算:连乘取对数,就变成了连加log(ABC)=logA+logB+logC\log(A \cdot B \cdot C) = \log A + \log B + \log C

所以,logPθ(τ)\log P_\theta(\tau) 就变成了一大串东西的相加:

logPθ(τ)=logP(s0)+tlogπθ(atst)+tlogP(st+1st,at)\log P_\theta(\tau) = \log P(s_0) + \sum_t \log \pi_\theta(a_t|s_t) + \sum_t \log P(s_{t+1}|s_t, a_t)

当我们对这串式子求梯度 θ\nabla_\theta 时,最爽的事情发生了:环境的初始状态概率 P(s0)P(s_0) 和转移概率 P(st+1st,at)P(s_{t+1}|s_t, a_t),它们都是环境自己的物理法则,完全不包含你的神经网络参数 θ\theta 所以对 θ\theta 求导后,它们全变成了 0!

只剩下与你的策略有关的那一项。最终,整个轨迹的梯度,就极度清爽地化简成了每一步动作梯度的累加。

把它代回我们上面的期望公式,就得到了大名鼎鼎的策略梯度(Policy Gradient)估计式的基本形态:

θJ(θ)Eπθ[tθlogπθ(atst)G(τ)]\nabla_\theta J(\theta) \propto \mathbb{E}_{\pi_\theta} \left[ \sum_{t} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G(\tau) \right]

5. 公式背后的直觉

别被上面的一堆符号吓到,这个公式如果翻译成大白话,不仅极度优雅,而且完全符合人类的常识。

括号里有两个关键部分:

  • θlogπθ(atst)\nabla_\theta \log \pi_\theta(a_t|s_t):它告诉你:“如果我想让当前这个动作的概率变大,我该往哪个方向调参数 θ\theta”。
  • G(τ)G(\tau):它告诉你:“你刚跑完的这一整局,到底拿了多大的总分(这就是调节的力道)”。

两者一乘,意思就是:如果这局拿了高分,就用力把沿途做过的所有动作的概率推上去;如果这局拿了低分(负分),就把沿途做过的所有动作的概率拉下来。

想象你是个傻瓜机器人,正在玩 10 局老虎机。你脑子里的策略是“70% 选 A,30% 选 B”。 其中有 3 局你运气好,拿到了正分(比如 +3);有 7 局运气差,拿到了负分(比如 -1)。

策略梯度的逻辑非常公平: 在拿正分的 3 局里,你选了 A,那我就把选 A 的概率往上推一点; 在拿负分的 7 局里,你选了 A,那我就把选 A 的概率往下压一点。 因为正分的力度(+3)大于负分的力度(-1),经过这两股力量的拉扯,最终净效果是:选 A 的概率略微上升了。 跑上几千局后,你的策略就会慢慢收敛到“几乎只选 A”。

整个过程里,你根本没有去算“选 A 到底得多少分”,你只是在反复的尝试中,顺着得分的力道,慢慢调整了你的偏好。这就是第 5 章我们要深入研究的核心武器。

沿着“直接优化策略”这条路,诞生了另一批同样如雷贯耳的算法:

算法核心思路特点
REINFORCE跑完一整局,用真实总分 GtG_t 来调整动作概率最纯粹的策略梯度,但因为用的是 MC 估算,方差极大,很难训练
Actor-Critic找个“裁判”(Critic)来给动作打分,降低方差把路线一(Value)和路线二(Policy)缝合在一起的经典架构,见第 6 章
PPO限制每次调整参数的幅度,别让步子迈太大稳定,好调参,目前工业界和 大模型对齐(RLHF) 的绝对主力算法

这条路线的优势是天然支持连续动作空间擅长探索(随机性策略总有概率尝试新动作)。但它的短板是打分不够准——策略梯度方法的方差很大,同一种策略跑两次,梯度估计可能差异显著,就像同一个学生两次考试分数波动很大一样。

第 5 章将深入这条路线,从最基础的 REINFORCE 开始,亲手体验策略梯度的工作方式和高方差问题。

本节总结

至此,你掌握了两套完全不同的工具,本节的核心收获可以归纳为以下几点:

  • 从“打分”到“直接行动”。 当面对连续或极大的动作空间时(如机械臂控制、大模型生成),无法枚举所有动作并计算 QQ 值。参数化策略 πθ(as)\pi_\theta(a|s) 直接学习输出动作的概率分布。
  • 优化目标 J(θ)J(\theta) 策略好不好,看平均得分。J(θ)J(\theta) 就是策略的平均长期回报,找到最优策略变成了寻找让 J(θ)J(\theta) 最大的参数 θ\theta^*
  • 策略梯度的推导与直觉。 通过 Log-Derivative Trick,我们将目标函数的梯度转化为轨迹概率和得分的期望。它在物理意义上非常朴素:“好结果 \rightarrow 提高沿途动作概率”,“坏结果 \rightarrow 降低沿途动作概率”。这通过 θlogπθGt\nabla_\theta \log \pi_\theta \cdot G_t 在数学上得到了严谨的体现。
  • 两条路线的互补性。
    • 路线一(Value-Based):先搞清楚每个动作值多少分,再选最高分。打分准(低方差),但不擅长探索、无法处理连续动作。
    • 路线二(Policy-Based):直接学“该做什么”。天然支持连续动作空间、擅长探索,但方差大、数据效率低。

局限性与后续引申

路线二(Policy-Based)虽然解决了连续动作空间的问题,但它的短板是打分不够准(高方差)——策略梯度方法的方差很大。同一种策略跑两次,梯度估计可能差异显著,就像同一个学生两次考试分数波动很大一样。

一个自然的想法是:能不能把两条路线的优点拼在一起?用路线一的方法打分,用路线二的方法选动作?这正是 Actor-Critic 架构的核心思想(我们将在第 6 章详细介绍)。

无论是学 QQ 还是优化 J(θ)J(\theta),所有算法的根本驱动力都来自同一个信号:奖励(Reward)。但这个决定智能体行为方向的奖励是从哪里来的?如果我们设计得不好,会发生什么灾难性的后果?

下一节,我们将讨论这个在强化学习中最容易被忽视、却至关重要的环节:

← 上一节:路线一:Q(s,a)——给每个动作打分 | 下一节:算法数据来源

Built for reusable bilingual course delivery