gpt4 book ai didi

python - 如何在反向传播前直接设置一层的梯度?

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:34 25 4
gpt4 key购买 nike

想象一个微型网络定义如下,其中 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 中优化器类的方法。

关于python - 如何在反向传播前直接设置一层的梯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39966149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com