【强化学习】一文带你理清强化学习

整理不易,希望留个赞再走哦!!

学习路线

pic_center” width=“20%”/
这个图描述的比较清晰,蓝框里是整个强化学习的一些概念基础了,橙色是一些学习方法,可以针对性的选择一些,废话不多说,接下来就按照这个路线图展开。

1. 马尔可夫链

马尔科夫链:用来描述智能体和环境互动的过程

  1. 智能体在环境中,观察到状态(S);
  2. 状态(S)被输入到智能体,智能体经过计算,选择动作(A);
  3. 动作(A)使智能体进入另外一个状态(S),并返回奖励®给智能体。
  4. 智能体根据返回,调整自己的策略。 重复以上步骤,一步一步创造马尔科夫链。
  5. 马尔可夫链包含三要素:state,action,reward

2. V值和Q值

在这里插入图片描述在这里插入图片描述
接下来是V值和Q值,从某个状态,按照策略 ,走到最终状态很多很多次;最终获得奖励总和的平均值,就是V值。从某个状态选取动作A,走到最终状态很多很多次;最终获得奖励总和的平均值,就是Q值。这就是Q值,这两个值有什么区别呢?
在这里插入图片描述
在这里插入图片描述
一个状态的V值,就是这个状态下的所有动作的Q值,在策略下的期望。
在这里插入图片描述
在这里插入图片描述

Q就是子节点的V的期望!但要注意,需要把R计算在内。
在这里插入图片描述

V值和Q值之后我们再来了解一下蒙特卡罗(MC)和时序差分(TD)。MC和TD都是估算V值的一种方式,不同点是蒙地卡罗会让智能体从某个状态S出发,直到最终状态,然后回过头来给每个节点标记这次的价值G。
G代表了某次,智能体在这个节点的价值。
而时序差分是一步一回头。用下一步的估值,估算当前状态的估值。
于是得到S - A - G 的数据。这里的G就是对于状态S,选择了A的评分。也就是说, - 如果G值正数,那么表明选择A是正确的,我们希望神经网络输出A的概率增加。(鼓励) - 如果G是负数,那么证明这个选择不正确,我们希望神经网络输出A概率减少。(惩罚) - 而G值的大小,就相当于鼓励和惩罚的力度了。

3. Q-Learning和SARSA

接下来我们开始正式了解一些常用的强化学习。首先是Q-learning和SARSA,这两种方法的主要思路在于,用同一个策略下产生的动作A的Q值替代V(S_(t+1))。
在这里插入图片描述
在这里插入图片描述

可以看到他们俩的更新公式长得很像,只差一个max,SARSA的想法是,用同一个策略下产生的动作A的Q值替代V(St+1)。Q-learning用所有动作的Q值的最大值替代V(St+1)。

4. 深度强化学习 DQN

开始进入深度强化学习的部分了。为什么深度强化学习这么强,是因为深度强化学习增加了一个很强的武器——深度神经网络。

深度神经网络就是一个函数。函数其实也很简单,就是描述两个东西的对应关系。F(x) = y , 描述的就是x和y之间的关系。
以前的函数,需要我们去精心设计的,要设计,就要描述其中的关系。但有些东西我们明明知道他们有关系,但又不好描述清楚。
例如,手写数字识别,一个正常人写的数字8,我们人类都能认出来。但我们却描述不出来,我们知道是两个圈是8,但有些人的圈明明不闭合,我们也认得出是8…
在这里插入图片描述

但深度神经网络这个工具就能自己学会这些关系。
我们先设一个Magic’(X),其中的X就是输入的图片;计算结果是各个数字的概率。这个判断一开始通常都是错的,但没关系,我们会慢慢纠正它。
纠正就需要有一个目标,没有目标就没有对错了。这里的目标是我们人类给他们标注的,告诉Magic’:这是数字8。
目标和现实的输出总是有一段距离的,这段距离我们称为损失(loss).
我们调整我们Magic’函数的参数,让损失最小化。也就是说,离目标越来越近。
这就是深度强化学习的主要思想。

Q-learning有一个问题:只能解决格子类型离散型状态问题,对连续型状态束手无策。
这是因为Q-learning在实做的时候用的是Q表格(Q-table)。表格这玩意儿注定就只能存离散的东西。但我们刚才说的神经网络,正好就能解决这个问题,因为神经网络是个函数,可以处理连续型的问题。两者一拍即合!DQN相当于Q-learning的Qtable换成深度神经网络,相当于用一根曲线穿过离散状态下所有的点。
在这里插入图片描述
在这里插入图片描述

Policy Gradient(PG)

这个时候我们发现,我们前面的方法都是通过Q值和V值来计算,也就是基于价值value。而PG用了一种全新的思路,用蒙特卡罗方法的G值来更新网络。也就是说,PG会让智能体一直走到最后,然后回溯计算G值。PG的思路比较新颖,但是缺点在于实际效果不太稳定,在某些环境下学习比较困难。所以我们希望用TD来代替MC,我们可不可以把PG和DQN结合起来呢?
在这里插入图片描述
如果你想详细学习这个模型,可以移步其他博客。当然也是我学习的过程中整理出来的,会有用别人图的情况,如果你觉得侵权可以随时跟我说我删帖。如果你想问原贴在哪也欢迎私信我哦!以下同理
PG原理:【强化学习】Policy Gradient原理
PG代码及注释:【强化学习】Policy Gradients代码注释版本

Actor-Critic

这个就是actor-critic思路的来源,AC准确来说是PG的TD版本。通过定义两个网络,actor网络和Critic网络。Critic网络负责估算Q值 Actor网络负责估算策略。AC方法相对PG来说具有更好的性能,同时也解决了连续动作空间的问题。
在这里插入图片描述
AC原理:【强化学习】Actor Critic原理
AC代码及注释:【强化学习】AC注释版本
A3C原理:【强化学习】A3C原理
A3C代码及注释:【强化学习】A3C代码注释版本

PPO

下一种PPO,这是目前使用最广泛的一种强化学习方法。PPO基于Actor-Critic框架,因此PPO也有两个网络,这是因为AC可以解决连续动作空间这一优点。PPO在AC的基础上主要做了两点改进,一个是延展的AC的TD(0),变成TD(N)的N步更新。第二点是在AC的基础上使用重要性采样,将在线策略变成了离线策略。
在这里插入图片描述
PPO代码及注释:【强化学习】PPO代码注释版本

DDPG

DDPG就是为了解决DQN连续控制型问题而产生的。
DQN的神经网络就相当于用线把Q-table的状态连起来。那到DDPG中,Critic网络就相当于我们用一张布,把整个Q-table的所有柱子都覆盖了。
在这里插入图片描述
在这里插入图片描述

DDPG的Actor接受输入一个状态,就相当于在这块布切沿着这个状态S切一个面。Actor的任务就是希望在这个面上找寻最高点,也就是最大的Q值。

所以和AC不同,DDPG预估的是Q而不是V。而DDPG的Actor采用的是梯度上升的方式找出最大值。而AC和PPO的Actor采用带权重更新的方法。

DDPG起源于DQN,是DQN解决连续控制问题的一个解决方法。
而DQN有一个众所周知的问题,就是Q值会被高估。这是因为我们用argmaxQ(s’)去代替V(s’),去评估Q(s)。当我们每一步都这样做的时候,很容易就会出现高估Q值的情况。
而这个问题也会出现在DDPG中。而要解决这个问题的思路,也在DQN的优化版本中。相信大家很快就明白,就是double DQN。

TD3

在TD3中,我们可以用了两套网络估算Q值,相对较小的那个作为我们更新的目标。这就是TD3的基本思路。
在这里插入图片描述
在这里插入图片描述

我们可以再次回到我们关于“布”的想象。
在DDPG中,计算target的时候,我们输入时s_和a_,获得q,也就是这块布上的一点A。通过估算target估算另外一点s,a,也就是布上的另外一点B的Q值。
在TD3中,计算target时候,输入s_到actor输出a后,给a加上噪音,让a在一定范围内随机。这又什么好处呢。
好处就是,当更新多次的时候,就相当于用A点附近的一小部分范围(准确来说是在s_这条线上的一定范围)的去估算B,这样可以让B点的估计更准确,更健壮。

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

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

相关文章

了解Java缓冲池

了解Java缓冲池 缓冲池空间位于垃圾收集器管理的内存之外。 这是分配本地堆外内存的一种方法。 使用缓冲池有什么好处? 为了回答这个问题,让我们首先了解什么是字节缓冲区。 字节缓冲区 非直接缓冲区 ByteBuffer类附带了java.nio包。 它允许我们分配直接…

java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner

在为什么阿里巴巴不建议在for循环中使用””进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点。其中还有一个重要的拼接方式我没有介绍,那就是Java 8中提供的StringJoiner ,本文就来介绍一下这个字符串拼接…

doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)

在日常工作中我们经常会与数组打交道,因此需要熟练掌握数组操作的相关方法,ES6中关于数组的操作,又给我们带来了哪些惊喜呢,Array数组操作又添加了哪些新方法?本篇文章将从以下几个方面进行介绍:Array.from…

No module named ‘__main__.common‘; ‘__main__‘ is not a package

今天在调通代码时遇到一个难缠的bug,源代码如下: from .common import _FLOATX, _EPSILON结果报错: 问题原因: 也就是说,这是相对导入,只有在父模块在当前运行环境中被导入过才能用。 这揭示了报错的缘由&#xff0…

ValueError( Shape(4, ?, 1, 20) and () are incompatible

报错: 解决: 将文件中的return tf.concat(axis, tensors) 改为:return tf.concat(tensors, axis)问题完美解决

adadelta算法_对C++用户比较友好的机器学习算法库

由于疫情影响,这几天在家学习编程,整理了基于c语言的机器学习算法库。目前大部分机器学习库都是面向pyhton语言的,尽管很python包的底层语言是c,但c用户使用起来很麻烦,这里整理了一些对c比较优化的机器学习算法库&…

不解析,使用解析对象

将面向对象的后端与外部系统集成的传统方式是通过数据传输对象 ,这些对象在外出之前先序列化为JSON,然后在返回时反序列化。 这种方法很流行,而且是错误的。 序列化部分应该由打印机代替,我在前面已经解释过。 这是我对反序列化的…

yaml报错TypeError: load() missing 1 required positional argument: ‘Loader‘

添加一下命令即可: 我的操作: return yaml.load(config)改为 return yaml.full_load(config)问题完美解决

3d制作中需要注意的问题_珠宝首饰工艺篇-戒指3D造型设计制作注意要点

1、戒指的常规手寸数据和戒指外围周长计算公式应用参考如下图:戒指手寸内直径大小说明图1、戒指手寸规格有14号、15号、16号、17号、18号、19号、20号、,但是从开发角度来说比较常见规格是17号18号19号这几种规格比较多,那我们电脑3D建模的时…

微信推送封面尺寸_连封面图都搞不明白,做什么新时代的新媒体人?

嘿,胖友们大家好呀,我是三儿。又是精(bu)神(xiang)满(shang)满(ban)的周一啦,胖友们准备好开始迎接新的一周了吗!为了迎接这个崭新的周一,三儿特意为你们准备的一些实用的小工具教学,帮助你们快速的完成工作…

latex学习篇【一】论文中的图片技巧QA

第一篇论文总算收尾了,整理一波latex写论文的Q&A。 LATEX专栏第一篇:在Latex模板中引入各种图片的问题。 工具:overleaf网站:https://www.overleaf.com/project/60e9ceb20f8db14efa31dc80在overleaf上面插入图片什么形式最好…

LATEX学习篇【二】:论文中的公式技巧QA

写论文免不了写好多好多公式,众所周知啊latex的公式是很难编辑的,有没有简便一点的办法呢?有的,让我们继续读下去吧! 写公式时会用到的一些奇奇怪怪的符号大全(来自百度) 2. 写公式好用的工具…

使用RabbitMQ的SpringBoot消息传递

RabbitMQ是流行的消息代理解决方案之一,并提供可用于各种编程语言的客户端库,包括Java,Scala,.NET,Go,Python,Ruby,PHP等。在本教程中,我们将学习如何使用RabbitMQ消息代…

1.0jpa 2.0_在JPA 2.1中使用@Convert正确完成映射枚举

1.0jpa 2.0如果您曾经在JPA中使用过Java枚举,那么您肯定会意识到它们的局限性和陷阱。 使用enum作为Entity的属性通常是一个很好的选择,但是2.1之前的JPA不能很好地处理它们。 它给了您2 1个选择: 托肖夫达林 Enumerated(EnumType.ORDINAL…

矩形脉冲信号的_IQ信号的解调学习

前面的文章学习了IQ的调制,本文主要讨论IQ的解调过程。调制波形回顾IQ的shifted DQPSK的调制波形总结如下。IQ的星图映射波形每个symbol有256个采样点,这里可以用单位脉冲或者矩形脉冲。如果只看256个symbol的话:IQ经过FIR滤波之后&#xff0…

Spring Data MongoDB教程

在当今世界,尽快启动并运行应用程序非常重要。 该应用程序还应该易于开发和维护。 Spring是这样的框架,它提供了与许多不同框架的集成的简便性,这使得使用Spring开发应用程序变得容易。 一种这样的集成是Spring与MongoDB的集成。 1.简介 在…

arm 交叉编译找不到so_嵌入式杂谈之交叉编译

这次扯一下嵌入式开发过程中经常用到的交叉编译器,虽说在之前的文章也提到过这个问题,不过上次是着重介绍为什么使用交叉编译器(主要是为了劝服自己从单片机的思想中脱离出来,慢慢的接受嵌入式Linux开发的一些约定俗成的工具与方法)&#xff…

Java 10将如何改变您的编码方式

突出显示Java 10中新的Java局部变量类型推断功能 早在2016年,Java社区就掀起了新的JDK增强提案(JEP): JEP 286 。 现在,两年后,局部变量类型推断可以说是Java 10中最值得注意的功能。这是Java语言开发人员…

中兴zxr10路由器重启命令_蒲公英路由器刷第三方固件(一)

蒲公英路由器是由上海贝锐信息科技股份有限公司(oray)在2015年10月14日推出的一款路由器。它是一款采用VPC[3]技术实现智能组网的路由器。2台或多台使用,无需公网IP,能将异地局域网通过蒲公英组建成一个网络。这次刷固件的教程为蒲公英路由器x3/x3pro刷第…

Spring Cloud Netflix尤里卡

本教程是关于Spring云Netflix Eureka的。 在这里,我们将创建eureka发现服务器和微服务,这些服务本身将注册到发现服务器和使用netflix客户端API的客户端中,以使用示例示例来发现服务并使用该服务公开的微服务。因此,我们将开发每个…