python – 如何在反向传播之前直接设置图层的渐变?

想象一下如下定义的微小网络,其中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.

最佳答案 tf.gradients通过其grad_ys参数提供此功能,请参阅
here.在您的情况下,tf.gradients([final_layer],list_of_variables,grad_ys = [_ deriv])将计算所需的渐变.

不幸的是,看起来内置优化器没有将grad_ys参数传递给tf.gradients.您可能必须在优化器类的compute_gradients方法中入侵.

点赞