理论误国,调参兴邦!

0%

Deep Q-Learning 系列论文漫谈(二) 从Target Net和Experience replay聊起

Target Net 是什么

要落俗套,首先解释下论文中的Target Net是做什么的。抄袭下论文的公式:

这里的 $\theta^-$就是Target Net的参数。整个DQN模型存在两个独立的网络,分别叫做
普通Q网络,就是我们要优化的网络,我们会从它导出最优策略,普通Q网络的参数是$\theta$。另一个就是Target Net,它的是在计算TD误差时被使用的,而TD误差前两项的和就是TargetValue,因此这个网络被称为Target Net。两个网络是结构相同,参数独立的。只不过会每隔C个迭代步骤,就将$\theta$同步到$\theta^-$,没错,就是直接复制过去。

Target Net 作用是什么

论文作者写了,为了提高训练的稳定性。为什么能提高稳定性,不知道。作者说了一个不太清楚的理由:当提升 $Q(s_{t},a_{t})$ 的时候,往往也会引起 $Q(s_{t+1},a)$ (对所有的a)的提升。这样一来,会引起目标值 $y_i$ 的提升,从而进一步导致网络可能不收敛。作者并没有详细阐述为什么DQN会引起这样的问题,其实也揭示了在强化学习领域,Function Approximation有诸多难以理论证明的点。

在搜索网上对Target Net的解释,大体就是从提高稳定性进行说明,比较有代表性的观点是,仔细考察公式(1),如果没有TargetNet,也就是计算TargetValue和优化网络都是一个网络$\theta_i$,假设$s,a$计算出的$Q(s,a)=1$ 而$TargetValue=2$,那么使用梯度下降法,让Q向TargetValue逼近,没有问题,这个时候参数$\theta_{i+1}$就此改变了,当同样的$s,a$再次参与训练时,由于$\theta_{i+1}$的改变,$TargetValue$也不一样了,变成了-1。那么网络又会让Q向-1逼近。引用那个朋友的话说,整个过程好像是在“追着一个移动的目标在跑,怎么都追不上”。因此会引起训练的不稳定。

第一次计算样本$(s,a,s’,r)$

第二次计算同样的样本$(s,a,s’,r)$

如果迭代一直持续下去,可能会因为老追不上目标而导致不收敛,或者收敛过程不稳定。

在《Foundations of Deep Reinforcement Learning: Theory and Practice in Python》中关于Target Net有进一步说明,它目的就是旨在提高训练稳定性,至于为啥,因为神经网络是脱胎于监督学习理论的,监督学习前提就是样本独立同分布,刚开始样本是$(x=1,y=2)$,更新过一次参数后,变成了$(x=1,y=-1)$,这咋拟合?y要是满足一个正态分布还好说,y要是一个乱七八糟的分布,和参数还强相关,那就有可能会引起训练结果不收敛。“This “moving target” can destabilize training because it makes it much less clear what values a network should be trying to approach”。这里解释的更加有道理了些,就是样本分布变化可能会引起神经网络的训练的不稳定。

于是作者所说的、和大家说的这些理由不尽相同,谁更接近真相呢?

Experience replay 是什么

公式(1)中的 $(s,a,r,s’)\sim U(D)$ 表示样本是从一个Buffer(也叫Memory)中均匀抽样(Uniform)出来的:

 

在算法运行过程中,每次根据行为策略(behavior policy)$b$执行动作 $a$ 后,我们都会生成一个上图所示的四元组,放入Memory中去。每次训练更新 $\theta$ 的时候,就从Memory中均匀随机采样一个样本。

Experience replay 作用是什么

上一篇文章中提到,作者在论文中写了三个优点:

  1. 让“有用”的样本得到更多的训练次数,提高样本的使用效率。

  2. 打破连续采样的样本之间的“correlations”,可以减少训练时的方差。

  3. 由于on-policy的学习模式使然(严格来说DQN是 off-policy,这里大致上是一样的),模型的参数会决定下一时刻的样本分布,这样会让模型陷入比较糟糕的局部最优,使用Experience replay可以减轻这种效应。

第一点好理解,样本被存入Memory,有可能在几次采样中都被捞出来训练,这样“好的”样本训练次数增加了,可以加速收敛。

第二点是说,由于reinforcement learning的采样方式,样本间存在很强的关联关系。因为毕竟是MDP模型,前后间的关系必然是紧密的,但我们的模型是神经网络,要求样本之间是独立同分布,不符合这个前提的数据集训练起来方差很大,收敛比较困难。

举个简单的例子,CartPole摆锤小车场景,采样两个完整episode的轨迹。其中一个是摆锤往左边倒地结束,另一个是摆锤往右边倒地结束。如果按照轨迹原有的样本顺序学习,在学习第一条轨迹的时候,会一直更新向左倒的状态,然后学习下一条的时候,又会一直更新向右倒的状态,这样连续更新同一个状态(或者邻域)的做法很容易让网络进入局部最小。我个人理解作者所说的”correlations”就是这样的。

第三点其实更具体些,采样分布 $\mu$ 是策略的函数,当策略定的时候,采样分布也确定了,如果是on-policy模式,策略一直在迭代更新,那么 $\mu$ 也一直在变,也就是样本的分布一直在变。

 

其实第二点和第三点说的都是样本的采样分布问题,也就是i.i.d条件中的是否独立、是否同分布,而Experience replay的作用就是提高独立性,减弱采样分布漂移。

注意,上面的结论是由作者自己说的优点诱导出来的,这只是它起作用的可能原因。

Function Approximation带来的问题

经过上面的讨论,我们发现Expeirence Replay和TargetNet的作用似乎都与采样分布漂移有关,为什么DQN会有这些问题呢,难道之前的Q-Learning就没有吗?还真没有,Q-Learning已经被严格证明了是可以很好收敛到最优策略的,因此它并不存在这些棘手的问题。所以我们需要考察DQN究竟有什么不同,导致它存在稳定性和收敛性上的问题。

在《RLbook2018》的11.3节中sutton提到,如果涉及到以下三个条件,那么基于值函数的迭代方法就不确保收敛,sutton将其称为”致命三要素” (deadly triad):

  1. Function Approximation 函数近似。

  2. Bootstrapping 自助法。使用动态规划或者TD方法,而不是使用完整轨迹的reward。

  3. Off-policy training 离策略的训练方式。训练用的采样分布不是由目标策略产生的,而且一直在变化。

至于为什么叫deadly triad,我个人认为是因为这三个条件大大增加了理论推导的复杂度,之前在简单条件下能够收敛的证明在更复杂的情况下不能直接使用,因此暂时没有办法给出严格的理论证明。如果增加一些假设条件进行仔细讨论,则有可能在某些情况下保证收敛到最优解。比如最近有人在研究使用神经网络近似情况下的收敛性,附带了DQN的很多其他特性,结论是在一些较弱的假设下,DQN是收敛的,喜欢数学的朋友可以看一看(A Theoretical Analysis of Deep Q-Learning Zhuora Yang, Yuchen Xie, Zhaoran Wang 2019)。

说回来,不收敛也可以翻译为不稳定,因此DQN的不稳定也应该逃不出这三个条件(target moving可以算作是Function Approximation的副作用之一)。

其中上节关于on-policy和这里off-policy的说法矛盾吗?其实不矛盾,sutton所说的off-policy是指让强化学习问题变得更复杂,更难以分析,因此不确保收敛,属于更抽象的层次。而上一节说的on-policy可能造成训练不稳定是论文作者针对DQN具体问题的猜测,他们完全是两个维度。

既然我们说不清楚这三个条件影响的理论推导,那我们能不能通过实验的方式搞清楚DQN所做的增加稳定性、提升性能的措施分别起到了多大的作用呢?也许在理论暂时没有出来的时候,严格且清晰的实验能够辅助我们得到一些直观的结论。

既然能想到就一定有人做过,有一篇论文对DQN进行了全方位的实验分析,包括Function Approximation造成的误差、target moving造成的误差、采样分布偏移造成的误差、采样本身带来的误差等等。这篇论文没有给出理论证明,仅仅通过实验结果做了直观的分析,很适合我们的主题。后面我们将会逐步讨论这篇论文。

误差来源

我个人将DQN的误差分为以下几类:

  • 函数近似误差:由Function Approx引起的投影误差、投影贝尔曼误差等等。
  • 过拟合
  • 采样分布漂移
  • 采样误差
  • Target moving
  • 最大化偏差(Maximization Bias)

这是一个很大的主题,我在后面分两章和大家讨论,首先分析由函数近似引起的投影误差。

第三章 Deep Q-Learning 系列论文漫谈(三) 错综复杂的误差(上)-投影误差

 
 
 
 

在写博客之前不觉得,以为周更都是小意思。现在发现双周更新都写不出来,要写好一篇技术文档,是很考验人的,光自己弄明白还不行,得让其他人也能看明白,尤其是当你觉得你明白了,但是讲不出来的时候就会发现,你其实还是没明白,然后又是一顿找论文、学习,直到确实触及到你知识的盲区,才算罢休。每写一次技术博客的过程,就是给自己解答疑惑的过程,希望能够坚持下去。能看到这篇文章的朋友,也衷心希望你能够坚持一件事情做下去,最后总会有收获。