Tensorflow几种计算梯度的方式
1. tf.gradients
tf.gradients(
ys,
xs,
grad_ys=None,
name='gradients',
colocate_gradients_with_ops=False,
gate_gradients=False,
aggregation_method=None,
stop_gradients=None,
unconnected_gradients=tf.UnconnectedGradients.NONE
)
计算ys关于xs的梯度,tf.gradients
返回的结果是一个长度为len(xs)的Tensor列表list,每个张量为sum(dy/dx)
,即ys关于xs的导数。
例子:
tf.gradients(y, [x1, x2, x3]
返回[dy/dx1, dy/dx2, dy/dx3]
当y与x无关时,即graph无x到y的路径, 则求y关于x的梯度时返回[None]
参数stop_gradients
指定的变量对当前梯度求解而言, 梯度求解将止于这些变量。
实例:
a = tf.constant(0.)
b = 2 * a
g = tf.gradients(a + b, [a, b], stop_gradients=[a, b]) #梯度计算不再追溯a,b之前的变量
输出:
In: sess.run(g)
out:[1.0, 1.0]
如果不设置stop_gradients
参数则反向传播梯度计算将追溯到最开始的值a,输出结果为:
In : sess.run(g)
Out: [3.0, 1.0]
具体查阅:tf.gradients官网教程
2. optimizer.compute_gradients
compute_gradients(
loss,
var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
grad_loss=None
)
optimizer.compute_gradients
是tf.gradients
的封装1.
是optimizer.minimize()
的第一步,返回(gradient, variable)的列表,其中gradient是tensor。
直观上,optimizer.compute_gradients
只比tf.gradients
多了一个variable输出。
具体查阅:optimizer.compute_gradients官网教程
3. tf.stop_gradient
tf.stop_gradient(
input,
name=None
)
tf.stop_gradient
阻止input的变量参与梯度计算,即在梯度计算的过程中屏蔽input之前的graph。
返回:关于input的梯度
应用:
- EM算法,其中M步骤不应涉及通过E步骤的输出的反向传播。
- Boltzmann机器的对比散度训练,在区分能量函数时,训练不得反向传播通过模型生成样本的图形。
- 对抗性训练,通过对抗性示例生成过程不会发生反向训练。
具体查阅: tf.stop_gradient官网教程