例如,如果我这样做:
loss_one = something
loss_two = somthing_else
train_one = tf.train.AdamOptimzer(0.001).minimize(loss_one)
train_two = tf.train.AdamOptimizer(0.001).minimize(loss_two)
sess.run([train_one, train_two])
这会做出预期的吗?我担心的原因是因为我不知道渐变是如何累积的。它们是否存储在优化器本身?还是变量?如果是第二个,我可以想象它们会干扰。
答案 0 :(得分:1)
很可能不是。据推测,loss_one
和loss_two
都衡量了模型输出的接近程度,让我们说out
与您的预期相符,所以它们都是out
的功能,也许还有别的东西。两个优化器都会在调用out
之前使用变量所具有的值计算session.run
计算的变量更新。因此,如果您应用一个更新然后应用另一个更新,则第二个更新将不是真正正确的,因为它尚未使用现在更新的变量进行计算。但是,这可能不是一个大问题。一个更复杂的问题是,根据优化器的实现方式,如果它或多或少类似于variable = variable + update
,那么表达式右侧的variable
是否确定性不确定具有原始或第一次更新的值,因此您可以非确定性地仅添加其中一个更新或两者。
有几种更好的选择:
sess.run(train_one)
,然后再调用sess.run(train_two)
。tf.train.AdamOptimzer(0.001).minimize(loss_one + loss_two)
)。compute_gradients
,然后根据您认为合适的结果渐变(例如,添加或平均更新)并将其应用于apply_gradients
。tf.control_dependencies
确保一个优化步骤始终在另一个之后进行。然而,这意味着使用第二个优化器将始终需要使用第一个优化器(可以解决,可能使用tf.cond
,但这更麻烦)。答案 1 :(得分:0)
优化器主要负责计算梯度(反向传播),如果你给它两次丢失(运行它两次),它会通过执行推理一次更新梯度两次。不知道为什么你会那样做