张量流中的损失限幅(在DeepMind的DQN上)

aph*_*ent 9 neural-network deep-learning conv-neural-network tensorflow

我正在尝试使用Deepmind在张量流中自己实现的DQN文件,并且在剪切损失函数时遇到了困难.

以下是描述损失裁剪的自然纸的摘录:

我们还发现将更新中的错误项剪辑在-1和1之间是有帮助的.因为绝对值损失函数| x | 对于x的所有正值,其导数为-1,对于x的所有正值,导数为1,将平方误差限制在-1和1之间,对应于使用绝对值损失函数(? 1,1)间隔.这种形式的错误限幅进一步提高了算法的稳定性.

(链接到完整论文:http://www.nature.com/nature/journal/v518/n7540/full/nature14236.html)

到目前为止我尝试过的是使用

clipped_loss_vec = tf.clip_by_value(loss, -1, 1)
Run Code Online (Sandbox Code Playgroud)

剪辑我在-1和+1之间计算的损失.在这种情况下,代理商没有学习正确的政策.我打印出网络的渐变,并意识到如果损失低于-1,渐变都会突然变为0!

我发生这种情况的原因是削减损失是(-inf,-1)U(1,inf)中的常数函数,这意味着它在这些区域中具有零梯度.这反过来确保整个网络中的梯度为零(想象一下,无论我提供给网络的任何输入图像,由于它已被剪切,损失在本地邻域中保持为-1).

所以,我的问题是两部分:

  1. Deepmind在摘录中究竟是什么意思?他们是否意味着低于-1的损失被削减为-1,高于+1的损失被削减为+1.如果是这样,他们是如何处理渐变的(即关于绝对值函数的那部分是什么?)

  2. 我应该如何在张量流中实现损耗限幅,使得梯度在限幅范围之外不会变为零(但可能保持在+1和-1)?谢谢!

D.W*_*.W. 9

我怀疑它们意味着你应该将渐变剪裁到[-1,1],而不是剪辑损失函数.因此,您像往常一样计算渐变,但随后将渐变的每个分量剪切到[-1,1]范围内(因此,如果它大于+1,则将其替换为+1;如果小于+1; -1,用-1)替换它; 然后在梯度下降更新步骤中使用结果,而不是使用未修改的渐变.

等效:定义函数f如下:

f(x) = x^2          if x in [-0.5,0.5]
f(x) = |x| - 0.25   if x < -0.5 or x > 0.5
Run Code Online (Sandbox Code Playgroud)

他们建议用作损失函数,而不是使用某种形式s^2作为损失函数(其中s有一些复杂的表达式)f(s).这是某种平方损失和绝对值损失之间混合的:将像s^2s小,但在s变大,它会像绝对值(|s|).

请注意,导数f具有良好的属性,其导数将始终在[-1,1]范围内:

f'(x) = 2x    if x in [-0.5,0.5]
f'(x) = +1    if x > +1
f'(x) = -1    if x < -1
Run Code Online (Sandbox Code Playgroud)

因此,当你采用这种f基于损失函数的梯度时,结果将与计算平方损失的梯度然后将其剪切相同.

因此,他们正在做的是用Huber损失有效地取代平方损失.f对于delta = 0.5,该函数只是Huber损失的两倍.

现在重点是以下两个选择是等价的:

  • 使用平方损失函数.计算此损失函数的梯度,但在执行梯度下降的更新步骤之前,梯度为[-1,1].

  • 使用Huber损失函数而不是平方损失函数.在梯度下降中直接(不变)计算此损失函数的梯度.

前者易于实施.后者具有良好的性能(提高稳定性;它比绝对值损失更好,因为它避免了在最小值附近振荡).因为这两者是等价的,这意味着我们得到一个易于实现的方案,它具有平方损失的简单性以及Huber损失的稳定性和鲁棒性.