强化学习 策略梯度

策略梯度

value based的强化学习方法对价值函数进行了近似表示,policy based使用了类似的思路,策略(pi)可以被描述为一个包含参数( heta)的函数

[pi_{ heta}(s, a)=P(a | s, heta) approx pi(a | s) ]

我们可以假设有一个策略(pi_ heta(a|s)),那么我们其实有一个概率(p(s'|s,a)),表示状态转移概率,它受参数( heta)的影响,整条路径可以用( au)表示,

[underbrace{p_{ heta}left(mathbf{s}_{1}, mathbf{a}_{1}, ldots, mathbf{s}_{T}, mathbf{a}_{T} ight)}_{p_{ heta}( au)}=pleft(mathbf{s}_{1} ight) prod_{t=1}^{T} pi_{ heta}left(mathbf{a}_{t} | mathbf{s}_{t} ight) pleft(mathbf{s}_{t+1} | mathbf{s}_{t}, mathbf{a}_{t} ight) ]

那么我们的目的就是优化( heta)使得期望总回报最大,

[ heta^* = argmax_ heta E_{ ausim p_ heta( au)} left[sum_tgamma(s_t,a_t) ight] ]

由于我们没有办法直接计算出期望总回报,只能通过与环境的交互,通过多次采样来获得期望值。

由此我们可以得到类似机器学习里的目标函数,并且用多次取样来近似计算它

[J( heta)=E_{ ausim p_ heta( au)} left[sum_tgamma(s_t,a_t) ight]approx frac{1}{N}sum_{i=1}^N sum_t gamma(s_{i,t},a_{i,t}) ]

slide有些不一致,(p_ heta( au))(pi_ heta( au))等价,都是表示一个策略,经过一系列推导可以求得目标函数的导数

[ abla_ heta J( heta) = E_{ au sim pi_{ heta}( au)}left[ abla_{ heta} log pi_{ heta}( au) r( au) ight] ]

我们可以经过一系列推导并移除式子中导数为0的项以得到更确切的公式:

1584633176232

[ abla_{ heta} J( heta)=E_{ au sim au_{*}( au)}left[left(sum_{t=1}^{T} abla_{ heta} log pi_{ heta}left(mathbf{a}_{t} | mathbf{s}_{t} ight) ight)left(sum_{t=1}^{T} rleft(mathbf{s}_{t}, mathbf{a}_{t} ight) ight) ight] ]

有了上面的梯度公式,我们就可以给定初始( heta)和环境交互得到目标函数的梯度来增大期望回报。也即是说,通过采样来更新( heta)

那么策略(pi)具体是什么形式呢?

在离散行为空间中常用softmax策略函数,因为策略需要满足对于任意状态(s in S) 均有(sum_api(a|s)=1),为此,引入动作偏好函数,利用 动作偏好的softmax值作为策略

[pi(a | S ; heta)=frac{e^ {h(s, a ; heta)}}{sum_{a^{prime}} e^ {hleft(s, a^{prime} ; heta ight)}} ]

则可以求出相应分值函数的导数

[ abla_{ heta} log pi_{ heta}(s, a)=phi(s, a)-mathbb{E}_{pi heta}[phi(s, a)] ]

在连续行为空间中常用高斯策略,其行为从高斯分布( mathbb{N}left(phi(mathbf{s})^{mathrm{T}_ heta} , sigma^{2} ight) )中产生,其对应log函数的导数

[ abla_{ heta} log pi_{ heta}(s, a)=frac{left(a-phi(s)^{T_ heta} ight) phi(s)}{sigma^{2}} ]


之前提到的

[J( heta)=E_{ ausim p_ heta( au)} left[sum_tgamma(s_t,a_t) ight]approx frac{1}{N}sum_{i=1}^N sum_t gamma(s_{i,t},a_{i,t}) ]

采样N次后可以估计出目标函数的梯度

[ abla_{ heta} J( heta) approx frac{1}{N} sum_{i=1}^{N}left(sum_{t=1}^{T} abla_{ heta} log pi_{ heta}left(mathbf{a}_{i, t} | mathbf{s}_{i, t} ight) ight)left(sum_{t=1}^{T} rleft(mathbf{s}_{i, t}, mathbf{a}_{i, t} ight) ight) ]

截至目前,我们就可以给出我们的强化学习算法:

  1. sample ({ au^i}) from (pi_ heta(a_t|s_t)) (run the policy)
  2. 用上面的梯度公式计算梯度
  3. ( heta leftarrow heta+alpha abla_ heta J( heta))

或许你看到会有疑问——策略(pi_ heta(a_t|s_t))具体是什么?我们可以举一个自动驾驶的例子,策略的状态s就是当前道路情况,动作a就是左转、右转、执行,参数( heta)就是神经网络的权重、偏置。

由于采样的不确定性,前面的算法会有很大的方差。

那么如何减小算法的方差呢??

一个基本的原则是policy at time t' can not affect reward at time t when t < t'(后面的策略不会影响之前的奖励)

1584799716446

(hat{Q}_{i,t})代表在第(i)次取样中从(t)时刻到最后获得的reward的和

[ abla_{ heta} J( heta) approx frac{1}{N} sum_{i=1}^{N} sum_{t=1}^{T} abla_{ heta} log pi_{ heta}left(mathbf{a}_{i, t} | mathbf{s}_{i, t} ight) hat{Q}_{i, t} ]

还有一项改进是Baseline

强化学习的目的是增加好的选择的概率减少坏的选择的概率,那么如果一个好的动作的reward是10001,坏的选择的reward是10000,那么学习的效果就会不明显。一个显而易见的改进是在奖励中减去平均值

[ abla_ heta J( heta) approx frac{1}{N} sum_{i=1}^N abla_ heta log pi_ heta( au) left[gamma( au)-b ight] ]

[b = frac{1}{N} sum_{i=1}^N gamma( au) ]

Policy gradient is on-policy

这意味着每次你更改策略都需要重新和环境交互采样获得新的样本。

pytorch实现REINFORCE的代码https://github.com/pytorch/examples/blob/master/reinforcement_learning/reinforce.py

原文地址:https://www.cnblogs.com/lepeCoder/p/RL_PolicyGradients.html