Python 如何在反向传播之前直接设置层的梯度?
想象一个定义如下的小网络,其中线性是一个典型的辅助函数,为权重矩阵和激活函数定义TensorFlow变量:Python 如何在反向传播之前直接设置层的梯度?,python,tensorflow,backpropagation,gradient-descent,Python,Tensorflow,Backpropagation,Gradient Descent,想象一个定义如下的小网络,其中线性是一个典型的辅助函数,为权重矩阵和激活函数定义TensorFlow变量: final\u layer=线性(线性(\u输入,10,tf.nn.tanh),20) 通常,这将通过损失梯度下降进行优化: loss=tf.reduce_sum(tf.square(最终_层-_目标)) 列车步进=tf.train.AdamOptimizer().最小化(损失) 但假设我从外部来源(例如,名为_deriv的tf.占位符)获得损耗w.r.t.最终_层的导数。如何将此梯度信息
final\u layer=线性(线性(\u输入,10,tf.nn.tanh),20)
通常,这将通过损失梯度下降进行优化:
loss=tf.reduce_sum(tf.square(最终_层-_目标))
列车步进=tf.train.AdamOptimizer().最小化(损失)
但假设我从外部来源(例如,名为_deriv的tf.占位符)获得损耗w.r.t.最终_层的导数。如何将此梯度信息与内置优化器一起用于反向传播和更新网络参数
我目前使用的解决方法是构造一个由_deriv和final_层之间的内积组成的人工损耗(因为这个损耗的导数w.r.t.final_层将等于_deriv)
loss=tf.减少总和(最后一层*)
列车步进=tf.train.AdamOptimizer().最小化(损失)
这是非常浪费的,因为它需要做这个不必要的内积,并计算每个训练步骤的导数,即使我已经知道这个信息。有更好的办法吗
对于那些认为这是一件奇怪的事情需要做的人来说,这是实现的必要条件。
tf。渐变通过其grad ys
参数提供此功能,请参阅。在你的例子中,tf.gradients([final\u layer],变量列表,grad\u ys=[\u deriv])
将计算你想要的梯度
不幸的是,内置优化器似乎没有将grad_ys
参数传递给tf.gradients
。您可能需要在优化器类的方法中加入一些东西。对于那些想知道的人,在TensorFlow 2中实现这一点的一个好方法是。具体来说,更改train_step
函数以忽略本机GradientTape()
,而是将外部计算的梯度传递给优化器。有趣的问题。也许是在像这样的斜坡上挖掘?