date: 2020/05/18

Endless - Alisa


参考:


基本形式

Q Learning是一种value-based的RL算法,value-based算法旨在训练一个Critic(记为),它与某个Actor绑定,能够根据状态(和采取的动作)预测出Actor接下来能累计获得多少奖励。


只考虑状态

首先考虑最简单的value-based算法,它只根据状态来预测未来的累计奖励——

image.png

如何训练这样一个Critic呢?这里列出两种常用的训练方法——

  1. 蒙特卡洛(Monte-Carlo, MC)
    用完整的episode进行训练
    image.png
  2. 时间差分(Temporal-Difference, TD)
    用相邻两个状态的差值进行训练
    image.png


这两个方法各有优劣,


综合状态和动作

前述的两种算法只考虑了状态对后续累计奖励的影响,而Q Learning在此基础上还额外考虑了采取的动作的影响。Q Learning有两种表现形式——

image.png

  1. 以状态和动作为输入,直接预测在状态下采取动作之后的累计奖励(如左图);
  2. 以状态为输入,预测在状态下采取不同动作之后的累计奖励(如右图),这种情况下要求可采取的动作是有限的(当然,也有一些解决方案)


对于Q Learning来说,并不需要独立的Actor,这是因为Critic应该给出了所有动作的未来累计价值,选择未来累计价值最高的一个动作即可,相当于隐含了Policy。

训练过程可以用下图概括,以最大化Q为目标,用TD或MC算法迭代训练——

image.png

(Q Learning训练过程示意)


如果Q Learning跟深度学习结合起来,那么就称为Deep Q-learning Network, DQN。


三点改进

在使用TD算法训练Q Learning模型时,存在一个问题,如果频繁对产生目标的模型进行更新,使得回归出来的逼近,那么训练过程很容易不稳定(因为对于同样的状态和动作,目标却一直在发生变化)。

因此可以引入一个独立的目标网络(Target Network),被训练的网络每迭代一定步数之后再将权重应用到目标网络上去,以此产生相对稳定的目标,使得训练过程变为稳定。

image.png


与policy-based算法一样,Q Learning也面临着探索(Exploration)的问题,为了避免对于某个状态倾向于对某个动作产生更大的Q值,需要采取一些措施来鼓励网络对其他动作进行探索。比如,


每次交互结果都只用来训练一次似乎有些浪费,可以用一个缓冲区(Replay Buffer)来记录早前的交互状况,每次从缓冲区中随机抽取一些经历构成batch来进行训练。虽然这些经历来自于不同的policies,甚至可能是差异比较大的policies,但考虑到状态、动作、奖励、下一个状态是客观存在的,跟policies本身无关,所以影响并不大。这种方法通常称为经验回放(Experience Replay)。

image.png


DQN的一些进展

Double DQN

论文:


观察Q Learning的目标,可以发现很容易被高估,从而导致整个目标被高估,恶性循环,Q值会存在一直被高估的现象。

为了解决这一问题,可以引入一个新的DQN(公式中的),用于独立地估计下一个state的Q值,

其实就是个冗余设计,两个DQN之间互相监督,减少高估情况的发生,

image.png

(Double DQN的效果)


Dueling DQN

论文:《Dueling Network Architectures for Deep Reinforcement Learning (2015)


image.png

(上:DQN;    下:Dueling DQN)


Dueling DQN不再直接输出Q值,而是由两个子分支分别输出state的Q值、在该state下各个action的Q值增量,最后广播相加得到在该state下各个action的实际Q值。

通常会约束,该约束在实现上也非常简单,直接对分支的输出做去均值的处理,然后再进行的计算就行。该约束使得输出恰好为的均值,在训练过程中即使某些action没有在episode中出现,Dueling DQN也有可能倾向于更新均值,此时这些没有出现的action的Q值也会随之更新。


Prioritized Replay

论文:《Prioritized Experience Replay (ICLR2016)

为Experience Buffer加一个优先级,增加对以往TD误差较大的样本的抽样概率。

image.png


Multi-step

MC和TD的一个折中版本,MC考虑整个episode,TD只考虑相邻的两次决策,Multi-step则考虑连续的N次决策。

image.png


Noisy Net

论文:(两篇论文主体思路一致,只是加噪方式有点差别)


之前讲过Epsilon Greedy的随机采取action的技巧,但论文认为这种Exploration不太合理,这种情况下面对同一个state很可能采取不同的action,这在实际中就不应该存在的,有可能会让模型点歪了技能树,从此越走越远(虽然在这条技术路线上可能还是会逐步提升,但并不能达到最理想的效果);因此提出,对参数进行加噪要比对action进行加噪更加合理。

加噪的方式有很多,比如最简单的给一个高斯噪声;

另外,在同一个episode中,噪声应当保持一致


Distributional Q-function

不再简单输出一个scalar,而是输出一个信息更加丰富的分布。

比如将原本的3输出神经网络,改为15输出的神经网络,每五个一组作为action的Q值分布(相当于一个5bins的直方图)。

image.png


Rainbow实验探究

论文:《Rainbow: Combining Improvements in Deep Reinforcement Learning (AAAI2018)

对前述的技术进行一系列的实验比较,来说明他们的有效性。

image.png

(单一技巧与Rainbow的比较)

(注意Multi-step技巧其实是A3C的一部分)


image.png

(Ablation studies)


值得注意的是,从图中我们看到即使去掉double技术,对rainbow似乎没有什么影响,论文中给出的解释是,distribution已经很好的解决了Q值高估的问题,所以double就显得不那么必要了。


处理非离散的动作

Q Learning通常只能处理离散的、可穷举的action,但现实世界中有很多非离散的情况,比如自动驾驶的汽车应该转过几度,或者控制机械手的舵机应当转过几度等等。

为了让Q Learning可以处理非离散的动作,有以下一些处理的方法:

  1. 对非离散的动作进行采样
    比如转向0-90°,离散成的动作选项;
    (是不是也可以不暴力离散化,而是转换以原始值为均值的正态分布呢?)
  2. 用梯度上升法更新动作
    但训练起来非常麻烦,你除了需要优化,还得花功夫去优化本身,而且还不容易找到全局最优的情况
  3. 改造的输出,使其隐含动作,比如
    image.png

    这里是一个vector,由于有(噫?为啥??),那么实际上取即可以使Q值最大化。具体在训练过程中会用到一些trick,比如如何保证为正定矩阵等等,此处也就不再赘述