到目前为止已经介绍了强化学习的基本方法:基于动态规划的方法、基于蒙特卡罗的方法、基于时间差分的方法。这些方法都有一个基本的前提条件:状态空间和动作空间是离散的,而且都不能太大。原因是这些方法的值函数其实是一张表,对于状态值函数,其索引是状态;对于动作值函数,其索引是状态-动作对,所以如果状态空间很大的话,或者状态空间是连续的话,值函数很难用一张表来表示或者存储。
此时我们就可以利用函数逼近的方法来表示值函数,然后就可以利用策略迭代和值迭代方法构建算法。
下面我们首先回顾一下蒙特卡罗方法、TD方法值函数的更新公式:
从上述值函数公式可以看出,值函数更新是向着目标函数逼近的。
我们本次分享的DQN是采用非线性-神经网络逼近的,采用的最小二乘法来构建损失函数,如下所示:
很显然,表格型的强化学习在更新值函数时,只有当前状态处的值函数被更新,其他状态值函数保存不变,而基于值函数逼近的方法,更新的是神经网络参数θ,所以任意状态的值函数都会发生变化。
下面我们介绍DQN原始论文《Human-levelcontrol through deep reinforcement learning》对上述的修改,论文地址https://www.nature.com/articles/nature14236?wm=book_wap_0005,论文主要是解决高维度输入情况下如何进行强化学习,以Atari游戏为例,如何让机器学会控制目标使得游戏得分最多。Deep Q Network = CNN + Q-Learning,具体是将卷积神经网络和QLearning结合在一起。卷积神经网络的输入是原始图像数据(作为状态)输出则为每个动作对应的价值Value Function来估计未来的反馈Reward。即使用CNN来拟合最优的动作估值函数(optimal action-value function)
DQN是在Qlearning的基础上做了一些修改和扩展,想了解Qlearning的朋友,可以参考强化学习(五):时间差分(二),修改的内容如下:
1、 DQN使用深度卷积神经网络逼近值函数使用神经网络的非线性逼近值函数,模型的鲁棒性更好。
2、 DQN使用经验回放训练强化学习
训练神经网络的假设是训练数据独立同分布,但是通过强化学习采样的数据之间存在着关联性,导致神经网络训练不稳定。经验回放是把数据先存储到一个数据库中,再均匀随机采样,然后训练神经网络,从而打破数据的关联性,提升模型的性能。
3、 DQN设置了目标网络来处理时间差分算法中的TD误差
主要是把TD的目标网络和值函数逼近网络分开异步更新,但是使用的还是同一个网络,只不过用于计算TD的目标网络是每个固定步数更新一次。
DQN的网络结构如下图所示:
DQN的伪代码如下:
下面详细解释一下每行伪代码:
1、 初始化回放记忆D,最多可容纳的数据条数N;
2、 随机初始化状态动作值函数Q的权值θ;
3、 通过初始化目标网络,计算TD目标的状态动作值Q;
4、 循环每个episode;
5、 初始化事件的第一个状态={
},通过预处理函数转换得到状态对应的输入特征
;
6、 循环每个episode的每一步;
7、 随机生成一个数,如果这个数小于ε,那么就随机选择一个动作;
8、 如果这个数大于ε,那么就采用贪婪策略选择当前值函数最大的那个动作;
9、 在仿真器中执行第7或者8步选择的动作,并观察回报
以及下一个图像
;
10、设置,
,
,预处理
为
;
11、将(,
,
,
)存储在回放记忆D中;
12、从回放记忆D中均匀随机采样一个minibatch样本数据(,
,
,
)
13、 判断是否是一个事件的终止状态,如果是,那么TD的目标为;否则,根据TD目标网络计算TD的目标
14、在以神经网络参数为θ的目标函数下求梯度
,并且更新动作值函数逼近的网络参数θ=θ+
15、每C步更新一次TD的目标函数的神经网络权值
16、结束一个episode
17、结束所有的episode
上述介绍了基本的DQN算法,该算法使用经验回放和单独设立目标网络两个技巧解决了Qtable太大的问题,但是仍然有诸多待改进的地方:
1) DQN仍然存在Qlearning算法的缺点-过估计。
2) 随机采样的方法好吗?不同样本的重要性是不一样的吗?
3) Q值代表状态-动作的价值,那么单独动作价值的评估会不会更准确?
第一个问题对应的改进是Double DQN, 第二个问题的改进是Prioritised Replay DQN,第三个问题的改进是Dueling DQN,这三个DQN的改进版我们在下一篇来讨论,敬请期待。