微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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方法中入侵.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐