直觉理解

训练模型就是不断调整参数,让损失变小。要知道「往哪个方向调、调多少」,就需要知道参数稍微变一点,损失会怎么变,这正是导数回答的问题。参数有成千上万个时,把每个参数的偏导数排成一个向量,就是梯度。对可微函数,在欧氏范数约束下,非零梯度给出局部一阶变化最快的上升方向,负梯度给出相应的下降方向;有限步长是否真的降低损失,还取决于学习率和函数曲率。

定义与公式

导数

函数 在 处的导数是它的瞬时变化率:

几何上就是曲线在这一点的切线斜率。几个常用结果:,,。

偏导数与梯度

多元函数 对某个变量求导、把其余变量看作常数,就是偏导数 。所有偏导数组成梯度:

梯度与参数的形状相同:一个 的权重矩阵,它的梯度也是 的矩阵。

链式法则

复合函数 的导数等于外层导数乘内层导数:

神经网络是许多层函数的嵌套,损失对任意一层参数的梯度,都可以沿着网络从后往前、逐层用链式法则乘出来,这就是反向传播。

常见的例子

  • 平方误差 对 的导数:。
  • Sigmoid 函数 的导数:。
  • Softmax 加交叉熵对 logits 的梯度非常简洁:,即预测概率减去真实的独热向量。

数值梯度

用很小的 近似导数:。它太慢,不能用来训练,但可以用来检查手写的梯度是否正确(梯度检验)。

代码示例

import torch
 
w = torch.tensor(3.0, requires_grad=True)
x, y = torch.tensor(2.0), torch.tensor(1.0)
L = (w * x - y).pow(2)
L.backward()                     # 自动用链式法则求梯度
print(w.grad)                    # tensor(20.) = 2 * (3*2 - 1) * 2
 
# 用数值梯度检验
f = lambda w: (w * 2.0 - 1.0) * (w * 2.0 - 1.0)
h = 1e-4
print((f(3.0 + h) - f(3.0 - h)) / (2 * h))   # ≈ 20.0

在 AI 中的作用

相关

  • 线性代数:梯度是向量或矩阵,对矩阵运算求导需要用到矩阵形状规则。
  • 损失函数:求梯度的对象。