1. 策略梯度算法
强化学习有3个组成部分:演员(actor)、环境和奖励函数。环境与奖励函数不是我们可以控制的,它们是在开始学习之前给定的。我们唯一需要做的就是调整演员里面的策略,使得演员可以得到最大的奖励
策略一般记作π。假设我们使用深度学习来做强化学习,策略就是一个网络。网络里面有一些参数,我们用θ来代表π的参数。网络的输入是智能体看到的东西,输出是我们可以执行的动作,有几个动作,输出层就有几个神经元
我们把初始状态记作s1,把第一次执行的动作记作a1,把第一次执行动作以后得到的奖励记作r1。不同的人有不同的记法,有人觉得在s1执行a1得到的奖励应该记为r2,这两种记法都可以
一场游戏称为一个回合。将这场游戏里面得到的所有奖励都加起来,就是总奖励(total reward),也就是回报,我们用R来表示它
在一场游戏里面,我们把环境输出的s与演员输出的动作a全部组合起来,就是一个轨迹,即
τ={s1,a1,s2,a2,⋯,st,at}
给定演员的参数θ,我们可以计算某个轨迹τ发生的概率为
pθ(τ)=p(s1)pθ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)⋯=p(s1)t=1∏Tpθ(at∣st)p(st+1∣st,at)
p(st+1∣st,at)代表的是环境,通常我们无法控制环境,因为环境是设定好的。我们能控制的是pθ(at∣st)
我们把轨迹所有的奖励r都加起来,就得到了R(τ),其代表某一个轨迹τ的奖励。我们要做的就是调整演员内部的参数θ,使得R(τ)的值越大越好。但实际上R(τ)并不只是一个标量(scalar),它是一个随机变量。因为演员在同样的状态下采取的动作有随机性;环境产生的观测也有随机性的。我们能够计算的是R(τ)的期望值。我们可以根据θ算出某一个轨迹R(τ)出现的概率,接下来计算τ的总奖励。对所有τ的总奖励使用出现的概率进行加权求和就是期望值
Eτ∼pθ(τ)[R(τ)]=τ∑R(τ)pθ(τ)=Rˉθ
因为我们要最大化期望奖励,所以可以使用梯度上升(gradient ascent)。我们先要计算期望奖励Rˉθ的梯度
∇Rˉθ=τ∑R(τ)∇pθ(τ)
因为计算的是关于θ的梯度,其中只有pθ(τ)与θ有关,因此只对其计算梯度
一般地,根据对数函数f(x)=logx的导数为x1,可以将函数的梯度计算公式构造为
∇f(x)=f(x)f(x)∇f(x)=f(x)∇logf(x)
特别地,对于对∇pθ(τ)有
∇pθ(τ)=pθ(τ)∇logpθ(τ)
于是我们可以进一步计算期望奖励Rˉθ的梯度
∇Rˉθ=τ∑R(τ)∇pθ(τ)=τ∑R(τ)pθ(τ)∇logpθ(τ)=Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]
实际上期望值Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]无法计算,我们需要使用采样的方式来得到梯度的期望值
Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]≈N1n=1∑NR(τn)∇logpθ(τn)
∇logpθ(τ)可以继续展开为
∇logpθ(τ)=∇(logp(s1)+t=1∑Tlogpθ(at∣st)+t=1∑Tlogpθ(st+1∣st,at))=∇logp(s1)+∇t=1∑Tlogpθ(at∣st)+∇t=1∑Tlogp(st+1∣st,at)=∇t=1∑Tlogpθ(at∣st)=t=1∑T∇logpθ(at∣st)
因为p(s1)和p(st+1∣st,at)由环境决定,因此对θ的梯度为0
最终,期望的梯度公式可以写为
∇Rˉθ=τ∑R(τ)∇pθ(τ)=τ∑R(τ)pθ(τ)∇logpθ(τ)=Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]≈N1n=1∑NR(τn)∇logpθ(τn)=N1n=1∑Nt=1∑TnR(τn)∇logpθ(atn∣stn)
直观理解为:能够使获得的期望增大的参数变化方向(期望的梯度)与最终的奖励和使对应状态-动作对出现的概率增大的参数变化方向(策略的梯度)有关。即我们在st执行at,最终的奖励为正,我们就要增加在st执行at的概率
关键点如下
-
∇pθ(τ)无法计算,需要将求梯度操作变换到pθ(at∣st)即神经网络函数上去
-
通过引入log运算,将pθ(τ)展开后的乘法变为加法
-
通过求期望操作来消除式中的pθ(τ),并使用采样的方式来计算期望值
我们在得到期望的梯度公式后可以使用梯度上升来更新参数,使得期望值最大。参数更新公式如下
θ→θ+η∇Rˉθ
η为学习率,需要要调整,可用Adam、RMSProp等方法来调整学习率
整个过程为
- 我们要用参数为θ的智能体与环境多次交互,将交互的数据记录下来
- 遍历交互数据中的每一个s与a的对,求对数概率(log probability),然后取梯度并在前面乘上奖励,对每个结果求和并取平均值
- 使用梯度上升来更新参数
一般策略梯度(policy gradient,PG)采样的数据只会用一次。我们采样这些数据,然后用这些数据更新参数,再丢掉这些数据。接着重新采样数据,才能去更新参数
我们可以把强化学习想成一个分类问题,这个分类问题就是输入一个图像,输出某个类。在一般的分类问题里面,我们在实现分类的时候,目标函数都会写成最小化交叉熵(cross entropy),最小化交叉熵就是最大化对数似然(log likelihood)。强化学习与分类问题唯一不同的地方是损失前面乘一个权重————整场游戏得到的总奖励R(τ)
2. 策略梯度实现技巧
2.1 添加基线
第一个技巧:添加基线(baseline)。但在很多情况下面,奖励总是正的,最低都是 0。假设我们在某一个状态有3个动作,虽然奖励总是正,参数的更新方向总是使得概率提高,但是获得的奖励不同导致权重不同,概率提高便有大有小。所以提高少的,在做完归一化(normalize)以后,动作出现的概率就是下降的;提高多的,该动作的概率才会上升
这是一个理想的情况,但是实际上,我们是在做采样,所以有一些动作可能从来都没有被采样到。其他动作的奖励都是正的,这些动作的奖励为0,经过归一化后概率就会下降。因此我们希望奖励不总是正的
我们可以把奖励减b,即
∇Rˉθ=N1n=1∑Nt=1∑Tn(R(τn)−b)∇logpθ(atn∣stn)
其中,b称为基线。这样就可以让R(τn)−b有正有负,如果R(τn)>b,那么状态-动作对概率上升;反之亦然。
2. 策略梯度的推导
策略梯度算法的推导过程如下