转自:https://www.cnblogs.com/pinard/p/10272023.html

1. Actor-Critic算法简介

    Actor-Critic从名字上看包括两部分,演员(Actor)和评价者(Critic)。其中Actor使用我们上一节讲到的策略函数,负责生成动作(Action)并和环境交互。而Critic使用我们之前讲到了的价值函数,负责评估Actor的表现,并指导Actor下一阶段的动作。

    回想我们上一篇的策略梯度,策略函数就是我们的Actor,但是那里是没有Critic的,我们当时使用了蒙特卡罗法来计算每一步的价值部分替代了Critic的功能,但是场景比较受限。因此现在我们使用类似DQN中用的价值函数来替代蒙特卡罗法,作为一个比较通用的Critic。

    也就是说在Actor-Critic算法中,我们需要做两组近似,第一组是策略函数的近似:

πθ(s,a)=P(a|s,θ)≈π(a|s)

    第二组是价值函数的近似,对于状态价值和动作价值函数分别是:

v̂ (s,w)≈vπ(s)

q̂ (s,a,w)≈qπ(s,a)

    对于我们上一节讲到的蒙特卡罗策略梯度reinforce算法,我们需要进行改造才能变成Actor-Critic算法。

    首先,在蒙特卡罗策略梯度reinforce算法中,我们的策略的参数更新公式是:

    梯度更新部分中,∇θlogπθ(st,at)是我们的分值函数,不用动,要变成Actor的话改动的是vt,这块不能再使用蒙特卡罗法来得到,而应该从Critic得到。

    而对于Critic来说,这块是新的,不过我们完全可以参考之前DQN的做法,即用一个Q网络来做为Critic, 这个Q网络的输入可以是状态,而输出是每个动作的价值或者最优动作的价值。

    现在我们汇总来说,就是Critic通过Q网络计算状态的最优价值vt, 而Actor利用vt这个最优价值迭代更新策略函数的参数θ,进而选择动作,并得到反馈和新的状态,Critic使用反馈和新的状态更新Q网络参数w, 在后面Critic会使用新的网络参数w来帮Actor计算状态的最优价值vt。

2. Actor-Critic算法可选形式

    在上一节我们已经对Actor-Critic算法的流程做了一个初步的总结,不过有一个可以注意的点就是,我们对于Critic评估的点选择是和上一篇策略梯度一样的状态价值vt,实际上,我们还可以选择很多其他的指标来做为Critic的评估点。而目前可以使用的Actor-Critic评估点主要有:

    a) 基于状态价值:这是我们上一节使用的评估点,这样Actor的策略函数参数更新的法公式是:

    b) 基于动作价值:在DQN中,我们一般使用的都是动作价值函数Q来做价值评估,这样Actor的策略函数参数更新的法公式是:

    c) 基于TD误差:TD误差的表达式是或者, 这样Actor的策略函数参数更新的法公式是:

     d) 基于优势函数Dueling DQN中,我们讲到过优势函数A的定义:,即动作价值函数和状态价值函数的差值。这样Actor的策略函数参数更新的法公式是:

    e) 基于TD(λλ)误差:一般都是基于后向TD(λλ)误差,是TD误差和效用迹E的乘积。这样Actor的策略函数参数更新的法公式是:

    对于Critic本身的模型参数w,一般都是使用均方误差损失函数来做做迭代更新,类似之前DQN系列中所讲的迭代方法. 如果我们使用的是最简单的线性Q函数,比如Q(s,a,w)=ϕ(s,a)Tw则Critic本身的模型参数w的更新公式可以表示为:

    通过对均方误差损失函数求导可以很容易的得到上式。当然实际应用中,我们一般不使用线性Q函数,而使用神经网络表示状态和Q值的关系。

3. Actor-Critic算法流程

    这里给一个Actor-Critic算法的流程总结,评估点基于TD误差,Critic使用神经网络来计算TD误差并更新网络参数,Actor也使用神经网络来更新网络参数  

    算法输入:迭代轮数T,状态特征维度n, 动作集A, 步长α,β,衰减因子γ, 探索率ϵ, Critic网络结构和Actor网络结构。

    输出:Actor 网络参数θ, Critic网络参数w

    1. 随机初始化所有的状态和动作对应的价值Q.

    2. for i from 1 to T,进行迭代。

      a) 初始化S为当前状态序列的第一个状态, 拿到其特征向量ϕ(S)

      b) 在Actor网络中使用ϕ(S)作为输入,输出动作A,基于动作A得到新的状态S′,反馈R。

      c) 在Critic网络中分别使用ϕ(S),ϕ(S‘′)作为输入,得到Q值输出V(S),V(S′)

      d) 计算TD误差δ=R+γV(S′)−V(S)

      e) 使用均方差损失函数作Critic网络参数ww的梯度更新

      f)  更新Actor网络参数θθ:

    对于Actor的分值函数∇θlogπθ(St,A),可以选择softmax或者高斯分值函数。

    上述Actor-Critic算法已经是一个很好的算法框架,但是离实际应用还比较远。主要原因是这里有两个神经网络,都需要梯度更新,而且互相依赖。但是了解这个算法过程后,其他基于Actor-Critic的算法就好理解了。

4. Actor-Critic算法实例

    下面我们用一个具体的例子来演示上面的Actor-Critic算法。仍然使用了OpenAI Gym中的CartPole-v0游戏来作为我们算法应用。CartPole-v0游戏的介绍参见这里。它比较简单,基本要求就是控制下面的cart移动使连接在上面的pole保持垂直不倒。这个任务只有两个离散动作,要么向左用力,要么向右用力。而state状态就是这个cart的位置和速度, pole的角度和角速度,4维的特征。坚持到200分的奖励则为过关。

    算法流程可以参考上面的第三节,这里的分值函数我们使用的是softmax函数,和上一片的类似。完整的代码参见我的Github:https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/actor_critic.py

    代码主要分为两部分,第一部分是Actor,第二部分是Critic。对于Actor部分,大家可以和上一篇策略梯度的代码对比,改动并不大,主要区别在于梯度更新部分,策略梯度使用是蒙特卡罗法计算出的价值v(t)v(t),则我们的actor使用的是TD误差。

    在策略梯度部分,对应的位置如下:

self.loss = tf.reduce_mean(self.neg_log_prob * self.tf_vt)  # reward guided loss

    而我们的Actor对应的位置的代码是:

        self.exp = tf.reduce_mean(self.neg_log_prob * self.td_error)

    此处要注意的是,由于使用的是TD误差,而不是价值v(t)v(t),此处需要最大化self.exp,而不是最小化它,这点和策略梯度不同。对应的Actor代码为:

        #这里需要最大化当前策略的价值,因此需要最大化self.exp,即最小化-self.expself.train_op = tf.train.AdamOptimizer(LEARNING_RATE).minimize(-self.exp)

    除此之外,Actor部分的代码和策略梯度的代码区别并不大。

    对于Critic部分,我们使用了类似于DQN的三层神经网络。不过我们简化了这个网络的输出,只有一维输出值,而不是之前DQN使用的有多少个可选动作,就有多少维输出值。网络结构如下:

    def create_Q_network(self):# network weightsW1q = self.weight_variable([self.state_dim, 20])b1q = self.bias_variable([20])W2q = self.weight_variable([20, 1])b2q = self.bias_variable([1])self.state_input = tf.placeholder(tf.float32, [1, self.state_dim], "state")# hidden layersh_layerq = tf.nn.relu(tf.matmul(self.state_input, W1q) + b1q)# Q Value layerself.Q_value = tf.matmul(h_layerq, W2q) + b2q

    和之前的DQN相比,这里还有一个区别就是我们的critic没有使用DQN的经验回放,只是使用了反馈和当前网络在下一个状态的输出来拟合当前状态。

          对于算法中Actor和Critic交互的逻辑,在main函数中:

    for step in range(STEP):action = actor.choose_action(state) # e-greedy action for trainnext_state,reward,done,_ = env.step(action)td_error = critic.train_Q_network(state, reward, next_state)  # gradient = grad[r + gamma * V(s_) - V(s)]actor.learn(state, action, td_error)  # true_gradient = grad[logPi(s,a) * td_error]state = next_stateif done:break

    大家对照第三节的算法流程和代码应该可以比较容易理清这个过程。但是这个程序很难收敛。因此大家跑了后发现分数总是很低的话是可以理解的。我们需要优化这个问题。

5. Actor-Critic算法小结

    基本版的Actor-Critic算法虽然思路很好,但是由于难收敛的原因,还需要做改进。

    目前改进的比较好的有两个经典算法,一个是DDPG算法,使用了双Actor神经网络和双Critic神经网络的方法来改善收敛性。这个方法我们在从DQN到Nature DQN的过程中已经用过一次了。另一个是A3C算法,使用了多线程的方式,一个主线程负责更新Actor和Critic的参数,多个辅线程负责分别和环境交互,得到梯度更新值,汇总更新主线程的参数。而所有的辅线程会定期从主线程更新网络参数。这些辅线程起到了类似DQN中经验回放的作用,但是效果更好。

    在后面的文章中,我们会继续讨论DDPG和A3C。

系统学习深度学习(三十六)--Actor-Critic相关推荐

  1. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  2. VTK学习笔记(三十六)VTK图像填充

    VTK学习笔记(三十六)VTK图像填充 1.官方示例 2.其他例子 总结 1.官方示例 来自官方示例代码,自己只是添加了理解. 代码: #include <vtkCamera.h> #in ...

  3. Slicer学习笔记(三十六)slicer坐标系

    Slicer学习笔记(三十六)slicer坐标系 1.坐标系统 1.1.世界坐标系 1.2.解剖坐标系 1.3.图像坐标系 1.4.图像变换 1.5.二维示例或计算IJtoLS矩阵 1.6.与其他软件 ...

  4. 36.深度解密三十六:网络舆情监测之另类“免费监测”方法详解

    网络营销推广技术.技巧深度解密(三十六)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解免费网络舆情监测的问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬畏法律 ...

  5. 【OS学习笔记】三十六 保护模式十:通过中断发起任务切换----中断任务

    上一篇文章学习了:OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 本篇文章接着上一篇文章学习中断任务. 我们在前面文章中一直在说通过中断发起任务切换,本文就是将之前没有说明白的内容:通 ...

  6. 深度学习自学(三十六):有效提升图像分类噪声鲁棒性的小波卷积网络

    整理的人脸系列学习经验:包括人脸检测.人脸关键点检测.人脸优选.人脸对齐.人脸特征提取,Re-ID等学习过程总结,有需要的可以参考,仅供学习,请勿盗用.https://blog.csdn.net/Th ...

  7. 深度学习自学(三十六):ABCNet实时自适应贝塞尔曲线场景文字检测识别网络

    整理的人脸系列学习经验:包括人脸检测.人脸关键点检测.人脸优选.人脸对齐.人脸特征提取,Re-ID等学习过程总结,有需要的可以参考,仅供学习,请勿盗用.https://blog.csdn.net/Th ...

  8. 【C语言进阶深度学习记录】三十六 程序与进程的区别(程序的内存布局)

    上一篇文章学了堆,栈以及静态存储区.它们实际上都是针对进程来说的.那么程序与进程有什么区别呢? 本文不细讲程序与进程. 1 程序与进程 1.1 什么是程序 写完的.c文件是源文件.也叫源代码. 将源代 ...

  9. 重学前端学习笔记(三十六)--Flex 布局

    笔记说明 重学前端是程劭非(winter)[前手机淘宝前端负责人]在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专 ...

  10. Linux学习之CentOS(三十六)--FTP服务原理及vsfptd的安装、配置

    本篇随笔将讲解FTP服务的原理以及vsfptd这个最常用的FTP服务程序的安装与配置... 一.FTP服务原理 FTP(File Transfer Protocol)是一个非常古老并且应用十分广泛的文 ...

最新文章

  1. 【系统架构师修炼之道】(1):『序』
  2. 版本控制:SVN和GIT的一些使用感受
  3. 操作系统学习笔记-2.1.1.进程的定义、组成、组织方式、特征
  4. 思品课如何使用计算机教学课件,小学思品获奖论文巧用多媒体,优化思品课堂教学...
  5. Git--rebase合并提交
  6. mysql event同步数据库_mysql 数据库Event定时任务使用详解(Navicat 及直接SQL语句创建)...
  7. ZeroMQ API简介
  8. php字符串转openssl格式,将OpenSSL生成的RSA公钥转换为OpenSSH格式(PHP)
  9. Java Jsoup爬虫入门
  10. 商用密码应用安全性评估过程学习指南
  11. 金蝶中间件公司CTO袁红岗
  12. idea服务关不掉的问题
  13. 【GNN报告】复旦大学许嘉蓉:基于图数据的鲁棒机器学习
  14. 技术支持----用户和产研沟通的桥梁
  15. html生成文字乱码,html中文为什么会乱码?html中文乱码怎么解决?
  16. java maven log4j配置_如何在Maven构建的Java项目中使用log4j
  17. 财务分账是什么意思?
  18. 【小沐学NLP】Python实现聊天机器人(ALICE)
  19. 神雕侠侣手游服务器维护,神雕侠侣手游7月30日更新维护公告内容大全
  20. 好友克隆显示服务器繁忙,好友克隆服务器繁忙

热门文章

  1. Android视频录制-MediaRecorder流程
  2. C#之double内存
  3. linux虚拟机模板部署模板,创建和部署基于 Linux 的虚拟机模板
  4. python调用soap_如何在python zeep中调用soap api而不使用wsdl(非wsdl模式)?使用用户和密码身份验证调用位置URL...
  5. idea Spring-boot 项目debug启动过慢 spring debug启动过慢解决办法:已解决
  6. MySQL 查询连接数并显示完整的processlist中info信息
  7. 进阶05 常用数据结构
  8. ERROR: This version of Android Studio cannot open this project, please retry with Android Studio 3.
  9. word 产生很多temp 不显示_word表格中文字显示到最下面的时候不自动换页-解决办法...
  10. matlab解微分方程组_MATLAB编程入门 求解常微分方程 通解 特解 数值解