如何在张量流中的MLP中实现最大范数约束?

时间:2016-06-14 02:01:51

标签: tensorflow keras

如何在张量流中对MLP中的权重实施最大范数约束? Hinton和Dean在他们关于黑暗知识的工作中描述的那种。也就是说,默认情况下tf.nn.dropout是否实现了权重约束,或者我们是否需要明确地执行权重约束,如

https://arxiv.org/pdf/1207.0580.pdf

“如果这些网络对存在的隐藏单元共享相同的权重。 我们使用标准的随机梯度下降程序来训练辍学神经 小批量培训案例的网络,但我们修改通常的惩罚期限 用来防止重量增长过大。而不是惩罚平方的长度 (L2范数)整个权重向量,我们设置了传入的L2范数的上界 每个隐藏单位的权重向量。如果权重更新违反了此约束,我们 通过除法重新规范隐藏单位的权重。“

Keras似乎拥有它

http://keras.io/constraints/

2 个答案:

答案 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}}参数的最终说明:

  1. 如果您正在计算axes或等效tf.nn.xw_plus_b(x, weights, biases),则matmul(x, weights) + biasesx的维度分别为weights(batch, in_units) ,那么您可能想要设置(in_units, out_units)(因为在此用法中,每个详细说明了特定单位的所有传入权重)。
  2. 注意上面变量的形状/尺寸以及是否/如何准确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

渐变裁剪也用于防止复发神经网络中的重量爆炸。