2016-06-14 38 views
6

如何在张量流中的MLP中实现最大范数约束?辛顿和迪恩在黑暗知识工作中所描述的那种。也就是说,它tf.nn.dropout执行默认的重量限制,还是我们需要明确地去做,如如何在张量流中实现MLP中的最大范数约束?

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

“如果这些网络共享相同的权重隐单元是 我们使用标准随机梯度下降程序来训练迷你批次培训案例中的退出神经 网络,但我们修改了用于防止权重过大的惩罚项,通常为 。整个权重向量的平方长度为 (L2范数),我们设置了输入的L2范数的上限矢量为每个单独的隐藏单位。如果权重更新违反此约束,我们 由师重新归一化的隐藏单元的权重“

Keras似乎有它

http://keras.io/constraints/

回答

3

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_normaxes参数:

  1. 如果你计算tf.nn.xw_plus_b(x, weights, biases),或等价matmul(x, weights) + biases,当xweights尺寸分别为(batch, in_units)(in_units, out_units),那么你可能要设置axes == [0](因为在这个每个列的使用情况列详细说明对特定单位的所有传入权重)。
  2. 请注意上面变量的形状/尺寸以及是否/你想要clip_by_norm每个人!例如。如果某些[weights1, weights2, ...]是矩阵,有些不是,并且您在grads_and_vars上调用了clip_by_norm(),其值与上述列表理解中的axes值相同,但这并不意味着所有变量都是相同的!事实上,如果你幸运的话,这会导致一个奇怪的错误,如ValueError: Invalid reduction dimension 1 for input with 1 dimensions,但否则它是一个非常鬼鬼祟祟的错误。