作者thefattiger (LT)
看板DataScience
标题[徵文] DQN与其後续的改进
时间Fri Aug 24 22:29:47 2018
小弟刚换新工作两个礼拜,需要应用一些RL(Reinforcement Learning)的知识
以前对这领域没什麽接触,背景知识就只有最近看的几堂David Silver
所以有些概念讲得不清楚或不对还请各位前辈指正
这篇文章算是小弟研究DQN(Deep Q Learning)的一个小笔记
DQN被提出来也已经五年了,除了原始论文外,後续改进的paper也很多
不太可能在一篇文章内全部概括完
这篇文章是根据这个网站
https://goo.gl/nXArSB
所提到的几个概念,小弟去阅读原始论文後做个简单地介绍
希望能帮助到跟我一样刚入门的新手
那麽就开始了
I.Playing Atari with Deep Reinforcement Learning
网址:
https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf
这篇是提出DQN的paper,作者们就是大名鼎鼎的DeepMind
这篇paper的出版年份是2013年,也就是DL(Deep Learning)正开始火热的时候
当时DL已经在电脑视觉已经语音辨识方面非常成功
主要就是归功於CNN(Convolutional Neural Network)及RNN(Recurent Neural Network)
等概念以及硬体的进步(当然还有ReLu)
然後DL目前在SL(Supervised Learning)方面的成功也倚赖於大量经过人工标注的资料,
这个在RL中是没有的
并且RL所要预测的reward,常常是非常的稀疏、充满杂讯且延迟的
笔者注:这边可以用走迷宫想像,若走到出口才会得到reward其余都是0,则刚开始训练
时会有大量没有reawrd=0的state-action pair
另外在DL中训练的资料常常都被假设为是独立取样的,并且符合某个固定的distribution
(也就是常说的i.i.d.)
然而在RL时训练资料(state, action, reward)往往都是有因果关系
并且训练的过程中会因为决策(policy)的改变而使得资料的distribution也跟着改变,既
不i也不d!
这些都会对训练造成影响
还有一点与SL不同的是DQN跟传统的Q-Learning一样,是用TD(0)的方法来更新Q值
(target Q=R+gamma*max_over_a(Q(s_next,a|w_i-1)) )
也就是说target本身也跟网路的系数有关,这会大幅地增加收敛难度
训练时的损失函数则是采用mean squared error
paper中的DQN是被训练来玩Atari 2600(一款游戏主机)的各种游戏,输入为游戏的原始
影像
影像只经过灰阶化及resize,没有任何手动提取的特徵
值得一提的是大部分的电动游戏是没办法只靠单张影像就得知所有资讯的
例如有时候我们需要知道角色或物体的速度才能判断接下来怎麽操作
所以paper中的输入是将最近的四个frame预处理过後叠在一起
(paper中似乎有将action也加入state,但我没看到他怎麽使用action的)
DQN的训练中应用了一个方法叫experience replay,跟传统的Q-Learning不同
在DQN中每做一个action、经过一个state及得到的reward,都会储存到replay memory里
在更新系数时并不是用最新的state及action来更新,而是从replay memory内随机取样一
小群样本当作mini-batch
replay memory的大小N,是hyper parameter
使用experience replay有两个优点
1.随机取样可以打破资料间的关联性
2.每笔资料有可能被多次使用,提升资料的利用率
paper最後有把DQN跟人类以及其他演算法做比较
DQN的不管是平均或是最佳分数都是赢过其他演算法很多
且这些演算法都是有用到游戏相关的知识,DQN是直接使用raw pixel
简言之就是很好很强大
至於跟人类玩家比较则是有输有赢,几款输给人类很多的游戏是需要long-term strategy
II.Human-Level Control Through Deep Reinforcement Learning
网址:
https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf
以往在使用non-linear function approximator(例如神经网路)代表Q值时往往会预到训
练过程不稳定甚至发散的情况
原本计算TD error时的target Q是直接用现有的网路,所以会每一次更新也都会跟着改变
可以想像成你往目标方向跨了一步,目标却也又走了一步
这篇的解决方法是把计算target Q值的网路(称为target network)固定C个iteration後,
再换成最新的系数
C是hyper parameter
这个方法在实作上相当简单,但大大地提昇了训练的稳定性跟收敛速度
III.Deep Reinforcement Learning with Double Q-LearningQ Learning
网址:
https://arxiv.org/pdf/1509.06461.pdf
在估计target Q值时,常因为在action space做maximize而造成Q值的高估
而1993年有篇paper有论述这个现象确实会对最後policy有负面的影响
2010年时有另一篇paper提出dounle Q learing,使用两个Q table轮流更新彼此
解耦action selection及target value estimation来改善最後的结果(笔者注:为何解
耦能改善Q的高估?我也不知道)
Double DQN的精神即与此相似,而且做起来更方便,因为我们本来就有第二个
network:target network
实作上就是在用target network估计Q值的action使用基於current network的greedy
policy
如此又进一步加强了DQN
IV.Prioritized Experience Replay
使用experience replay时原本都是用uniform sampling,意即每个样本被采样到的机率
都一样但事实上并非每个样本的重要性都一样
尤其是在sparse reward的task
replay memory里可能有大量的样本reward都为0好不容易有非0的样本却又不一定被采样到
我们知道那些TD-error较大的样本代表网路的预测与估计值相差甚远
可以给系数有较大的改进
因此第一直觉就是:若将样本依照TD error决定prioritization,由大排到小
每次只固定取前几大的那些样本来更新
这样是否更好呢?答案是否定的
主要原因是每个样本的TD-error是以上次被采样到时的网路去计算的
随着网路的更新原先TD-error值也已经不准了
若一直没有机会被采样到的话,也无法更新它的TD-error
这个样本就永远没机会被使用了
因此我们还是要采用机率的方式,让TD-error高的样本只是具有较高的机率被取样
作者提出了两个决定prioritization(p_i)的方式
第一种是proportional prioritization,让p_i直接等於TD-error
第二种是rank-based prioritization,p_i=1/rank(i)
rank(i)是第i个样本的error在所有样本中的排名
这边引入了一个hyper parmeter:alpha来控制这个机率分布
但因为用这个机率去采样样本的话会使样本偏离真正的data distribution
所以需要使用IS(Importance Sampling)来消除这个bias
这边引入了第二个hyper parameter:beta,来控制IS(beta跟learning rate一样训练中
会变化的)
beta=1时就是常规的IS,等於是回到uniform sampling
在训练前期由於policy的变化迅速,资料的distribution也会剧烈变化
此时unbiased sampling并没那麽重要,可以让beta较低
在训练快结束时再慢慢增加beta到1,以确保采样的样本有符合真正的distribution
使用IS也有另一个好处是TD-error与IS的权重成反比
刚好可以平衡各个样本的step size
原本error大的样本step size也会较大,使gradient desecent的更新不准确
paper另外有解释实作上怎麽采样才能节省时间跟空间,细节就要请各位去看paper了
网路上也有很多的程式码可以参考(其实我也还没完全搞懂XD)
V.Dueling Network Architectures for Deep Reinforcement Learning
网址:
https://arxiv.org/pdf/1511.06581.pdf
这篇的概念是我个人觉得最有趣的,也是本文章中唯一不是由DeepMind发表的paper
作者们在原先DQN的CNN後用两个独立的FCN把输出分成两个部分
一个部分是预测目前state本身的value:V(s)
另一个部分预测在当前state上采取不同action所造成的影响:A(s,a)
(笔者注:可以想像这个做法是把共同的部分V(s)提取出来後让你有机会把各个action的
差异分得更明显)
最後再通过一个aggregate layer把他们整合起来
在整合时若直接让Q(s,a)=V(s)+A(s,a),会发现当给定一个Q值时,V与A有无限种可能的
组合,无法将他们识别出来的
实际上采用这个equation的时候也会发现效果很差,需要重新思考一下
回到Q与V的定义,可以推出如果采用greedy-policy,当我们在state s选择到action a*
时,A(s,a*)=0
因此我们可以强迫A(s,a*)=0,实际上的作法就是让新的
A'(s,a)=A(s,a)-max_over_a[A(s,a)]
这样V(s)就符合一般RL领域state-value function的意义了
但最後他们选择让A'是减去所有A的平均,应该实验过这样收敛比较好
下一个部分他们用走迷宫做了一个小实验,这个迷宫只有一条路,action则有上、下、左
、右、不动
在这个环境显然有很多action是没有差别的(会撞墙的跟不动),这时能独立学习共同的
value:V(s)就很有用
作者们把透过增加,不动来比较有duel network跟没有的差别,可以发现行为类似的
action越多,优势越大
最後就是一样训练DQN去玩Atari 2600来跟之前的结果做比较,这边就不再详述了
VI.结论
其实这几篇paper用到的概念都不是新东西了,只是以前没有人能够将它们很好地整合进
DRL(Deep Reinforcement Learning)
第一篇DQN的起始paper是用experience replay,解决了资料关联性太强的问题
第二篇及第三篇都是在改善target Q value的估计,让训练更stable及更快
第四篇提升了replay memory的利用效率,对於sparse reward的task帮助相当大
第五篇算是比较有创意,对於action space很大的task尤其有帮助
後面几篇改进paper的共通点就是他们对於DQN架构的改动都非常少
第二第三篇甚只是数行程式码的程度
但提供的效果却是很显着,从简单的cart-pole平衡问题就可以看到很明显的差别
DQN可说是DRL的开山始祖,在DL内RL相对於SL来说还算是很稚嫩
对於这种快速火热起来的领域当然也免不了一些吐槽文章,其中一篇比较知名的:
https://www.alexirpan.com/2018/02/14/rl-hard.html
不过他也不是在唱衰,只是想提醒人们:我们还有很多问题没有解决
并且大部分你想用DRL解决的问题都已经有很好的解决方法,还不用training!
(当然就是需要很多domain knowledge)
我目前的心得是DQN虽然主打不需要prior knowledge
就像DL可用CNN feature取代hand-crafted feature
但要能发挥得好,还是得定义一个良好的reward function
这还是需要prior knowledge呀QQ
另外我最近在试时总有一个感觉,DQN对hyper parameter好像超级敏感?
有时候只是微调结果却天差地远,可以从不会收敛变成快速收敛,不知道是不是我的错觉
最後如果有前辈或跟我一样正在学习的板友想讨论RL领域(不一定要是DQN)
也欢迎来信给我
在公司目前还没有人可以讨论更别说请教了QQ,有点闭门造车的感觉
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 58.114.212.150
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1535120997.A.106.html
※ 编辑: thefattiger (58.114.212.150), 08/24/2018 22:31:56
※ 编辑: thefattiger (58.114.212.150), 08/24/2018 22:35:14
※ 编辑: thefattiger (58.114.212.150), 08/24/2018 22:38:39
※ 编辑: thefattiger (58.114.212.150), 08/24/2018 22:39:54
1F:→ skgg: 建议先看rainbow(1710.02298),17年以前常见的DQN优化都有 08/24 23:02
2F:→ skgg: 还有今年的NoisyNet(1706.10295)也是简单有效的方法 08/24 23:03
3F:→ skgg: 两篇都是DeepMind的,上面数字是arxiv编号 08/24 23:03
4F:→ thefattiger: 太感谢了,自己瞎摸索真的很没效率 08/24 23:20
5F:推 DarkIllusion: 推 RL我也找不太到人讨论QQ 08/25 00:06
6F:推 EGsux: 刚好我在写RL的论文写完也来发一篇好了 09/04 05:24
7F:推 wei1204: 推这篇 详细! 09/09 15:15
8F:推 i5201122: 推,也推rainbow 09/15 03:35
9F:推 daniel0523: 感谢t大整理与详细分享! 10/25 12:35
10F:推 juijuijuijui: 感谢分享~ 01/14 13:02
11F:推 clonsey1314: 论文会用到RL, 谢谢详尽的说明 10/14 22:20