【问题标题】:How to disable momentum in specific layer in tensorflow?如何在张量流中禁用特定层的动量?
【发布时间】:2016-11-24 09:25:57
【问题描述】:

我有一个具有三个隐藏层的神经网络,可以使用“纯”梯度下降或一些更复杂的技术对其进行训练。我还注意到,在我的问题中,基于动量的优化方法(adam、adadelta、动量)效果更好。

现在到有趣的部分。按照设计,我想在 NN 的第一层禁用动量。这意味着,我想在第二层和第三层使用 Adam 更新权重,但在第一层使用简单的梯度下降。

当然,我总是可以编写自己的优化器:用tf.gradients(loss, tf.trainable_variables()) 计算梯度,然后自己做动量技巧。但是如果可以选择在每一层中使用特殊的优化器参数,那就太好了。有人听说过这样做的方法吗?

【问题讨论】:

  • 如何定义网络中的层?
  • 没什么特别的,我认为W_1 = tf.Variable( tf.truncated_normal([HIDDEN_0_SIZE, HIDDEN_1_SIZE], stddev=1/np.sqrt(HIDDEN_0_SIZE)), name='W') b_1 = tf.Variable(tf.zeros([HIDDEN_1_SIZE]), name='b') hidden_1 = tf.matmul(activation_0_drop, W_1) + b_1 activation_1 = tf.nn.relu(hidden_1, name='activation') activation_1_drop = tf.nn.dropout(activation_1, keep_prob) 不知道为什么,markdown 会删除所有新行:(
  • 它只是不适用于 cmets,如果您编辑帖子,新行将在那里:)

标签: machine-learning tensorflow gradient-descent


【解决方案1】:

好吧,您可以将要优化的变量列表提供给优化器(docs):

opt = tf.train.AdamOptimizer()
opt_op = opt.minimize(loss, var_list=[W1, b1])
opt2 = tf.train.GradientDescentOptimizer(learning_rate)
opt2_op = opt2.minimize(loss, var_list=[W2, b2])

您必须自己提取给定层的变量列表(可能是权重和偏差)。

【讨论】:

  • 感谢您的建议!但是通过这种方式,我可以通过不将其提供给优化器来完全禁用第一层的训练。但我仍然想训练它,但要使用动量。也许我可以有两个优化器:第一层的 GradientDescent 和其他所有的 Adam。
  • 查看编辑。如果定义了两个优化器,每个优化器都可以更新相应的变量。如果你在 sess.run([opt_op, opt2_op]) 中一起运行它们,我怀疑梯度只会计算一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2021-02-21
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多