强化学习从基础到进阶-常见问题和面试必知必答[4]::深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN
强化学习全系列超详细算法码源见文章顶部
1.核心词汇
- 深度Q网络(deep Q-network,DQN):基于深度学习的Q学习算法,其结合了价值函数近似(value function approximation)与神经网络技术,并采用目标网络和经验回放等方法进行网络的训练。
- 状态-价值函数(state-value function):其输入为演员某一时刻的状态,输出为一个标量,即当演员在对应的状态时,预期的到过程结束时间段内所能获得的价值。
- 状态-价值函数贝尔曼方程(state-value function Bellman equation):基于状态-价值函数的贝尔曼方程,它表示在状态
下对累积奖励
的期望。
- Q函数(Q-function): 其也被称为动作价值函数(action-value function)。其输入是一个状态-动作对,即在某一具体的状态采取对应的动作,假设我们都使用某个策略
,得到的累积奖励的期望值有多大。
- 目标网络(target network):其可解决在基于时序差分的网络中,优化目标
左右两侧会同时变化使得训练过程不稳定,从而增大回归的难度的问题。目标网络选择将右边部分,即
固定,通过改变左边部分,即
中的参数进行回归,这也是深度Q网络应用中比较重要的技巧。
- 探索(exploration):我们在使用Q函数的时候,我们的策略完全取决于Q函数,这有可能导致出现对应的动作是固定的某几个数值的情况,而不像策略梯度中的输出是随机的,我们再从随机分布中采样选择动作。这会导致我们继续训练的输入值一样,从而“加重”输出的固定性,导致整个模型的表达能力急剧下降,这就是探索-利用窘境(exploration-exploitation dilemma)问题。我们可以使用
-贪心和玻尔兹曼探索(Boltzmann exploration)等探索方法进行优化。
- 经验回放(experience replay):其会构建一个回放缓冲区(replay buffer)来保存许多经验,每一个经验的形式如下:在某一个状态
,采取某一个动作
,得到奖励
,然后进入状态
。我们使用
与环境交互多次,把收集到的经验都存储在回放缓冲区中。当我们的缓冲区“装满”后,就会自动删去最早进入缓冲区的经验。在训练时,对于每一轮迭代都有相对应的批量(batch)(与我们训练普通的网络一样,都是通过采样得到的),然后用这个批量中的经验去更新我们的Q函数。综上,Q函数在采样和训练的时候,会用到过去的经验,所以这里称这个方法为经验回放,其也是深度Q网络应用中比较重要的技巧。
- 双深度Q网络(double DQN):在双深度Q网络中存在两个Q网络,第一个Q网络决定哪一个动作的Q值最大,从而决定对应的动作。另一方面,Q值是用
计算得到的,这样就可以避免过度估计的问题。具体地,假设我们有两个Q函数并且第一个Q函数高估了它现在执行的动作
的值,这没关系,只要第二个Q函数
没有高估动作
的值,那么计算得到的就还是正常的值。
- 竞争深度Q网络(dueling DQN):将原来的深度Q网络的计算过程分为两步。第一步计算一个与输入有关的标量
;第二步计算一个向量
对应每一个动作。最后的网络将两步的结果相加,得到我们最终需要的Q值。用一个公式表示就是
。另外,竞争深度Q网络,使用状态价值函数与动作价值函数来评估Q值。
- 优先级经验回放(prioritized experience replay,PER):这个方法是为了解决我们在第6章中提出的经验回放方法的不足而提出的。我们在使用经验回放时,均匀地取出回放缓冲区(reply buffer)中的采样数据,这里并没有考虑数据间的权重大小。但是我们应该将那些训练效果不好的数据对应的权重加大,即其应该有更大的概率被采样到。综上,优先级经验回放不仅改变了被采样数据的分布,还改变了训练过程。
- 噪声网络(noisy net):其在每一个回合开始的时候,即智能体要和环境交互的时候,在原来的Q函数的每一个参数上加上一个高斯噪声(Gaussian noise),把原来的Q函数变成
,即噪声Q函数。同样,我们把每一个网络的权重等参数都加上一个高斯噪声,就得到一个新的网络
。我们会使用这个新的网络与环境交互直到结束。
- 分布式Q函数(distributional Q-function):对深度Q网络进行模型分布,将最终网络的输出的每一类别的动作再进行分布操作。
- 彩虹(rainbow):将7个技巧/算法综合起来的方法,7个技巧分别是——深度Q网络、双深度Q网络、优先级经验回放的双深度Q网络、竞争深度Q网络、异步优势演员-评论员算法(A3C)、分布式Q函数、噪声网络,进而考察每一个技巧的贡献度或者与环境的交互是否是正反馈的。
2.常见问题汇总
2.为什么在深度Q网络中采用价值函数近似的表示方法?
首先深度Q网络为基于深度学习的Q学习算法,而在Q学习中,我们使用表格来存储每一个状态下动作的奖励,即我们在正文中介绍的动作价值函数
。但是在我们的实际任务中,状态量通常数量巨大,并且在连续任务中会遇到维度灾难等问题,使用真正的价值函数通常是不切实际的,所以使用了与价值函数近似的表示方法。
2.2 评论员的输出通常与哪几个值直接相关?
与状态和演员直接相关。我们在讨论输出时通常是针对一个演员衡量一个状态的好坏,也就是状态、价值从本质上来说是依赖于演员的。不同的演员在相同的状态下也会有不同的输出。
2.3 我们通常怎么衡量状态价值函数
?其优势和劣势分别有哪些?
(1)基于蒙特卡洛的方法:本质上就是让演员与环境交互。评论员根据统计结果,将演员和状态对应起来,即如果演员看到某一状态
,将预测接下来的累积奖励有多大,如果看到另一个状态
,将预测接下来的累积奖励有多大。但是其普适性不好,其需要匹配到所有的状态。如果我们面对的是一个简单的例如贪吃蛇游戏等状态有限的问题还可以应对,但是如果我们面对的是一个图片型的任务,我们几乎不可能将所有的状态(对应每一帧的图像)的都“记录”下来。总之,其不能对未出现过的输入状态进行对应价值的输出。
(2)基于蒙特卡洛的网络方法:为了弥补上面描述的基于蒙特卡洛的方法的不足,我们将其中的状态价值函数
定义为一个网络,其可以对于从未出现过的输入状态,根据网络的泛化和拟合能力,“估测”出一个价值输出。
(3)基于时序差分的网络方法,即基于时序差分的网络:与我们在前4章介绍的蒙特卡洛方法与时序差分方法的区别一样,基于时序差分的网络方法和基于蒙特卡洛的网络方法的区别也相同。在基于蒙特卡洛的方法中,每次我们都要计算累积奖励,也就是从某一个状态
一直到游戏结束的时候,得到的所有奖励的总和。所以要应用基于蒙特卡洛的方法时,我们必须至少把游戏玩到结束。但有些游戏要玩到游戏结束才能够更新网络花费的时间太长了,因此我们会采用基于时序差分的网络方法。基于时序差分的网络方法不需要把游戏玩到结束,只要在游戏某一个状态
的时候,采取动作
得到奖励
,进入状态
,就可以应用基于时序差分的网络方法。其公式与之前介绍的时序差分方法类似,即
。
(4)基于蒙特卡洛方法和基于时序差分方法的区别在于: 蒙特卡洛方法本身具有很大的随机性,我们可以将其
视为一个随机变量,所以其最终的偏差很大。而对于时序差分,其具有随机的变量
。因为在状态
采取同一个动作,所得的奖励也不一定是一样的,所以对于时序差分方法来说,
是一个随机变量。但是相对于蒙特卡洛方法的
来说,
的随机性非常小,这是因为
本身就是由很多的
组合而成的。从另一个角度来说,在时序差分方法中,我们的前提是
,但是我们通常无法保证
、
计算的误差为0。所以当
、
计算得不准确,得到的结果也会是不准确的。总之,两者各有优劣。
(5)目前,基于时序差分的方法是比较常用的,基于蒙特卡洛的方法其实是比较少用的。
2.4 基于本章正文介绍的基于蒙特卡洛的网络方法,我们怎么训练模型呢?或者我们应该将其看作机器学习中什么类型的问题呢?
理想状态下,我们期望对于一个输入状态,输出其无误差的奖励价值。对于价值函数,如果输入状态是
,正确的输出价值应该是
。如果输入状态是
,正确的输出价值应该是
。所以在训练的时候,其就是一个典型的机器学习中的回归问题。我们实际中需要输出的仅仅是一个非精确值,即我们希望在输入状态
的时候,输出价值与
越近越好;输入
的时候,输出价值与
越近越好。其训练方法与我们在训练卷积神经网络等深度神经网络时的方法类似。
2.5 基于本章正文中介绍的基于时序差分的网络方法,具体地,我们应该怎么训练模型呢?
基于时序差分网络的核心函数为
。我们将状态
输入网络,因为将
输入网络会得到输出
,同样将
输入网络会得到
。同时核心函数
告诉我们,
减
的值应该是
。我们希望它们两个相减的损失值与
尽可能地接近。这也是网络的优化目标,我们称之为损失函数。
2.6 动作价值函数和状态价值函数的有什么区别和联系?
(1)状态价值函数的输入是一个状态,它根据状态计算出当前这个状态以后的累积奖励的期望值是多少。
(2)动作价值函数的输入是状态-动作对,即在某一个状态采取某一个动作,同时假设我们都使用策略
,得到的累积奖励的期望值是多少。
2.7 请介绍Q函数的两种表示方法。
?
(1)使用状态-动作对表示时,即当Q函数的输入是状态-动作对时,输出就是一个标量。
(2)仅使用状态表示时,即当Q函数的输入仅是一个状态时,输出就是多个价值。
2.8 当得到了Q函数后,我们应当如何找到更好的策略
呢?或者说
的本质是什么?
首先,
由
计算而得,其表示假设我们已经学习出
的Q函数,对于某一个状态
,把所有可能的动作
一一代入这个Q函数,看看哪一个动作
可以让Q函数的价值最大,那么该动作就是
将会执行的动作。所以根据以上方法决定动作的策略
一定比原来的策略
要好,即
。
2.9 解决探索-利用窘境问题的探索的方法有哪些?
(1)
-贪心: 我们有
的概率(通常
很小)完全按照Q函数决定动作,但是有
的概率使得动作是随机的。通常在实现上,
的值会随着时间递减。也就是在最开始的时候,因为还不知道哪个动作是比较好的,所以我们会花比较大的力气做探索。接下来随着训练的次数越来越多,我们已经比较确定哪一种策略是比较好的,就会减少探索,从而把
的值变小,主要根据Q函数来决定未来的动作,随机性就会变小。
(2) 玻尔兹曼探索:这个方法比较像策略梯度。在策略梯度里面,网络的输出是一个期望动作空间上的一个概率分布,我们根据概率分布去采样。所以也可以根据Q值确定一个概率分布,假设某一个动作的Q值越大,代表它越好,我们采取这个动作的概率就越高。
2.10 我们使用经验回放有什么好处
(1)首先,在强化学习的整个过程中,最花时间的过程是与环境交互,使用GPU乃至TPU来训练网络相对来说是比较快的。而用回放缓冲区可以减少与环境交互的次数。因为在训练的时候,我们的经验不需要通通来自于某一个策略(或者当前时刻的策略)。一些由过去的策略所得到的经验可以放在回放缓冲区中被使用多次,被反复地再利用,这样采样到的经验才能被高效地利用。
(2)另外,在训练网络的时候,我们其实希望一个批量里面的数据越多样越好。如果一个批量里面的数据都是同性质的,我们训练出的模型的拟合能力可能不会很乐观。如果一个批量里面都是一样的数据,在训练的时候,拟合效果会比较差。如果回放缓冲区里面的经验通通来自于不同的策略,那么采样到的一个批量里面的数据会是比较多样的。这样可以保证我们的模型的性能至少不会很差。
2.11 在经验回放中我们观察
的价值,发现里面混杂了一些不是
的经验,这会有影响吗?
没影响。这并不是因为过去的
与现在的
很相似,就算过去的
不是很相似,其实也是没有关系的。主要的原因是我们并不是去采样一条轨迹,我们只能采样一个经验,所以与是不是异策略是没有关系的。就算是异策略,就算是这些经验不是来自
,我们还是可以使用这些经验来估测
。
2.12 为什么传统的深度Q网络的效果并不好?可以参考其公式
来描述。
因为实际应用时,需要让
与
尽可能相等,即与我们的目标越接近越好。可以发现,目标值很容易一不小心就被设置得太高,因为在计算该目标值的时候,我们实际上在做的事情是看哪一个动作
可以得到最大的Q值,就把它加上去,使其成为我们的目标。
例如,现在有4个动作,本来它们得到的Q值都是差不多的,它们得到的奖励也都是差不多的,但是在估算的时候是有误差的。如果第1个动作被高估了,那目标就会执行该动作,然后就会选这个高估的动作的Q值加上
当作目标值。如果第4个动作被高估了,那目标就会选第4个动作的Q值加上
当作目标值。所以目标总是会选那个Q值被高估的动作,我们也总是会选那个奖励被高估的动作的Q值当作Q值的最大值的结果去加上
当作新目标值,因此目标值总是太大。
2.13 在传统的深度Q网络中,我们应该怎么解决目标值太大的问题呢?
我们可以使用双深度Q网络解决这个问题。首先,在双深度Q网络里面,选动作的Q函数与计算价值的Q函数不同。在深度Q网络中,需要穷举所有的动作
,把每一个动作
都代入Q函数并计算哪一个动作
反馈的Q值最大,就把这个Q值加上
。但是对于双深度Q网络的两个Q网络,第一个Q网络决定哪一个动作的Q值最大,以此来决定选取的动作。我们的Q值是用
算出来的,这样有什么好处呢?为什么这样就可以避免过度估计的问题呢?假设我们有两个Q函数,如果第一个Q函数高估了它现在选出来的动作
的值,那没关系,只要第二个Q函数
没有高估这个动作
的值,计算得到的就还是正常值。假设反过来是
高估了某一个动作的值,那也不会产生过度估计的问题。
2.14 请问双深度Q网络中所谓的
与
两个网络的功能是什么?
在双深度Q网络中存在两个Q网络,一个是目标的Q网络,一个是真正需要更新的Q网络。具体实现方法是使用需要更新的Q网络选动作,然后使用目标的Q网络计算价值。双深度Q网络相较于深度Q网络的更改是最少的,它几乎没有增加任何的运算量,甚至连新的网络都不需要。唯一要改变的就是在找最佳动作
的时候,本来使用
来计算,即用目标的Q网络来计算,现在改成用需要更新的Q网络来计算。
2.15 如何理解竞争深度Q网络的模型变化带来的好处?
对于
,其对应的状态由于为表格的形式,因此是离散的,而实际中的状态却不是离散的。对于
的计算公式——
。其中的
对于不同的状态都有值,
对于不同的状态都有不同的动作对应的值。所以从本质上来说,我们最终矩阵
的结果是将每一个
加到矩阵
中得到的。从模型的角度考虑,我们的网络直接改变的不是
,而是改变的
、
。但是有时我们更新时不一定会将
和
都更新。将状态和动作对分成两个部分后,我们就不需要将所有的状态-动作对都采样一遍,我们可以使用更高效的估计Q值的方法将最终的
计算出来。
2.16 使用蒙特卡洛和时序差分平衡方法的优劣分别有哪些?
优势:时序差分方法只采样了一步,所以某一步得到的数据是真实值,接下来的都是Q值估测出来的。使用蒙特卡洛和时序差分平衡方法采样比较多步,如采样
步才估测价值,所以估测的部分所造成的影响就会比较小。
劣势:因为智能体的奖励比较多,所以当我们把
步的奖励加起来时,对应的方差就会比较大。为了缓解方差大的问题,我们可以通过调整
值,在方差与不精确的Q值之间取得一个平衡。这里介绍的参数
是超参数,需要微调参数
,例如是要多采样3步、还是多采样5步。
2.17 深度Q网络相比基于策略梯度的方法为什么训练效果更好、更平稳?
在深度Q网络中,只要能够估计出Q函数,就可以找到一个比较好的策略。同样地,只要能够估计出Q函数,就可以增强对应的策略。因为估计Q函数是一个比较容易的回归问题,在这个回归问题中,我们可以时刻观察模型训练的效果是不是越来越好(一般情况下我们只需要关注回归的损失有没有下降,就可以判断模型学习得好不好),所以估计Q函数相较于学习一个策略来说是比较容易的。只需要估计Q函数,就可以保证现在一定会得到比较好的策略,同样其也比较容易操作。对比来说,策略梯度方法中的优化目标是最大化总回报,但是我们很难找到一个明确的损失函数来进行优化,其本质上是一个策略搜索问题,也就是一个无约束的优化问题。
2.18 深度Q网络在处理连续动作时存在什么样的问题呢?对应的解决方法有哪些呢?
我们在日常生活中常见的问题大都是包含连续动作的,例如智能体要进行自动驾驶,其就需要决定方向盘要左转几度或右转几度,这就是连续的动作;假设智能体是一个机器人,它身上有50个关节,它的每一个动作就对应到这50个关节的角度,这些角度也是连续的。
然而在使用深度Q网络时,很重要的一步是要求能够解决对应的优化问题。当我们预估出Q函数
以后,必须要找到一个动作,它可以让
最大。假设动作是离散的,那么动作
的可能性是有限的。但如果动作是连续的,我们就不能像对离散的动作一样,穷举所有可能的动作了。
为了解决这个问题,有以下几种方案。
(1)第一个方案:我们可以使用采样方法,即随机采样出
个可能的动作,然后一个一个代入Q函数中,计算对应的
个Q值,并比较哪一个最大。但是这个方案因为使用采样方法所以不会非常精确。
(2)第二个方案:我们将这个连续动作问题,建模为一个优化问题,从而可以用梯度上升去最大化我们的目标函数。具体地,我们将动作视为变量,使用梯度上升更新动作对应的Q值。但是这个方案通常时间花销比较大,因为其需要迭代计算。
(3)第三个方案:设计一个特别的网络架构,即设计一个特别的Q函数,使得求解让Q函数最大化的动作
变得非常容易。也就是这里的Q函数不是一个广义的Q函数,我们可以使用特殊方法设计Q函数,使得寻找让这个Q函数最大的动作
非常容易。但是这个方案的Q函数不能随意设计,其必须有一些额外的限制。
(4)第四个方案:不用深度Q网络,毕竟用其处理连续动作比较麻烦。
3.面试必知必答
3.1 友善的面试官:请问深度Q网络是什么?其两个关键性的技巧分别是什么?
深度Q网络是基于深度学习的Q学习算法,其结合了价值函数近似与神经网络技术,并采用了目标网络和经验回放技巧进行网络的训练。目标网络和经验回放
3.2 友善的面试官:那我们继续分析!你刚才提到的深度Q网络中的两个技巧————目标网络和经验回放,其具体作用是什么呢?
在深度Q网络中某个动作价值函数的更新依赖于其他动作价值函数。如果我们一直更新价值网络的参数,会导致更新目标不断变化,也就是我们在追逐一个不断变化的目标,这样势必会不太稳定。为了解决基于时序差分的网络中,优化目标
左右两侧会同时变化使得训练过程不稳定,从而增大回归难度的问题,目标网络选择将优化目标的右边即
固定,通过改变优化目标左边的网络参数进行回归。对于经验回放,其会构建一个回放缓冲区,用来保存许多数据,每一个数据的内容包括:状态
、采取的动作
、得到的奖励
、下一个状态
。我们使用
与环境交互多次,把收集到的数据都放到回放缓冲区中。当回放缓冲区“装满”后,就会自动删去最早进入缓冲区的数据。在训练时,对于每一轮迭代都有相对应的批量(与我们训练普通网络一样,通过采样得到),然后用这个批量中的数据去更新Q函数。即Q函数在采样和训练的时候会用到过去的经验数据,也可以消除样本之间的相关性。
3.3 友善的面试官:深度Q网络和Q学习有什么异同点?
整体来说,从名称就可以看出,两者的目标价值以及价值的更新方式基本相同。但有如下不同点:
(1)首先,深度Q网络将Q学习与深度学习结合,用深度网络来近似动作价值函数,而Q学习则是采用表格进行存储。
(2)深度Q网络采用了经验回放的技巧,从历史数据中随机采样,而Q学习直接采用下一个状态的数据进行学习。
3.4 友善的面试官:请问,随机性策略和确定性策略有什么区别吗?
随机性策略表示为某个状态下动作取值的分布,确定性策略在每个状态只有一个确定的动作可以选。从熵的角度来说,确定性策略的熵为0,没有任何随机性。随机性策略有利于我们进行适度的探索,确定性策略不利于进行探索。
3.5 友善的面试官:请问不打破数据相关性,神经网络的训练效果为什么就不好?
在神经网络中通常使用随机梯度下降法。随机的意思是我们随机选择一些样本来增量式地估计梯度,比如常用的批量训练方法。如果样本是相关的,就意味着前后两个批量很可能也是相关的,那么估计的梯度也会呈现出某种相关性。但是在极端条件下,后面的梯度估计可能会抵消掉前面的梯度估计量,从而使得训练难以收敛。
3.6 友善的面试官:深度Q网络都有哪些变种?引入状态奖励的是哪种?
深度Q网络有3个经典的变种:双深度Q网络、竞争深度Q网络、优先级双深度Q网络。
(1)双深度Q网络:将动作选择和价值估计分开,避免Q值被过高估计。
(2)竞争深度Q网络:将Q值分解为状态价值和优势函数,得到更多有用信息。
(3)优先级双深度Q网络:将经验池中的经验按照优先级进行采样。
3.7 友善的面试官:请简述双深度Q网络原理。
深度Q网络由于总是选择当前最优的动作价值函数来更新当前的动作价值函数,因此存在过估计问题(估计的价值函数值大于真实的价值函数值)。为了解耦这两个过程,双深度Q网络使用两个价值网络,一个网络用来执行动作选择,然后用另一个网络的价值函数对应的动作值更新当前网络。
3.8 友善的面试官:请问竞争深度Q网络模型有什么优势呢?
对于
,其对应的状态由于为表格的形式,因此是离散的,而实际的状态大多不是离散的。对于Q值
。其中的
是对于不同的状态都有值,
对于不同的状态都有不同的动作对应的值。所以本质上,我们最终的矩阵
是将每一个
加到矩阵
中得到的。但是有时我们更新时不一定会将
和
都更新。我们将其分成两个部分后,就不需要将所有的状态-动作对都采样一遍,我们可以使用更高效的估计Q值的方法将最终的
计算出来。