DQN伪代码:
1. 在电脑中开辟内存,容量为N,记作D
2. 初始化动作价值函数Q,随机初始化,由于是DQN,使用了深度学习,所以随机初始化的是神经网络的权重参数θ 这个Q网络的输入是具体的“真实的status”,比如游戏里的一帧画面,输出的是一个Q值。
3.初始化目标动作价值函数Qhat,其参数和Q一样(即,神经网络权重参数一样)
4. 开始循环,外侧1~M是episode
5. 初始输入,假设我们输入的是一张游戏起始状态的截图,那么它就是x1,也就是status的第一幕s1,经过神经网络的处理变成Φ1
6. 目标是经过M轮循环后得到完美的Q表(当Q表完善后,相当于智能体训练完成)。
7. 由于要将status从第一幕一直延申到第T慕,所以开始第二轮循环:1~T
8. 设置一个参数ε,用于产生一定的几率去进行探索,如果没有被选中进行探索,则采用贪心算法选取最大Q值。注意!此处最大值选用的是Q表,不是Qhat(注意,虽然说是"Q表",其实它是一个神经网络)
9. 总之在一个选定的at的情况下,送入模拟器,可以得到一个rt,并且会得到第二张图片xt+1(也就是游戏在第二个状态下的截图)。
10. 将这个截图xt+1和之前的状态st,以及动作at进行整合,输入神经网络Φ做处理,得到Φt+1,也就是Φ也进行一遍更新。
* 截至此处请注意,之前相当于是用Q表来进行动作at的选择(Q表上哪个Q值高就选择哪个),但仅仅是进行动作选择,没有实际上利用Q表去计算价值函数.
11. 将这一步的流程储存到内存D里面,可以用于后面的采样。
12. 定义一个批次的大小,然后按照这个大小在D中存储的所有SARS组合里进行采样,并算出对应的y值。注意,关键点在于,此处的y计算要用Qhat表上对应的值来计算。而且,yj是用j+1的数据计算出来的。
*此处是真正计算价值函数的过程,注意是对之前通过Q表更新的一群SARS组合进行采样,采出来的结果在计算价值函数时,使用的Q值不是来源于Q表而是来源于Qhat表,
**这种“at的选择”和“价值函数更新”使用不同Q表(分别用Q表和Qhat表)的机制,体现了Q-learning离轨的计算思想。
13. 将求出来的yj作为标准去和Q表算2范数
*注意,这个2范数是整个网络的loss函数,通过把这个loss函数训练到接近于0,实现对网络的训练。
**Loss函数的表述里,yj是一个定值,相当于是标签,此时训练的是Q表(或者称之为Q网络)中的θ。
14. 规定的轮数更新Qhat:每隔C轮,把Q网络赋值给Qhat网络。
***所以整个DQN的流程是:
(1) 先在某一幕s下,用Q去选择行动a,得到一组SARS组合。录入存储空间D
(2) 在空间D中采样,对采样结果:用Qhat去计算价值函数,形成标签
(3) 用标签进行监督学习,优化Q网络
(4) 定期将Q的参数复制给Qhat