DQN——Deep Q-learning。在上一篇博客DQN(Deep Q-learning)入门教程(四)之Q-learning Play Flappy Bird 中,咱们使用Q-Table来储存state与action之间的q值,那么这样有什么不足呢?咱们能够将问题的稍微复杂化一点了,若是在环境中,State不少,而后Agent的动做也不少,那么毋庸置疑Q-table将会变得很大很大(好比说下围棋),又或者说若是环境的状态是连续值而不是离散值,尽管咱们能够将连续值进行离散化,可是又可能会致使q-table变得庞大,而且可能还有一个问题,若是某一个场景没有训练过,也就是说q-table中没有储存这个值,那么当agent遇到这种状况时就会一脸懵逼。html
这个时候咱们联想咱们在神经网络中学到的知识,咱们能够将Q-table变成一个网络模型,以下所示:(图来自莫烦)git
之前咱们想得到Q值,须要去q-table中进行查询,可是如今咱们只须要将状态和动做(或者仅输入状态)便可得到相对应的Q值,这样,咱们在内存中仅仅只须要保存神经网络模型便可,简单又省内存儿。github
若是不了解神经网络的话,能够先去看一看相关的知识,或者看一看我以前的博客,里面包含了相关的介绍以及具体的实例使用:算法
神经网络中有两个很重要的概念:训练,预测。预测咱们很好理解,就是输入一个状态\(s_1\),它会返回对应的\(q(s_1,a_1),q(s_1,a_2) \cdots q(s_1,a_n)\),而后咱们选择最大值对应的Action就好了。那么咱们怎么进行训练呢?网络
在传统的DNN or CNN网络中,咱们是已知训练集,而后进屡次训练的。可是在强化学习中,训练集是未知的,由于咱们的要求是机器进行自我学习。换句话来讲,就是神经网络的更新是实时的,一边进行游戏获得数据集一边使用数据进行训练。app
首先咱们假设模型是下图这样的:输入一个 \(s\) 返回不一样动做对应的 \(q\) 值。函数
那么咱们进行训练的时候,\(x\_train\) 即为状态 \(s_1\) ,\(y\_train\) 则为 \(q(s_1,a_1),q(s_1,a_2) \cdots q(s_1,a_n)\)。🆗,如今的问题就回到了咱们如何获得“真实”的 \(y\_train\) 。在DQN(Deep Q-learning)入门教程(三)之蒙特卡罗法算法与Q-learning算法中咱们提到使用以下的公式来更新q-table:学习
对应的图以下所示:优化
其中咱们将\(Q(s_1,a_1) = R+\gamma^{*} \max Q(s_2)\)称之为Q现实,q-table中的\(Q(s_1,a_1)\)称之为Q估计。而后计算二者差值,乘以学习率,而后进行更新Q-table。ui
咱们能够想想神经网络中的反向传播算法,在更新网络权值的时候,咱们是获得训练集中的真实值和预测值之间的损失函数,而后再乘以一个学习率,再向前逐渐地更新网络权值。这样想想,彷佛二者之间很类似。
在DQN中咱们能够这样作:
具体的使用,能够看一看下一篇博客的具体使用,用代码来表达更加的丝滑。
经验回放是一个很妙的方法。实际上,咱们训练神经网络模型须要训练不少次才能够获得一个比较好的模型,也就是说,数据会被重复的填入到神经网络中训练不少次。而经验回放就是将数据进行保存,好比说agent再\(S_1\)状执行动做\(a_1\)获得了\(r_1\)的奖励,而后状态转移到了\(S_2\),则经验池就会将\((S_1,a_1,r_1,S_2)\)进行保存,而后咱们在训练的时候,随机从经验池中抽取必定数量的数据来进行训练。这样就能够不停的优化网络模型。
若是没有经验回放,咱们则须要每次获得一个数据,则就进行训练,咱们每次训练的内容都是目前的数据。可是,有了经验回放,咱们就能够从历史数据中选择数据进行训练。
下面介绍一下算法流程:
下面是来自Playing Atari with Deep Reinforcement Learning论文中算法流程:
下面是来自强化学习(八)价值函数的近似表示与Deep Q-Learning对算法的中文翻译:
以上即是DQN的介绍,实际上DQN还有不少优化算法,好比说 Nature DQN使用两个Q网络来减小相关性,Double DQN(DDQN,Nature DQN的优化)……
下一篇博客将具体的使用DQN进行训练,同时DQN入门博客也就快结束了。