狗都能看懂的Actor-Critic强化学习算法讲解

Review Policy Gradient

review policy gradient.png

上面的公式是Policy Gradient的更新函数,这个式子是指在 s t s_t st时刻采取了 a t a_t at,计算出对应发生的概率 p θ p_\theta pθ,然后计算在采取了这个 a t a_t at之后,所得到的reward有多大。但这里需要减去一个baseline,不能让reward都大于0,这样会降低没有sample到的action的概率。同时还需要加上衰减因子,保证后期得到的reward不会过大,从而影响了一开始的action概率。最后把所有时刻的reward求和。

我们将画蓝色横线的式子记作 G t n G_t^n Gtn,它虽然没有偏差,但因为方差大,数值波动比较大。波动大的原因也很好理解, G t n G_t^n Gtn从执行了这个action之后到episode结束得到的所有reward总和,由于sample的概率不相同,所以中间会遇到各种不同的state。

如果我们收集数据的数量足够多,这个波动会被平均掉。但实际收集数据是比较耗时,所以也不会有太多数据。如果说能用期望值(平均)替代 G t n G_t^n Gtn,那可以让训练过程更稳定。这里就需要引入Value-Based的方法。

Review Q-Learning

review q-learning.png

Value-Based的方法有两种:

  • V π ( s ) V^{\pi}(s) Vπ(s)输入state,输出可能会得到reward的期望值
  • Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a)输入state和会采取的action,输出可能会得到reward的期望值

以上两个方法都可以用TD或MC的方法更新,用TD比较稳定,用MC更精确。

Actor Critic

Actor Critic.png

刚刚说到,如果能用期望值(平均)替代 G t n G_t^n Gtn,训练会更加稳定。那 G t n G_t^n Gtn的期望值是什么?它是希望在 s t s_t st时刻,用 π \pi π这个策略得到 a t a_t at,执行了 a t a_t at之后所得到的reward总和的期望值,那这个其实就是 Q π θ ( s t n , a t n ) Q^{\pi_\theta}(s^n_t,a^n_t) Qπθ(stn,atn)的定义。所以有:
E [ G t n ] = Q π θ ( s t n , a t n ) E[G_t^n] = Q^{\pi_\theta}(s^n_t,a^n_t) E[Gtn]=Qπθ(stn,atn)
那么我们用 Q π θ ( s t n , a t n ) Q^{\pi_\theta}(s^n_t,a^n_t) Qπθ(stn,atn)替代 G t n G_t^n Gtn这一项即可。还有一项baseline,正常是自己设置,但这里我们可以用Value Function替代, V ( s ) V(s) V(s)是不包含action的, Q ( s , a ) Q(s,a) Q(s,a)是包含action的, V ( s ) V(s) V(s) Q ( s , a ) Q(s,a) Q(s,a)的期望值,为什么这么说呢?原因是这样的:

  • s t s_t st下,价值函数 V π ( s ) V^\pi(s) Vπ(s)表示从状态 s t s_t st开始,遵循策略 π \pi π的期望回报。
  • 由于策略 π \pi π定义了在 s t s_t st下采取各个action的概率分布,因此,价值函数 V π ( s ) V^\pi(s) Vπ(s)可以看作是动作价值函数 Q ( s , a ) Q(s,a) Q(s,a)在所有可能动作上的加权平均,即期望值。

所以上图红框内的式子就可以被Value-Based的两个方法给替换掉,这样就可以将Actor和Critic的两个方法给结合起来。

Advantage Actor Critic

Advantage Actor-Critic-1.png

这样结合的缺点就是需要训练两个网络,有办法可以只训练一个网络用来预测两个值吗?可以,事实上可以只训练 V ( s ) V(s) V(s),用 V ( s ) V(s) V(s)替代 Q ( s , a ) Q(s,a) Q(s,a)。回到 Q ( s , a ) Q(s,a) Q(s,a)的定义,因为 r t r_t rt本身是一个随机值,只有我们取了期望值之后才是 Q ( s , a ) Q(s,a) Q(s,a)的定义。现在为了简化Actor-Critic的训练,直接将求期望值去掉。这样就可以用 V ( s ) V(s) V(s)替代 Q ( s , a ) Q(s,a) Q(s,a)

但这样做的坏处也显而易见,是引入了一个随机的变量。但不过相较于 G t n G_t^n Gtn来说还好, r t r_t rt只是某一个step会有的随机变量,方差会比 G t n G_t^n Gtn小的多。所以整体上还是能接受的。

Advantage Actor-Critic-2.png

红框里面是原来的Advantage项,已经用Value-Based的方法替代了。那么Advantage Actor-Critic完整流程如上图:

  1. 有一个Policy π \pi π 和环境做互动收集训练数据。(Policy Gradient中是用这些训练数据直接优化Policy)
  2. 用TD或MC优化 V ( s ) V(s) V(s)
  3. 套用上面的公式更新Policy π \pi π
  4. 重复1-3直至收敛

Tips

Advantage Actor-Critic-3.png

backbone shared

和很多CV任务一样,前面的特征提取都是可以共享的。然后预测action和预测value分成两个分支,这部分和Dueling DQN很像,只是最后没有合并成一个 Q ( s , a ) Q(s,a) Q(s,a)

large entropy

我们可以设置一些限制,使得action的entropy会大一点,不同的action被采用的概率平均一些,才会有几率探索更多state,得到比较好的结果。

asynchronous

强化学习通常花时间都是在收集训练数据过程中。开多个线程与环境做互动收集数据可以有效缩短训练时间。

Asynchronous Advantage Actor-Critic

Asynchronous.png

Asynchronous Advantage Actor-Critic简称为A3C,具体如何实现?

首先有一个初始的global network

  1. 复制N个network
  2. 让它们都和环境做互动,收集数据
  3. 计算梯度
  4. 更新模型

这里值得注意的是,所有的actor都是并行去收集,训练,更新的。可能有人问,如果复制出来的参数是 θ 1 \theta^1 θ1,但是要更新的时候已经被别覆盖成 θ 2 \theta^2 θ2了呢?这个没关系,直接覆盖就行。

Pathwise Derivative Policy Gradient

Pathwise Derivative Policy Gradient.png

之前说到Q-Learning在连续的问题上表现不好。我们完全可以利用Actor预测action的能力,为 Q π Q^\pi Qπ提供action,使得 Q π Q^\pi Qπ的值越大越好。在训练的时候会直接将两个网络连起来,并且freeze Q π Q^\pi Qπ的参数,只训练Actor,这个思路和CV任务里的GAN很像,用生成器生成一个图片,用判别器去判断是好是坏。

Pathwise Derivative Policy Gradient-2.png

算法的流程也很简单,有一个 π \pi π去和环境交互,收集数据,训练 Q π Q^\pi Qπ,然后将 Q π Q^\pi Qπ固定,只训练actor使得 Q π Q^\pi Qπ输出的值越大越好。在Q-Learning中能用到的trick,这里也能用上,比如replay buffer等。

Algorithm.png

相较于之前的Q-Learning算法,改动四个地方就行:

  1. 之前使用 Q π Q^\pi Qπ决定用什么action,现在改用 π \pi π来预测action
  2. π ^ \hat{\pi} π^预测的action代入到 Q π Q^\pi Qπ中,不再解 a r g max ⁡ a Q π ( s , a ) arg \max\limits_{a} \ Q^\pi(s,a) argamax Qπ(s,a)(会有两个 π \pi π,其中一个是固定的,和训练DQN是一样的)
  3. 训练 π \pi π(其优化目标是让 Q π Q^\pi Qπ越大越好)
  4. 更新 π \pi π的参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/49557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化算法|自适应大邻域搜索算法及MATLAB代码实现

回来填坑了,本篇推文将详细讲解ALNS算法求解VRP问题及MATLAB代码实现。 算法介绍 节约算法构造初始解 function routessaving_init(DistMatrix, Demand, Cap) C_EPS1e-1;Nsize(DistMatrix,1); routescell(numel(2:N),1); for i1:numel(routes) % 每个节点单独一条…

【Django】前端技术HTML常用标签(开发环境vscode)

文章目录 安装两个常用插件HTML常用标签定义文档类型DOCTYPE网页的结构html/head//title/body/div标题h1/h2/h3/h4/h5分割线hr段落 p列表ul/li,ol/li超链接a文本span图片img按钮button表格table(table、tr、th、td)表单form 安装两个常用插件…

目标检测 YOLOv5-7.0 详细调试自制数据集实战

目标检测 YOLOv5-7.0 详细调试&自制数据集实战 一、项目介绍及环境配置(一)项目解读(二)版本选择(三)环境配置 二、如何利用YOLOv5进行预测(detect.py)(一&#xff0…

Windows 实用小工具:窗口钉子/文件管理 2024/7/27

一: wintop 窗口置顶工具 二:WinDirStat 这是一个免费的、开源的磁盘使用分析工具,适用于Windows系统。它会扫描你的硬盘,列出所有文件和文件夹的大小,并以图形化的方式展示,便于理解。 可以用来检测硬盘文件夹占用从而,酌情处…

JAVA.抽象、接口、内部类

1.抽象 共性,父类定义抽象方法,子类必须重写,或者子类也是抽象类 示例代码 animal package animalabstract;//定义抽象类animal public abstract class animal {String name;int age;//定义抽象方法eat,子类必须重写public abs…

Java给定一些元素随机从中选择一个

文章目录 代码实现java.util.Random类实现随机取数(推荐)java.util.Collections实现(推荐)Java 8 Stream流实现(不推荐) 完整代码参考(含测试数据) 在Java中,要从给定的数据集合中随机选择一个元素,我们很容易想到可以使用 java.…

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说,创建一个文件&a…

力扣第三十七题——解数独

内容介绍 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞,编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码,从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

VIM基础配置

1. CTAGS配置 下载 上传虚拟机,解压,进入目录 tar -xzvf ctags-5.8.tar.gz cd ctags-5.8/编译 ./configure sudo make sudo make install查看是否安装成功 ctags --version打印如下 2. 使用Vundle 下载 git clone https://github.com/VundleVim/Vund…

Linux并发程序设计(3):守护进程

目录 前言 一、介绍 1.1 概念 1.2 特点 1.3 举例 二、系统编程 2.1 setsid函数 2.2 getpid函数 2.3 getsid函数 2.4 getpgid函数 2.5 chdir函数 三、代码例程 3.1 使子进程在后台运行 3.2 使子进程脱离原终端 3.3 更换目录,并设定权限(非…

基于STM32通过云平台实现智慧大棚【手机远程查看温湿度】【报警】

文章目录 一、成果演示二、所用到的模块三、实现的功能四、接线说明五、WIFI模块配置步骤5.1云平台介绍5.2云平台使用5.3使用USB转TTL测试联通云平台 六、STM32代码编写七、手机上查看数据6.1下载软件(仅限安卓手机)6.2操作 一、成果演示 STM32通过物联网…

String、StringBuffer和StringBuilder

一、String类 1. String类的理解 2. String类结构 1. String类实现了Serializable接口,说明String对象可以串行化,即可以在网络上传输 2. String类实现了Comparable接口,说明String对象可以比较 String底层是一个字符数组,这个数组里存的是字符串的内容 例如:…

005 仿muduo实现高性能服务器组件_通信连接管理

​🌈个人主页:Fan_558 🔥 系列专栏:仿muduo 📒代码仓库: 项目代码 🌹关注我💪🏻带你学更多知识 文章目录 前言Channel模块设计原因整体设计代码如下 Connection模块设计原…

Florence2:Advancing a unified representation for a variety of vision tasks

Florence-2模型:开启统一视觉基础模型的新篇章_florence -2-CSDN博客文章浏览阅读1.1k次,点赞108次,收藏109次。Florence-2是由微软Azure AI团队开发的一款多功能、统一的视觉模型。它通过统一的提示处理不同的视觉任务,表现出色且优于许多大型模型。Florence-2的设计理念是…

用Postman Flows打造你的专属API:外部公开,轻松上手!

引言 Postman Flows 是一个使用 GUI 进行无代码 API 调用流程创建的服务。这篇文章我尝试使用 Flows 来构建将 Momento Topic 中的数据保存到 TiDB 的保存 API,因此想分享一些使用过程中的技巧等。 实现内容 将从 Momento Topics 配发的 JSON 数据保存到 TiDB 中。…

C++ 栈( stack )学习

目录 1.栈 2.模拟栈 1.1.入栈( push ) 1.2.出栈( pop ) 1.3.获取栈顶元素( top ) 3.直接使用栈( stack ) 3.1.导入头文件并创建栈 3.2.栈的操作 3.2.1.入栈( push ) 3.2.2.出栈( pop ) 3.2.3.获取栈顶元素( top ) 3.2.4.获取栈中元素个数( size ) 3.2.5.判断栈是否…

代码随想录算法训练营day8 | 344.反转字符串、541.反转字符串 II、卡码网:54.替换数字

文章目录 344.反转字符串思路 541.反转字符串 II思路 卡码网:54.替换数字思路复习:字符串 vs 数组 总结 今天是字符串专题的第一天,主要是一些基础的题目 344.反转字符串 建议: 本题是字符串基础题目,就是考察 revers…

docker挂载部署reids6.2.1

1.拉取镜像 docker pull redis:6.2.12.创建挂在目录(根据自己要求修改具体目录) mkdir -p /home/admin/redis/{data,conf}3.在/home/admin/redis/conf目录下创建redis.conf文件 cd /home/admin/redis/conf touch redis.conf4.复制下面文本到redis.conf…