Press "Enter" to skip to content

从零开始构建交叉熵,理解策略梯度

统一的模型训练视角

强化学习(RL)可以做出惊人的成果。最近,ChatGPT使用PPO进行人类反馈微调,这是一种称为策略梯度(PG)的强化学习算法的变体。理解RL,特别是策略梯度,可能是不容易的,特别是如果你像我一样喜欢抓住直觉。本文将通过一系列思考过程,从更熟悉的监督学习设置开始,帮助我真正理解PG。

TL;DR

  • 我们将从设计一个简单的二分类机器人的监督训练过程开始,通过为正确答案奖励+1来进行
  • 我们将为该过程制定目标
  • 我们将为该过程推导梯度上升公式(这将证明与交叉熵的梯度下降相同)
  • 我们将比较我们的过程与RL设置,并将我们的梯度上升与策略梯度相关联

谁应该阅读本文?

  • 我的目标是为理解PG提供友好的、直观的帮助。如果您对RL问题设置有一般了解,并且知道PG是什么,则会很有帮助。
  • 我希望帮助您更好地理解RL与PG和监督ML之间的关系。因此,如果您知道如何使用交叉熵损失函数训练监督ML算法,则会很有帮助。

为什么写这篇文章?

策略梯度

在RL问题中,一个代理与一个环境交互以学习一个策略。该策略告诉代理在不同的状态下做什么以最大化奖励

Image by Author

PG的思想似乎很简单。

  • 在时间t指导代理行为的策略是π_θ(a_t|s_t)。
  • 这是一个某种类型的函数(通常是神经网络),其参数为θ。
  • 获取状态s_t的信息,并输出一个要执行的动作的概率分布a_t。
  • 然后它接收r(s_t,a_t)的奖励
  • 当我们有许多这样的动作和奖励的历史记录时,我们可以更新参数θ,以最大化由π_θ生成的动作产生的期望奖励。

我们如何进行更新?通过…梯度!我们使用以下梯度更新产生π_θ的模型

从零开始构建交叉熵,理解策略梯度 机器学习 第2张

感觉有些不对

这看起来非常熟悉。当我们在好的旧的监督学习中训练神经网络模型时,我们也通过进行第二行操作(在PG情况下,由于我们正在最大化一个目标,它是梯度上升)来更新模型参数,即梯度下降。

但这也感觉非常不同。如果你看看它的推导过程,你就会发现它需要一些努力才能推导出这个方程式。这与我们进行监督学习的更直观方式非常不同:将输入馈送到神经网络中,获得输出,将其与目标进行比较并计算损失函数,点击反向传播按钮,我们就完成了!

此外,对我来说,对数项总是似乎从无处而来。尽管上面的链接中的同一个在线课程解释了如何得到对数项,但这个过程似乎只是一堆正确但缺乏动力的数学。

与监督学习相比,到底有什么不同?实际上,深入探讨这个问题提供了一种理解PG的好方法。此外,这也是提醒我们对我们每天都在做的监督学习中一些熟悉的事情的本质。

从零开始构建交叉熵

如果我们接触到一些监督学习中使用的损失函数,它们很快就会“有意义”。但要理解它从何而来,需要付出更多的努力。例如,良好的均方误差损失直观上是有意义的:它只是最小化预测和目标之间的距离。但有很多距离度量;为什么是平方距离?你必须深入了解,才能看到均方误差是做最大似然的副产品,假设潜在的总体分布是正态分布。

同样,对于我们每天使用的另一个好的损失函数:交叉熵。虽然有许多对交叉熵的解释,但让我们尝试从最基本的方式来构建它

让我们训练一个分类机器人!

假设你想训练一个机器人来分类狗和猫的图像。通过奖励正确答案和惩罚错误答案(或不奖励错误答案)来训练机器人是直观的。下面是具体实现方法:

  • 给机器人提供一张图像。让我们称其为s。该图像是从总体分布D_s中采样得到的
狗的图片来源:Unsplash;其他部分由作者制作
  • 机器人将会告诉你它的答案,它认为这是一张狗的图片(动作a_dog)还是一张猫的图片(动作a_cat)。
  • 机器人具有自己的预测,给出关于该图像是狗还是猫的概率:π_θ(a|s) = (a_dog, a_cat)。例如,π_θ(a|s) = (0.9, 0.1)意味着它认为这是一只狗的概率为0.9,是一只猫的概率为0.1。
狗的图片来源:Unsplash;其他部分由作者制作
  • 但是每次机器人只会给你一个确定的答案。它要么说“这是一只狗”(a_dog),要么说“这是一只猫”(a_cat)。每次给出响应时,响应(动作)是由π_θ(a|s)产生的分布随机抽样得到的:a = (a_dog, a_cat) ~ π_θ(a|s)。
狗的图片来源:Unsplash;其他部分由作者制作
  • 然后,每当机器人回答正确时,你将会奖励它(也许给它一些食物?):r(s,a) = 1。当答案错误时,没有奖励(0奖励):r(s,a) = 0。
狗的图片来源:Unsplash;其他部分由作者制作
猫的图片来源:Unsplash;其他部分由作者制作

这个过程是我在学习监督式机器学习时首先想到的。当它做对时奖励它。当它做错时惩罚它(或者在我们设计的训练过程中根本没有奖励)。这可能是训练某些东西最直观的方式。

最大化目标

我们的机器人的目标是什么?我们希望它的响应尽可能经常正确。更准确地说,我们希望找到产生π_θ(a|s)的最优参数θ*,使得在所有可能出现的s(从图像人口分布D_s中抽样)和a(从模型π_θ(a|s)产生的分布中抽样)中,我们得到每次出现(s,a)的最大平均奖励乘以概率

从零开始构建交叉熵,理解策略梯度 机器学习 第8张

换句话说,我们正在最大化目标函数J(θ),定义为

从零开始构建交叉熵,理解策略梯度 机器学习 第9张

目标函数的梯度

现在我们有了一个目标函数,我们可能可以通过…梯度上升来尝试最大化它!也就是说,我们可以通过迭代执行

从零开始构建交叉熵,理解策略梯度 机器学习 第10张

但是我们应该如何计算梯度,即J对θ的导数?在这种情况下,这有点棘手,因为

  • 我们想要导数的函数是一个期望
  • 如果期望值不依赖于θ的分布,那么根据期望值的线性性,我们可以只对期望值内部的内容进行导数计算并保留期望值。然而,在这种情况下,期望值是关于(s,a)~(D_s,π_θ(a|s))的,这依赖于θ。因此,导数并不明显。
  • 另一种思考这个问题的方法是,J(θ)的值随着我们从部分由θ决定的分布中对(s,a)进行采样的频率的变化而变化。当我们进行梯度上升时,我们如何捕捉θ向这个方向的变化?

此外,理想情况下,我们希望梯度的形式为

从零开始构建交叉熵,理解策略梯度 机器学习 第11张

这是因为你是根据机器人和你的交互样本来训练它。每个样本包括一个三元组(s,a,r)。因此,我们可以通过收集N个样本并计算f(θ,s,a,r)的平均值(根据大数定律,即进行随机梯度上升)来近似这个梯度:

从零开始构建交叉熵,理解策略梯度 机器学习 第12张

然后,我们可以通过执行

从零开始构建交叉熵,理解策略梯度 机器学习 第13张

来进行梯度上升。现在让我们找到f。

寻找梯度

总之,我们要从(1)开始得到(2),得到一些f(θ,s,a,r)。

从零开始构建交叉熵,理解策略梯度 机器学习 第14张

让我们首先使用期望的定义重新编写(1):

从零开始构建交叉熵,理解策略梯度 机器学习 第15张

这基本上是对所有可能的(s,a)对加权概率进行奖励的整合。

现在,一个(s,a)对的联合概率P(s,a)到底是什么?我们可以将其分解为图像样本(s)出现的概率和机器人随机选择行动a的概率。

从零开始构建交叉熵,理解策略梯度 机器学习 第16张

由于机器人随机从机器人的内部预测模型π_θ(a | s)中选择行动a,所以我们有

从零开始构建交叉熵,理解策略梯度 机器学习 第17张

括号内的所有术语中,只有π_θ(a | s)依赖于θ。其他术语都是常数。因此,我们可以将梯度操作移到积分符号内的此术语旁边,并得到

从零开始构建交叉熵,理解策略梯度 机器学习 第18张

请注意,我们也可以写出以下内容。这里没有什么大不了的,只是将原始左侧乘以写成分数的1,并重新排列术语。

从零开始构建交叉熵,理解策略梯度 机器学习 第19张

将其替换回去,稍微重新排列一下,我们得到

从零开始构建交叉熵,理解策略梯度 机器学习 第20张

P(s)π_θ(a | s)看起来很熟悉。这就是我们之前分解的P(s,a)!将其放回,我们有

从零开始构建交叉熵,理解策略梯度 机器学习 第21张

现在我们有一个积分和P(s,a),我们可以……将其重新适应到期望的定义中!

从零开始构建交叉熵,理解策略梯度 机器学习 第22张

这正是我们要在(2)中得到的形式,其中f是括号内的术语!

也许你会想知道为什么我们要在笨拙的分数中重写π_θ(a | s)的梯度?这个想法是创建一个π_θ(a | s)项(我们之前通过对其进行导数而失去的),以便我们可以再次产生一个P(s,a)项,并将积分变回期望!

构建交叉熵

现在是魔术时间。

从零开始构建交叉熵,理解策略梯度 机器学习 第23张

不相信我?用链式法则从右向左推导。 ([可选]旁边的想法:如果您也对策略梯度公式中对数项的动机感到困惑,那么它是我们得到的简化笨拙公式的副产品,旨在提取π_θ(a | s)项以将事物转换回期望。)

因此,我们可以稍微简化J(θ)的梯度:

从零开始构建交叉熵,理解策略梯度 机器学习 第24张

因此,每次我们有一批(s,a)作为样本时,我们可以通过上升梯度来进行:

从零开始构建交叉熵,理解策略梯度 机器学习 第25张

为了更容易理解,我们将梯度符号移动到求和符号外部,得到:

从零开始构建交叉熵,理解策略梯度 机器学习 第26张

同时我们需要通过以下方式翻转符号:

从零开始构建交叉熵,理解策略梯度 机器学习 第27张

这个式子让你想到了什么吗?我们来将其和交叉熵损失函数的梯度下降做比较。

回忆一下交叉熵损失函数:

从零开始构建交叉熵,理解策略梯度 机器学习 第28张

其中,y_i 是真实标签,是一个one-hot向量( y_i_1, y_i_2 ),用于描述一张图片是猫还是狗(分别为(0,1)或(1,0))。y_hat_i 是模型的预测,是一个向量( y_hat_i_1, y_hat_i_2 ),其中两个条目的和为1。

当我们在这个损失函数上进行梯度下降时,我们计算批处理的交叉熵损失函数,并按下反向传播按钮:

从零开始构建交叉熵,理解策略梯度 机器学习 第29张

这个式子和之前得到的梯度上升式子之间的区别在于:

从零开始构建交叉熵,理解策略梯度 机器学习 第30张

简单来说,它的意思是:

  • 模型在样本x_i,y_i上进行预测( y_hat_i_1, y_hat_i_2 )
  • 模型从预测的分布中随机抽取一个响应
  • 如果标签是类别1,即 y_i_1 = 1,y_i_2 = 0,当模型正确地响应1时,我们会用1来奖励模型;而当模型错误地响应0时,我们不会给任何奖励。类似地,对于类别2也是一样的。

这就是我们一直在做的事情!

因此,总结一下:

  • 我们设计了一个简单的训练设置,当机器人回答正确时,我们给予它1分,当回答错误时我们给予它0分
  • 我们总结了一个目标函数,描述了机器人获得的奖励,权重由其响应的机会决定
  • 我们找到了梯度下降过程,以最大化这个目标函数
  • 我们得到了……完全符合我们在训练模型时使用的程序,即先计算交叉熵损失,然后反向传播。

回到强化学习

现在让我们把重点转回到强化学习设置上。强化学习和监督式机器学习有什么不同?

多个时间步

第一个区别是强化学习通常涉及到多个状态和多个周期。在我们的设置中,机器人从图像输入开始,即状态s。机器人根据其预测给出答案并收集奖励后,机器人和你之间的交互就结束了。

相反,在RL问题中,代理通常在多个周期中与环境交互,而且可能在初始状态之后转移到其他状态。

然后,目标函数变成了:

从零开始构建交叉熵,理解策略梯度 机器学习 第31张

换言之,我们最大化所有可能状态和动作序列(轨迹)的期望奖励总和加权权重由参数θ决定

注意,p_θ是代理模型参数θ决定动作时状态和动作序列的联合分布。在每个时间步,代理的行动由π_θ(a_t|s_t)决定,其中π_θ是由θ参数化的模型。p_θ是代理基于π_θ做出决策时,状态和动作序列发生的概率的高层次抽象(即p_θ是理论上代理采取轨迹的频率的占位符。另一方面,π_θ(a|s)是代理将在特定时间步骤采取行动的概率。我们实际上无法轻松知道p_θ的值,因此稍后我们将用我们实际知道的模型输出π_θ(a|s)重写它)。

让我们将其与早期目标进行比较:

从零开始构建交叉熵,理解策略梯度 机器学习 第9张

主要区别在于:

  • 我们计算期望序列s和a而不仅仅是一对。
  • 我们最大化轨迹中所有时间步的奖励总和,而不仅仅是来自图像和答案的单个时间步奖励。

比较梯度公式

我们可以对这个目标进行类似的操作,以推导我们可以在每个时间步使用来更新θ的梯度。

回顾一下,我们的目标是找到以下形式的J(θ)的梯度,其中f是一些函数

从零开始构建交叉熵,理解策略梯度 机器学习 第33张

当我们获得一批样本的状态和动作序列s_1,a_1,r_1,…s_T,a_T,r_T时,我们可以通过随机梯度上升来更新θ:

从零开始构建交叉熵,理解策略梯度 机器学习 第34张

为了简化问题,让我们用一个变量τ表示状态和序列。

从零开始构建交叉熵,理解策略梯度 机器学习 第35张

因此,我们希望最大化以下目标函数

从零开始构建交叉熵,理解策略梯度 机器学习 第36张

我们可以进行类似于我们所做的操作:

  • 使用积分将期望表示为积分的形式

从零开始构建交叉熵,理解策略梯度 机器学习 第37张

  • 对涉及θ的唯一项,即p_θ(τ),进行导数处理

从零开始构建交叉熵,理解策略梯度 机器学习 第38张

  • 将p_θ(τ)的梯度重写为p_θ(τ)和其他内容的乘积,以恢复定义期望的形式

从零开始构建交叉熵,理解策略梯度 机器学习 第39张

因此,我们得到

从零开始构建交叉熵,理解策略梯度 机器学习 第40张

咦!这正是我们要找的东西。简言之,它意味着我们在更新θ时沿着样本τ的对数概率梯度方向更新,这些样本是在θ确定的动作下采样的,加权采样τ的总奖励这正是策略梯度的公式。

如果我们将交叉熵类比扩展到先前的话,总奖励的和基本上是轨迹的标签,p_θ(τ)是模型预测下τ发生的可能性。训练过程鼓励模型预测与不同轨迹τ上奖励的分布类似的分布。(如果您了解KL散度,这实际上是一个数学上准确的陈述[如果我错了请纠正我]。请将正在梯度中的内容与KL散度进行比较)。

我们可以用条件概率和p_θ(τ)的定义进行一些操作。该过程在此视频中得到了很好的解释(大约在9:27左右)。我们最终得到了以下重写p_θ(τ)作为我们实际上知道其值的π_θ(a_t|s_t)的结果:

从零开始构建交叉熵,理解策略梯度 机器学习 第41张

请注意当T = 1(单个情节)时,这与我们在之前的设置中得到的梯度相同。换句话说,监督学习是RL的一个特例,其中只有一个情节,奖励是非随机的(请参见下一节)。

另一个区别:估计奖励

RL和监督学习之间的另一个区别是我们可以信任奖励的程度。在监督学习中,奖励是随图像样本提供的基本事实标签。我们通常可以确信这些奖励是正确的,我们的机器人会根据这些标签调整其行为。

然而,在RL问题中,奖励可能会更加随机(想象一下当您玩游戏时,您可能在同一个位置两次,但得分不同)。因此,我们必须估计特定状态-动作对的奖励,并以历史奖励为基础与环境进行交互。

[可选] 副思考:我也在思考是否有监督学习(其中标签/奖励的可信度为100%)和RL(奖励更加随机)之间的中间地带。当标签有噪声(包含一些错误标签)时,我们是否处于中间地带?因此,伪标记方法是否与RL问题有一些相似之处?让我知道您的想法。

从长远来看,我们应该有足够的历史奖励来了解平均奖励行为,但在短期内,样本数量较少可能会产生不稳定、有偏差的估计。

更糟糕的是,由于代理行为是通过收集的奖励来更新的,如果我们收集到低质量的奖励,我们可能会陷入并停留在一个糟糕的策略中。而要重新回到正确的轨道上则需要很长时间。

这是RL中仍然是一个正在研究的领域的挑战。对奖励进行一些操作以及如TRPO和PPO等策略梯度的变体旨在更好地解决这个问题,并且已经比香草PG更常用。

[可选] 另一个副思考:与序列监督学习的比较

我们的监督学习设置与RL之间的一个区别是RL通常涉及多个时间步。我立即想到了一个问题:那么RL与训练像Transformer或LSTM这样的顺序模型有什么区别?

这个问题的答案肯定取决于您最喜欢的顺序模型训练的确切损失设计。

目前,我们说您训练一个序列模型f( x_1,x_2,…x_T )来预测y_1, y_2…y_T。例如,在机器翻译任务中,x可能是输入英语句子的单词,y是输出法语句子的单词(每个x_t, y_t都是单词的一种独热向量表示)。

我们通过取每个单词输出预测和真实标签之间的交叉熵之和来计算每个样本的损失函数。我们将其平均到一批样本中,并进行以下反向传播:

从零开始构建交叉熵,理解策略梯度 机器学习 第42张

将其放回到策略梯度公式中,对我来说,这与计算目标函数的梯度相同,如下所示:

从零开始构建交叉熵,理解策略梯度 机器学习 第43张

这种公式与PG的公式之间的区别在于,我们没有将所有时间步的预测的总对数概率乘以所有步骤的奖励总和。相反,我们取每个时间步的对数概率和奖励的成对乘积并将它们相加。

这消除了很多项,从而大大降低了梯度的方差,这可能是使在监督设置下训练Transformer/LSTM比RL算法更容易的原因之一(除了监督设置中的非随机奖励)。

在这个视频中介绍了一种减少PG方差的技术:将所有时间步的奖励总和在PG中改为奖励(即从t’=t到t’=T的总和)。这与PG和在监督设置中训练Transformer/LSTM之间的差异具有类似的风味。虽然奖励的方式使代理人通过可能的未来奖励来评估每个状态,但我们可以说,监督顺序训练使模型只关注当前时间步的正确性吗?

此外,我试图从这个梯度表达式开始倒推,并找到导致这个梯度表达式的原始J(θ),这样我们就可以更直接地解释监督顺序训练的目标。但我卡在了一半。如果您有任何想法,请告诉我。

致谢

策略梯度和交叉熵之间的联系不是我自己的原创想法。感谢这篇文章为我提供了思路,以便更基本地理解交叉熵和策略梯度的作用。

Leave a Reply

Your email address will not be published. Required fields are marked *