【发布时间】:2016-07-27 13:18:34
【问题描述】:
我正在尝试自己在张量流中实现 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)
将我计算的损失限制在 -1 和 +1 之间。在这种情况下,代理没有学习正确的策略。我打印了网络的梯度,发现如果损失低于-1,梯度会突然变成0!
我对这种情况发生的原因是裁剪损失是 (-inf,-1) U (1,inf) 中的一个常数函数,这意味着它在这些区域中的梯度为零。这反过来又确保了整个网络的梯度为零(可以将其想象为,无论我向网络提供什么输入图像,在本地邻域中的损失都保持在 -1,因为它已被裁剪)。
所以,我的问题是两个部分:
Deepmind 在摘录中究竟是什么意思?他们是否意味着低于 -1 的损失被剪裁为 -1 而高于 +1 的损失被剪裁为 +1。如果是这样,他们是如何处理梯度的(即关于绝对值函数的所有部分是什么?)
我应该如何在张量流中实现损失裁剪,以使梯度在裁剪范围之外不会变为零(但可能保持在 +1 和 -1)? 谢谢!
【问题讨论】:
-
fleibfried 的回答是正确的。然而,一些 DQN 实现确实将损失从 -1 削减到 1。这是有效的,因为游戏奖励也从 -1 削减到 1,这缓解了这个问题。
标签: neural-network tensorflow deep-learning conv-neural-network