在上面的两个示例中,我们都是手工计算获得损失函数关于各参数的偏导数。但当模型和损失函数都变得十分复杂时(尤其是深度学习模型),这种手动求导的工程量就难以接受了。TensorFlow提供了 自动求导机制 ,免去了手工计算导数的繁琐。利用TensorFlow的求导函数 tf.gradients(ys, xs) 求出损失函数loss关于a,b的偏导数。由此,我们可以将上节中的两行手工计算导数的代码

    1. # 反向传播,手动计算变量(模型参数)的梯度
    2. grad_a = tf.reduce_sum((y_pred - y_) * X_)
    3. grad_b = tf.reduce_sum(y_pred - y_)

    替换为

    甚至不仅于此,TensorFlow附带有多种 优化器 (optimizer),可以将求导和梯度更新一并完成。我们可以将上节的代码

    1. # 反向传播,手动计算变量(模型参数)的梯度
    2. grad_b = tf.reduce_sum(y_pred - y_)
    3.  
    4. # 梯度下降法,手动更新参数
    5. new_a = a - learning_rate_ * grad_a
    6. update_a = tf.assign(a, new_a)
    7. update_b = tf.assign(b, new_b)
    8.  
    9. train_op = [update_a, update_b]

    整体替换为

    以上三行代码等价于下面一行代码:

      简化后的代码如下: