在2013年DQN首次被提出后,学者们对其进行了多方面的改进,其中最主要的有六个,分别是:
Double-DQN:将动作选择和价值估计分开,避免价值过高估计
Dueling-DQN:将Q值分解为状态价值和优势函数,得到更多有用信息
Prioritized Replay Buffer:将经验池中的经验按照优先级进行采样
Multi-Step Learning:使得目标价值估计更为准确
Distributional DQN(Categorical DQN):得到价值分布
NoisyNet:增强模型的探索能力
而在最近,DeepMind在论文《Rainbow: Combining Improvements in Deep Reinforcement Learning》中,将这六种方法进行了一个整合,提出了Rainbow模型。本文,我们一起来回顾一下DQN及其各种改进模型。
本文将不再介绍模型的实现,不过在我的github中已经有rainbow的代码,具体可参考:https://github.com/princewen/tensorflow_practice/tree/master/RL/Basic-Rainbow-Net
1、原始DQN
Q-learning是强化学习中一种十分重要的off-policy的学习方法,它使用Q-Table储存每个状态动作对的价值,而当状态和动作空间是高维或者连续时,使用Q-Table不现实。
因此,将Q-Table的更新问题变成一个函数拟合问题,使用神经网络来得到状态动作的Q值,并通过更新参数 θ 使Q函数逼近最优Q值 ,这就是DQN的基本思想。
但是,将深度神经网络和强化学习思想进行结合,难免会出现一定的问题,比如:
1、DL需要大量带标签的样本进行监督学习;RL只有reward返回值;
2、DL的样本独立;RL前后state状态相关;
3、DL目标分布固定;RL的分布一直变化,比如你玩一个游戏,一个关卡和下一个关卡的状态分布是不同的,所以训练好了前一个关卡,下一个关卡又要重新训练;
4、过往的研究表明,使用非线性网络表示值函数时出现不稳定等问题。
为了解决问题1,我们就要用到贝尔曼方程:
上面的两个式子,第一个是贝尔曼期望方程,第二个是贝尔曼最优方程,在我们实际的问题中,对于一个状态,采取特定的动作,下一个状态基本上是确定的,因此我们可以把最优方程中的求和去掉。这样我们就可以通过神经网络得到一个Q值的预估值,并通过贝尔曼最优方程得到一个Q值的目标值,并通过预估值和目标值的差距来进行有监督的学习。
为了解决问题2和3,我们用到了经验回放(Experience Replay)的方法,具体做法是把每个时间步agent与环境交互得到的转移样本 (st,at,rt,st+1,is_terminal) 储存到经验池中,要训练时就随机拿出一些(minibatch)来训练。这样就避免了相关性问题。
这里我们重新解释一下问题4,根据上面的思路,我们需要网络来得到当前状态动作的Q预估值,还需要通过网络得到下一个时刻状态-最优动作的Q预估值,进而通过贝尔曼方程得到当前状态动作的Q目标值,并根据Q目标值和Q预估值对网络参数进行更新。这就像一场自导自演的电影,或者说一场既当运动员又当裁判的比赛,使得网络变的非常不稳定。为了解决这个问题,我们提出了双网络结构。这样,Q预估值由eval-net得到,而Q目标值根据当前的即时奖励r和target-net得到。
因此,在DQN中,最终的损失函数如下:
其中,θ表示eval-net的参数,而θ横表示target-net的参数。在实际应用中,target-net的参数是每隔一段时间从eval-net复制过来的。
2、Double-DQN
在原始的DQN中,会出现Q值估计偏高的情形,因为这是一种off-policy的策略,我们每次在学习时,不是使用下一次交互使用的真实动作,而是使用当前策略认为的价值最大的动作,所以会出现对Q值的过高估计。而在DQN中,我们也会面临同样的问题,因为我们选择下一时刻的动作以及计算下一时刻状态-动作Q值时,使用的都是target-net。
为了将动作选择和价值估计进行解耦,我们有了Double-DQN方法。在Double-DQN中,在计算Q实际值时,动作选择由eval-net得到,而价值估计由target-net得到。此时,损失函数变为:
3、Prioritized Replay Buffer
在传统DQN的经验池中,选择batch的数据进行训练是随机的,没有考虑样本的优先级关系。但其实不同的样本的价值是不同的,我们需要给每个样本一个优先级,并根据样本的优先级进行采样。
样本的优先级如何确定?我们可以用到 TD-error, 也就是 q-target - q-eval 来规定优先学习的程度. 如果 TD-error 越大, 就代表我们的预测精度还有很多上升空间, 那么这个样本就越需要被学习, 也就是优先级 p 越高。
有了 TD-error 就有了优先级 p, 那我们如何有效地根据 p 来抽样呢? 如果每次抽样都需要针对 p 对所有样本排序, 这将会是一件非常消耗计算能力的事. 文中提出了一种被称作SumTree的方法。
SumTree 是一种树形结构, 叶子结点存储每个样本的优先级 p, 每个树枝节点只有两个分叉, 节点的值是两个分叉的和, 所以 SumTree 的顶端就是所有 p 的和. 如下图所示。最下面一层树叶存储样本的 p, 叶子上一层最左边的 13 = 3 + 10, 按这个规律相加, 顶层的 root 就是全部 p 的和了.
抽样时, 我们会将 p 的总和 除以 batch size, 分成 batch size 那么多区间, (n=sum(p)/batch_size). 如果将所有 node 的 priority 加起来是42的话, 我们如果抽6个样本, 这时的区间拥有的 priority 可能是这样.
[0-7], [7-14], [14-21], [21-28], [28-35], [35-42]
然后在每个区间里随机选取一个数. 比如在第区间 [21-28] 里选到了24, 就按照这个 24 从最顶上的42开始向下搜索.。首先看到最顶上 42 下面有两个子节点,拿着手中的24对比左子节点, 因为29>24, 那我们就走左边这条路;接着再对比29的左子节点13,因为24>13, 那我们就走右边的路, 并且将手中的值根据 13 修改一下, 变成 24-13 = 11。 接着拿着 11 和 13的左子节点12 比, 结果 12 比 11 大, 那我们就选择 12 对应的数据作为该区间采样的结果。
4、Dueling-DQN
什么是Dueling DQN呢?看下面的图片
上面是我们传统的DQN,下面是我们的Dueling DQN。在原始的DQN中,神经网络直接输出的是每种动作的 Q值, 而 Dueling DQN 每个动作的Q值,是由状态价值V和优势函数A确定的,即Q = V + A。
什么是优势函数?我们可以简单理解为,对于一个特定的状态,采取一个动作所能得到的价值与这个状态能得到的平均价值的区别。如果采取的动作得到的价值比平均价值大,那么优势函数为正,反之为负。
简单的使用Q = V + A可以么?当然不行,因为对于一个确定的Q,有无数种V和A的组合可以得到Q。因此我们需要对A进行一定的限定,通常将同一状态下的优势函数A的均值限制为0。所以,我们的Q值计算公式如下:
5、Multi-Step Learning
原始的DQN使用的是当前的即时奖励r和下一时刻的价值估计作为目标价值,这种方法在前期策略差即网络参数偏差较大的情况下,得到的目标价值偏差也较大,因此学习速度可能相对较慢。因此我们可以通过Multi-Step Learning来解决这个问题,这样在训练前期目标价值可以得到更准确的估计(因为即时奖励是我们可以通过与环境的交互准确得到的),从而加快训练速度。
在Multi-Step Learning中,我们的损失函数变为:
6、Distributional DQN
在DQN中,网络输出的都是状态-动作价值Q的期望预估值。这个期望值其实忽略很多信息。比如同一状态下的两个动作,能够获得的价值期望是相同的,比如都是20,第一个动作在90%的情况下价值是10,在10%的情况下是110,另一个动作在50%的情况下是15,在50%的情况下是25。那么虽然期望一样,但如果我们想要减小风险,我们应该选择后一种动作。而只有期望值的话,我们是无法看到动作背后所蕴含的风险的。
所以从理论上来说,从分布视角(distributional perspective)来建模我们的深度强化学习模型,可以获得更多有用的信息,从而得到更好、更稳定的结果。
我们选择直方图来表示对于价值分布的估计,并将价值限定在[Vmin,Vmax]之间。在[Vmin,Vmax]选择N个等距的价值采样点。网络的输出便是这N个价值采样点的概率。
还是延续DQN中的双网络结构,我们会得到估计的价值分布和目标的价值分布(目标价值分布需要进行裁剪和投影),并使用交叉熵损失函数来计算两个分布之间的差距,并通过梯度下降法进行参数的更新。
7、NoisyNet
增加Agent的探索能力是强化学习中经常遇到的问题,一种常用的方法是采用e-greedy的策略,即以e的概率采取随机的动作,以1-e的概率采取当前获得价值最大的动作。而另一种常用的方法是NoisyNet,该方法通过对参数增加噪声来增加模型的探索能力。
我们的噪声通常添加在全连接层,考虑我们全连接层的前向计算公式:
假设两层的神经元个数分别为p个和q个,那么w是q*p的,x是p维的,y和b都是q维的。
此时我们在参数上增加噪声,文章中假设每一个参数b和w分别服从于均值为μ,方差为σ的正态分布,同时存在一定的随机噪声ε,我们可以假设噪声是服从标准正态分布N(0,1)的。那么前向计算公式变为:
这样,我们模型的变量从原来的p*q + q个,变为了2 * p * q + q个,你可能会问,变量不是3 * p * q + q个么?因为这里,我们的噪声ε在每一轮中,都是随机产生的常量,试想如果噪声ε也是变量的话,就跟原有的wx+b没有什么区别了。
接下来就是这个噪声如何产生的问题了。文中提到了两种方法:
Independent Gaussian noise:这也是我们最容易想到的方法,就是直接从标准正态分布中,随机产生p*q+q个常量。这也就是说,对于每一个全连接层来说,为每一个w和b都产生独立的噪声,这无疑对于模型的计算带来了不小的负担。
Factorised Gaussian noise:该方法有效地减少了噪声的个数,我们只需要p + q个噪声即可,w和b的噪声计算方式如下:
而上式中的f所代表的函数如下:
了解了如何给参数增加噪声,我们就可以把这种方法应用于DQN等方法中。
8、模型试验
文章对比了使用Rainbow和其他的DQN的在57种Atari游戏上的实验效果:
参考文献
1、2013DQN:https://pdfs.semanticscholar.org/667f/b84bfca10bec165f9e2cca3e21f5e4829ca7.pdf
2、2015DQN:http://www.nature.com/nature/journal/v518/n7540/abs/nature14236.html
3、Double-DQNhttps://arxiv.org/pdf/1509.06461v3.pdf
4、Deuling-DQN:https://arxiv.org/pdf/1511.06581.pdf
5、Prioritized Replay Buffer:https://arxiv.org/pdf/1511.05952.pdf
6、NoisyNet:https://arxiv.org/abs/1706.10295v1
7、distributional DQN:https://arxiv.org/abs/1707.06887
8、Rainbow:https://arxiv.org/abs/1710.02298
网友评论