DQN学习笔记

时间:2024-03-19 15:33:57

参考:1.莫烦什么是DQN
   2强化学习:DQN与Double DQN讨论
   3实战深度强化学习DQN-理论和实践

DQN(深度神经网络)是Q learning 与神经网络结合的产物。

1.传统的Q learning

先回顾一下传统的Q learning 算法。
  Q learning 是异策略时间差分算法:
DQN学习笔记
Q learning最重要的两个概念是异策略和时间差分。
  异策略是指动作策略(选择动作的策略)和评估更新的策略不是同一个。如算法所示,动作策略是ε\varepsilon 贪婪策略,目标策略是最大贪婪策略。
  (注:这里的ε\varepsilon是一个变化的值比较合理,这个值在一开始比较大,是为了让agent充分探索环境并得到反馈,越到后面,这个值应该越小,也就是说,agent通过不断学习,会使得其行为逐渐优化,变的越来越靠谱,所以应当适当减小ε\varepsilon的值)
  时间差分方法是指利用时间差分目标来更新当前行为值函数。在算法中,时间差分目标是:
rt+γmaxaQ(st+1,a){r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},a)
  公式中,Q(s,a) 我们可以称做Q估计值,即我们当前估计的Q值,而rt+γmaxaQ(st+1,a){r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},a)称为Q target,即我们使用贝尔曼方程加贪心策略认为实际应该得到的奖励,我们的目标就是使我们的Q值不断的接近Q-target值。

2.为什么要与神经网络融合?

  在q learning中,我们采用Q表来存储每个状态state和动作action。而对于实际中的问题,比如玩游戏,agent的状态和动作实在是太多了,如果全部采用表格的形式来存储这些,就需要花费相当大的内存,且不一定够,另外,在每次在这些大数据中搜索对应的状态和动作也是一件极为麻烦的事情。
  神经网络处理这些事情很拿手。一种方法是可以将状态state和动作action作为神经网络的输入,经过网络分析计算后产生Q值。这样我们就没有必要用表格去记录Q值,而是直接通过网络生成Q值。第二种方法是只输入状态值,输出所有的动作的Q值,然后在选择最大q值对应的动作。
  可以想象,神经网络接受外部的信息, 相当于眼睛鼻子耳朵收集信息, 然后通过大脑加工输出每种动作的值, 最后通过强化学习的方式选择动作。如下图所示:
DQN学习笔记

3.DQN的特点

DQN主要有三大特点:

  1. DQN利用深度卷积神经网络逼近值函数
  2. DQN利用经验回放机制训练强化学习
  3. DQN独立设置了目标网络来单独处理时间差分

3.1 DQN利用深度卷积神经网络逼近值函数

  如下图所示为DQN的行为值函数逼近网络。与线性逼近不同,线性逼近指值函数由一组基函数和一组与之对应的参数相乘得到,值函数是参数的线性函数。而DQN的行为值函数利用神经网络逼近,属于非线性逼近。虽然逼近方法不同,但都属于参数逼近。请记住,此处的值函数对应着一组参数,在神经网络里参数是每层网络的权重,我们用θ表示。用公式表示的话值函数为Q(s,a;θ)。请留意,此时更新值函数时其实是更新参数θ,当网络结构确定时,θ就代表值函数。DQN所用的网络结构是三个卷积层加两个全连接层,整体框架如下图所示。
DQN学习笔记

3.2 )DQN利用经验回放机制训练强化学习

  当人类睡觉的时候,海马体会把一天的记忆重放给大脑皮层。利用这个启发机制,DeepMind团队的研究人员构造了一种神经网络的训练方法:经验回放。
  在标准的Q learning算法中没见过这个replay memory。引入它的优势是打破了(s,a,r,s’)的相关性。
  在训练神经网络时,存在的假设是训练数据是独立同分布的,但是通过强化学习采集的数据之间存在着关联性,利用这些数据进行顺序训练,神经网络当然不稳定。如果不打乱顺序,每次更新时会使估算的值比较偏。
  经验回放可以打破数据间的关联,如下图所示,在强化学习过程中,智能体将数据存储到一个数据库中,再利用均匀随机采样的方法从数据库中抽取数据,然后利用抽取的数据训练神经网络。
DQN学习笔记
  比如说我们用dqn玩游戏的时候,采集的图片信息是一个连续的时间序列,样本之间具有连续性,如果每次得到样本就更新Q值,受样本分布的影响,效果会不好。我们可以先将样本存起来,然后随机采样。

3.3 DQN独立设置了目标网络来单独处理时间差分

  与表格型的Q learning算法不同,利用神经网络对值函数进行逼近时,价值函数更新的是θ。DQN利用了卷积神经网络。其更新方法是梯度下降法,更新公式变为了:
θt+1=θt+α[r+γmaxaQ(s,a;θ)Q(s,a;θ)]Q(s,a;θ){\theta _{t + 1}} = {\theta _t} + \alpha \left[ {r + \gamma \mathop {\mathop {\max }\limits_a Q(s',a';\theta ) - Q(s,a;\theta )}\limits_{} } \right]\nabla Q(s,a;\theta )
其中,r+γmaxaQ(s,a;θ)r + \gamma \mathop {\mathop {\max }\limits_a Q(s',a';\theta )}\limits_{}
为时间差分目标。
  在计算maxaQ(s,a;θ)\mathop {\mathop {\max }\limits_a Q(s',a';\theta )}\limits_{}用到网络参数θ,如下:
DQN学习笔记
  称计算TD目标时所用的网络为TD网络。在DQN算法出现之前,利用神经网络逼近值函数时,计算TD目标的动作值函数所用的网络参数θ,与梯度计算中要逼近的值函数所用的网络参数相同,这样就容易导致数据间存在关联性,从而使训练不稳定。为了解决此问题,DeepMind提出计算TD目标的网络表示为θ-;计算值函数逼近的网络表示为θ;用于动作值函数逼近的网络每一步都更新,而用于计算TD目标的网络则是每个固定的步数更新一次。
所以,值函数的更新变为:
θt+1=θt+α[r+γmaxaQ(s,a;θ)Q(s,a;θ)]Q(s,a;θ){\theta _{t + 1}} = {\theta _t} + \alpha \left[ {r + \gamma \mathop {\mathop {\max }\limits_a Q(s',a';{\theta ^ - }) - Q(s,a;\theta )}\limits_{} } \right]\nabla Q(s,a;\theta )
DQN的伪代码如下:
DQN学习笔记
第[1]行,初始化回放记忆D,可容纳的数据条数为N;
第[2]行,利用随机权值θ初始化动作-行为值函数Q;
第[3]行,令θ-=θ初始化,计算TD目标的动作行为值Q;
第[4]行,循环每次事件;
第[5]行,初始化事件的第一个状态s1,通过预处理得到状态对应的特征输入;
第[6]行,循环每个事件的每一步;
第[7]行,利用概率ε选一个随机动作at;
第[8]行,若小概率事件没发生,则用贪婪策略选择当前值函数最大的那个动作:at=argmaxQ(ϕ(st),a;θ){a_t} = \arg \max Q(\phi ({s_t}),a;\theta )
(注意:这里选最大动作时用到的值函数网络与逼近值函数所用的网络是一个网络,都对应θ。
注意:第[7]行和第[8]行是行动策略,即ε\varepsilon 贪婪策略)
第[9]行,在仿真器中执行动作at,观测回报rt以及图像xt+1;
第[10]行,设置:st+1=st,at,xt+1{s_{t + 1}} = {s_t},{a_t},{x_{t + 1}},预处理:ϕt+1=ϕ(st+1){\phi _{t + 1}} = \phi ({s_{t + 1}})
第[11]行,将转换:(ϕt,at,rt,ϕt+1)({\phi _t},{a_t},{r_t},{\phi _{t + 1}})存到回放记忆D中;
第[12]行,从回放记忆D中均匀随机采样一个转换样本数据:(ϕj,aj,rj,ϕj+1)({\phi _j},{a_j},{r_j},{\phi _{j + 1}})
第[13]行,判断是否是一个事件的终止状态,若是则TD目标为rj ,否则利用TD目标网络θ-计算TD目标:
r+γmaxaQ(s,a;θ)r + \gamma \mathop {\mathop {\max }\limits_a Q(s',a';{\theta ^ - })}\limits_{}
第[14]行,执行一次梯度下降算法:
θ=+α[r+γmaxaQ(s,a;θ)Q(s,a;θ)]Q(s,a;θ)\nabla \theta = + \alpha \left[ {r + \gamma \mathop {\mathop {\max }\limits_a Q(s',a';{\theta ^ - }) - Q(s,a;\theta )}\limits_{} } \right]\nabla Q(s,a;\theta )
第[15]行,更新动作值函数逼近的网络参数:θ=θ+θ\theta = \theta + \nabla \theta
第[16]行,每隔C步更新一次TD目标网络权值,即令θ-=θ;
第[17]行,结束每次事件内循环;
第[18]行,结束事件间循环。
  我们可以看到,在第[12]行利用了经验回放;在第[13]行利用了独立的目标网络θ-;第[15]行更新动作值函数逼近网络参数;第[17]行更新目标网络参数。

4.如何将Q learning 转换为深度学习问题?

  Q-Learning只适用于状态和动作空间是离散且维数不高,当状态和动作空间是高维连续时,例如Atari游戏中,输入是原始图像数据,也就是84x84像素的图片,假设每一个像素都有256种颜色选择,那么状态空是 ,Q-Learnng就变得不现实了。通常的做法是将Q函数求解转化为函数拟合问题:Q(s,a)f(s,a,ω)Q\left( {s,a} \right) \approx f\left( {s,a,\omega } \right)
那么DL和RL结合会带来哪些问题?

  1. DL需要大量带标签的样本进行监督学习;RL只有reward返回值,而且伴随着噪声,延迟(过了几十毫秒才返回),稀疏(很多State的reward是0)等问题;
  2. DL的样本独立;RL前后state状态相关;
  3. DL目标分布固定;RL的分布一直变化,比如你玩一个游戏,一个关卡和下一个关卡的状态分布是不同的,所以训练好了前一个关卡,下一个关卡又要重新训练;、
  4. 过往的研究表明,使用非线性网络表示值函数时出现不稳定等问题。
    解决方法:

1、通过Q-Learning使用reward来构造标签(对应问题1)
2、通过experience replay(经验池)的方法来解决相关性及非静态分布问题(对应问题2、3)
3、使用一个神经网络产生当前Q值,使用另外一个神经网络产生Target Q值(对应问题4)
构造损失函数的具体操作:
  对于函数优化问题,监督学习的一般方法是先确定Loss Function,然后求梯度,使用随机梯度下降等方法更新参数。DQN则基于Q-Learning来确定Loss Function。我们想要使q-target值和q-eval值相差越小越好。
DQN中的损失函数为:
DQN学习笔记
这里yi是根据上一个迭代周期或者说target-net网络的参数计算出的q-target值,跟当前网络结构中的参数无关,yi的计算如下:
DQN学习笔记
这样,整个目标函数就可以通过随机梯度下降方法来进行优化:
DQN学习笔记