DQN学习笔记
作为新手了解DQN的学习笔记,仅为自用,欢迎交流,不喜勿喷
文章目录
一、DQN是什么?
DQN是DRL的其中一种算法,它要做的就是将卷积神经网络(CNN)和Q-Learning结合起来,CNN的输入是原始图像数据(作为状态State),输出则是每个动作Action对应的价值评估Value Function(Q值)。
所以可以这么理解,DQN是Q学习的升级版,那么我们首先就得理解,什么是Q学习。
1.1 Q学习
参考文献:强化学习基本概念
Q学习需要Q表,如图
关于什么是Q表,以及Q表的状态动作,可以参考:莫烦大神讲Q-learning
上面这个图,左边表格就是Q表,s1、s2…表示不同状态(state),a1、a2表示该状态下选取的不同动作(action),中间的数值就表示在该状态下选取该动作得到的奖励值(reward),也称为Q值。
机器学习的一般思想就是在当前状态s1下选取Q值最大的对应动作a1,得到奖励r1,动作a1又使得状态s1变成s2,如此循环,最终使得总奖励total_reward最大。
Q表在一个状态值、动作值很少的时候很高效,但是当状态-动作空间较大时,让机器每次去Q表里面一个一个找是很麻烦的,所以就提出DQN的概念。
Q学习伪代码如下:
可能很多人看不懂这个伪代码,我放莫烦大神的讲解视频,我一个纯小白都秒懂 莫烦Q-learning 一定要看他下一个例子讲解视频。他代码有些地方略过了,而且我接触python不多,所以附上我对他“探索者游戏”的代码注解,小白应该也能看懂。
此外,Q学习有几个要点需要注意:
1、Q学习是off-police,Sarsa是on-poloce。关于两者区别,请观看:莫烦讲Sarsa
2、Q学习根据当前环境S计算得到最优动作A,根据该动作A得到下个环境S_;
Sarsa流程同上,但是得到下个环境S_后,还要根据下个环境S_得到下个动作A_,并且A_就是要采取的动作
2、Q学习的代码实现
1.2 DQN基本思想
既然一个一个找很麻烦,我们能不能把Q表拟合成一个函数。还是上面这个图,我们看下面两个流程图
NN表示神经网络,通过神经网络生成Q值,就相当于一个拟合的Q函数(这个拟合函数需要不断更新)
左边这个,输入是状态和动作,输出是Q值
右边这个,输入是当前状态,输出是不同动作和对应的Q值。我们主要用右边这个思想编程。
1.3 DQN的两个重要技术
1.3.1 experience replay
1.3.2 fixed Q-targets
1.4 DQN实现
机器学习,顾名思义,得让机器自己来学习,自己提高拟合水平,因此下面这个图里面的NN(神经网络)是不断更新的。
其实就是
只把状态s作为输入,但是输出的时候输出每一个动作的Q值,也就是输出一个向量
记住这里输出是一个值,只不过是包含了所有动作的Q值的向量而已。这样我们就只要输入状态s,而且还同时可以得到所有的动作Q值,也将更方便的进行Q-Learning中动作的选择与Q值更新
(每次学习从记忆库memory中抽取一定量的训练数据batch_memory,根据batch_memory中的 s 和 s_ 分别输入到eva-net和target-net神经网络中,计算得到q-eval和q-next,然后根据dqn的q现实更新公式:
计算得到q-target,计算损失函数,使用优化器最小化误差
看这篇文章:dqn算法详解