强化学习算法入门
前言
策略梯度(Policy Gradient)算法最早是由Richard S. Sutton等人于1999年提出的。
强化学习大致分为基于值函数的强化学习、基于策略的强化学习、基于策略和值函数的强化学习。本文会从目标函数开始介绍,逐步引入一种最简单的基于策略的强化学习算法——策略梯度算法,最后介绍了能够提高决策效率的优势函数公式。掌握策略梯度算法是进入强化学习领域的重要一步。许多后续强化学习算法的提出,都是在该算法的基础上不断优化和改进,特别是通过结合不同的策略和价值函数方法来增强算法的效率和效果。
思考:把大象装进冰箱需要几步?
一、强化学习的目标函数
1、学会神经网络只需三步
经常把大象装入冰箱的人应该都知道:把大象放入冰箱需要几个步骤?
公布下正确答案:3步——打开冰箱门,把大象装进冰箱,关上冰箱门。(如上图所示)
看似这个问题与本文无关紧要,实际上它可以帮助我们进一步理解深度学习。
任何深度学习模型的创建无非也就是这三步。
打开冰箱门(定义一个神经网络模型架构)——把大象放进去(评价该网络模型的好坏)——关闭冰箱门(基于好坏更新参数,直到最优)
以强化学习为例,第一步就是指构造智能体的动作空间、状态空间、奖励函数以及初始化神经网络种类、层数、神经元数量和各种超参数(如学习率)等。
第二步就是评价强化学习模型的好坏,通常会构造一个损失函数来评价该模型的好坏。损失函数是为优化过程提供一个明确的度量标准而设定的,因此它是模型优化和求解的核心。
第三步优化模型,神经网络常用的方法是梯度下降,即用损失函数的梯度来优化神经网络参数,而强化学习中采用的方法正好与之相反,叫做梯度上升。
2、强化学习的目标函数
在强化学习中,目标函数用于量化智能体在环境中的表现,从而引导其学习更优的策略。通常,智能体的核心目标是学到一个最佳策略,以便在长期运行中获得最大的回报,即最大化累积奖励。
累积奖励是指整个交互过程中所有时间步的奖励总和。此时,智能体在每个时间步的决策不仅关注当前时刻的即时奖励,还会考虑整个回合的长期收益。
假设一个回合的步长总数为 ( T ),即时奖励为 ( r ),则总奖励的公式如下:
R = ∑ t = 0 T r t + 1 R=\sum\limits_{t=0}^T r_{t+1} R=t=0∑Trt+1
上述公式是强化学习中最基础的目标函数。随着强化学习算法的不断发展,该目标函数逐渐衍生出多种不同的版本。
二、策略梯度原理
2.1 目标函数的获取
假设以参数为 θ t \theta_t θt的智能体与环境交互,获得的总奖励为 R ( θ t ) R(\theta_t) R(θt)。我们先从 R ( θ t ) R(\theta_t) R(θt)入手,看一下 R ( θ t ) R(\theta_t) R(θt)是如何计算的。
实际上这个 R ( θ t ) R(\theta_t) R(θt)并不是一成不变的,因为每次交互中,代理在同一状态下做出什么动作,以及环境从某个状态和动作下转换成下一个状态,都具有一定的随机性,哪怕是同一个参数 θ t θ_t θt下。所以我们可以采用统计法,用总奖励的期望值来替代。假设轨迹 τ = { s 1 , a 1 , r 1 , . . . s n , a n , r n } \tau=\{ s_1,a_1,r_1,...s_n,a_n,r_n\} τ={s1,a1,r1,...sn,an,rn},该轨迹是由内部参数为 θ t θ_t θt的代理 π ( θ t ) \pi(\theta_t) π(θt)与环境互动产生的。那么这个轨迹发生的概率为:
p θ t ( τ ) = p ( s 1 ) p θ t ( a 1 ∣ s 1 ) p ( s 2 ∣ s 1 , a 1 ) p θ t ( a 2 ∣ s 2 ) p ( s 3 ∣ s 2 , a 2 ) . . . = p ( s 1 ) ∏ n = 1 N p θ t ( a n ∣ s n ) p ( s n + 1 ∣ s n , a n ) p_{\theta_t}(\tau)= p(s_1)p_{\theta_t}(a_1|s_1)p(s_2|s_1,a_1)p_{\theta_t}(a_2|s_2)p(s_3|s_2,a_2)... \\=p(s_1)\prod\limits_{n=1}^Np_{\theta_t}(a_n|s_n)p(s_{n+1}|s_n,a_n) pθt(τ)=p(s1)pθt(a1∣s1)p(s2∣s1,a1)pθt(a2∣s2)p(s3∣s2,a2)...=p(s1)n=1∏Npθt(an∣sn)p(sn+1∣sn,an)
同时,假设该轨迹产生的总奖励为 R ( τ ) R(\tau) R(τ)。那么期望总奖励 R ‾ ( θ t ) \overline R(\theta_t) R(θt)即为多个轨迹产生的总奖励均值,其计算公式为:
R ‾ ( θ t ) = ∑ τ R ( τ ) p θ t ( τ ) = E τ ∼ p θ t ( τ ) [ R ( τ ) ] \overline R(\theta_t)=\sum\limits_\tau R(\tau)p_{\theta_t}(\tau)\\=\mathbb{E}_{\tau\sim p_{\theta_t}(\tau)}[R(\tau)] R(θt)=τ∑R(τ)pθt(τ)=Eτ∼pθt(τ)[R(τ)]
也就是说,总奖励使用 τ \tau τ出现的概率进行加权,然后对所有的 R R R进行求和,也就是求期望值。
2.2 梯度上升策略
我们已经求出了目标函数,下一步就是用目标函数来更新参数,以使得智能体获得最大的总奖励值。代理采取梯度上升策略来更新其内部参数。同时代理将目标函数等价于损失函数来更新参数,更新公式如下:
θ t + 1 = θ t + α ▽ R ‾ ( θ t ) \theta_{t+1}=\theta_t+\alpha\triangledown \overline R(\theta_t) θt+1=θt+α▽R(θt)
其中 θ t θ_t θt 是代理在t时刻的参数, α α α 是学习率, ▽ R ‾ ( θ t ) \triangledown \overline R(\theta_t) ▽R(θt)是基于参数 θ t θ_t θt做出的总奖励值 R R R的梯度。
▽ R ‾ ( θ t ) = ∂ R ∂ θ ∣ θ = θ t \triangledown \overline R(\theta_t)=\frac{\partial R}{\partial \theta}\mid_{\theta=\theta_t} ▽R(θt)=∂θ∂R∣θ=θt
那么,该如何计算奖励值R对参数 θ t θ_t θt的梯度呢?
2.3 对目标函数求梯度
根据上面2.1节的分析,目标函数的公式如下:
R
‾
(
θ
t
)
=
∑
τ
R
(
τ
)
p
θ
t
(
τ
)
\overline R(\theta_t)=\sum\limits_\tau R(\tau)p_{\theta_t}(\tau)
R(θt)=τ∑R(τ)pθt(τ)
这里的 R ( τ ) R(\tau) R(τ)是从环境从特定状态和动作下给出的具体数值,与 θ t \theta_t θt参数无关。因此,我们对总奖励期望 R ( θ t ) R(\theta_t) R(θt)求导可得:
▽ R ‾ ( θ t ) = ∑ τ R ( τ ) ▽ p θ t ( τ ) \triangledown \overline R(\theta_t)=\sum\limits_\tau R(\tau) \triangledown p_{\theta_t}(\tau) ▽R(θt)=τ∑R(τ)▽pθt(τ)
为不失一般性,这里的 θ t \theta_t θt可以指任意 θ \theta θ。
▽ R ‾ ( θ ) = ∑ τ R ( τ ) ▽ p θ ( τ ) \triangledown \overline R(\theta)=\sum\limits_\tau R(\tau) \triangledown p_{\theta}(\tau) ▽R(θ)=τ∑R(τ)▽pθ(τ)
下面,我们计算一下概率p如何对参数 θ \theta θ求导:
在此之前,我们需要用到一个公式: ▽ l o g f ( x ) = 1 f ( x ) ▽ f ( x ) \triangledown log f(x) =\frac{1}{f(x)}\triangledown f(x) ▽logf(x)=f(x)1▽f(x),应用到上面的公式:
▽ R ‾ ( θ ) = ∑ τ R ( τ ) p θ ( τ ) ▽ l o g p θ ( τ ) \triangledown \overline R(\theta)=\sum\limits_\tau R(\tau)p_{\theta}(\tau) \triangledown log p_{\theta}(\tau) ▽R(θ)=τ∑R(τ)pθ(τ)▽logpθ(τ)
上述公式可以看出,我们对 τ \tau τ进行求和,把 R ( τ ) R(\tau) R(τ)和 ▽ l o g p θ ( τ ) \triangledown logp_\theta(\tau) ▽logpθ(τ)这两项用 p θ ( τ ) p_\theta(\tau) pθ(τ)进行加权。
此时我们可以这么想, ∑ τ p θ ( τ ) f ( τ ) = E τ ∼ p θ ( τ ) [ f ( τ ) ] \sum\limits_\tau p_\theta(\tau)f(\tau)=\mathbb{E}_{\tau\sim p_\theta(\tau)}[f(\tau)] τ∑pθ(τ)f(τ)=Eτ∼pθ(τ)[f(τ)],那么就有:
▽ R ‾ ( θ ) = E τ ∼ p θ ( τ ) [ R ( τ ) ▽ l o g p θ ( τ ) ] \triangledown \overline R(\theta)=\mathbb{E}_{\tau\sim p_\theta(\tau)}[R(\tau)\triangledown log p_{\theta}(\tau)] ▽R(θ)=Eτ∼pθ(τ)[R(τ)▽logpθ(τ)]
同样的,求期望是理想情况,而实际可以用采样N个轨迹求均值得到:
E τ ∼ p θ ( τ ) [ R ( τ ) ▽ l o g p θ ( τ ) ] ≈ 1 N ∑ n = 1 N R ( τ n ) ▽ l o g p θ ( τ n ) \mathbb{E}_{\tau\sim p_\theta(\tau)}[R(\tau)\triangledown log p_{\theta}(\tau)]\approx\frac{1}{N}\sum\limits_{n=1}^NR(\tau^n)\triangledown logp_\theta(\tau^n) Eτ∼pθ(τ)[R(τ)▽logpθ(τ)]≈N1n=1∑NR(τn)▽logpθ(τn)
同时,对 ▽ l o g p θ ( τ ) \triangledown logp_{\theta}(\tau) ▽logpθ(τ)进行详细分析(结合2.1节公式):
▽ l o g p θ ( τ ) = ▽ ( l o g p ( s 1 ) + ∑ t = 1 T l o g p θ ( a t ∣ s t ) + ∑ t = 1 T l o g p ( s t + 1 ∣ s t , a t ) ) = ▽ l o g p ( s 1 ) + ▽ ∑ t = 1 T l o g p θ ( a t ∣ s t ) + ▽ ∑ t = 1 T l o g p ( s t + 1 ∣ s t , a t ) \triangledown logp_{\theta}(\tau)=\triangledown (logp(s_1)+\sum\limits_{t=1}^Tlogp_\theta(a_t|s_t)+\sum\limits_{t=1}^Tlogp(s_{t+1}|s_t,a_t))\\=\triangledown logp(s_1)+\triangledown\sum\limits_{t=1}^Tlogp_\theta(a_t|s_t)+\triangledown\sum\limits_{t=1}^Tlogp(s_{t+1}|s_t,a_t) ▽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)
由于环境的转换概率(如 l o g p ( s 1 ) 、 l o g p ( s t + 1 ∣ s t , a t ) logp(s_1)、logp(s_{t+1}|s_t,a_t) logp(s1)、logp(st+1∣st,at))与参数 θ \theta θ无关,所以:
▽ l o g p θ ( τ ) = ▽ ∑ t = 1 T l o g p θ ( a t ∣ s t ) = ∑ t = 1 T ▽ l o g p θ ( a t ∣ s t ) \triangledown logp_{\theta}(\tau)=\triangledown\sum\limits_{t=1}^Tlogp_\theta(a_t|s_t)\\=\sum\limits_{t=1}^T \triangledown logp_\theta(a_t|s_t) ▽logpθ(τ)=▽t=1∑Tlogpθ(at∣st)=t=1∑T▽logpθ(at∣st)
2.4 策略梯度公式
结合上面的分析,对期望总奖励求导公式可以进一步整理成以下公式:
E τ ∼ p θ ( τ ) [ R ( τ ) ▽ l o g p θ ( τ ) ] ≈ 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ▽ l o g p θ ( a t n ∣ s t n ) \mathbb{E}_{\tau\sim p_\theta(\tau)}[R(\tau)\triangledown log p_{\theta}(\tau)]\approx\frac{1}{N}\sum\limits_{n=1}^N\sum\limits_{t=1}^{T_n}R(\tau^n)\triangledown logp_\theta(a_t^n|s_t^n) Eτ∼pθ(τ)[R(τ)▽logpθ(τ)]≈N1n=1∑Nt=1∑TnR(τn)▽logpθ(atn∣stn)
三、优势函数
在第二章期望总奖励公式中, R ( τ ) R(\tau) R(τ)指的是轨迹 τ \tau τ所获得的总奖励值。首先,我们先列出该公式:
R ( τ ) = ∑ t = 0 T τ r t R(\tau)=\sum\limits_{t=0}^{T_\tau} r_t R(τ)=t=0∑Tτrt
其中, r t r_t rt是在t时刻的即时奖励。 T τ T_\tau Tτ是指轨迹 τ \tau τ的总步长。
1、加入基线
结合2.4节中的期望总奖励求导公式,我们发现, R ( τ ) R(\tau) R(τ)在策略梯度里起到的作用是在 ▽ l o g p θ ( τ ) \triangledown logp_\theta(\tau) ▽logpθ(τ)大小和方向上加一个权重,这个权重的大小取决于获取总奖励值的大小。例如,在相同的状态s上,做出动作a和c后分别获得的R为1分和3分,那么模型更新后就会在状态s上增加c的概率高一些,增加a的概率小一些。但是这样会出现一个问题,那就是如果还有个决定b并没有被采用过,假设执行它获得的分数R是2分,但是模型更新后并不会增加b的概率。这样,相对于c和a来讲,执行b的概率就是减小了的。所以,为了避免这个问题,我们给奖励R加一个基线b。改进后的公式如下:
▽ R ‾ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n ( R ( τ n ) − b ) ▽ l o g p θ ( a t n ∣ s t n ) \triangledown \overline{R}_\theta\approx\frac{1}{N}\sum\limits_{n=1}^N\sum\limits_{t=1}^{T_n}(R(\tau^n)-b)\triangledown logp_\theta(a_t^n|s_t^n) ▽Rθ≈N1n=1∑Nt=1∑Tn(R(τn)−b)▽logpθ(atn∣stn)
通过加入基线,可以使得修正后的总奖励有正有负,消除了当整体奖励为正数时,采样到的动作概率变高,而未被采样的动作概率值相对变低的现象。
基线通常选取为奖励值的均值: b ≈ E [ R ( τ ) ] b\approx E[R(\tau)] b≈E[R(τ)]
2、取消动作之前的奖励
在一个交互回合中,我们对所有的状态-动作选择概率 l o g p θ ( a t ∣ s t ) logp_\theta(a_t|s_t) logpθ(at∣st)用一样的总奖励 R ( τ ) R(\tau) R(τ)进行了加权。这显然是不好的,因为总奖励不好并不完全代表当前动作也不好。同时也可以看出,在某一步长下对状态s采取的任意行动是不会影响到在状态s之前获得的奖励的。那么我们完全可以用对状态s采取行动a之后的总奖励来替代全部过程的总奖励,然后再对该状态-动作对的概率进行加权。
也就是改成为下面的公式:
▽ R ‾ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n ( ∑ t ′ = t T n r t ′ n − b ) ▽ l o g p θ ( a t n ∣ s t n ) \triangledown \overline{R}_\theta\approx\frac{1}{N}\sum\limits_{n=1}^N\sum\limits_{t=1}^{T_n}(\sum\limits_{t'=t}^{T_n}r_{t'}^n-b)\triangledown logp_\theta(a_t^n|s_t^n) ▽Rθ≈N1n=1∑Nt=1∑Tn(t′=t∑Tnrt′n−b)▽logpθ(atn∣stn)
该公式将原来的整体总奖励权重,改变成了从当前时刻起,直到整个回合结束,获得的所有奖励总和。以此为依据来判断当前状态下某一行动的好坏。
3、加入折扣因子
从当前时刻t开始计算后续整个回合的所有奖励值时,如果回合太长且不确定性太大怎么办?
如果我们更看重短期回报怎么办?
这个时候我们需要加入一个折扣因子 γ \gamma γ,来帮助均衡一下短期利益与长期利益,减小计算回报的复杂性,加速收敛性。
整体公式如下:
▽ R ‾ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n ( ∑ t ′ = t T n γ t ′ − t r t ′ n − b ) ▽ l o g p θ ( a t n ∣ s t n ) \triangledown \overline{R}_\theta\approx\frac{1}{N}\sum\limits_{n=1}^N\sum\limits_{t=1}^{T_n}(\sum\limits_{t'=t}^{T_n}\gamma^{t'-t} r_{t'}^n-b)\triangledown logp_\theta(a_t^n|s_t^n) ▽Rθ≈N1n=1∑Nt=1∑Tn(t′=t∑Tnγt′−trt′n−b)▽logpθ(atn∣stn)
加入折扣因子会避免太长的回合导致当前动作的影响性变小,该折扣因子是个超参数,可以人为设置。
此时,我们将修改后总奖励值称之为优势函数:
A θ ( s t , a t ) = ∑ t ′ = t T n γ γ < 1 t ′ = t r t ′ n − b A^\theta(s_t,a_t)=\sum\limits_{t'=t}^{T_n}\gamma_{\gamma<1}^{t'=t}r_{t'}^n-b Aθ(st,at)=t′=t∑Tnγγ<1t′=trt′n−b
其中 γ \gamma γ(介于[0,1])为折扣因子,它表示了未来奖励值相对于当前奖励值的重要性。b是基线,是对总体奖励值的修正。 r t ′ n r_{t'}^n rt′n是在第n个轨迹下的第t’个步长下获得的即时奖励。
4、加入优势函数后的策略梯度公式
在强化学习中,计算 R ‾ θ \overline{R}_\theta Rθ梯度的公式如下:
▽ R ‾ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n A θ ( s t , a t ) ▽ l o g p θ ( a t n ∣ s t n ) \triangledown\overline{R}_θ ≈\frac{1}{N}\sum\limits_{n=1}^N\sum\limits_{t=1}^{T_n}A^\theta(s_t,a_t)\triangledown{log}p_\theta(a_t^n|s_t^n) ▽Rθ≈N1n=1∑Nt=1∑TnAθ(st,at)▽logpθ(atn∣stn)
其中,N是采样轨迹 τ \tau τ的数量, T n T_n Tn是在第n个采样轨迹下的步长数量,优势函数 A θ ( s t , a t ) A^\theta(s_t,a_t) Aθ(st,at)是指参数 θ \theta θ的代理在状态 s t s_t st下采取动作 a t a_t at后获得的加权总体奖励值。 ▽ \triangledown ▽代表了梯度,log是取对数, p θ ( s t ∣ a t ) p_\theta(s_t|a_t) pθ(st∣at)是指参数 θ \theta θ的代理在状态 s t s_t st下采取动作 a t a_t at的概率。
总结
本文重点描述了策略梯度算法的原理,介绍了如何通过优化目标函数和利用优势函数来提升智能体的决策性能,以实现长期奖励最大化。掌握了上面的内容,你就已经入门基于策略的强化学习算法了。