原文链接:https://www.yuque.com/yahei/hey-yahei/rl-q_learning
参考:
Q Learning是一种value-based的RL算法,value-based算法旨在训练一个Critic(记为 V π V^\pi Vπ),它与某个Actor绑定,能够根据状态 s s s(和采取的动作 a a a)预测出Actor接下来能累计获得多少奖励。
首先考虑最简单的value-based算法,它只根据状态 s s s来预测未来的累计奖励——
如何训练这样一个Critic呢?这里列出两种常用的训练方法——
这两个方法各有优劣,
前述的两种算法只考虑了状态 s s s对后续累计奖励的影响,而Q Learning在此基础上还额外考虑了采取的动作 a a a的影响。Q Learning有两种表现形式——
对于Q Learning来说,并不需要独立的Actor,这是因为Critic应该给出了所有动作的未来累计价值,选择未来累计价值最高的一个动作即可,相当于隐含了Policy。
π ′ ( s ) = arg max a Q π ( s , a ) \pi^{\prime}(s)=\arg \max _{a} Q^{\pi}(s, a) π′(s)=argamaxQπ(s,a)
训练过程可以用下图概括,以最大化Q为目标,用TD或MC算法迭代训练——
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4MDU5OTM4MzktNmU2ZjJmYTQtM2FiNy00YWUxLWI4MmItZjkwZGYwM2IzNmVlLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=149&margin=[object Object]&name=image.png&originHeight=298&originWidth=460&size=44567&status=done&style=none&width=230)
(Q Learning训练过程示意)
如果Q Learning跟深度学习结合起来,那么就称为Deep Q-learning Network, DQN。
在使用TD算法训练Q Learning模型时,存在一个问题,如果频繁对产生目标 Q π ( s t + 1 , π ( s t + 1 ) ) Q^\pi\left(s_{t+1}, \pi(s_{t+1})\right) Qπ(st+1,π(st+1))的模型 π \pi π进行更新,使得回归出来的 Q π ( s t , a t ) Q^\pi\left(s_t, a_t\right) Qπ(st,at)逼近 r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) rt+Qπ(st+1,π(st+1)),那么训练过程很容易不稳定(因为对于同样的状态和动作,目标却一直在发生变化)。
因此可以引入一个独立的目标网络(Target Network),被训练的网络每迭代一定步数之后再将权重应用到目标网络上去,以此产生相对稳定的目标,使得训练过程变为稳定。
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4MDYzODMxMTktNDcyNzlhMmUtMzhjMy00M2IwLTgzZTMtNDE5MzFmMzBiNzI5LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=212&margin=[object Object]&name=image.png&originHeight=424&originWidth=844&size=55971&status=done&style=none&width=422)
与policy-based算法一样,Q Learning也面临着探索(Exploration)的问题,为了避免 Q π Q^\pi Qπ对于某个状态 s s s倾向于对某个动作 a a a产生更大的Q值,需要采取一些措施来鼓励网络对其他动作进行探索。比如,
每次交互结果都只用来训练一次似乎有些浪费,可以用一个缓冲区(Replay Buffer)来记录早前的交互状况 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1),每次从缓冲区中随机抽取一些经历构成batch来进行训练。虽然这些经历来自于不同的policies,甚至可能是差异比较大的policies,但考虑到状态、动作、奖励、下一个状态是客观存在的,跟policies本身无关,所以影响并不大。这种方法通常称为经验回放(Experience Replay)。
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4MDc1NjEwNDgtOWNmZjk3MTMtOTEyZS00NjkyLWJkMDAtMzM1ZDQyMDI0MmQ3LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=315&margin=[object Object]&name=image.png&originHeight=629&originWidth=918&size=143949&status=done&style=none&width=459)
论文:
Q ( s t , a t ) ⟷ r t + max a Q ( s t + 1 , a ) Q\left(s_{t}, a_{t}\right) \longleftrightarrow r_{t}+\max _{a} Q\left(s_{t+1}, a\right) Q(st,at)⟷rt+amaxQ(st+1,a)
观察Q Learning的目标,可以发现 max a Q ( s t + 1 , a ) \max _{a} Q\left(s_{t+1}, a\right) amaxQ(st+1,a)很容易被高估,从而导致整个目标被高估,恶性循环,Q值会存在一直被高估的现象。
为了解决这一问题,可以引入一个新的DQN(公式中的 Q ′ Q' Q′),用于独立地估计下一个state的Q值,
Q ( s t , a t ) ⟷ r t + Q ′ ( s t + 1 , arg max a Q ( s t + 1 , a ) ) Q\left(s_{t}, a_{t}\right) \longleftrightarrow r_{t}+Q^{\prime}\left(s_{t+1}, \arg \max _{a} Q\left(s_{t+1}, a\right)\right) Q(st,at)⟷rt+Q′(st+1,argamaxQ(st+1,a))
其实就是个冗余设计,两个DQN之间互相监督,减少高估情况的发生,
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4NDY2MzU5OTctOThkMzY4OTMtNzA4Ny00OGM4LTg3NDktZmYwYmFmZjZkNWU4LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=141&margin=[object Object]&name=image.png&originHeight=281&originWidth=1068&size=119634&status=done&style=none&width=534)
(Double DQN的效果)
论文:《Dueling Network Architectures for Deep Reinforcement Learning (2015)》
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4NDczNTA1MTUtNGRiNmI3YzYtMmE3MS00Y2NlLWIwYTktMDQ2ZDZkNjFhZDdiLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=272&margin=[object Object]&name=image.png&originHeight=544&originWidth=896&size=184521&status=done&style=none&width=448)
(上:DQN; 下:Dueling DQN)
Dueling DQN不再直接输出Q值,而是由两个子分支分别输出state的Q值、在该state下各个action的Q值增量,最后广播相加得到在该state下各个action的实际Q值。
Q ( s , a ) = A ( s , a ) + V ( s ) Q(s, a) = A(s, a) + V(s) Q(s,a)=A(s,a)+V(s)
通常会约束 ∑ A ( s , a i ) = 0 \sum A(s, a_i) = 0 ∑A(s,ai)=0,该约束在实现上也非常简单,直接对分支的输出做去均值的处理,然后再进行 Q ( s , a ) Q(s, a) Q(s,a)的计算就行。该约束使得 V ( s ) V(s) V(s)输出恰好为 Q ( s , a ) Q(s,a) Q(s,a)的均值,在训练过程中即使某些action没有在episode中出现,Dueling DQN也有可能倾向于更新均值 V ( s ) V(s) V(s),此时这些没有出现的action的Q值也会随之更新。
论文:《Prioritized Experience Replay (ICLR2016)》
为Experience Buffer加一个优先级,增加对以往TD误差较大的样本的抽样概率。
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4NDkxNzkwNTktNzAwZjQyMWUtM2JjMi00NTdlLTlmNjUtYWU1NGRiNjg1NGViLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=156&margin=[object Object]&name=image.png&originHeight=311&originWidth=828&size=46995&status=done&style=none&width=414)
MC和TD的一个折中版本,MC考虑整个episode,TD只考虑相邻的两次决策,Multi-step则考虑连续的N次决策。
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4NDkzOTU5NTAtZWZkY2I1NDEtMWNlZS00ZTc1LWJmMjAtNTk4YjMxNzFmNjI5LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=150&margin=[object Object]&name=image.png&originHeight=300&originWidth=847&size=43230&status=done&style=none&width=423.5)
论文:(两篇论文主体思路一致,只是加噪方式有点差别)
之前讲过Epsilon Greedy的随机采取action的技巧,但论文认为这种Exploration不太合理,这种情况下面对同一个state很可能采取不同的action,这在实际中就不应该存在的,有可能会让模型点歪了技能树,从此越走越远(虽然在这条技术路线上可能还是会逐步提升,但并不能达到最理想的效果);因此提出,对参数进行加噪要比对action进行加噪更加合理。
Q ( s , a ) → Add Noise Q ~ ( s , a ) a = arg max a Q ~ ( s , a ) Q(s, a) \xrightarrow{\text{Add Noise}} \tilde{Q}(s, a) \\ a=\arg \max _{a} \tilde{Q}(s, a) Q(s,a)Add NoiseQ~(s,a)a=argamaxQ~(s,a)
加噪的方式有很多,比如最简单的给一个高斯噪声;
另外,在同一个episode中,噪声应当保持一致
让 Q π Q^\pi Qπ不再简单输出一个scalar,而是输出一个信息更加丰富的分布。
比如将原本的3输出神经网络,改为15输出的神经网络,每五个一组作为action的Q值分布(相当于一个5bins的直方图)。
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4NTExNDgxNDUtY2UzMWE3ZDEtMGU4ZC00NjZmLTlmZWYtMzIxMmEwNmFiZjkwLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=203&margin=[object Object]&name=image.png&originHeight=406&originWidth=755&size=38379&status=done&style=none&width=377.5)
论文:《Rainbow: Combining Improvements in Deep Reinforcement Learning (AAAI2018)》
对前述的技术进行一系列的实验比较,来说明他们的有效性。
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4NTEyMzg4MjAtOTdlZmIzY2QtYTA1Yi00ZDk3LWFlZTUtY2QwYTdiYjFiNTNiLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=301&margin=[object Object]&name=image.png&originHeight=601&originWidth=635&size=167563&status=done&style=none&width=317.5)
(单一技巧与Rainbow的比较)
(注意Multi-step技巧其实是A3C的一部分)
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNTA0MzI4LzE1ODk4NTEzMTkxNzctNzhmYjEzNGItOTUzYi00MDEzLThmOGQtN2U3M2JhZjk4MzZiLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=311&margin=[object Object]&name=image.png&originHeight=621&originWidth=652&size=144714&status=done&style=none&width=326)
(Ablation studies)
值得注意的是,从图中我们看到即使去掉double技术,对rainbow似乎没有什么影响,论文中给出的解释是,distribution已经很好的解决了Q值高估的问题,所以double就显得不那么必要了。
Q Learning通常只能处理离散的、可穷举的action,但现实世界中有很多非离散的情况,比如自动驾驶的汽车应该转过几度,或者控制机械手的舵机应当转过几度等等。
为了让Q Learning可以处理非离散的动作,有以下一些处理的方法: