我有一个包含三层隐藏层的neural网络,可以使用“纯”梯度下降法或更复杂的技术进行训练。我还注意到,在我的问题中,基于动量的优化方法(如adam、adadelta、momentum)效果更好。
现在进入有趣的部分。根据设计,我希望在神经网络的第一层禁用动量。这意味着,我希望在第二层和第三层使用Adam来更新权重,但在第一层使用简单的梯度下降法。
当然,我总是可以编写自己的优化器:使用tf.gradients(loss, tf.trainable_variables())
计算梯度,然后自己处理动量。但如果能在每一层使用特殊的优化器参数选项就更好了。有人听说过如何实现这种方法吗?
回答:
嗯,你可以向优化器提供要优化的变量列表(文档):
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])
你需要自己提取特定层的变量列表(可能是权重和偏置)。