想象一下如下定义的微小网络,其中linear是一个典型的辅助函数,用于定义权重矩阵和激活函数的TensorFlow变量:
final_layer = linear(linear(_input,10,tf.nn.tanh),20)
通常情况下,这会通过失败时的梯度下降进行优化:
loss = tf.reduce_sum(tf.square(final_layer - _target))
train_step = tf.train.AdamOptimizer().minimmize(loss)
但是假设我得到了损失的衍生物w.r.t.来自外部源的final_layer(例如名为_deriv的tf.placeholder)。如何将此梯度信息与其中一个内置优化器一起使用来反向传播和更新网络参数?
我目前使用的解决方法是构造一个由_deriv和final_layer之间的内积组成的人为损失(因为这个损失的衍生物w.r.t. final_layer将等于_deriv)。
loss = tf.reduce_sum(final_layer*_deriv)
train_step = tf.train.AdamOptimizer().minimmize(loss)
这是非常浪费的,因为它需要做这个不必要的内在产品并计算每个训练步骤的衍生物,即使我已经知道这些信息。还有更好的方法吗?
对于那些认为需要做的事情很奇怪的人来说,有必要实施synthetic gradients。
答案 0 :(得分:2)
tf.gradients
通过其grad_ys
参数提供此功能,请参阅here。在您的情况下,tf.gradients([final_layer], list_of_variables, grad_ys=[_deriv])
会计算您想要的渐变。
不幸的是,内置优化器看起来没有将grad_ys
参数传递给tf.gradients
。您可能必须在优化器类的compute_gradients方法中进行入侵。
答案 1 :(得分:0)
对于那些想知道的人,在 TensorFlow 2 中执行此操作的一个好方法是 customizing what happens in model.fit
。具体来说,更改 train_step
函数以忽略本机 GradientTape()
,而是将外部计算的梯度传递给优化器。