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

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

学习路线

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 ,本文就来介绍一下这个字符串拼接…

module ‘tensorflow_core.compat.v1‘ has no attribute ‘contrib‘问题的完美解决

问题描述&#xff1a; Instructions for updating: Use keras.layers.Dense instead. Traceback (most recent call last):File "run_cnn.py", line 200, in <module>model TextCNN(config)File "D:\MY DATA\学习资料\研究生\深度学习\text-classificat…

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

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

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

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

spring 异步返回结果_使用Spring Integration聚合异步结果

spring 异步返回结果嗨&#xff0c;我遇到了一个问题&#xff0c;该问题使用Spring Integration解决方案非常好。 很多时候&#xff0c;我们需要一种将消息分发到未知数量的目的地的方案。 为此&#xff0c;我们使用主题方法。 但是有时&#xff0c;我们还希望从收到消息的所有…

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

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

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

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

不解析,使用解析对象

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

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

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

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

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

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

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

2021总结

去年做了复盘&#xff0c;感觉很良好。以后希望把这个每年复盘一次的习惯能够好好坚持下去&#xff0c;再加上年初的规划就更好啦&#xff01;2021年&#xff0c;比起2020来说&#xff0c;就相对平静了很多&#xff0c;没经历过大风大浪&#xff0c;心智还是有所变化&#xff0…

java queue使用_使用Java使用Amazon Simple Queue Service

java queue使用Amazon Simple Queue Service或SQS是Amazon Webservice堆栈提供的高度可扩展的托管消息队列。 Amazon SQS可用于完全解耦系统内不同组件的操作&#xff0c;这些组件否则将交换数据以执行独立的任务。 Amazon SQS还可以帮助我们保存在应用程序关闭或组件之一不可用…

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

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

配置HTTPS以与Servlet一起使用

要配置Java EE应用程序以通过HTTPS进行通信&#xff0c;需要在web.xml文件中使用几行XML。 web.xml文件位于项目的WEB-INF目录中&#xff0c;通常在IDE生成Java EE Web应用程序时自动创建。 如果不是&#xff0c;您可以自己创建它。 HTTPS的动机 为Web应用程序配置安全连接的…

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

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

latex学习篇【三】论文中的表格技巧QA

latex中表格是一个大头 和公式一样&#xff0c;推荐一个好用的工具&#xff01; https://www.tablesgenerator.com/latex_tables 这个网站可以在线编辑表格&#xff0c;直接生成代码&#xff0c;粘贴过去就可以啦&#xff01;&#xff01;&#xff01; 但是关于细节还有很多要调…

JRebel适用于Gradle Spring Boot应用程序

关于如何将JRebel添加到使用Gradle作为构建工具的Spring Boot应用程序中&#xff0c;有一些文档 。 它是基本的&#xff0c;但是效果很好。 您所要做的就是在build.gradle中添加几行&#xff1a; if (project.hasProperty(rebelAgent)) {bootRun.jvmArgs rebelAgent }然后在…

MADDPG中环境怎么配置,multiagent包解决

一、环境提供 MADDPG&#xff1a; https://github.com/starry-sky6688/MADDPG (pytorch版本) MPE环境&#xff1a;https://github.com/openai/multiagent-particle-envs 论文&#xff1a;《Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments》https…