自动微分和梯度
Tensorflow为自动微分提供了 tf.GradientTape API,将tf.GradientTape上下文内执行的相关运算记录到“条带”上,随后使用该条带通过反向传播模式计算梯度。
要实现自动微分,Tensorflow需要记忆前向传播过程中的运算顺序;
后向传播期间,Tensorflow以相反的顺序遍历此运算列表来计算梯度。
使用 GradientTape.gradient(target,sources)
计算某个目标相对于模型变量的梯度。
使用GradientTape.watch(x)
可以设置要监视的变量。
x = tf.constant(3.0)
with tf.GradientTape() as tape:
tape.watch(x)
y = x**2
dy_dx = tape.gradient(y,x)
dy_dx.numpy()
6.0
要停用监视所有 tf.Variables 的默认行为,请在创建梯度带时设置 watch_accessed_variables=False
.
中间结果
如果要在统一计算中计算多个梯度,需要创建一个 persistent=True 的梯度带。
x = tf.constant([1,3.0])
with tf.GradientTape(persistent = True) as tape:
tape.watch(x)
y = x*x
z = y*y
print(tape.gradient(z,x).numpy())
print(tape.gradient(y,x).numpy())
[ 4. 108.]
[2. 6.]
如果不设置 persistent=True,计算y对x梯度时会报错。
多目标的梯度
单目标的梯度:
x = tf.Vari