基本上,Tensorflow 是一个基于数据流和可微编程 的符号数学库。我们不必手动处理自动微分公式。所有这些数学运算都将在后台自动完成。您从官方文档中正确引用了有关梯度计算的内容。但是,如果您想知道如何使用 numpy 手动完成,我建议您查看 Neural Networks and Deep Learning 的精彩课程,尤其是第 4 周,或其他来源 here。
仅供参考,在TF 2 中,我们可以通过覆盖tf.keras.Model 类的train_step 从头开始进行自定义训练,并且我们可以使用tf.GradientTape API 进行自动区分;也就是说,计算一些输入的计算梯度。同一官方页面包含有关此的更多信息。此外,必须在tf.GradientTape 上看到这篇写得很好的文章。例如,使用此 API,我们可以轻松计算梯度,如下所示:
import tensorflow as tf
# some input
x = tf.Variable(3.0, trainable=True)
with tf.GradientTape() as tape:
# some output
y = x**3 + x**2 + x + 5
# compute gradient of y wrt x
print(tape.gradient(y, x).numpy())
# 34
此外,我们可以计算更高阶的导数,例如
x = tf.Variable(3.0, trainable=True)
with tf.GradientTape() as tape1:
with tf.GradientTape() as tape2:
y = x**3 + x**2 + x + 5
# first derivative
order_1 = tape2.gradient(y, x)
# second derivative
order_2 = tape1.gradient(order_1, x)
print(order_2.numpy())
# 20.0
现在,在tf. keras 中的自定义模型训练中,我们首先进行forward 传递并计算loss,然后计算gradients 模型的可训练变量相对于loss。稍后,我们根据这些gradients 更新模型的权重。下面是它的代码 sn-p,这里是端到端的详细信息。 Writing a training loop from scratch.
# Open a GradientTape to record the operations run
# during the forward pass, which enables auto-differentiation.
with tf.GradientTape() as tape:
# Run the forward pass of the layer.
# The operations that the layer applies
# to its inputs are going to be recorded
# on the GradientTape.
logits = model(x_batch_train, training=True) # Logits for this minibatch
# Compute the loss value for this minibatch.
loss_value = loss_fn(y_batch_train, logits)
# Use the gradient tape to automatically retrieve
# the gradients of the trainable variables with respect to the loss.
grads = tape.gradient(loss_value, model.trainable_weights)
# Run one step of gradient descent by updating
# the value of the variables to minimize the loss.
optimizer.apply_gradients(zip(grads, model.trainable_weights))