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,ReplayMemory。Agent为智能体,主要用来决策。Env为环境,主要用了获取游戏进行时的状态,游戏的分数(奖励值),以及游戏是否over。ReplayMemory可以理解为,Agent的经验,也就是由一系列马尔可夫节点构成的马尔科夫链。还有几个名词action space 和reward,以及terminate。action space就是可选的动作空间,比如超级玛丽游戏来说的话,它的可选动作就是左,右,跳,蹲,部分状态还可以发子弹。reward就是奖励值,当执行一个动作之后,会从系统返回一个奖励值(当然针对不同的场景,奖励值可以人为定义,也就是说,reward值是和你的智能体的任务是直接挂钩的)
下面先说,ReplayMemory,之前说了是由一系列马尔可夫节点构成的马尔科夫链。说白了就是马尔科夫过程,在这里我就不进行专业的解释了,具体参照浙江大学出版社出版的《概率论与数理统计》上面有详细的数学论证过程。所谓马尔科夫过程,就是说系统下一个状态只是由系统的上一个状态决定,而与之前的状态无关。针对咱们这个大环境就是,游戏的下一个状态是由游戏的当前状态决定。所以,马尔科夫节点就是,在游戏的当前状态s_t下,执行action a_t后 所得下一个状态s_t_plus_1和reward值r_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的策略,下面是论文里面的伪代码,我来解释一下。。。
这简简单单的一行就是exploration的过程,采用的算法类似于模拟退火的算法,以深度学习的角度来思考的话就是,跳出局部最小(大)值,探索全局最小(大)值。。。。
以上变为DQN的基本介绍,加上笔者自己的个人理解,欢迎大家批评指正!
- DQN起源,原理,核心理解
- DQN 原理(二):理解 DQN 中的“Q”
- 理解DQN算法
- DQN 原理(三):DQN 训练代码实现
- DQN
- DQN
- DQN 原理(一):环境,行为,观测
- 指针理解之指针“起源”
- 指针理解之指针“起源”
- MVC的起源和理解
- 理解核心
- 起源
- 起源
- 起源
- 起源
- 区块链:起源、原理及应用
- 区块链:起源、原理及应用
- 区块链:起源、原理及应用
- 进程和线程
- 使用vue中路由router-link中包含a标签
- Linux下的.so文件编写
- 【事件绑定的方式】兼容浏览器的事件监听器的设计
- 【HDU6146】【2017百度之星复赛-C】Pokémon GO(动态规划)(dp)
- DQN起源,原理,核心理解
- 高版本vtk 的MFC显示
- java 打印流(PrintStream,PrintWriter)
- POJ 1163 The Triangle
- Java 发送邮件
- 配置php
- Yii session 和 cookie
- mysql日志满了 mysqld_safe
- Log4j,Log4j2,logback,slf4j日志学习