先贴一个链接,这篇文章写得很不错:www.jianshu.com/p/d347bb2ca53c
这篇文章是DeepMind团队于2015年在Nature上发表的关于深度增强学习的一篇文章。
这篇文章非常有趣,作者通过将深度学习与强化学习相结合,提出了一个名叫“deep Q-network”的算法。作者通过使用同一种算法和网络,同一种超参数,在49种游戏的集合中,仅仅使用像素点和游戏分数作为输入,就有超过一半游戏超过了专业游戏玩家的水平。
接下来是具体的原理介绍,
首先我们将这个游戏任务进行转换,假设这里有一个agent,在一个环境中(比如某个游戏)。环境有着一个即时状态s0。agent可以在环境中执行某种行动a0(比如向左或者向右移动)。这些行动可能会带来收益r1,并且会改变环境并使其进入新的状态s1,然后agent又可以这行另外的行动,如此进行下去。因此总共的收益就是:
我们的目标就是最大化这个R,同时为了使程序更关注现在的r,我们对r进行时间上的折减,折减系数为γ,因此有下面这个action-value函数:
等式右边可以转换为以下形式:
但是这里有一个问题,当使用非线性函数(如卷积神经网络)来估计Q函数时,函数可能不稳定甚至会发散。主要有以下几种原因:
1.可观测序列的相关性,即每次输入的图片都是时间上前后连续的。
2.Q值的小的更新会很大范围的更改策略进而更改数据的分布
3.Q值和目标函数(也就是上面等式右边的式子)之间的相关性
为此作者使用了:
1.经验延迟机制,它会将数据随机化,因此可以消除观测数据的相关性,并且减小数据分布的影响。
2.使用一个迭代更新算法调整Q函数向目标值的方向,并且周期性的更新,从而可以降低和目标之间的相关性。
为了实现经验延迟机制,作者将每一时刻t对应的
都存入数据集Dt,因此
在训练的时候,随机从Dt里面抽取mini-batch个样本,并在它们上面使用Q-learning更新。
第i次迭代时的损失函数如下:
为了验证模型的效果,作者在Atari2600平台上测试了它。这个平台提供了49种不同的游戏。作者使用相同的网络架构、超参数和学习过程来证明他们的方法可以非常鲁棒的成功在很多游戏中学习到操作策略,并且学习过程仅仅基于传感器的输入并且只依赖很少的先验知识(仅仅是视觉图像输入,以及每个游戏可采取的动作个数)。最终在29个游戏上,成功超越了75%的人类玩家的分数!最后作者通过使用一个叫做“t-SNE”的技术将所有状态可视化了出来。
最后作者介绍了他们实验的具体方法,
1.数据预处理:
首先,为了编码一个单帧图像,我们在要编码的图像和上一幅图像的每个像素颜色值中取最大值,这有利于消除游戏过程中的闪烁。第二点,我们从RGB图像中提取了Y通道,即亮度通道,然后把它缩小为84*84大小。每次选取最近的4帧图像并将他们作为Q函数计算的输入,也就是卷积神经网络的输入。
2.网络结构:
作者使用了三层卷积层和两层全连接层的网络,而并没有使用Pooling层,因为Pooling层会对每一帧图像中像素的位置关系造成影响。
3.训练细节:
(1)由于49种游戏的分数范围差别很大,我们对于正的回报给予1,负的回报给予-1,对于不变的给予0。使用这种方式,可以限制误差倒数的规模,同时对于不同的学习任务可以更容易的使用相同的学习速率。
(2)为了使算法能够对新玩法一直保持尝试,而不是一直使用一种策略,作者使用了RMSProp算法,其中的mini-batch大小是32。在训练过程中以的概率来选择策略,ε退火的线性的从1.0到0.1,然后固定在0.1上。也就是说,最开始ε=1,也就是每一次都随机选择策略。当ε=0.1时,则以0.1的概率选择其他策略(a),以0.9的概率保持当前策略。
(3)使用了简单的frame-skipping技术。也就是说,机器人每经历k幅图像才采取一个动作,而不是每幅图像都采取动作,在忽略的图像播放过程中,其动作会一直持续。因为在运行仿真器的过程中,前馈一步所需要的计算比程序选取一个动作所需的计算量要少很多。作者使用的k=4。
4.算法
最优的“动作-值”函数遵循一个重要的恒等式,也就是贝尔曼等式。原文中描述如下:
也就是说,假设通过下一步行动a’所得到的Q*(s’,a’)已知,
则我们的任务就是最大化r+γQ*(s’,a’)这个式子,转化一下就得到上面的等式了。
然后我们用一个权重为θ的神经网络来近似模拟上面的式子,则
可以用
来表示,于是损失函数可以表示为:
其中:
最后的训练步骤为:
网友评论