强化学习入门简单实例 DQN

强化学习入门简单实例 DQN基础知识作者 甄景贤链接 https www zhihu com question answer 我在外国博客上写过一些基於人工智能的文章 有些搬到了博客园 上面转录的是其中一篇 什么是强化学习 我正在研究的 AIarchitectu 是用强化学习控制 recurrent 神经网络 我相信这个设置可以做到逻辑推理和答问题的功能 基本上就

基础知识

 

我正在研究的 AI architecture 是用强化学习控制 recurrent 神经网络,我相信这个设置可以做到逻辑推理和答问题的功能,基本上就是 strong AI。 但还有一些未解决的细节。 论文的标题是《游荡在思考的迷宫中》,即将发表。

 

手把手实例Q-learning

作者: peghoty 

出处: http://blog.csdn.net/peghoty/article/details/

 

第一部分:中文翻译

强化学习入门简单实例 DQN强化学习入门简单实例 DQN强化学习入门简单实例 DQN强化学习入门简单实例 DQN强化学习入门简单实例 DQN强化学习入门简单实例 DQN强化学习入门简单实例 DQN强化学习入门简单实例 DQN

 

 从Q-Learning到DQN

 

来源

2 维度灾难

在上面的简单分析中,我们使用表格来表示Q(s,a),但是这个在现实的很多问题上是几乎不可行的,因为状态实在是太多。使用表格的方式根本存不下。

举Atari为例子。

 

强化学习入门简单实例 DQN计算机玩Atari游戏的要求是输入原始图像数据,也就是210×160像素的图片,然后输出几个按键动作。总之就是和人类的要求一样,纯视觉输入,然后让计算机自己玩游戏。那么这种情况下,到底有多少种状态呢?有可能每一秒钟的状态都不一样。因为,从理论上看,如果每一个像素都有256种选择,那么就有:

 

256^{210\times 160}

这简直是天文数字。所以,我们是不可能通过表格来存储状态的。我们有必要对状态的维度进行压缩,解决办法就是 价值函数近似Value Function Approximation

3 价值函数近似Value Function Approximation

什么是价值函数近似呢?说起来很简单,就是用一个函数来表示Q(s,a)。即

Q(s,a) = f(s,a)

f可以是任意类型的函数,比如线性函数:

Q(s,a) = w_1s + w_2a + b 其中w_1,w_2,b是函数f的参数。

大家看到了没有,通过函数表示,我们就可以无所谓s到底是多大的维度,反正最后都通过矩阵运算降维输出为单值的Q。

这就是价值函数近似的基本思路。

如果我们就用w来统一表示函数f的参数,那么就有

Q(s,a) = f(s,a,w)

为什么叫近似,因为我们并不知道Q值的实际分布情况,本质上就是用一个函数来近似Q值的分布,所以,也可以说是

Q(s,a)\approx f(s,a,w)

4 高维状态输入,低维动作输出的表示问题

对于Atari游戏而言,这是一个高维状态输入(原始图像),低维动作输出(只有几个离散的动作,比如上下左右)。那么怎么来表示这个函数f呢?

难道把高维s和低维a加在一起作为输入吗?

必须承认这样也是可以的。但总感觉有点别扭。特别是,其实我们只需要对高维状态进行降维,而不需要对动作也进行降维处理。

那么,有什么更好的表示方法吗?

当然有,怎么做呢?

其实就是Q(s) \approx f(s,w),只把状态s作为输入,但是输出的时候输出每一个动作的Q值,也就是输出一个向量[Q(s,a_1),Q(s,a_2),Q(s,a_3),...,Q(s,a_n)],记住这里输出是一个值,只不过是包含了所有动作的Q值的向量而已。这样我们就只要输入状态s,而且还同时可以得到所有的动作Q值,也将更方便的进行Q-Learning中动作的选择与Q值更新(这一点后面大家会理解)。

5 Q值神经网络化!

终于到了和深度学习相结合的一步了!

意思很清楚,就是我们用一个深度神经网络来表示这个函数f。

这里假设大家对深度学习特别是卷积神经网络已经有基本的理解。如果不是很清楚,欢迎阅读本专栏的CS231n翻译系列文章。

 

强化学习入门简单实例 DQN以DQN为例,输入是经过处理的4个连续的84×84图像,然后经过两个卷积层,两个全连接层,最后输出包含每一个动作Q值的向量。

 

对于这个网络的结构,针对不同的问题可以有不同的设置。如果大家熟悉Tensorflow,那么肯定知道创建一个网络是多么简单的一件事。这里我们就不具体介绍了。我们将在之后的DQN tensorflow实战篇进行讲解。

总之,用神经网络来表示Q值非常简单,Q值也就是变成用Q网络(Q-Network)来表示。接下来就到了很多人都会困惑的问题,那就是

怎么训练Q网络???

6 DQN算法

我们知道,神经网络的训练是一个最优化问题,最优化一个损失函数loss function,也就是标签和网络输出的偏差,目标是让损失函数最小化。为此,我们需要有样本,巨量的有标签数据,然后通过反向传播使用梯度下降的方法来更新神经网络的参数。

所以,要训练Q网络,我们要能够为Q网络提供有标签的样本。

所以,问题变成:

如何为Q网络提供有标签的样本?

答案就是利用Q-Learning算法。

大家回想一下Q-Learning算法,Q值的更新依靠什么?依靠的是利用Reward和Q计算出来的目标Q值:

R_{t+1}+\lambda \max _aQ(S_{t+1},a)

因此,我们把目标Q值作为标签不就完了?我们的目标不就是让Q值趋近于目标Q值吗?

因此,Q网络训练的损失函数就是

 

强化学习入门简单实例 DQN上面公式是s^`,a^`  即下一个状态和动作。这里用了David Silver的表示方式,看起来比较清晰。

 

既然确定了损失函数,也就是cost,确定了获取样本的方式。那么DQN的整个算法也就成型了!

接下来就是具体如何训练的问题了!

7 DQN训练

我们这里分析第一个版本的DQN,也就是NIPS 2013提出的DQN。

 

强化学习入门简单实例 DQN我们分析了这么久终于到现在放上了DQN算法,真是不容易。如果没有一定基础直接上算法还真是搞不明白。

 

具体的算法主要涉及到Experience Replay,也就是经验池的技巧,就是如何存储样本及采样问题。

由于玩Atari采集的样本是一个时间序列,样本之间具有连续性,如果每次得到样本就更新Q值,受样本分布影响,效果会不好。因此,一个很直接的想法就是把样本先存起来,然后随机采样如何?这就是Experience Replay的意思。按照脑科学的观点,人的大脑也具有这样的机制,就是在回忆中学习。

那么上面的算法看起来那么长,其实就是反复试验,然后存储数据。接下来数据存到一定程度,就每次随机采用数据,进行梯度下降!

也就是

在DQN中增强学习Q-Learning算法和深度学习的SGD训练是同步进行的!

通过Q-Learning获取无限量的训练样本,然后对神经网络进行训练。

样本的获取关键是计算y,也就是标签。

 与DQN不同的Policy Gradient:

来源

2 Why Policy Network?

我们已经知道DQN是一个基于价值value的方法。换句话说就是通过计算每一个状态动作的价值,然后选择价值最大的动作执行。这是一种间接的做法。那么,更直接的做法是什么?

能不能直接更新策略网络Policy Network呢?

什么是策略网络Policy Network?就是一个神经网络,输入是状态,输出直接就是动作(不是Q值)。

a = \pi(s,\theta)a = \pi(s,\theta)

或者输出概率:a = \pi(a|s,\theta)

这里要提一下概率输出的问题。对于DQN来说,本质上是一个接近于确定性输出的算法。至多就是采用\epsilon-greedy进行探索。但是有很多时候,在某一个特定状态下,很多动作的选择可能都是可以的。比如说我有20块钱去买饭。那么不管我买的是蛋炒饭还是土豆肉片盖码饭,结果都是一样的填饱肚子。因此,采用输出概率会更通用一些。而DQN并不能输出动作的概率,所以采用Policy Network是一个更好的办法。

3 Policy Gradient

要更新策略网络,或者说要使用梯度下降的方法来更新网络,我们需要有一个目标函数。对于策略网络,目标函数其实是比较容易给定的,就是很直接的,最后的结果!也就是

L(\theta) = \mathbb E(r_1+\gamma r_2 + \gamma^2 r_3 + ...|\pi(,\theta)) 所有带衰减reward的累加期望

那么问题就在于如何利用这个目标来更新参数\theta呢?咋一看这个损失函数和策略网络简直没有什么直接联系,reward是环境给出的,如何才能更新参数?换个说法就是如何能够计算出损失函数关于参数的梯度(也就是策略梯度):

\nabla_{\theta} L(\theta)

咋一看根本就没有什么思路是不是,所以先换一个思路来考虑问题。

4 就给我一个Policy Network,也没有loss,怎么更新?

改变动作的出现概率!

现在我们不考虑别的,就仅仅从概率的角度来思考问题。我们有一个策略网络,输入状态,输出动作的概率。然后执行完动作之后,我们可以得到reward,或者result。那么这个时候,我们有个非常简单的想法:

如果某一个动作得到reward多,那么我们就使其出现的概率增大,如果某一个动作得到的reward少,那么我们就使其出现的概率减小。

当然,也显然的,用reward来评判动作的好坏是不准确的,甚至用result来评判也是不准确的。毕竟任何一个reward,result都依赖于大量的动作才导致的。但是这并不妨碍我们做这样的思考:

如果能够构造一个好的动作评判指标,来判断一个动作的好与坏,那么我们就可以通过改变动作的出现概率来优化策略!

假设这个评价指标是f(s,a),那么我们的Policy Network输出的是概率。一般情况下,更常使用log likelihood log \pi(a|s,\theta)。原因的话看这里Why we consider log likelihood instead of Likelihood in Gaussian Distribution。

因此,我们就可以构造一个损失函数如下:

L(\theta) = \sum log\pi(a|s,\theta)f(s,a)

怎么理解呢?举个简单的AlphaGo的例子吧。对于AlphaGo而言,f(s,a)就是最后的结果。也就是一盘棋中,如果这盘棋赢了,那么这盘棋下的每一步都是认为是好的,如果输了,那么都认为是不好的。好的f(s,a)就是1,不好的就-1。所以在这里,如果a被认为是好的,那么目标就是最大化这个好的动作的概率,反之亦然。

这就是Policy Gradient最基本的思想。

5 另一个角度:直接算

f(s,a)不仅仅可以作为动作的评价指标,还可以作为目标函数。就如同AlphaGo,评价指标就是赢或者输,而目标就是结果赢。这和之前分析的目标完全没有冲突。因此,我们可以利用评价指标f(s,a)来优化Policy,同时也是在优化的同时优化了f(s,a).那么问题就变成对f(s,a)求关于参数的梯度。下面的公式直接摘自Andrej Karpathy的blog,f(x)即是f(s,a)

\begin{align}\nabla_{\theta} E_x[f(x)] &= \nabla_{\theta} \sum_x p(x) f(x) & \text{definition of expectation} \\& = \sum_x \nabla_{\theta} p(x) f(x) & \text{swap sum and gradient} \\& = \sum_x p(x) \frac{\nabla_{\theta} p(x)}{p(x)} f(x) & \text{both multiply and divide by } p(x) \\& = \sum_x p(x) \nabla_{\theta} \log p(x) f(x) & \text{use the fact that } \nabla_{\theta} \log(z) = \frac{1}{z} \nabla_{\theta} z \\& = E_x[f(x) \nabla_{\theta} \log p(x) ] & \text{definition of expectation}\end{align}

从公式得到的结论可以看到正好和上一小结分析得到的目标函数一致。

因此,Policy Gradient方法就这么确定了。

结合DQN和Policy Gradient的Actor Critic:

来源

一句话概括 Actor Critic 方法:结合了 Policy Gradient (Actor) 和 Function Approximation (Critic) 的方法. Actor 基于概率选行为, Critic 基于 Actor 的行为评判行为的得分, Actor 根据 Critic 的评分修改选行为的概率.

Actor Critic 方法的优势: 可以进行单步更新, 比传统的 Policy Gradient 要快(回合结束更新).

Actor Critic 方法的劣势: 取决于 Critic 的价值判断, 但是 Critic 难收敛, 再加上 Actor 的更新, 就更难收敛. 为了解决收敛问题, Google Deepmind 提出了 Actor Critic 升级版 Deep Deterministic Policy Gradient. 后者融合了 DQN 的优势, 解决了收敛难的问题.

Actor 修改行为时就像蒙着眼睛一直向前开车, Critic 就是那个扶方向盘改变 Actor 开车方向的.

强化学习入门简单实例 DQN

或者说详细点, 就是 Actor 在运用 Policy Gradient 的方法进行 Gradient ascent 的时候, 由 Critic 来告诉他, 这次的 Gradient ascent 是不是一次正确的 ascent, 如果这次的得分不好, 那么就不要 ascent 那么多.

DDPG

它吸收了 Actor critic 让 Policy gradient 单步更新的精华, 而且还吸收让计算机学会玩游戏的 DQN 的精华, 合并成了一种新算法, 叫做 Deep Deterministic Policy Gradient一句话概括 DDPG: Google DeepMind 提出的一种使用 Actor Critic 结构, 但是输出的不是行为的概率, 而是具体的行为, 用于连续动作 (continuous action) 的预测. DDPG 结合了之前获得成功的 DQN 结构, 提高了 Actor Critic 的稳定性和收敛性.

强化学习入门简单实例 DQN

现在我们来说说 DDPG 中所用到的神经网络. 它其实和我们之前提到的 Actor-Critic 形式差不多, 也需要有基于策略 Policy 的神经网络和基于价值 Value 的神经网络, 但是为了体现 DQN 的思想, 每种神经网络我们都需要再细分为两个, Policy Gradient 这边, 我们有估计网络和现实网络, 估计网络用来输出实时的动作, 供 actor 在现实中实行. 而现实网络则是用来更新价值网络系统的. 所以我们再来看看价值系统这边, 我们也有现实网络和估计网络, 他们都在输出这个状态的价值, 而输入端却有不同, 状态现实网络这边会拿着从动作现实网络来的动作加上状态的观测值加以分析, 而状态估计网络则是拿着当时 Actor 施加的动作当做输入.在实际运用中, DDPG 的这种做法的确带来了更有效的学习过程.

DDPG中,actor网络的输入是state,输出Action,以DNN进行函数拟合,对于连续动作NN输出层可以用tanh或sigmod,离散动作以softmax作为输出层则达到概率输出的效果。Critic网络的输入为state和action,输出为Q值。

强化学习入门简单实例 DQN

A3C(Asynchronous Advantage Actor-Critic)

我们知道目前的计算机多半是有双核, 4核, 甚至 6核, 8核. 一般的学习方法, 我们只能让机器人在一个核上面玩耍. 但是如果使用 A3C 的方法, 我们可以给他们安排去不同的核, 并行运算. 实验结果就是, 这样的计算方式往往比传统的方式快上好多倍. 

一句话概括 A3C: Google DeepMind 提出的一种解决 Actor-Critic 不收敛问题的算法. 它会创建多个并行的环境, 让多个拥有副结构的 agent 同时在这些并行环境上更新主结构中的参数. 并行中的 agent 们互不干扰, 而主结构的参数更新受到副结构提交更新的不连续性干扰, 所以更新的相关性被降低, 收敛性提高.

强化学习入门简单实例 DQN

全面提升基础知识

https://www.cnblogs.com/pinard/category/1254674.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209731.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:32
下一篇 2026年3月19日 上午8:33


相关推荐

  • linux mencoder,linux下mencoder的一些用法

    linux mencoder,linux下mencoder的一些用法引用 ToDIVXmencod oacmp3lame lameoptsaq 7 cbr br 128 srate44100 vfscale width height harddup ovclavc ffourccDX50 lavcoptsvcod mpeg4 vbitrate 320InputFile oOutputFile ToDIVX 2ps

    2026年3月19日
    3
  • Python数据分析的过程记录

    Python数据分析的过程记录第一次Python接单的过程记录文章目录第一次Python接单的过程记录

    2022年5月15日
    38
  • LZW编码的学习与实现

    LZW编码的学习与实现Preface 看了一天 感觉终于搞明白了一点 代码终于写对了 编码过程大四的时候学过一点点 按部就班的按照步骤来做就行了 解码过程貌似课堂上老师没讲 自己看 wiki 上的讲解和 example 搞懂了 LZW 全称 Lempel Ziv Welch 就是这个三个人搞出来的 LZW 的工作思路 考虑一段数据 abcabcabc 对于这样的一段数据 如果不做任何处理和压缩 假设每个字符用一个字节来表

    2026年3月19日
    2
  • winrm java客户端_winrm service

    winrm java客户端_winrm service今天看脚本忽然发现一个服务 叫 winRM 服务 这是个 PowerShell 的远程管理 开启它可以很大程度的方便用 PowerShell 操控 下面是我找到的一些资料 在 Linux 中 我们可以使用安全的 SSH 方便的进行远程管理 但在 Windows 下 除了不安全的 Telnet 以外 从 WindowsServe 开始提供了另外一种命令行原创管理方式 那就是基于 PowerShell 的 WinRM 下面就

    2026年3月26日
    2
  • windows/linux环境python3出现pip is configured with locations that require TLS/SSL, however the..不可用的解决方法[通俗易懂]

    windows/linux环境python3出现pip is configured with locations that require TLS/SSL, however the..不可用的解决方法[通俗易懂]linux环境下首先明确问题出现原因,是因为openssl版本过低或者不存在so: 查看openssl安装包,发现缺少openssl-devel包 [root@localhost~]#rpm-aq|grepopenssl openssl-0.9.8e-20.el5 openssl-0.9.8e-20.el5 [root@localhost~]# yu…

    2025年7月13日
    6
  • 中国博士为什么会没有尊严

    最近经常看到一些博士在网上诉苦,感叹自己寒窗苦读了半辈子的说,依然没有能够摆脱贫困,还不如早年进城打工的放牛娃,甚至出现了考研考博不如读技校的说法。中国的博士到底是怎么啦,为什么都这么没有尊严的呢?

    2022年4月12日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号