直觉理解
训练模型就是不断调整参数,让损失变小。要知道「往哪个方向调、调多少」,就需要知道参数稍微变一点,损失会怎么变,这正是导数回答的问题。参数有成千上万个时,把每个参数的偏导数排成一个向量,就是梯度。对可微函数,在欧氏范数约束下,非零梯度给出局部一阶变化最快的上升方向,负梯度给出相应的下降方向;有限步长是否真的降低损失,还取决于学习率和函数曲率。
定义与公式
导数
函数 在 处的导数是它的瞬时变化率:
几何上就是曲线在这一点的切线斜率。几个常用结果:,,。
偏导数与梯度
多元函数 对某个变量求导、把其余变量看作常数,就是偏导数 。所有偏导数组成梯度:
梯度与参数的形状相同:一个 的权重矩阵,它的梯度也是 的矩阵。
链式法则
复合函数 的导数等于外层导数乘内层导数:
神经网络是许多层函数的嵌套,损失对任意一层参数的梯度,都可以沿着网络从后往前、逐层用链式法则乘出来,这就是反向传播。
常见的例子
- 平方误差 对 的导数:。
- 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 中的作用
- 反向传播就是链式法则的系统化应用,见神经网络与反向传播。
- 梯度决定参数的更新方向,见梯度下降。
- 激活函数的导数形状决定了梯度能否顺利传回前面的层(梯度消失问题),见激活函数。
- 深度学习框架自动完成求导,见PyTorch张量与自动求导。