• Actor-Critic(AC)算法学习


    背景知识

    Policy Gradient方法利用带有权重的梯度上升方法更新策略。在REINFORCE算法中,这个权重是由蒙特卡洛方法来计算未来总体回报 G t G_{t} Gt的。这带来一个问题:就是待优化的策略参数 θ \theta θ只能在与环境交互完成一个Episode后,才进行更新。这种更新方式就是方差大,学习效率比较低。

    前面我们用从t时刻开始的未来总奖励 G t G_{t} Gt来作为权重,评价在t时刻,状态为 s t s_{t} st时,执行动作 a t a_{t} at的价值。我们的目的是寻找一组最优的策略参数,使得未来总奖励越高。同时, G t G_{t} Gt的计算是依赖于策略与环境的交互轨迹的,而这个轨迹又具有随机性,因此我们最终的优化目的是 G t G_{t} Gt的期望最大

    由马尔科夫决策过程可知,某一状态下采取某一动作,得到的回报期望可以表示为:
    Q π ( s , a ) = E [ G t ∣ s t = s , a t = a ] Q_\pi{}(s,a)=\mathbb{E} [G_{t}|s_{t}=s,a_{t}=a] Qπ(s,a)=E[Gtst=s,at=a]因此有人提出将原始的奖励值 G t G_{t} Gt用当前状态 s t s_{t} st a t a_{t} at的价值 Q ( s t , a t ) Q(s_{t},a_{t}) Q(st,at)来代替。
    在这里插入图片描述

    Actor-Critic算法

    网络构成

    Q ( s t , a t ) Q(s_{t},a_{t}) Q(st,at)代替 G t G_{t} Gt后,那么该如何求解 Q ( s t , a t ) Q(s_{t},a_{t}) Q(st,at)呢?毫不意外,我们同样用万能的神经网络来求解。因此AC算法就出现了两个神经网络。

    • (1)根据状态 s t s_{t} st,指导智能体输出 a t a_{t} at的网络,也就是策略网络 π θ \pi_{\theta} πθ,术语为Actor;
    • (2)用来评价当前状态 s t s_{t} st下选择动作 a t a_{t} at的好坏,即输出 Q ( s t , a t ) Q(s_{t},a_{t}) Q(st,at),可以理解为评委,术语为Critic

    实现细节

    在REINFORCE算法中,为了提高PG算法的性能,我们通常会让未来回报 G t G_{t} Gt减去一个baseline,使得权重部分(下图红色部分)有正有负。这样以来,如果是正的,我们就增加这个动作概率;反之减小它的概率。
    在这里插入图片描述
    现在将未来折扣奖励用 Q ( s t , a t ) Q(s_{t},a_{t}) Q(st,at)进行了代替,上式可以转变为:
    ∇ R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n ( Q ( s t n , a t n ) − b ) ∇ log ⁡ p θ ( a t n , s t n ) \nabla \bar{R} _{\theta}\approx \frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}} \left ( Q\left ( s_{t}^{n},a_{t}^{n} \right ) -b \right )\nabla\log p_{\theta}\left ( a_{t}^{n},s_{t}^{n} \right ) RˉθN1n=1Nt=1Tn(Q(stn,atn)b)logpθ(atn,stn)为了让权重有正有负(即下图红色部分),一般的做法是减去 Q ( s t , a t ) Q(s_{t},a_{t}) Q(st,at)的期望。而 Q ( s t , a t ) Q(s_{t},a_{t}) Q(st,at)的期望就是状态 s t s_{t} st的价值 V ( s t ) V(s_{t}) V(st)
    在这里插入图片描述
    这样以来,梯度计算公式可以转化为:
    ∇ R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n ( Q ( s t , a t ) − V ( s t ) ) ∇ log ⁡ p θ ( a t n , s t n ) \nabla \bar{R} _{\theta}\approx \frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}} \left ( Q\left ( s_{t},a_{t} \right ) -V(s_{t}) \right )\nabla\log p_{\theta}\left ( a_{t}^{n},s_{t}^{n} \right ) RˉθN1n=1Nt=1Tn(Q(st,at)V(st))logpθ(atn,stn)此时,中间的权重就会变为优势函数 A ( s t n , a t n ) A(s_{t}^{n},a_{t}^{n}) A(stn,atn)。这样的算法就是优势演员-评论员算法(Advantage Actor Critic,A2C)

    如果这样实现,一个很明显的缺点是我们需要再额外增加一个网络来计算 V ( s t ) V(s_{t}) V(st)。不仅耗费资源,同时估计不准的风险也会增加。何不将二者合并,只估计一个网络呢?幸运的是,马尔科夫告诉我们,V和Q是可以互换的。
    Q π ( s t n , a t n ) = E [ r t n + V π ( s t + 1 n ) ] Q_\pi{}(s_{t}^{n},a_{t}^{n})=\mathbb{E} [r_{t}^{n}+V_{\pi}(s_{t+1}^{n})] Qπ(stn,atn)=E[rtn+Vπ(st+1n)]我们把期望去掉,则:
    Q π ( s t n , a t n ) = r t n + V π ( s t + 1 n ) Q_\pi{}(s_{t}^{n},a_{t}^{n})=r_{t}^{n}+V_{\pi}(s_{t+1}^{n}) Qπ(stn,atn)=rtn+Vπ(st+1n)这样一来,我们就只需要一个估计状态价值的网络。梯度计算公式可以表示为:
    ∇ R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n ( r t n + V π ( s t + 1 n ) − V ( s t ) ) ∇ log ⁡ p θ ( a t n , s t n ) \nabla \bar{R} _{\theta}\approx \frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}} \left ( r_{t}^{n}+V_{\pi}(s_{t+1}^{n})-V(s_{t}) \right )\nabla\log p_{\theta}\left ( a_{t}^{n},s_{t}^{n} \right ) RˉθN1n=1Nt=1Tn(rtn+Vπ(st+1n)V(st))logpθ(atn,stn)
    PS:关于此处为什么直接将期望去掉?答案是实验表明这样的效果最好,因此就这样用了。

    算法流程

    在这里插入图片描述

    实现tips

    1. AC算法包含两个网络,策略网络Actor和估算状态价值的V网络。 V网络的输入为状态,输出为V(s),是标量。 策略网络 π ( s ) \pi(s) π(s)输入状态,输出:离散动作,输出动作分布;连续动作,输出一个连续的向量。
      由于两个网络都是状态作为输入,因此前面部分是可以参数共享的
      在这里插入图片描述
    2. AC算法中,同样需要探索机制。一个常见的探索的方法是对 π \pi π 输出的分布设置一个约束。这个约束用于使分布的熵(entropy)不要太小,也就是希望不同的动作被采用的概率平均一些。这样在测试的时候,智能体才会多尝试各种不同的动作,才会把环境探索得比较好,从而得到比较好的结果。

    参考

    1. 知乎张斯俊:理解Actor-Critic的关键是什么?(附代码及代码分析)
    2. Datawhale:蘑菇书
  • 相关阅读:
    Java 中的异常和处理详解
    Git使用【下】
    Java集合List报错,java.lang.UnsupportedOperationException
    如何用C语言实现 IoT Core
    R语言ggplot2可视化:使用ggpubr包的ggline函数可视化折线图(点线图、line plot)、设置add参数为mean可视化不同水平均值的折线图
    Cypress(1)——如何安装及测试类型简要介绍
    【论文理解】Neural circuit policies enabling auditable autonomy
    对话芯动科技 | 助力云游戏 4K级服务器显卡的探索与创新
    用go实现cors中间件
    什么是著作权?对此你了解多少?
  • 原文地址:https://blog.csdn.net/weixin_44769214/article/details/126242368