Press "Enter" to skip to content

深度强化学习-深度Q网络(DQN)介绍

1.引言

 

 

由DeepDream生成的图像

 

原始的深度强化学习是纯强化学习,其典型问题为马尔科夫决策过程(MDP)。马尔科夫决策过程包含一组状态S和动作A。状态的转换是通过概率P,奖励R和一个折衷参数gamma决定的。概率转换P反映了转换和状态转变的奖励之间的关系,状态和奖励仅依赖上一时间步的状态和动作。

 

强化学习为Agent定义了环境,来实现某些动作以最大化奖励(这些动作根据policy采取)。对Agent的优化行为的基础由Bellman方程定义,这是一种广泛用于求解实际优化问题的方法。为了解决Bellman优化问题,我们使用了一种动态编程的方法。

 

当Agent存在于环境中并转换到另一个状态(位置)时,我们需要估计状态V(s)(位置)-状态值函数的值。一旦我们知道了每个状态的值,我们就可以找出执行Q(S, A)-动作值函数的最佳方法(只需遵循值最高的状态)。

 

这两个映射或函数相关性很高,可以帮助我们找到问题的最佳策略。从状态值函数我们可以看出遵循策略的Agent,处于的S状态有多好。

 

符号解释:

 

E[X] — 随机变量X的期望

 

?— policy

 

Gt — t时刻的折现收益

 

γ — 折现率

 

 

但是,动作值函数q(s,a)是从状态S开始,采取动作A,并遵循策略π的折现收益,并告诉我们从特定状态采取特定动作的效果。

 

 

很明显,状态值函数和Q函数之间的区别在于值函数体现状态的良好性,而Q函数体现状态中的动作的良好性。

 

MDP由Bellman方程求解,Bellman方程是以美国数学家Richard Bellman的名字命名的。该方程有助于寻找最优的策略和价值函数。代理根据所施加的策略选择操作(策略——正式地说,策略定义为每种可能状态下操作的概率分布)。代理可以遵循的不同策略意味着状态的不同值函数。然而,如果目标是使收集到的奖励最大化,我们必须找到最好的可能的政策,称为最优政策。

 

 

另一方面,最佳状态值函数的值,比所有其它值函数(最大返回值)都要大,因此,最佳值函数也以通过代入最大Q值来进行估算:

 

 

最后,值函数的贝尔曼等式(Bellman equation)可表示如下:

 

 

类似地,Q函数的贝尔曼等式可表示如下:

 

 

基于最佳状态值函数以及上述的状态值函数、动作值函数的等式,我们可以写出最终的最佳值函数的等式,该等式称作贝尔曼最佳等式:

 

 

 

通常,强化学习的问题通过Q学习算法来解决。这里,如上所言,智能体与环境交互并接收奖励。目标是用足最佳策略(选择动作的方法),以取得最大奖励。在学习过程中,智能体更新Q(S,A)表(当回合结束时,任务完成,目标达到)。

 

Q学习算法通过以下步骤实现:

 

1、用随机数初始化Q(S,A)表。

 

2、用epsilon贪心策略选取一个行动,然后进入下一个状态S’

 

3、根据更新等式来更新前一个状态的Q值:

 

 

最好是从解决来自OpenAI gym的 Frozen Lake 开始。

 

在冻湖环境里(最好能熟悉OpenAI的描述),智能体可处理16种状态,执行4个不同的动作(在一个状态中)。在这种情况下,我们的A(S,A)表的大小是16×4。

 

Frozen Lake 代码如下,你也可以点击 此处 查看~

 

 

https://gist.github.com/markusbuchholz/af4e5b5891de6d3cf5528f83b6198311#file-qlearning_algorithm-py

 

 

请注意上面给出的Q算法属于时序差分学习算法(Temporal Difference Learning algorithms)(由Richard S. Sutton于1988年提出)。Q算法是一种线下策略(off-policy)算法(这种算法具有从旧的历史数据学习的能力)。Q学习算法的扩展是SARSA(在线策略(on-policy)算法)。唯一区别在于Q(S,A)表的更新:

 

 

2. 深度强化学习(深度Q网络–DNQ)

 

当所有可到达的状态处于可控(能够迭代)并且能存储在计算机RAM中时,强化学习对于环境来说是足够好用的。然而,当环境中的状态数超过现代计算机容量时(Atari游戏有12833600个状态),标准的强化学习模式就不太有效了。而且,在真实环境中,智能体必须面对连续状态(不离散),连续变量和连续控制(动作)的问题。

 

知道了智能体所处的环境的复杂性(状态数量,连续控制),标准的、定义明确的强化学习Q表就得被深度神经网络(Q网络)取代了,后者可以把环境状态映射为智能体动作(非线性逼近)。网络架构,网络超参数的选择以及学习都在训练阶段(Q网络权重的学习)中完成。DQN允许智能体探索非结构化的环境并获取知识,经过时间积累,他们可以模仿人类的行为。

 

3. 学习算法DQN

 

下图(在训练过程中)描述了DQN的核心概念,图中,Q网络做非线性逼近,把状态映射为动作值。

 

在训练过程中,智能体与环境交互,并接收数据,这些数据在Q网络的学习过程中会用到。智能体探索环境,建立一个转换和动作输出的全图。开始时,随机进行动作,随着时间推移,这样做越来越没效果。在探索环境时,智能体尽量查询Q网络(逼近)以决定如何行动。我们把这种方式(综合了随机行为和Q网络查询)称为epsilon贪心方法(epsilon贪心动作选择块),也就是说利用概率超参数epsilon在随机和Q策略间进行选择。

 

我们所讲的Q学习算法的核心来自于监督学习。

 

如前所述,我们的目标是用深度神经逼近一个复杂的非线性函数Q(S,A)。

 

跟监督学习一样,在DQN中,我们定义损失函数为目标和预测值之间的方差,我们也更新权重尽量减少损失(假定智能体从一个状态转换到另一个状态,进行了某个动作a,获取奖励r)。

 

 

在学习过程中,我们使用两个不相关的Q网络(Q_network_local和Q_network_target)来计算预测值(权重θ)和目标值(权重θ’)。经过若干步骤后,目标网络会被冻结,然后拷贝实际的Q网络的权重到目标网络权重。冻结目标Q网络一段时间再用实际Q网络的权重更新其权重,可以稳定训练过程。

 

 

图1. DQN算法概念

 

为使训练过程更稳定(我们要避免用比较关联的数据来训练网络,如果基于连续更新最后转换来进行训练的话, 这种情况就有可能发生),我们引入重播缓冲区,它能记住智能体所经历的行为。然后,用重播缓冲区里的随机样本来进行训练(这可以减少智能体的经历之间的关联性,并有助于智能体从更广泛的经历中进行学习)。

 

DQN算法可描述如下:

 

1. 初始化重播缓冲区。

 

2. 预处理环境,并把状态S输入DQN, 后者会返回该状态中所有可能的动作的Q值。

 

3. 用epsilon贪心策略选取一个动作:当有概率epsilon时,我们选择随机动作A,当有概率1-epsilon时,选取具有最高Q值的动作,例如A=argmax(Q(S, A, θ))。

 

4. 选择了动作A后,智能体在状态S中执行所选的动作,并进行到新状态S ,接收奖励R。

 

5. 把转换存储在重播缓冲中,记作<S,A,R,S’>。


 

6. 下一步,从重播缓冲区中抽取随机批次的转换,并用以下公式计算损失:

 

 

7. 针对实际网络参数,执行梯度下降,以使损失最小化。

 

8. 每隔k步之后,拷贝实际网络权重到目标网络权重中。

 

9. 重复这些步骤M回合。

 

4. 工程设置.结果.

 

在这一段中,我展示Udacity(深度强化学习)的工程代码的结果。

 

a. 工程的目标

 

本工程的目标是训练智能体如何在方块环境中通过移动来采集黄色香蕉。工程要求在100个连续回合中获取+13的平均分。

 

b. 在导航工程中,使用下列参数设置神经网络架构和超参数:

 

以下是每回合的奖励图,显示出智能体在玩了2247回合后,能收到的平均奖励(超过100回合)有至少+13。

 

Q网络架构:

 

输入层FC1:37节点输入,64节点输出

 

隐藏层FC2:64节点输入,64节点输出

 

隐藏层FC3:64节点输入,64节点输出

 

输出层:64节点输入,4节点输出—-动作的大小

 

使用的超参数:

 

BUFFER_SIZE = int(1e5) # 重播缓冲区大小
BATCH_SIZE = 64 # 最小批量大小
GAMMA = 0.99 # 折扣率
TAU = 1e-3 # 用于目标参数的软更新
LR = 5e-4 # 学习率
UPDATE_EVERY = 4 # 更快网络的快慢
Epsilon start = 1.0
Epsilon start = 0.01
Epsilon decay = 0.999

 

 

 

图2. 智能体学习的平均得分

 

5. 未来工作的想法

 

如果有深度学习的相关经验,那幺未来工作将主要集中于图像处理方面(从像素中学习)。下图展示了DQN的架构,图中,我们输入游戏画面,Q网络逼近游戏状态中所有动作的Q值。动作由我们讨论过的DQN算法进行选择。

 

 

图3. 从像素学习的概念

 

其次,未来的工作将集中在生成一个决斗(Dueling)式DQN。在这个新的架构中,我们指定新的优势函数,这个函数计算出智能体执行的一个动作,比其它动作好了多少(优势可为正也可为负)。

 

Dueling DQN架构与上面讲的DQN相同,只不过最后的全连接层分成两股(见下图所描述)。

 

若环境的一个状态有确定数量的动作空间,绝大多数计算出来的动作对状态没有什幺影响。此外,有些动作有冗余效应。在这种情况下,新的dueling DQN将会比DQN架构估算出来的Q值更精确。

 

其中一股计算值函数,另一股计算优势函数(用于决定哪个动作更优)。

 

 

图4. Dueling DQN架构

 

最后,我们考虑一下从人类的偏好中进行学习 (OpenAI和Deep Mind) 。这个新概念的核心思想是从人类的反馈中学习。接收人类反馈的智能体,将尽力进行人类期望的动作,并相应地设置奖励。人类与智能体的直接交互 ,会有助于降低设计奖励函数和复杂的目标函数的难度。

 

 

你可以通过我的Github找到本工程的全部源码:

 

https://github.com/markusbuchholz/deep-reinforcement-learning/tree/master/p1_navigation

 

本文编辑:王立鱼

 

英语原文:https://medium.com/@markus.x.buchholz/deep-reinforcement-learning-introduction-deep-q-network-dqn-algorithm-fb74bf4d68621

原标题 |  Deep Reinforcement Learning. Introduction. Deep Q Network (DQN) algorithm.

作者 |  Markus Buchholz

译者 |  qianyuhappy、AI小山

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注