本文主要讲解深度强化学习的开山之作,文献[1,2].
本文主要由学习“深度之眼强化学习中Alex老师的课”总结得出,Alex老师是我目前觉得把强化学习讲的最好的老师,没有之一,感谢Alex老师。主要参看文献为:[1]Playing Atari with Deep Reinforcement Learning 2013和[2]Human-level control through deep reinforcement learning 2015(是对上一篇的改进,发表在正儿八经的Nature),它们均出自谷歌的DeepMind,alpha go出自他们之手,有兴趣的同学自行下载。
读懂本文需要一定的强化学习预备很基础的知识,上B站找个视频看看就会了的那一种。
一、强化学习->深度强化学习
由于强化学习没有找到好的方法进行状态的缩减表示,所以导致强化学习热度下降(通过谷歌趋势获得),在2010年左右到达低谷,如图1所示。在传统强化学习中需要确定一个Q_table(如图2)指导决策,如每次在给定当前状态s_i这一行下选取值最大的数,得出数对应的动作a_j,该动作就位agent(智能体)当下要执行的动作。当状态s和动作a数量增大的时候,Q_table的的计算复杂度指数增长。
为了解决进行状态的缩减表示问题,当时主要的研究方法是使用人工设计的特征,结合线性函数拟合value function(用来估计Q_table中的值,也叫Q function)。因为非线性难以收敛。人工设计特征往往只能找到一些比较表面的特征,能以挖掘深层次的特征。
终于,在2013年DeepMind团队提出Deep Q-Network[1](后边简称DQN),在多个游戏上实现对人类的超越。是第一篇成功结合深度学习和强化学习的研究成果,让强化学习不借助人工设计的特征,并使用非线性函数拟合value function(用来估计Q_table中的值,也叫Q function),即神经网络的输入是状态s输出的是各个动作的价值,使用DQN代替Q_table。在当时这片的论文的具有很大的意义,使得一部分研究者看到深度学习和强化学习结合的潜力,但是通过图1,我们还是可以看到当时对强化学习关注的人还不是很多。真正关注的人变多了还是得等到2016年,我猜是因为当时的alpha go下围棋赢了的事,才引起大家的重视。话不多说,进入主题:
二、数据预处理实现细节
1、图像部分:
我们的目的使用深度强化学习打Artri小游戏,首先我们需要对获取的游戏界面进行处理(当然也有直接使用RAN,不是面对游戏的图像进行的方式。为了模拟人类,我们还是采用游戏图像进行训练)。图像预处理的主要目的是减少数据量,提高运算效率。预处理过程主要包括几部分:Grayscale(将彩图压缩成灰度图),Down-sampling(降低采样),Cropping(裁剪),remove background(去背景)。
(1)Grayscale(将彩图压缩成灰度图):将RGB三个信道的值加起来,取平均值。将平均值作为灰度值,因此图片变成只有灰度单信道。很是简单粗暴。
(2)Down-sampling(降低采样):简单理解就是每隔几个像素点取一个,文献[1,2]中是将原本210×160的输入压缩为110×84。
(3)Cropping(裁剪):裁剪一个游戏界面里边真正和打游戏有关的中心区域,在文献[1,2]中裁剪区域为最终大小为84×84。
(4)remove background(去背景):把(3)中得到的所有值除以256,所有像素点都减去背景颜色除以256的值,具体的例如在玩游戏“Pong-v0”时的背景颜色灰度值为90/256。我个人是这么觉得其实完全可以做个统计背景颜色(上边的90),出现概率最高的值肯定就是背景颜色的值,杆精的话就当我没说这句话。
2、游戏部分
游戏部分的预处理主要包括两部分:key Frame和Reward Clipping。
(1)key Frame:游戏中时序上相邻的多帧图像之间是存在很强的相关性或者说很相似,我们没有必要对每帧图像都进行处理。所以文献[1]采用的固定间隔采用的方式,获取图像,图像称为Frame,这个方式称为key Frame。
(2)Reward Clipping:毕竟是要用这个方法玩几个游戏,为了提高这个深度强化学习方法的通用性,将所有的reward简化为+1,-1,和0。因为不同游戏的得分(reward)不一样。最后他有一个洋气的名:Reward Clipping。
三、Replay Buffer介绍(是关键)
回放机制(Experience Replay)从1992年被提出,现在得到发扬光大。训练时,从Replay Buffer中随机抽样进行训练。Replay Buffer是什么?Replay Buffer就是存储很多个transition的地方。transition又是什么?一个ransition指一组(state、action、reward、next_state)数据。开始正题,使用Replay Buffer的:
(1)原理:存储过去遇到的transition、忘记过去太久的transition(说白了就是用一个定长的活动窗口存储transition)。训练时,从Replay Buffer中随机抽样进行训练。
(2)条件:存储的transition数量要合适。
(3)优势:满足DQN训练数据需要独立同分布(深度学习训练集要求独立同分布,而游戏过程中的图像从时序上有具有强相关性,故采用从relpay buffer中随机抽样进行克服,使得抽样后的数据相互独立。这个是深读学习和强化学习结合最关键因素);“记忆”一段时间内的transition训练数据更平稳;可重复多次采样,提高数据利用。
四、实现细节
1、DQN论文中的网络结构:
2、网络训练时数据集的“Lable”计算
要知道具体细节还是得看下边的伪代码和源码对应的思维导图,相信只要写过代码的都能看懂,现在给出更新方法的核心公式,确定Lable的公式。Q为网络,文献[2]中是两个Q网络,一个称为主网络Q、一个称为目标网络(Q上加个^)。y为label的值,对应与神经网络输出中最大的action_value;r 为收益(reward);a'为在下一个状态Φ_(j+1)能取得最大值的动作;Φ表示状态(state);θ为网络参数。
捋一下,transition为网络输入,下边两条公式是网络输出对应的目标:Lable。
至于怎么去求loss,作者用的是均方误差,优化方法是动能法吧,起码在Alex老师的源码里边是这样。
3、算法伪代码
我就直接贴出来了,要用心看才行,是在还是很多疑问可以通过下一部分Alex老师源码的思维导图进行补充。
4、源码思维导图
源码为Alex老师关于文献[2]的源码,我看完源码字后,画了个思维导图。我觉得看导图更容易看懂和理清逻辑。由于对源码作者尊重,若要源码或者其他相关资料,可以私信,只能用于学术交流。我觉得通过源码的思维导图,应该可以完全看懂整个深度强化学习的细节,语法问题自行百度即可,我觉得逻辑足够清晰。
train_visual.py文件中包括定义了两个函数main()和train(),main()为训练的程序入口,train()为一些训练细节。文件agent.py中定义了智能体的类:class Agent(...),包括类中的各个变量和智能体训练过程对执行动作的决策Agent.act(state),DQN主网络Q的学习Agent.learn(),对目标网络Q(上边加^)的更新soft_update(tau)等重要操作。nerworks.pyclass Visual_Q_Network()
五、总结和展望
分别从深度强化学习产生原因,数据预处理,replay buffer,训练的核心(lable)、源码思维导图等实现细节方面,对深度强化学习开山之作[1,2]进行分享。关于实验结果就不贴图了,没啥意思,就是很多种游戏玩的比人好,有一些也玩的不好,文献[2]比文献[1],有很大提升。有兴趣的话,可以都手撕实现一下。有什么疑惑的,强烈建议先多看看上边的思维导图,强烈建议,问题应该会迎刃而解。通过写这个把这几天看的东西整理了一遍,感觉又很好的复习了一遍,这是我第二篇简书,手敲不易啊。文章当然肯定还存在许多的不足和个人不准确观点,还请批评指正。有什么问题和意见建议欢迎留言或者通过其他方式交流。DeepMind团队已经做到根据基因序列预测蛋白质结构,一起追逐大佬的脚步吧!
参考文献:
[1] Mnih V , Kavukcuoglu K , Silver D , et al. Playing Atari with Deep Reinforcement Learning[J]. Computer Science, 2013.
[2]Volodymyr M , Koray K , David S , et al. Human-level control through deep reinforcement learning[J]. Nature, 2015.