• 强化学习 策略梯度


    策略梯度

    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

  • 相关阅读:
    SSE特殊指令集系列之二字节绝对差值求和指令
    HDR阴影高光图像增强
    移植FFMPEG到VS2008系列之二
    SSE2指令集系列之一浮点运算指令
    移植FFMPEG到VS2008系列之三
    网站添加时间线
    HTML实体符号代码速查表
    div显示在object、embed之上~
    不用JS照样使IE6支持PNG 24位背景图支持透明背景且链接不会失去焦点
    CSS 针对谷歌浏览器(Chrome) safari的webkit核心浏览器CSS hack
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/RL_PolicyGradients.html
Copyright © 2020-2023  润新知