如何在张量流中对MLP中的权重实施最大范数约束? Hinton和Dean在他们关于黑暗知识的工作中描述的那种。也就是说,默认情况下tf.nn.dropout是否实现了权重约束,或者我们是否需要明确地执行权重约束,如
https://arxiv.org/pdf/1207.0580.pdf
“如果这些网络对存在的隐藏单元共享相同的权重。 我们使用标准的随机梯度下降程序来训练辍学神经 小批量培训案例的网络,但我们修改通常的惩罚期限 用来防止重量增长过大。而不是惩罚平方的长度 (L2范数)整个权重向量,我们设置了传入的L2范数的上界 每个隐藏单位的权重向量。如果权重更新违反了此约束,我们 通过除法重新规范隐藏单位的权重。“
Keras似乎拥有它
答案 0 :(得分:4)
tf.nn.dropout
不强加任何规范约束。我相信你要找的是“process the gradients before applying them”使用tf.clip_by_norm
。
例如,而不是简单地:
# Create an optimizer + implicitly call compute_gradients() and apply_gradients()
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
你可以:
# Create an optimizer.
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
# Compute the gradients for a list of variables.
grads_and_vars = optimizer.compute_gradients(loss, [weights1, weights2, ...])
# grads_and_vars is a list of tuples (gradient, variable).
# Do whatever you need to the 'gradient' part, for example cap them, etc.
capped_grads_and_vars = [(tf.clip_by_norm(gv[0], clip_norm=123.0, axes=0), gv[1])
for gv in grads_and_vars]
# Ask the optimizer to apply the capped gradients
optimizer = optimizer.apply_gradients(capped_grads_and_vars)
我希望这会有所帮助。关于tf.clip_by_norm
的{{1}}参数的最终说明:
axes
或等效tf.nn.xw_plus_b(x, weights, biases)
,则matmul(x, weights) + biases
和x
的维度分别为weights
和(batch, in_units)
,那么您可能想要设置(in_units, out_units)
(因为在此用法中,每个列详细说明了特定单位的所有传入权重)。axes == [0]
每个变量!例如。如果某些clip_by_norm
是矩阵而某些不是矩阵,并且您在[weights1, weights2, ...]
上调用clip_by_norm()
并使用相同的grads_and_vars
值,就像上面的列表理解中一样,这不会对所有变量来说意味着同样的事情!事实上,如果你很幸运,这将导致一个奇怪的错误,如axes
,但否则这是一个非常偷偷摸摸的错误。答案 1 :(得分:2)
您可以使用tf.clip_by_value:
https://www.tensorflow.org/versions/r0.10/api_docs/python/train/gradient_clipping
渐变裁剪也用于防止复发神经网络中的重量爆炸。