DQN起源,原理,核心理解

来源:互联网 发布:docker 查看数据库 编辑:程序博客网 时间:2024/06/04 08:15

DQN,在深度学习领域算是比较老的东西了,网上有很多关于DQN的论文解读或者原理解读!这篇博客仅为笔者自己学习记录。。。


好了,废话不多说,接下来介绍DQN到底是怎么一回事?DQN全名Deep Q-Network,它是一种利用深度网络对Q值预测的一种方法,在传统的增强学习中,常用线性变换或者查表法来,对Q进行预测(http://fromwiz.com/share/s/1CGZRH2S1Aro2gtjMB0TJPbh2WMt0I1fPkJq26Z6cI3pS8GI这篇博客主要讲的是用查表法对Q值进行预测,从进行路线规划)。而非线性变化,容易导致不收敛等各种问题。但是在实际问题中,大多数都是高维非线性问题,故而,强化学习在前些年其实发展的比较缓慢的。但是最近几年,深度学习的发展,很多高维度的,非线性的问题都交由深度网络进行学习非线性变化。



然后,围棋天才Demis Hassabis以及强化学习领域的大神David Silver将深度网络(其实,2014年的深度网络相对于现在真不算深,3个卷积层,两个全连接层)对强化学习中的Q值进行预测,在玩Atari游戏取得了非常好的效果,从而将深度强化学习(神经网络和强化学习结合,其实并不是DeepMind首创,很早就有了,但是DQN的效果特别好)带入了世人关注的焦点,从而为AlphGo的出生奠定了基础。



在强化学习领域中,下面以游戏为例,有这样几个东西:Agent,Env,ReplayMemoryAgent为智能体,主要用来决策。Env为环境,主要用了获取游戏进行时的状态,游戏的分数(奖励值),以及游戏是否overReplayMemory可以理解为,Agent的经验,也就是由一系列马尔可夫节点构成的马尔科夫链。还有几个名词action space reward,以及terminateaction space就是可选的动作空间,比如超级玛丽游戏来说的话,它的可选动作就是左,右,跳,蹲,部分状态还可以发子弹。reward就是奖励值,当执行一个动作之后,会从系统返回一个奖励值(当然针对不同的场景,奖励值可以人为定义,也就是说,reward值是和你的智能体的任务是直接挂钩的)



下面先说,ReplayMemory,之前说了是由一系列马尔可夫节点构成的马尔科夫链。说白了就是马尔科夫过程,在这里我就不进行专业的解释了,具体参照浙江大学出版社出版的《概率论与数理统计》上面有详细的数学论证过程。所谓马尔科夫过程,就是说系统下一个状态只是由系统的上一个状态决定,而与之前的状态无关。针对咱们这个大环境就是,游戏的下一个状态是由游戏的当前状态决定。所以,马尔科夫节点就是,在游戏的当前状态s_t下,执行action a_t 所得下一个状态s_t_plus_1rewardr_t,以及游戏是否over t_t...所得的一个tuple(s_t,a_t,s_t_plus_1,r_t,t_t),这一系列的tuple组成了ReplayMemory.

再说,贝尔曼公式,贝尔曼公式其实就是一个马尔可夫过程。在传统的Q-learning中有这样一个公式,这也就是Q-learning的思想,就是要每次执行action之后,使得打折后的未来奖励值最大



然后 提取公因式,简化形式就得到!



其实,细细看来,它与马尔科夫过程还是有区别的,区别在于马尔科夫过程,当前状态由上一状态决定!而在Q-Learning中,是当前状态的Q(s_t)值是取决于下一状态的Q(s_t_plus_1), 这听起来很荒谬,因为我下一个状态我还不知道是什么呢。。凭啥就知道对应的Q值呢。。。原因在于,是过去对现在的影响(马尔科夫过程),还是 未来对现在的影响(Q-Learning)。。。其实就一个评价的不同,在DQN算法中,强调的是智能体探索环境的过程,探索的好不好,它的评价标准是未来的action对当前的影响(这一段,其实,笔者自己的小小看法)


好了,细枝末节说完了,现在主要来说说,Agent,在DQN中,agent就是一个策略网络。它由两个部分组成,一个是target-net,一个是Q-net。先说说 两个网络的结构,target-net和Q-net是两个长得真的一摸一样的网络,三个卷积层,两个全连接层,没有池化层!!!(为啥没有池化层,我记得playing Ataris 那篇论文有详细的解释,主要就是,图像位置的关系保持一致)。在初始化时,两个网络的权值也是一样的。在这里,笔者要说一说网络(两个网络输入输出的实际意义相同的)的输入输出是啥?网络输入的是游戏的状态(在DQN中,是连续的4帧图像;在DDPG中,输入的是当前状态的一些参数),输出的是每一个action对应的预测的Q值(其实在这里解释一下Q值,Q值就是 state-action value 它是一个关于状态和动作的函数)


在训练时,训练的网络时Q-Net,并没有 训练Target-Net, Target-Net权值的更新是通过Q-Net直接赋值(当然,在DDPG中会有更加合理的权值赋值方式)。每一次训练迭代的过程中,会从R e play M e mo r y随机抽样出一个batch的数据的马尔科夫节点(s_t,a_t,s_t_plus_1,r_t,t_t),然后 注意的是s_t喂入Q-Net,输出的是在状态s_t下,每一个action的Q值,然后取出 action a_t 对应的Q值这就是 Q-Net的预测值Q(a_t|s_t)。然后 如果要训练的话,还需要标签值(label)才能进行网络优化,权值更新, 求标签值。将s_t_plus_1喂入Target-Net, 这样输出 在状态s_t_plus_1下,每一个action对应的Q值,这里我们取最大的Q值 argmaxQ'(a|s_t_plus_1),也就是说要使打折后的未来奖励最大,然后根据贝尔曼公式然后求得标签,进行梯度下降,更新 Q-Net的权值



然后 每迭代一定时候,更新Target-Net。这就是DQN的训练策略!笔者写了如下表来方便理解



至于测试就很简单了,把当前状态输入,选取最大Q值对应的action执行就完毕了,直到游戏over!


知道了,训练策略,其实只不过知道了DQN是啥而已,然并卵!DQN之所以玩得起Ataris,不是在于它的训练策略,而是在于它的探索策略。在强化学习领域中,有一大难点,就是关于exploration and exploiation的平衡问题,所谓exploration就agent怎样探索环境,exploitation是利用现有的知识来完成特定任务!如果光有exploration就容易发散,而光有exploitation 容易过拟合,这一点 在 DQN 上处理得比较简单,但是也取得了不错的效果,但是 在 A l p h G o中,结合了蒙特卡洛搜索树之后进行exploration 和 四个网络以及相互博弈进行exploitation,达到了举世瞩目的成就。

 

咱们来看一看,DQN exploration和exploitation的策略,下面是论文里面的伪代码,我来解释一下。。。





从算法,可以看到,每次迭代过程中,都会先玩游戏,然后 将玩游戏的过程记录到R e play M e mo r y中,然后 从RepalyMemory进行抽样,训练Q-Net。从而达到边学边玩,现学现用的目睹,在这里,训练的过程其实就是exploitation的过程。请注意:


这简简单单的一行就是exploration的过程,采用的算法类似于模拟退火的算法,以深度学习的角度来思考的话就是,跳出局部最小(大)值,探索全局最小(大)值。。。。


以上变为DQN的基本介绍,加上笔者自己的个人理解,欢迎大家批评指正!



原创粉丝点击