写点什么

强化学习之策略梯度解析:原理 + 代码 + 公式,训练小狗捡球!

作者:攀岩飞鱼
  • 2025-11-23
    湖南
  • 本文字数:11273 字

    阅读完需:约 37 分钟

强化学习之策略梯度解析:原理+代码+公式,训练小狗捡球!

01 为什么要研究策略梯度方法?

在 AI 领域,强化学习凭借其独特的自主学习与环境适应能力,正日益凸显其重要性。而在强化学习的众多算法中,策略梯度(Policy Gradient)方法扮演着尤为关键的角色。它通过直接建模并优化智能体的策略,使其能够应对更复杂、高维的环境与任务。


例如,当前广泛使用的大语言模型(如 DeepSeek、ChatGPT),在其关键的后期训练阶段,便使用了策略梯度的变体算法进行策略优化与对齐。由此可见,策略梯度方法是大语言模型训练的重要技术基础之一,有力推动了智能模型与人类意图的一致性学习。


从其核心机制上来看,策略梯度在形式上与其他深度学习模型类似:它同样利用神经网络直接表示智能体的策略函数,并通过梯度不断调整参数,以追求长期奖励的最大化,从而解决序列决策问题。


然而,与我们更熟悉的监督学习相比,策略梯度在目标函数、梯度计算和训练方式上存在显著差异,而这也正是很多初学者感到困惑的难点。深刻理解这些差异,是掌握策略梯度核心思想的关键。


在本文中,我将通过一个“训练小狗捡球”的生动案例,结合基本原理、代码实现与数学公式,由浅入深地解析策略梯度方法。正所谓“麻雀虽小,五脏俱全”,希望通过这一完整而简单的示例,大家能够扎实掌握其核心机制,并为后续学习更高级算法(如 TRPO、PPO 等)打下坚实基础。

02 让小狗学会在网格世界中捡球

在一个 3×3 的网格世界中,橙色小狗的目标是成功捡到网球。然而,途中存在两个干扰物:一只粉色小狗(会吸引它分心玩耍)和一碗骨头(会诱使它贪吃停留)。橙色小狗必须学会避开这两者,否则任务将失败。


橙色小狗每次只能向上、下、左、右四个方向之一移动一格,且不得越出网格边界。在任务过程中,它必须学会避开所有干扰物——一旦触碰任意干扰物,任务即告失败。



如下所示,共有四种行动方案,其中仅第四种成功,它巧妙避开了骨头和粉色小狗,并以最短路径精准抵达网球。其余方案均未成功:有的因触碰干扰物而直接失败,有的则因路径迂回未能高效达成目标。



接下来,我们将采用策略梯度方法(Policy Gradient)训练橙色小狗,使其像第四种方案那样高效、准确地成功捡到网球。

03 策略网络原理:状态到行动的映射

前文提到,策略梯度方法的核心在于使用一个神经网络,称为策略网络(Policy Network)。为便于理解,我们可以暂时将这个策略网络视为一个“黑盒子”——那么,这个黑盒子具体要完成什么任务?它的输入和输出又分别是什么?


简而言之,策略网络的作用是充当一个智能决策器


  • 输入:橙色小狗当前所处的环境状态,即它在 3×3 网格中的横纵坐标(例如 (1,1) 表示中心位置);

  • 输出:在该状态下,小狗选择上、下、左、右四个动作的概率分布。概率越高,表示该动作被选中的可能性越大。



如图所示,当小狗位于网格中心时,我们将坐标 (1,1) 输入策略网络。网络随即输出四个动作对应的概率值


理想情况下,由于“向右”是通往网球的最短且安全路径,网络应赋予该方向极高的概率;而“向上”和“向下”会直接撞上干扰物(粉色小狗或骨头),导致任务失败,因此这两个方向的概率应被压至极低。


将网格中每一个可能的状态依次输入策略网络,都能获得对应的动作概率分布。通过选择概率最高的动作,即可确定小狗在该位置的最优行为。



最终,我们将得到一张覆盖整个网格世界的最优策略图。如上图所示,每个格子中的箭头清晰地标明了小狗在该位置时应采取的最佳行动方向,从而形成一条安全、高效的智能路径,引导橙色小狗成功抵达网球。

04 与监督学习的区别是什么?

上文探讨了策略网络的核心逻辑,即一个策略网络。接下来,我们将深入分析具体的训练方式。在开始之前,有必要先回顾一下监督学习训练过程,这有助于理解策略网络的训练机制。

4.1 监督学习的训练流程

在监督学习中,首先需要准备训练数据,这些数据通常被整理成特征(features)与标签(labels)的格式。特征作为模型的输入,标签则代表我们期望模型学习的正确答案


随后,我们将特征输入神经网络,网络会输出相应的预测值,其形式可能是概率分布,也可能是具体的数值。通过不断调整网络内部的参数,使预测值与真实标签之间的误差尽可能缩小,从而使模型的输出逐渐逼近真实情况。


4.2 策略梯度的训练流程

策略梯度同样是训练神经网络,它有什么特别之处呢?与监督学习不同,策略梯度的特殊性主要体现在以下两个方面。


其一,数据方面:策略梯度在训练前没有预先准备好的(特征,标签)数据集。例如在此案例中,训练前并无训练样本数据,我们只知道模型要输入当前位置,输出动作概率。


其二,目标方面:由于没有样本数据,不能像监督学习那样通过对比预测值与标签来缩小差距。其目标是让行动后获得的奖励(reward)更大。模型通过不断尝试来收集交互数据,并依据所获得的奖励来调整策略。



因此,策略梯度在神经网络正向与反向传播的部分和监督学习一致,其核心区别在于数据获取与目标设定,下面重点介绍这两个方面。

05 从轨迹中获取训练数据(蒙特卡洛采样)

先来探讨数据方面。策略梯度方法不存在与特征和标签对应的现成训练样本,然而神经网络的参数优化却需要大量数据输入。那么,这些数据究竟是如何产生的呢?答案是:通过让智能体在环境中进行多次完整的探索,在探索中来收集训练数据。

5.1 强化学习抽象模型

这个探索过程可以抽象为强化学习通用模型,模型分为两个部分:智能体(Agent)(橙色小狗)与环境(Environment)(即整个网格世界)。



智能体通过执行动作(Action) 与环境进行交互,(具体动作由策略网络结合概率抽样来决定)。环境则根据当前状态(State)(如小狗位置)提供奖励(Reward)(正/负积分),并更新至下一个状态。如此循环,直至任务终止。

5.2 抽象模型到轨迹采样

上述抽象模型为一个循环交互过程,这个过程也有一个专业名词--轨迹采样


那么,什么是轨迹呢?轨迹本质上是对智能体与环境完整交互过程的数据记录,它是由一系列状态(State)、动作(Action)及奖励(Reward) 构成的序列


可以将其理解为,将强化学习抽象模型中的循环过程,展开后形成的一个具体的数据序列,而这些序列正是训练策略网络所需的关键数据。


回到网格世界的案例,具体应如何生成一条轨迹呢?思路非常简单:让智能体(橙色小狗)在环境中进行随机探索。


具体过程如下:


  1. 让小狗随机出现在网格中的某个位置,接着,在当前位置“扔骰子”

  2. 根据骰子结果选择上、下、左、右中的一个方向,并向该方向移动一格

  3. 到达新位置后,重复这一过程

  4. 直到小狗成功捡到网球,或碰到障碍物(粉色小狗或骨头)为止


在此过程中,我们详细记录小狗的:


  • 所处位置(状态)

  • 移动方向(动作)

  • 获得的奖励(碰到网球 +10 分,碰到粉色小狗 −1 分,碰到骨头 −5 分,其他为 0 分)


这些记录构成训练策略网络所需的原始样本数据,这一过程在强化学习中称为蒙特卡洛采样。


如下图所示的三次轨迹采样示例:


第一条轨迹:小狗向下、向右移动后撞到骨头,总奖励为-5,是一次失败探索;



第二条轨迹:小狗经过向下、向右、再向下的移动后成功捡到球,获得+10 奖励,是一次成功探索;



第三条轨迹:小狗直接向右移动撞到其他小狗,以-1 奖励结束,同样是一次失败探索。



这些轨迹直观展示了成功与失败策略所产生的不同数据。

5.3 第二条轨迹详细分析

为了理解轨迹产生过程,我们对第二条成功的轨迹详细拆分一下。如下图所示:



  1. 随机一个起始状态,如左下方的位置,将这个位置(状态)输入给策略网络,网络会输出一个动作的概率分布。

  2. 根据得到的概率分布进行抽样,得到一个具体的动作(例如“向下”)。

  3. 智能体执向下这个动作,会从环境中获得一个即时奖励(例如 0),并转换到下一个状态(新的位置)。

  4. 到达新位置后,重复 2,3 步骤流程,将新状态输入网络,输出策略并抽样得到下一个动作,获得奖励并进入再下一个状态

  5. 这个过程循环往复,直到遇到终止状态(如碰到网球),探索结束。


每次重复的这个过程被称为一个时间步。在此轨迹中,共经历了 4 个时间步。每一步都会产生一条样本数据,其中包含了当前状态、模型输出的概率分布、采样得到的实际动作等信息。


因此,一条轨迹是从起始到终止的完整过程,包含多个时间步,每一步则产生一条包含(状态 S、预测概率 P、实际动作 A、奖励 G)的样本数据。最终,这个序列就构成了用于策略梯度训练的数据集。

5.4 每一步的详细过程

上面介绍了整个轨迹的产生过程,我们再深入一步,详细解释轨迹采样中每个时间步的流程,如下图所示:



整个过程起始于状态表示与编码转换。


首先,要用坐标确切表示小狗的状态,比如小狗处于网格中间位置时,坐标为 。因原始坐标信息不能直接输入神经网络计算,所以必须将其转换为 One - Hot 编码。这里编码长度为 9,与网格状态总数一致,像坐标 的状态,就可用向量 表示。


接下来,是神经网络层的前向传播计算,转换后的 One - Hot 编码向量作为神经网络输入,先与第一层参数矩阵 (维度为 )相乘,得到具有 32 个神经元的隐藏层。对该隐藏层应用 tanh 激活函数,其输出再与第二层参数矩阵 (维度为 )相乘,最终得到一个 维输出层向量,分别对应 “上、下、左、右” 四个动作的原始分数。


随后,进行概率处理与动作抽样,为得到每个动作的概率,需对输出层原始分数进行 Softmax 操作,将其转变为总和为 1 的概率分布。概率分布抽样,就是根据这个分布把概率转化为区间长度,然后随机生成一个数字,判断它落入哪个区间,以此选定动作。这样既能确保高概率动作更容易被选中,又保留了一定随机性以激励探索。


最后,是动作执行与流程结束环节,依据抽样得出的抽象动作,智能体在环境中切实执行该动作,由此进入下一个状态,并获取环境反馈的奖励。


以上就是一个完整时间步的流程,其产生的数据是策略学习的关键,为后续策略优化奠定了数据基础。

06 目标函数,最大化期望回报,图形总面积最大

前文介绍了强化学习中在线策略学习的轨迹采样过程:智能体与环境持续交互,生成形如 的数据序列,分别对应状态、动作、奖励及状态转移。


这些轨迹数据便是用于神经网络训练的样本数据。有了样本数据,就能通过训练更新神经网络的参数。


神经网络的参数更新,必须依赖明确的目标函数。正如“给神经网络一个清晰目标,它便会全力以赴,给出你想要的结果”这句话所说,目标函数在此至关重要。


策略梯度的目标函数是最大化期望回报。那么,“期望回报”究竟是什么意思呢?简单来讲,期望回报可等效为面积,下面我们详细介绍。


如下图所示,假设小狗现在位于编号为 的位置,它有两种行动选择:


  1. 向左:概率 ,能得到回报

  2. 向下:概率 ,能得到回报



可以用一张图来表示期望回报:


  1. X 轴表示动作发生的概率

  2. Y 轴表示动作能带来的回报


蓝色区域代表“向左”动作,橙色区域代表“向下”动作。X 轴上两个概率的和为 1。一个变大,另一个就会变小。



在图中,期望回报是这两个图形面积之和(其中 x 轴代表概率,y 轴代表回报),当前状态下期望回报的计算方式如下:



这意味着,在当前状态下,小狗平均可获得 的回报。从面积角度理解期望,既直观,又有助于我们在后续推导中更轻松地理解策略优化原理。


若目标是最大化期望回报,即让两块图形面积之和最大,该怎么做呢?


很显然,我们应增大黄色图形出现的概率,也就是增加其在 轴(概率)上的宽度。因为黄色图形在 轴(回报)上的值更高,如此能使总面积增长得更快 。下图所示:



理解了期望回报等同于图形面积总和后,策略梯度目标函数的数学公式就容易理解了。公式为:



  1. 表示单个行动可获得的奖励,对应图形中的 轴;

  2. 表示单个行动发生的概率,对应图形中的 轴;

  3. 是求和符号,表示对所有行动得到的奖励与概率的乘积进行求和。-


训练的目标就是让这个函数的值不断增大,即让图形面积尽可能大。

07 根据策略梯度公式更新参数

上文我们探讨了策略梯度的目标函数,即最大化长期累积奖励,直观上可理解为最大化图形面积。接下来,我们基于这个目标函数,来更新神经网络参数。


更新神经网络参数,就是神经网络的正向与反向计算过程。下面我们从神经网络计算图的角度,逐步分析这一计算过程。


从计算图看,神经网络由诸多计算节点构成,包括输入节点 、隐藏层节点 、输出层节点 ,以及对应的权重参数节点 。在这些节点上有两个数据:一个是实际值,另一个是梯度值(即更新幅度),分别用 表示。



在计算图中,灰色节点代表待优化参数,蓝色节点表示原始输入与最终目标结果,橙色节点为中间计算过程。


从左到右是神经网络的正向计算(橙色虚线所示),从右到左则是反向计算(红色虚线所示)。


计算图最右侧的节点是最终结果,即目标函数,它由回报与概率分布决定。训练的目标是增大目标函数的值,而关键在于调整灰色节点的值,因为仅有是可改变的参数。那么,具体该如何调整呢?


策略梯度最核心的部分——策略梯度公式来了。


为何它是核心?因为只需依据这个公式,计算节点中的值。接着,按照链式法则,便能算出节点的值。随后,根据值更新。**更新后的值,在下次正向传播计算时,会使目标函数的值增大。 **


下面,我们重点来解释策略梯度公式:



这个公式是如此重要,因此我们从直观理解,图形化理解,和数学推导这三个角度全面来解释

7.1 直观逻辑理解

上面我们讲过,策略梯度公式的核心作用是指导参数更新,更确切地说,是确定梯度的值,进而使目标函数的值增大。那么这个值具体如何确定呢?它正是通过策略梯度公式来确定的。


公式中期望内部有两部分


第一部分: 表示奖励信号,表示动作产生的价值(可为即时奖励、累积回报或优势函数),是一个标量值可以为正,也可以为负。这一部分很好理解,比如这个案例中,小狗碰到网球奖励 10,f(x)就是 10。


第二部分: 有点复杂,但是可以先简单的理解为“概率变大的方向”。


通过“ 概率变大的方向× 奖励信号”,就可以来指导参数更新。


  • "奖励信号">0,说明是好行动,梯度更新会增加这个动作的概率。

  • "奖励信号"<0,说明是坏行动,奖励信号为负数,在乘以原本增加概率的梯度,就会变成减小概率的梯度。


同时


  • 当 "奖励信号" 绝对值很大时,说明这次行动很成功,梯度被放大,网络更快地学习到这种行为。

  • 当 "奖励信号" 绝对值很小时,说明这次行动效果一般,梯度被缩小,网络学习得慢。


因此,通过这两部分就可以顺利的调整参数,使得奖励大的行动概率得到增强,而负奖励或者奖励小的行动概率得到降低。

7.2 图形化理解

接下来,让我们通过图形的角度去理解策略梯度。这张图源自大神安德烈・卡帕斯博客文章,通过图形化的方式阐释了策略梯度的原理。



这张图展示了如何让一个概率分布 “学会”得到我们想要的结果。整个过程分三步:对应左,中,右三个图。


左图:一圈圈的椭圆线,表示一个概率分布,同一个圈上的概率相同,越中心的位置概率越高,越往外概率越低。


蓝色的点表示一个样本,每个样本都带有一个梯度箭头(对应公式中的。这个箭头就像一个“拉力”,让该样本出现概率增大。它仿佛在说:“把分布的中心朝我这边拉,让我更容易出现!”


中图:对样本进行打分(对应公式中 f(x)):好的(绿色)得正分 +1,坏的(红色)得负分 -1。分数决定了如何响应每个样本的“拉力”:


  • 好样本 (+1): 正分增强了这个拉力,顺着箭头的方向更新参数。

  • 坏样本 (-1): 负分反转了这个拉力,沿着箭头的反方向更新参数,主动“躲避”它。


右图:经过上面的两个过程后,概率分布的中心(概率最高点)成功地移动到了“好”样本密集的区域。


概率分布其实就是对应模型参数,至此模型成功地调整了参数,学会了偏爱能带来高奖励的样本(正 1 样本)。

7.3 数学公式推导

下面,我们从数学推导的角度再次理解策略梯度。对数学推导不感兴趣的读者可以直接跳过。




请注意,这部分公式推导内容全部由 AI 生成,我只是做了一些样式的调整。


这个公式通常被称为分数函数估计器 (Score Function Estimator) 或 REINFORCE 技巧 (REINFORCE trick)。它的核心作用是,将一个期望的梯度,转化为另一个期望,从而允许我们使用蒙特卡洛采样来估计原始的梯度。目标我们要推导的公式是:



基本设定和符号说明


  • :一个随机变量。它可以是离散的或连续的。为了清晰起见,我们的推导将以离-散情况(使用求和符号 )为主,但其结论对连续情况(使用积分符号 )同样成立。

  • :由参数 控制的关于 的概率分布。我们的目标是对参数 求梯度。

  • :一个关于 的标量函数,我们称之为“回报函数”或“价值函数”。一个至关重要的前提是, 本身不依赖于参数

  • :表示在 服从分布 的情况下的数学期望。

  • :表示对参数 的梯度算子。


整个推导过程可以分解为以下几个步骤:


第一步:写出期望的定义


首先,我们将目标函数中的期望 展开为其基本定义。对于离散型随机变量 ,期望的定义是所有可能取值的函数值 与其对应概率 的乘积之和。



所以,我们要计算的梯度是:



第二步:交换梯度和求和(/积分)算子


梯度算子 是一个线性算子。在满足一定正则性条件(通常在机器学习环境中都满足)的情况下,我们可以将梯度算子和求和(或积分)算子交换位置。



第三步:应用求导的乘法法则


现在我们对求和符号内的项 应用梯度。请记住我们之前的关键前提: 不依赖于 。因此,对于 算子来说, 是一个常数。根据求导法则 (其中 c 是常数),我们得到:



现在,我们面临一个问题:表达式中出现了 。这个形式不利于计算,因为它直接对概率分布求梯度。如果我们想通过采样来估计,我们很难处理这项。下一步是解决这个问题的关键,也是整个技巧的核心。


第四步:引入“对数-导数技巧” (Log-Derivative Trick)


我们来引入一个非常有用的恒等式。考虑对数函数 的导数是 。根据链式法则,我们有:



现在,我们将这个等式的两边同时乘以 (假设 ):



这个恒等式就是所谓的“对数-导数技巧”。它绝妙地将一个难以处理的项 ,转换成了一个更容易处理的项的乘积:原始的概率 和对数概率的梯度


第五步:替换并重构期望


现在,我们将第四步得到的恒等式代回到第三步的结果中:



我们可以重新整理求和式中的项:



第六步:将求和形式变回期望形式


观察第五步最后的表达式。它正是 “某一项” 与其概率 的乘积之和。根据期望的定义,这正是 “某一项” 在 分布下的期望。这里的“某一项”是 。所以,我们可以将其写回期望的形式:



AI 推导完成!




下面,我们将整个推导过程,重新梳理为下面的 6 个步骤;



8 代码实现

以上是策略梯度理论与原理部分,接下来进入代码实现部分。 为了掌握底层实现原理。我们代码实现不会借助任何深度学习框架(例如 PyTorch),只依赖 numpy 等基础库。我们希望代码实现不是高度封装好的 “黑箱”。

8.1 折扣奖励

讲代码之前,还要理解一个强化学习中非常重要的概念--折扣奖励。到目前为止,我们还没有提及折扣奖励,这是因为先抛开一些细枝末节,有助于与理解策略梯度的本质原理 。


什么是折扣奖励?先看奖励,从字面理解就是小狗在行动中可以获得的好处,正是通过这个好处来指导小狗做正确的行动。折扣也很好理解,就是降低某个东西的价值或价格。比例,某个商品打折,就代表该商品的价格降低了。


折扣奖励就可以理解为:对奖励进行打折,已降低奖励的价值。


为什么要对奖励进行打折?回到上面小狗捡球的轨迹。比如下面有两条轨迹,小狗都成功的捡到了球,最终都能获得+10 的奖励,但是哪条轨迹更优呢?很显然是第二条。因为,第一条轨迹用了 6 步,而第二条只用了 4 步,第二条的路径更短,意味着耗时更少。



正因如此,在奖励的过程中,我们不仅要考量是否能达到目标,还要考虑步数因素,也就是时间因素,即“多久能达到目标”。


这也非常符合实际情况,比例,老板给你画个大饼,饼确实很诱人,但如果加上时间因素,这个“诱人”就会打折扣,而折扣多少,取决于你预估什么时候给你兑现。


理解了折扣奖励的本质后,再看上面两张图,就很清楚了。两条轨迹中小狗都成功捡到了球,但是,这两条轨迹存在优劣差异。那么,怎样运用折扣奖励来衡量这种差异呢?


先看下面数学公式:



  • 表示从时间步 开始,直到后续所有步骤的总回报。

  • 是在不同时间步获得的奖励(reward),即在每个时间步 后得到的即时回报。

  • 是 折扣因子(Discount Factor),它表示未来奖励的重要性。折扣因子 的取值范围是

  • 接近 1 时,未来的奖励对当前的回报计算影响较大。

  • 接近 0 时,意味着模型更加关注近期的奖励,忽视未来的回报。


根据上面的公式,分别计算出两条轨迹的回报(空白格子位置即时奖励为 0)




通过计算,第二条轨迹所获得的回报(价值)高于第一条轨迹。这与上述直观判断相符。所以,若没有折扣奖励,便无法量化区分这两条轨迹的优劣。


当然,强化学习中采用折扣奖励的原因,远不止我们刚才直观理解的这些。以下是 David Silver 强化学习课件中的一页内容,他给出了较为全面的解答,感兴趣的读者可深入研究。


8.2 神经网络代码

以下是定义神经网络的代码,这是一个非常简单的神经网络。本质就是由多个数学函数构成的数学表达式,并封装在一个方法里。该方法输入坐标信息,输出概率分布,对应下图左边部分。


def policy_forward(state):     # state 格式为(x,y) 网格中的坐标    x = one_hot(state)         # 状态编码 将状态转换为one-hot编码    h = np.tanh(np.dot(x, W1)) # 隐藏层 激活函数 将输入映射到[-1,1]之间    logits = np.dot(h, W2)     # 输出层 线性输出
# softmax 将输出转换为概率分布 exp_logits = np.exp(logits - np.max(logits)) probs = exp_logits / np.sum(exp_logits)
return probs, h, x
复制代码


8.3 轨迹采样代码

下面是轨迹采样的代码,其主体是一个 while 循环,直到碰到终止条件。循环的每一次迭代,对应着下图中每一步所执行的动作。


# 循环正向传播-收集样本数据    while not done: # 遇到球,骨头,其他狗结束采样,否则一直循环        # 前向传播 得到动作概率分布        probs, h, x = policy_forward(state)                      # 根据概率分布选择动作 概率越大,被选中的可能性越大        action_idx = np.random.choice(range(OUTPUT_DIM), p=probs)                 # 根据动作索引得到动作        action = ACTIONS[action_idx]                       # 执行动作 得到新的状态 奖励 是否结束        next_state, reward, done = step(state, action)                       # 将轨迹添加到轨迹列表中(收集样本数据)        trajectory.append((x, h, action_idx, reward, probs))             state = next_state
复制代码


上面的代码对应之前讲过的轨迹产生的过程


8.4 反向更新参数

下面的代码基于轨迹采样所得到的轨迹 trajectory 集合进行反向遍历。我们可以从上面的轨迹采样图形的终止状态开始往前看,即从第 4 步开始遍历。



在反向更新参数的代码里,有两行代码需要重点解释,可以说这两行代码是整个案例中最为关键的部分。只有真正弄懂这两行代码,才算是真正理解了策略网络。


第一行代码:G = r + DISCOUNT_FACTOR * G,它用于计算回报,即策略梯度公式中的'f(x)' 。乍一看,这行代码似乎与上文讲述的通过折扣奖励计算回报的数学公式有所不同。


下面,我们先对公式做一个简单的变换。


1 式:



2 式(提取一个



3 式:



4 式(将 3 式替换 1 式的后半)



经公式变换,折扣奖励最终能写成的形式,这是个递归公式。要留意的是,轨迹列表按从后往前的顺序循环,如此一来,便把递归计算转化为递推计算,这正对G = r + DISCOUNT_FACTOR * G这行代码。


第二行代码:dlog = (action_one_hot - probs) * G


,这行代码是上面花了很大篇幅讲解的策略梯度公式



但是,初看上去这行代码与策略梯度数学公式没有必然的联系。


下面借助以下两张图,对 (action_one_hot - probs) * G 展开分析。action_one_hot 代表下图中的实际动作,它是一个由 0 和 1 组成的向量,若某个动作被选中,该动作对应位置的值为 1,其余动作对应值为 0;probs 表示预测概率,G 表示回报,其值可为正,也可为负。



  1. 若选中动作的 G 值为正,那么梯度值为正正得正,此时 logits 参数更新会增大该动作出现的概率;

  2. 若选中动作的 G 值为负,梯度值则为正负得负,logits 参数更新会降低该动作出现的概率;

  3. G 绝对值的大小,决定了参数更新的幅度,绝对值越大,更新幅度越大。


这行代码看似简单,但其背后实现的正是策略梯度公式所表达的内容:使带来高价值的动作概率上升,让低价值的动作概率下降。

09 最终运行效果

经过 1000 轮训练,最终奖励稳定在 10 左右。而且通过训练,小狗无论在哪个格子,只要依照右图中的箭头方向行动,都能以最优方式捡到球。至此,我们完成了最简单版本的训练小狗捡球任务。


10 补充说明与后续更新

我们讨论的是策略梯度最基础的版本,训练过程中奖励波动较大。对此还有非常多的改进空间。但无论怎样改进,策略梯度的核心始终不变。


下图仍然取自 David Silver 的强化学习课件,各类策略优化算法仅在红色部分存在差异,这部分就是前文提到的策略公式中的。依据实际情况,可设计成不同形式,然而策略梯度的原理与流程,依旧如前文所述。



扫码关注公众号,获取更多高质量内容



发布于: 刚刚阅读数: 3
用户头像

攀岩飞鱼

关注

任何一步都不会决定成功,但可以决定失败! 2017-10-19 加入

15年软件从业经验,关注底层技术原理,软件开发,系统架构,研发管理,团队建设等;

评论

发布
暂无评论
强化学习之策略梯度解析:原理+代码+公式,训练小狗捡球!_攀岩飞鱼_InfoQ写作社区