在 Keras 或 Tensorflow 中,重新clipnorm
调整大的“梯度”以具有特定的规范并clipvalue
限制“梯度”的所有值。
但是,如果将其中一个与moemntum
或类似的东西结合起来会发生什么adam
?它是应用于梯度还是速度?
A) 是否clipnorm
应用于g
损失相对于参数的实际纯数学梯度,然后使用这个剪裁梯度来使用旧梯度的动量和学习率计算更新步骤?
velocity = momentum * velocity - learning_rate * clipnorm(g)
w = w + velocity
或者
B)首先将旧梯度的动量与未修改的新梯度相结合。然后得到的向量(“速度”)被clipnorm缩放。
velocity = clipnorm(momentum * velocity - learning_rate * g)
w = w + velocity
或 B')
velocity = momentum * velocity - learning_rate * g
w = w + clipnorm(velocity)
或者也有可能是A')
velocity = momentum * velocity - clipnorm(learning_rate * g)
w = w + velocity
?
A(和 A')会遇到这样一个问题,即即使梯度的范数是有界的,速度也可能由于动量而变得任意大,并且剪辑范数会使分解速度或改变方向的速度变得更慢。
从我的角度来看,B 是最合理的,但我不知道它是如何实现的。
同样的问题可以类似地询问clipvalue
和adam
其他基于动量的算法。
PS:如果clipnorm
没有按照 B 中的建议实施,如果还有可能通过使用不同的选项在 keras 中获得 B 或 B',我会很感兴趣?