在上面的两个示例中,我们都是手工计算获得损失函数关于各参数的偏导数。但当模型和损失函数都变得十分复杂时(尤其是深度学习模型),这种手动求导的工程量就难以接受了。TensorFlow提供了 自动求导机制 ,免去了手工计算导数的繁琐。利用TensorFlow的求导函数 tf.gradients(ys, xs)
求出损失函数loss关于a,b的偏导数。由此,我们可以将上节中的两行手工计算导数的代码
- # 反向传播,手动计算变量(模型参数)的梯度
- grad_a = tf.reduce_sum((y_pred - y_) * X_)
- grad_b = tf.reduce_sum(y_pred - y_)
替换为
甚至不仅于此,TensorFlow附带有多种 优化器 (optimizer),可以将求导和梯度更新一并完成。我们可以将上节的代码
- # 反向传播,手动计算变量(模型参数)的梯度
- grad_b = tf.reduce_sum(y_pred - y_)
- # 梯度下降法,手动更新参数
- new_a = a - learning_rate_ * grad_a
- update_a = tf.assign(a, new_a)
- update_b = tf.assign(b, new_b)
- train_op = [update_a, update_b]
整体替换为
以上三行代码等价于下面一行代码:
简化后的代码如下: