CS294 Lecture 6-Actor Critic

作者: 丰谷数 | 来源:发表于2019-05-11 16:01 被阅读0次

    从 "reward to go" 到 Actor Critic

    回顾一下REINFORCE算法
    \begin{array}{l} {\text { 1. sample }\left\{\tau^{i}\right\} \text { from } \pi_{\theta}\left(a_{t} | s_{t}\right) \text { (run the policy) }} \\ {\text { 2. } \nabla_{\theta} J(\theta) \approx \sum_{i}\left(\sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{i, t} | s_{i, t}\right)\left(\sum_{t^{\prime}=t}^{T} r\left(s_{i, t'}, a_{i, t'}\right)\right)\right)} \\ {\text { 3. } \theta \leftarrow \theta+\alpha \nabla_{\theta} J(\theta)} \end{array}
    其中reward to go 为
    \hat{Q}_{t} = \sum_{t^{\prime}=t}^{T} r\left(s_{t'}, a_{t'}\right) \quad; \text{single estimate of true reward to go}
    但这个reward to go有什么缺点呢?实际上这个reward to go只是估计了单个轨迹从s_{t},a_{t}开始的累积奖励,并不是一个期望的概念,因此方差较大。

    reward_to_go.png

    那么应该如何改进以降低方差呢?实际上我们希望理想的reward to go是
    Q(s_t,a_t) \approx \sum_{t^{\prime}=t}^{T} \mathbb{E}_{s_{t'}, a_{t'} \sim \pi_{\theta}}\left[r\left(s_{t^{\prime}}, a_{t^{\prime}}\right) | s_{t}, a_{t}\right] \quad; \text{true reward to go}
    如果我们知道Q(s_t,a_t),那么策略梯度便是:
    \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{i, t} | s_{i, t}\right) Q\left(s_{i, t}, a_{i, t}\right) \quad; \text{true reward to go}

    在上一节我们还讲到了应该添加一个baseline,以评估当前轨迹的累积奖励就平均而言有多好,因此添加了baseline的策略梯度是:
    \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{i, t} | s_{i, t}\right)\left(Q\left(s_{i, t}, a_{i, t}\right)-b\right) \quad; \text{true reward to go + baseline}
    那么这个baseline如何决定呢?因为我们使用的是Q\left(s_{i, t}, a_{i, t}\right),那么理所应当减去的也应该是 V(s)。因此,最终Actor Critic的策略梯度为:
    \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{i, t} | s_{i, t}\right) A^{\pi}\left(s_{i, t}, a_{i, t}\right)

    接下来我们要做的便是如何得到A^\pi(s,a)

    如何估计 advantage?

    为了得到 advantage,我们可以直接拟合 A(s,a),但是通常不这么做,因为如果我们 Q(s,a) 具有下面的关系:
    \begin{aligned} Q^{\pi}\left(s_{t}, a_{t}\right)&=r\left(s_{t}, a_{t}\right)+\mathbb{E}_{s_{t+1} \sim p\left(s_{t+1} | s_{t}, a_{t}\right)}\left[V^{\pi}\left(s_{t+1}\right)\right] \\ &\approx r\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)+V^{\pi}\left(\mathbf{s}_{t+1}\right) \quad; \text{unbiased, a little variance}\\ \end{aligned}

    于是,advantage 可以通过这种方式近似求出:
    A^{\pi}\left(s_{t}, a_{t}\right) \approx r\left(s_{t}, a_{t}\right)+V^{\pi}\left(s_{t+1}\right)-V^{\pi}\left(s_{t}\right)
    这样 V^\pi(s)只是 s 的函数,而 A^\pi(s,a)(s,a) 的函数,所以如果拟合 V,参数更少,更容易拟合,也更方便。

    所以基于上面的分析,我们的思路是这样的:我们有一个神经网络,输入是 s, 输出是 \hat{V}^\pi(s),下面就是如何训练这样一个神经网络。


    Policy evaluation

    进行policy evaluation 有两种方式,一种是Monte Carlo,另一种是temporal difference。

    Monte Carlo Evaluation

    接下来就是如何拟合V^\pi(s),这个步骤称之为 Policy evaluation,因为这个网络做的是给定一个s,输出V(s),我们不考虑 Policy Improvement步骤。下面是 V^\pi(s_t) 的定义:
    V^{\pi}\left(s_{t}\right)=\sum_{t^{\prime}=t}^{T} \mathbb{E}_{\pi_{\theta}}\left[r\left(\mathbf{s}_{t^{\prime}}, \mathbf{a}_{t^{\prime}}\right) | \mathbf{s}_{t}\right]

    如果我们拟合得到了 V^\pi(s_t),那么根据RL目标函数的定义 J(\theta)=E_{\mathbf{s}_{1} \sim p\left(\mathbf{s}_{1}\right)}\left[V^{\pi}\left(\mathbf{s}_{1}\right)\right],我们也顺便得到了目标函数的表达式,岂不美哉?

    那么如何获得训练目标数据呢?可以有下面两种方式:
    \begin{aligned} V^{\pi}\left(s_{t}\right) &\approx \sum_{t^{\prime}=t}^{T} r\left(s_{t^{\prime}}, a_{t^{\prime}}\right) \quad; \text{single sample} \\ V^{\pi}\left(\mathbf{s}_{t}\right) &\approx \frac{1}{N} \sum_{i=1}^{N} \sum_{l^{\prime}=t}^{T} r\left(\mathbf{s}_{t^{\prime}}, \mathbf{a}_{t^{\prime}}\right) \quad; \text{multiple samples, requires us to reset the simulator} \end{aligned}
    第二种方式明显更好一点,其方差更小,但是其要求环境能够重置到特定的状态s_t来进行采样。

    于是我们的训练数据和损失函数就可以表达为:
    \text{training data: }\Big\{ \Big(\mathbf{s}_{i, t}, \underbrace{\sum_{t^{\prime}=t}^{T} r\left(\mathbf{s}_{i, t^{\prime}}, \mathbf{a}_{i, t^{\prime}}\right)}_{y_{i,t}}\Big)\Big\} \\ \text{supervised regression: } \mathcal{L}(\phi)=\frac{1}{2} \sum_{i}\left\|\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i}\right)-y_{i}\right\|^{2}

    Temporal Difference

    下面对我们的真实标签 y_{i,t} 进行近似:
    \begin{aligned} y_{i, t}&=\sum_{t^{\prime}=t}^{T} \mathbb{E}_{\pi_{\theta}}\left[r\left(\mathbf{s}_{t^{\prime}}, \mathbf{a}_{t^{\prime}}\right) | \mathbf{s}_{i, t}\right] \\ &\approx r\left(\mathbf{s}_{i, t}, \mathbf{a}_{i, t}\right)+\sum_{t^{\prime}=t+1}^{T} \mathbb{E}_{\pi_{\theta}}\left[r\left(\mathbf{s}_{t^{\prime}}, \mathbf{a}_{t^{\prime}}\right) | \mathbf{s}_{i, t+1}\right] \\ &= r\left(\mathbf{s}_{i, t}, \mathbf{a}_{i, t}\right)+V^{\pi}\left(\mathbf{s}_{i, t+1}\right) \\ &\approx r\left(\mathbf{s}_{i, t}, \mathbf{a}_{i, t}\right)+\hat{V}_{\Phi}^{\pi}\left(\mathbf{s}_{i, t+1}\right) \end{aligned}

    所以,进行了上面的两层近似,我们还可以使用 r\left(\mathbf{s}_{i, t}, \mathbf{a}_{i, t}\right)+\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i, t+1}\right)作为真实标签的近似,因此我们的训练数据如下:
    \left\{\left(\mathbf{s}_{i, t}, r\left(\mathbf{s}_{i, t}, \mathbf{a}_{i, t}\right)+\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i, t+1}\right)\right)\right\}
    这种方式也叫做 bootstrapped estimate。

    总结一下,最终的 Batch Actor-Critic algorithm 如下:

    1. {\text {sample }\left\{\mathbf{s}_{i}, \mathbf{a}_{i}\right\} \text { from } \pi_{\theta}(\mathbf{a} | \mathbf{s})(\text { run it on the robot) }}
    2. {\text{fit } \hat{V}_{\phi}^{\pi}(\mathbf{s}) \text { to sampled reward sums }}(MC or Bootstrap)
    3. {\text {evaluate } \hat{A}^{\pi}\left(\mathbf{s}_{i}, \mathbf{a}_{i}\right)=r\left(\mathbf{s}_{i}, \mathbf{a}_{i}\right)+\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i}^{\prime}\right)-\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i}\right)}
    4. {\nabla_{\theta} J(\theta) \approx \sum_{i} \nabla_{\theta} \log \pi_{\theta}\left(\mathbf{a}_{i} | \mathbf{s}_{i}\right) \hat{A}^{\pi}\left(\mathbf{s}_{i}, \mathbf{a}_{i}\right)}
    5. {\theta \leftarrow \theta+\alpha \nabla_{\theta} J(\theta)}

    discont factors

    如果 T 是无穷大,那 \hat{V}_{\phi}^{\pi} 就会变得无穷大,一种方法就是引入折扣因子 \gamma \in [0,1],那么
    \begin{aligned} {y_{i, t} \approx r\left(\mathbf{s}_{i, t}, \mathbf{a}_{i, t}\right)+\gamma \hat{V}_{\Phi}^{\pi}\left(\mathbf{s}_{i, t+1}\right)} \\ \end{aligned}

    注意到 \sum_{s'}p(s'|s,a)=1,而当我们加上 \gamma 之后,\sum_{s'} \gamma p(s'|s,a)=\gamma,因此可以认为添加了一个以概率 1-\gamma 进入的死亡状态 s^*,进入死亡状态就没有奖励了。因此可以认为 \gamma 没有改变MDP框架,只是改变了环境的转移概率 p(s'|s,a)

    gamma.png
    1. option 1:
      \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(\mathbf{a}_{i, t} | \mathbf{s}_{i, t}\right)\left(\sum_{t^{\prime}=t}^{T} \gamma^{t^{\prime}-t} r\left(\mathbf{s}_{i, t^{\prime}}, \mathbf{a}_{i, t^{\prime}}\right)\right) \quad; \text{reward to go 加上gamma最自然的方式}

    2. option 2:

    \begin{aligned} \nabla_{\theta} J(\theta) &\approx \frac{1}{N} \sum_{i=1}^{N}\sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(\mathbf{a}_{i, t} | \mathbf{s}_{i, t}\right)\left(\sum_{t'=t}^{T} \gamma^{t'-1} r\left(\mathbf{s}_{i, t'}, \mathbf{a}_{i, t'}\right)\right) \quad; \text{reward to go 加上 gamma 的另一种方式} \\ &=\frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \gamma^{t-1} \nabla_{\theta} \log \pi_{\theta}\left(\mathbf{a}_{i, t} | \mathbf{s}_{i, t}\right)\left(\sum_{t^{\prime}=t}^{T} \gamma^{t^{\prime}-t} r\left(\mathbf{s}_{i, t^{\prime}}, \mathbf{a}_{i, t^{\prime}}\right)\right) \\ \end{aligned}

    option1 只对后面的奖励进行了折扣,option2不仅对奖励进行折扣,对梯度也进行了折扣。option1是我们在实际中使用的,option2的直觉含义是说:如果你遇到了死亡状态,那么后面的steps就不重要了。

    Actor-critic Algorithm design

    \text{batch actor-critic algorithm:}

    1. {\text {sample }\left\{\mathbf{s}_{i}, \mathbf{a}_{i}\right\} \text { from } \pi_{\theta}(\mathbf{a} | \mathbf{s})(\text { run it on the robot) }}
    2. {\text{fit } \hat{V}_{\phi}^{\pi}(\mathbf{s}) \text { to sampled reward sums }}(MC or Bootstrap)
    3. {\text {evaluate } \hat{A}^{\pi}\left(\mathbf{s}_{i}, \mathbf{a}_{i}\right)=r\left(\mathbf{s}_{i}, \mathbf{a}_{i}\right)+\gamma \hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i}^{\prime}\right)-\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i}\right)}
    4. {\nabla_{\theta} J(\theta) \approx \sum_{i} \nabla_{\theta} \log \pi_{\theta}\left(\mathbf{a}_{i} | \mathbf{s}_{i}\right) \hat{A}^{\pi}\left(\mathbf{s}_{i}, \mathbf{a}_{i}\right)}
    5. {\theta \leftarrow \theta+\alpha \nabla_{\theta} J(\theta)}

    \text{online actor-critic algorithm:}

    1. \text{take action }\mathbf{a} \sim \pi_{\theta}(\mathbf{a} | \mathbf{s}), \text { get }\left(\mathbf{s}, \mathbf{a}, \mathbf{s}^{\prime}, r\right).
    2. \text{update }\hat{V}_{\phi}^{\pi} \text { using target } r+\gamma \hat{V}_{\phi}^{\pi}\left(\mathbf{s}^{\prime}\right)
    3. \text{evaluate }\hat{A}^{\pi}(\mathbf{s}, \mathbf{a})=r(\mathbf{s}, \mathbf{a})+\gamma \hat{V}_{\phi}^{\pi}\left(\mathbf{s}^{\prime}\right)-\hat{V}_{\phi}^{\pi}(\mathbf{s})
    4. \nabla_{\theta} J(\theta) \approx \nabla_{\theta} \log \pi_{\theta}(\mathbf{a} | \mathbf{s}) \hat{A}^{\pi}(\mathbf{s}, \mathbf{a})
    5. {\theta \leftarrow \theta+\alpha \nabla_{\theta} J(\theta)}

    但是这里的online actor-critic在实际中使用还有一些问题。方差大

    Architecture design

    实现actor-critic的网络架构有两种:

    • 分别使用两个网络,容易训练一点,不需要调很多参数,但是比较慢。!

    • 使用共享的网络,这样如果输入的state是图像的话,可以共享某些特征信息。但是训练起来比较困难,因为共享网络存在两种梯度,分别对应于不同的单元。所以想让网络的更新稳定一些,需要在调参上多下功夫,例如网络参数的初始化以及学习率的设置上。

    Lower the variance of online actor-critic algorithm

    \text{online actor-critic algorithm:}

    1. \text{take action }\mathbf{a} \sim \pi_{\theta}(\mathbf{a} | \mathbf{s}), \text { get }\left(\mathbf{s}, \mathbf{a}, \mathbf{s}^{\prime}, r\right).
    2. \text{update }\hat{V}_{\phi}^{\pi} \text { using target } r+\gamma \hat{V}_{\phi}^{\pi}\left(\mathbf{s}^{\prime}\right)
    3. \text{evaluate }\hat{A}^{\pi}(\mathbf{s}, \mathbf{a})=r(\mathbf{s}, \mathbf{a})+\gamma \hat{V}_{\phi}^{\pi}\left(\mathbf{s}^{\prime}\right)-\hat{V}_{\phi}^{\pi}(\mathbf{s})
    4. \nabla_{\theta} J(\theta) \approx \nabla_{\theta} \log \pi_{\theta}(\mathbf{a} | \mathbf{s}) \hat{A}^{\pi}(\mathbf{s}, \mathbf{a})
    5. {\theta \leftarrow \theta+\alpha \nabla_{\theta} J(\theta)}

    online actor-critic 的一个缺点就是在对 \hat{V}_\phi^\pi 做更新的时候使用的是单个样本,因此方差较大。所以一种改善的方法就是构造更大的batch。有两种方式:

    • 左图中表示同时有4个并行的进程同时采样,每次得到batch size=4个(s,a,s',r),然后分别计算4个梯度并相加,用来更新\theta,注意这种同步采样,同步更新参数。
    • 右图表示有3个异步的进程,每次计算完梯度,送到一个central parameter server,然后central parameter server累积一定timesteps的梯度,然后再更新参数,接着把新参数送给每一个进程。
    sync-async-actor-critic.png

    Critics as state-dependent baselines

    现在总结一下,我们讨论了actor-critic,并将其与policy gradient相比较:

    • actor-critic
      • \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(\mathbf{a}_{i, t} | \mathbf{s}_{i, t}\right)\left(r\left(\mathbf{s}_{i, t}, \mathbf{a}_{i, t}\right)+\gamma \hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i, t+1}\right)-\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i, t}\right)\right)
      • low variance
      • biased (if the critic is not perfect)
    • policy gradient
      • \nabla_{\boldsymbol{\theta}} J(\boldsymbol{\theta}) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\boldsymbol{\theta}} \log \pi_{\theta}\left(\mathbf{a}_{i, t} | \mathbf{s}_{i, t}\right)\left(\left(\sum_{t^{\prime}=t}^{T} \gamma^{t^{\prime}-t} r\left(\mathbf{s}_{i, t^{\prime}}, \mathbf{a}_{i, t^{\prime}}\right)\right)-b\right)
      • high variacne
      • no bias
    • Better version
      • \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(\mathbf{a}_{i, t} | \mathbf{s}_{i, t}\right)\left(\left(\sum_{t'=t}^{T} \gamma^{t^{\prime}-t} r\left(\mathbf{s}_{i, t^{\prime}}, \mathbf{a}_{i, t^{\prime}}\right)\right)-\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{i, t}\right)\right)
      • no bias
      • low variance

    Eligibility trances & n-step returns

    下面的两种方式各有特点,并且优缺点互补,那么就很自然会去想能够将这两种方式结合起来,实现bias和variance之间的一种权衡?

    • \hat{A}_{\mathrm{C}}^{\pi}\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)=r\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)+\gamma \hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{t+1}\right)-\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{t}\right)

      • lower variance
      • higher bias if value is wrong(it always is)
    • \hat{A}_{\mathrm{MC}}^{\pi}\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)=\sum_{t^{\prime}=t}^{\infty} \gamma^{t^{\prime}-t} r\left(\mathbf{s}_{t^{\prime}}, \mathbf{a}_{t^{\prime}}\right)-\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{t}\right)

      • no bias
      • higher variance
    • \hat{A}_{\mathrm{n}}^{\pi}\left(\mathbf{s}_{t}, \mathbf{a}_{t}\right)=\sum_{t^{\prime}=t}^{t+n} \gamma^{t^{\prime}-t} r\left(\mathbf{s}_{t^{\prime}}, \mathbf{a}_{t^{\prime}}\right)+\gamma ^n\hat{V}^\pi_\phi(s_{t+n})-\hat{V}_{\phi}^{\pi}\left(\mathbf{s}_{t}\right) \quad; \text{n steps}

      • 样本轨迹的前几个timestep的方差较小,越往后越大
      • 这样就和之前学习的MC的variance比较大,但是unbiased;而TD的variance比较小,但是biased。所以使用n-step return进行估计,实现bias和variance的一个平衡。
      • discount的一个作用就是降低variance,因为越将来的奖励是越不确定的,而gamma正好降低了其重要性。
    eligibility traces.png

    Generalized advantage estimation

    \begin{array}{ll}{\hat{A}_{t}^{(1)} :=\delta_{t}^{V}} & {=-V\left(s_{t}\right)+r_{t}+\gamma V\left(s_{t+1}\right)} \\ {\hat{A}_{t}^{(2)} :=\delta_{t}^{V}+\gamma \delta_{t+1}^{V}} & {=-V\left(s_{t}\right)+r_{t}+\gamma r_{t+1}+\gamma^{2} V\left(s_{t+2}\right)} \\ {\hat{A}_{t}^{(3)} :=\delta_{t}^{V}+\gamma \delta_{t+1}^{V}+\gamma^{2} \delta_{t+2}^{V}} & {=-V\left(s_{t}\right)+r_{t}+\gamma r_{t+1}+\gamma^{2} r_{t+2}+\gamma^{3} V\left(s_{t+3}\right)}\\ \hat{A}_{t}^{(k)} :=\sum_{l=0}^{k-1} \gamma^{l} \delta_{t+l}^{V}&=-V\left(s_{t}\right)+r_{t}+\gamma r_{t+1}+\cdots+\gamma^{k-1} r_{t+k-1}+\gamma^{k} V\left(s_{t+k}\right) \\ &\vdots \\ \hat{A}_{t}^{(\infty)}=\sum_{l=0}^{\infty} \gamma^{l} \delta_{t+l}^{V}&=-V\left(s_{t}\right)+\sum_{l=0}^{\infty} \gamma^{l} r_{t+l} \end{array}

    \hat{A}_t^{(1)}\hat{A}_t^{(k)} bias 越来越小,但是variance越来越大。现在给每一个 \hat{A}_t^{(k)} 加上一个权重 \lambda^k,就得到
    \begin{aligned} \hat{A}_{t}^{\operatorname{GAE}(\gamma, \lambda)} & :=(1-\lambda)\left(\hat{A}_{t}^{(1)}+\lambda \hat{A}_{t}^{(2)}+\lambda^{2} \hat{A}_{t}^{(3)}+\ldots\right) \\ &=(1-\lambda)\left(\delta_{t}^{V}+\lambda\left(\delta_{t}^{V}+\gamma \delta_{t+1}^{V}\right)+\lambda^{2}\left(\delta_{t}^{V}+\gamma \delta_{t+1}^{V}+\gamma^{2} \delta_{t+2}^{V}\right)+\ldots\right) \\ &=(1-\lambda)\left(\delta_{t}^{V}\left(1+\lambda+\lambda^{2}+\ldots\right)+\gamma \delta_{t+1}^{V}\left(\lambda+\lambda^{2}+\lambda^{3}+\ldots\right)\right. +\gamma^{2} \delta_{t+2}^{V}\left(\lambda^{2}+\lambda^{4}+\lambda^{4}+\ldots\right)+\ldots ) \\ &=(1-\lambda)\left(\delta_{t}^{V}\left(\frac{1}{1-\lambda}\right)+\gamma \delta_{t+1}^{V}\left(\frac{\lambda}{1-\lambda}\right)+\gamma^{2} \delta_{t+2}^{V}\left(\frac{\lambda^{2}}{1-\lambda}\right)+\ldots\right) \\ &=\sum_{l=0}^{\infty}(\gamma \lambda)^{l} \delta_{t+l}^{V} \end{aligned}

    相关文章

      网友评论

        本文标题:CS294 Lecture 6-Actor Critic

        本文链接:https://www.haomeiwen.com/subject/sywxaqtx.html