首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度学习第10期:基于Q的强化学习(下)

experience replay与explore

强化学习中,我们需要用训练集的数据来训练一个agent,而另一方面,训练数据本身又是由这个agent产生的。这就导致了上一节中局部收敛的问题。总的来说,为了防止“局部收敛”,我们希望我们的训练集数据(s,a,r,s_)中(s,a)的分布始终与agent的policy给出的(s,a)分布有所不同。

从这个角度说,on-policy是极其危险的。因为on-policy意味着用来训练的数据集与当前的policy的分布是高度一致的。一旦agent初步陷入“套路”,则其产生的数据集也是根据“套路”得来(即(s,a)的分布与当前套路的分布高度吻合)的,这会让训练过程不断地强化这个“套路”。而为此我们采用off-policy的技术打断训练集的关联性、有序性,或是让explore rate较大,使得训练集包含更加丰富的不同“套路”的步骤,并且利用r的“客观性”来说明这些不同“套路”是具有一定优势的。这样可以一定程度上降低局部收敛的风险。

用不严谨,但是通俗的比喻来说,on-policy就好像是一个人闷着头凭着自己的policy去决策,并且通过自己的决策的结果又进一步强化自己的经验。如果他初步形成了只追求金钱的价值观,他就会不断地重复追求金钱的生活,并且从这个生活中进一步强化他的价值观,变得越来越固执、越来越顽冥不化;而off-policy就仿佛是一个人在学习的过程中会不断借鉴他人。哪怕他初步形成了policy,它也不会只靠着自己policy产生的经验去学习,它可以从别人的policy有关的经验中学习,去改变自己的价值观。如果他从各种各样policy的经验中学习,目睹了人生百态、社会百态,然后逐渐地改变自己的想法,从一个只想着赚钱的狭隘的人变得更加关心社会,最后他可能就会选择最好的policy,也就是为世界上最壮丽的事业——全人类的解放而奋斗。在这其中,才能获得人生真正的意义。

我们最理想的训练方式是这样的——在前期agent距离最佳策略比较远的时候,我们希望训练数据的分布与agent的policy有较大的不同,以避免快速地局部收敛;在后期agent快要收敛到最佳策略的时候,我们希望训练数据的分布与agent的policy比较相似,这样有助于收敛;从人生的意义上看,这似乎是一个“先博而后专”的过程。当我们小时候,我们总是先学习常识、学习通识教育,然后上高中之后我们进行文理文科,报考大学志愿的时候,我们选择院系,大二结束之际,我们又要选择专业……就是这个道理。

为此,我们要让训练更加具有off-policy的特性,即训练集的前后关联性更弱,训练集的P(s|a)分布与当前的policy更加不一致。但是,我们又决不能“彻头彻尾”地off-policy。这也就是说,我们不能一开始就准备好所有的训练集,无论agent怎么训练,也不对训练集进行更新,只是抽取不同的batch喂给agent——在监督学习中,事先准备好全部训练集是天经地义的。然而在强化学习中,这种方式显然是十分欠妥的。

所以,基于Q的方法中,我们一般需要准备一个记忆库储存大量agent玩出来的(s,a,r,s)数据,打断前后顺序,每次取出一个batch的(s, a, r, s)进行训练,则这自然降低了训练集的相关性。一方面,由于记忆库存储的都是agent在更早时候玩出来的数据,故而这些数据的分布会与当前policy不那么一致。而另一方面,每过一定的时间,我们就将数据库中的数据丢弃一些,然后再将新产生的数据加入记忆库。这样一来,我们既使得我们数据集的产生具有off-policy的性质,也避免它变成“彻头彻尾”的off-policy。这个方法被称为experience replay的方法,它是一种典型的off-policy方法。

用我们上面用过的通俗语言解释:如果你成年了,形成了一套既有的价值观,比如按照追求金钱生活,然后你每天按照你的价值观选择,又用你所选择得到的人生经验来进一步学习,则你只会越来越强化自己一切都为金钱服务的价值观;但是,如果你是用你从小到大的所有记忆,打乱了顺序去分析、去学习,你就会想起很多你年轻时候的事情,那个时候你还不是满脑子只想着钱,那时候你还会追求和一群小伙伴在草地上奔跑的酣畅淋漓、你还会想着长大要成为科学家探索太空的奥秘、你还回想着要为祖国崛起而读书为中华民族伟大复兴而努力。你想着你人生的全部经历,而不是只有你最近的经历,你就可以对各种价值观有一个对比,这样有助于你去选择最好的人生。用一个简单的词概括,那就是“不忘初心”。

当然,experience replay意思是一个agent不但用它自己玩出来的(s,a,r,s)训练,也可以用别的agent玩出来的(s,a,r,s)训练。这从数学上也不难理解——进一步增强当前policy与训练集数据的分布的区别。如果通俗地理解,这就意味着多和别人交流,从别人的人生经验中汲取经验……总之,experience replay的核心含义就是off-policy,也就是训练集的(s,a,r,s_)不能和你当前的agent的policy太一致。

在基于Q的学习过程中,还有一个trick是十分值得关注的,那就是explore与exploit的权衡取舍。前面说过,agent一边用自己的policy玩以产生训练集,一边又用这些训练集来训练、更新自己的policy。而前面我们说过,如果训练集的(s,a)分布与当前的policy过于一致,容易导致过拟合。当我们用了上述的experience replay,当过去的policy产生的数据集被保留下来,与现在policy产生的数据集混合在一起,会使得整个训练集与当前policy的相似程度下降。但是,这种下降是有限的,比如训练集中只含有历史上policy产生的数据,我们就没法发现一些全新的道路。而exploit-explore权衡取舍就是设计来解决这个问题的。

Explore与exploit是两种agent的策略。Exploit意思是,agent按照当前policy的判断,选择最优的方式来操作(也即产生训练集);而explore的意思是,用随机的policy来选择一个动作执行(产生训练集)。在实际中,我们设定一个exploit rate比如0.9。每次agent执行操作的时候,我们生成一个0到1之间均匀分布的随机数。如果它小于0.9,则我们执行exploit策略,而如果它大于等于0.9,则我们执行explore策略。这样一来,我们的训练集中就将有一部分的(s,a,r,s_)是由explore产生的,这有助于我们的训练集包含的成分更加丰富。这种丰富是单靠着experience replay提供的off-policy属性所不具备的。

在实际训练中,我们一般先选取较小的exploit rate,比如0.5,用它来产生数据集;然后随着训练的深入,就逐渐增大exploit rate,到大约0.9的程度。这样一来,我们agent所使用的数据集就会更加接近我们所期望的那样——在一开始与当前policy有较大出入,且包含了较多不同的“套路”相关的经验;在训练的后期,逐渐与当前的policy趋于一致。这样则可以更好地帮助agent收敛到最优策略。如果用通俗的类比,这就好像我们说的年轻时候要多闯一闯,去试一试不同的事物,看看能不能找到真正适合自己的事情;而到了中年的时候,则要更多地追求稳定,这样才能在已经选择的事业上达到高峰。

总结一下这两节的内容——基于Q的方法,存在着难以收敛或者局部收敛的风险,为了避免这些风险,我们希望训练的中间状态下,能够衡量更多种不同套路下的Q,为了实现这一点,我们希望训练早期训练集与当时的policy差异尽量大、包含信息尽量多,而训练晚期的训练集逐渐与当时的policy较一致→我们用experience replay与exploit-explore的取舍等方式可以实现这一点。

在任何包含了基于Q的算法中,包括刚才说的Q-learning,包括DQN,也包括之后要介绍的、Q网络与policy网络一起训练的Actor-Critic算法与A3C算法中,这种思想都是很重要的。如果不注意这一点,经常会遇到网络已经收敛了,但是训练出的agent却表现得很差的情况。

DQN

之前我们介绍了一种最基本的基于Q的学习方法——Q-learning。但是,对于一些s可能有几亿种的游戏,Q表会变得很大。并且如果s是连续的,则Q-learning就完全无能为力了。所以,我们考虑不是用一个Q表,而是用一个神经网络来计算Q(s,a)。我们训练的目的仍然是通过梯度下降的方法更新神经网络的参数,以使得网络计算出来的Q(s,a)预测值要更加接近r+γ Q(s_)。从这一点看,DQN与Q-learning很接近。

但是,二者也有明显的不同:在Q-learning中,你修改Q表中(s,a)位置对应的值,不会对Q表的别的部分产生任何影响。故而你的训练确实能够使得Q(s,a)更加接近于r+γ Q(s);但是在DQN中,你修改Q(s,a)的值,等于修改网络的参数。当这个参数被修改,可能Q(s)的值本身也变了,训练可能不能使得Q(s,a)更加接近于r+γ Q(s_)。

针对这个情况有两种方法,第一种是后传整个loss=(Q(s,a)?r+γQ(s))2,第二种是fixed Q-targets。两种方法都可以保证训练的过程能够使得Q(s,a)更加接近于r+γ Q(s_)。在DQN等需要计算Q(s,a)的场景中,一般采用第二种;在离散a问题使用AC算法等特殊情况下,Q网络只需要计算s的价值的时候,常常会采用第一种方法。

下我们来具体介绍一下这两种方法:

Fixed Q-targets的做法是这样的:搞两个结构一样的神经网络,一个为target net,一个为eval net。对于每一条(s, a, r, s),我们用eval net算出Q(s,a),用target net算出(r+γ max Q(s,?)),然后后传loss更新eval net的参数,而target net站在此地不要走动。这就会使得eval net算出来的Q(s,a)更加接近target net给出来的(r+γ max Q(s_,?))。我们可以想象,target net就是用来提供不动的标签的,就像是监督学习中的target一样。

但是target net归根结底也是要动的。这又分为两种方法,hard replace与soft replace。Hard replace即每当我们训练target net训练了很多个batch之后,我们直接把eval net的所有参数给照搬到target net上来;soft replace则是在训练的过程中,让eval net的参数不断地缓慢地向着target net参数更新。总之,这两种方法的共同点是,target net不是用梯度更新的,而是要朝着更接近eval net的方向更新的。

目前看来,hard replace虽然显得有些简单粗暴,但它的效果确实比较好。所以DQN中一般采用hard replace。而在DDPG中,github上常见的模型似乎更喜欢采用soft place一些。在后面我们还会再专门介绍一下soft replace。

我们可以想象,在训练过程中,target net提供的标签越来越准确。而训练使得eval net算出的Q(s,a)越来越接近target net。当某一刻达到所有eval net与target net的参数相同,并且满足Q(s,a) = r+γ Q(s)对于所有(s,a,r,s)成立时,DQN训练完毕。 关于fixed Q target的算法,有兴趣的同学可以参考论文《Dueling Network Architectures for Deep Reinforcement Learning》。

我们考虑另外一种思路,,如果只搞一个网络,把(r+γQ(s)?Q(s,a))2当做loss后传修改这个网络的参数,也可以使得最终Q(s,a)接近(r+γ Q(s_))。并且,这还不必引入两个网络,节省内存空间。为什么DQN要采取fixed Q-targets而不用这种方法呢?

事实上,在a离散问题中采用AC算法时候,需要的critic是一个计算s的价值V(s)的Q网络,它正是用这种方法更新的,即直接后传(r + γ V(s_) – V(s))的损失。在下面我们还要专门介绍一下这个。那为什么AC要采取这种直接的后传误差的方法,而DQN不是呢?

这是因为,在DQN中,网络计算的是Q(s,a)而不是Q(s)。我们所谓的Q(s)实际上是Q(s, argmaxQ(s,a))。这个部分是难以求导的。因为当我们更新参数,让Q(s)更加接近我们所需时,可能会导致argmaxQ(s,a)从一个a变成另外一个a,使得整个Q(s_)与我们的需求背道而驰;而另一方面,在a离散问题中采用AC算法时候,由于我们只需求计算V(s),求导的含义十分清晰,故而不存在这个问题。

采用fixed Q-targets的技术后,我们可以把更新公式记为:

Qeval(s,a)→r+Qtarget(s,arg?maxQtarget(s,a))

在更新公式中,左边的Qeval则采用神经网络的训练方法进行训练,而右边部分都完全被当作不动的标签来对待。Qtarget只是依靠hard replace方法更新。

DDQN

DDQN其实就是double DQN。DQN由于采取fixed Q-targets,所以会用到两个网络,eval net与target net。而DDQN就想着要更加充分地利用这两个网络。实际上,DDQN比起一般的DQN也只有一点区别。

一般的DQN的更新公式为:

Qeval(s,a)→r+Qtarget(s,arg?maxQtarget(s,a))

而DDQN的更新公式为:

Qeval(s,a)→r+Qtarget(s,arg?maxQeval(s,a))

实验表明,DDQN对比一般的DQN具有一定的优势。关于其解释主要因为它能够解决over-estimate的问题。在论文中,Hasselt证明了传统的DQN普遍会过高估计Action的Q值,而且估计误差会随Action的个数增加而增加。如果对于每个a的高估不是均匀的,则会导致某个次优的Action高估的Q值超过了最优Action的Q值,则会不利于我们找出最佳的策略。

对比上述的两个公式,不难发现Qtarget(s,arg?maxQeval(s,a))显然是要比Qtarget(s,arg?maxQtarget(s,a))更小的,这也就一定程度上降低了over-estimate的风险。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180613G0HGU000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com