狗都能看懂的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,一经查实,立即删除!

相关文章

分布式智能:Mojo模型在分布式系统中的动态使用策略

分布式智能:Mojo模型在分布式系统中的动态使用策略 在当今的大数据时代,机器学习模型经常需要在分布式系统中运行,以处理大规模数据集并提高计算效率。Mojo模型,作为一个泛指,可以代表任何机器学习或深度学习模型。实…

Java 注解概述和自定义注解案例

文章目录 一、注解概述1.1 什么是注解1.2 注解的用途1.3 注解的常见种类1.4 注解类型和常用注解 二、自定义注解2.1 自定义注解的格式2.2 自定义注解中的属性2.3 自定义注解的案例 参考资料 一、注解概述 1.1 什么是注解 注解是元数据的一种形式,它提供的数据不是…

Android 里SQLite和ROOM框架简单介绍

简单的Android SQLite使用 最简单的SQLite 在 Android 开发中,SQLite是一个轻量级的关系型数据库管理系统,经常用于存储和管理应用程序的数据。如果你刚刚学习Android数据库的使用,你一定要学习SQLite的使用。以下是一个简单的示例&#xf…

优化算法|自适应大邻域搜索算法及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) % 每个节点单独一条…

Javascript面试基础6【每日更新10】

Gulp gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成 Gulp的核心概念:流 流,简单来说就是建立在面向对象基础上的一种抽象的…

【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 安装两个常用插件…

基于riscv64架构的Dayu800开发板的napi_demo开发介绍

itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源,拥抱国产化 一、环境准备工作 1.1 Ubuntu20.04环境配置 如果已经配置OpenHarmony的编译环境则…

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

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

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

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

【C#】获取DICOM图像像素的像素值

8位像素深度的像素值 public byte GetGreyValue(int x, int y) {x Math.Min(x, m_nWidth - 1);y Math.Min(y, m_nHeight - 1);unsafe{byte* greyValue (byte*)m_pDicomData.ToPointer() y * m_nWidth x;return *greyValue;} } 16位像素深度的像素值 public ushort GetG…

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.…

Redis快速入门(一)

一、初识Redis 1、认识NoSQL NoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。   a)结构化与非结构化   传统关系型数据库是结构化数据,每一张…

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

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

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

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

每天一个数据分析题(四百四十四)- 数据仓库

企业数据仓库里面的数据一般是由业务数据经过ETL技术处理后来的,以下关于ETL的说法错误的是 A. ETL过程中的主要环节是数据抽取、数据转换和加工、数据流转 B. 增量数据抽取过程中,提取增量数据的方法有通过时间戳、建立触发器、全表比对、日志比对等 …

springboot整合pgsql

demo代码说明 springboot使用mybatis-plus整合pgsql 在springboot项目中使用pgsql,使用了mybatis-plus、druid 代码见 spring-demo: springboot 结合各种插件 demo 注意事项: 版本兼容 正常springboot使用,但是注意需要添加pgsql正确版…

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…