38 分钟
AI 数学精要

导数、偏导与梯度:优化世界的指南针

从单变量变化率讲到多元梯度,亲手算偏导和方向导数,搞懂负梯度为什么是下山方向

  • 会用极限定义求简单导数,能讲明白导数的几何含义和物理含义
  • 能对多元函数求偏导并写出梯度向量
  • 能手算方向导数,能讲明白梯度为什么指向函数上升最快的方向
  • Hessian 矩阵用来描述曲率,是判断极值和鞍点的基础。

训练神经网络的本质,是在一张高维「损失曲面」上找最低点,而梯度就是指南针

模型参数规模从百万到千亿不等,损失函数的作用,是把这一整串参数映射成一个标量损失。训练的核心动作,就是不断微调参数让损失往下降——但参数空间维度太高,根本没法穷举所有可能,你只能盯着「当前位置往哪个方向走损失降得最快」来决定下一步怎么走。微积分刚好能解决这个问题:单变量场景用导数,多变量场景用偏导,把所有偏导拼到一起就是梯度。这一节的逻辑链顺下来是:导数刻画单个量的变化率 → 多元函数每次只变动一个变量,得到的就是偏导 → 所有偏导组成梯度向量 → 梯度方向是局部上升最快的方向,它的反方向,就是梯度下降的核心依据。

先建立「局部线性」的直觉。任何光滑曲线,只要你凑得足够近,一小段都近似一条直线,导数就是这条切线的斜率:斜率为正说明函数在该处随自变量增大而上升,为负说明下降,为零说明暂时走平。神经网络的所有优化,都是在「当前点用一个线性近似代替复杂曲面」,然后沿近似给出的方向迈一小步,走一步重新算一次——这就是为什么训练是迭代的,而不是一次解出来的。

1.1 导数:一个变量的瞬时变化率

函数 f 在 x 处的导数,是自变量做极小改变 Δx 时,函数改变量和 Δx 的比值在 Δx→0 时的极限:f′(x) = lim(Δx→0) [f(x+Δx)−f(x)] / Δx。它有两副面孔:几何上是切线斜率,物理上是瞬时变化率——位移对时间求导是速度,再求一次是加速度。

用定义手算 f(x)=x² 在 x=3 处的导数:f(3)=9,f(3+Δx)=(3+Δx)²=9+6Δx+Δx²,差商=[(9+6Δx+Δx²)−9]/Δx=(6Δx+Δx²)/Δx=6+Δx,令 Δx→0 得 f′(3)=6。常用幂函数法则 (xⁿ)′=n·xⁿ⁻¹ 直接给 (x²)′=2x,代入 3 也是 6,两条路一致。

示例代码(可运行)
预测输出
f(x)=x²,用 h=0.01 的前向差分 (f(3.01)-f(3))/0.01 近似 f′(3),结果约等于多少(保留两位小数)?
ℹ️可导、连续与数值差分的两种取法

可导必连续,连续不一定可导。比如 |x| 在 0 点有个尖点,左右斜率不一致,就不可导。工程上不算符号导数,用数值差分:前向差分是 [f(x+h)−f(x)]/h,中心差分是 [f(x+h)−f(x−h)]/(2h),精度更高。h 太大有截断误差,太小有浮点舍入误差,常取 1e−5~1e−7。梯度检查(gradient check)就是用这个来核对反向传播的。

把常用求导法则备齐,后面反复用:常数 (c)′=0;和差 (u±v)′=u′±v′;乘法 (uv)′=u′v+uv′;除法 (u/v)′=(u′v−uv′)/v²;复合 (f(g))′=f′(g)·g′。基本初等函数:(xⁿ)′=n·xⁿ⁻¹,(eˣ)′=eˣ,(ln x)′=1/x,(sin x)′=cos x、(cos x)′=−sin x。神经网络里出现的运算几乎都由这些拼出,autograd 内置了它们的局部导数,你要做的是看懂组合方式而不是对整张网络死算。

1.2 偏导:多元函数每次只拧一个旋钮

函数有多个自变量的时候,比如 f(x,y)=x²y,说「变化率」得先讲清是对谁求的。偏导数 ∂f/∂x 的算法:把 y 当成常数,只对 x 求导;∂f/∂y 反过来,把 x 当常数只对 y 求导。符号 ∂ 读作「partial」,意思就是只变这一个变量,剩下的全按住不动。拿 f(x,y)=x²y 手算一遍:∂f/∂x = 2xy(y 当系数)∂f/∂y = x²(x² 当常数,是 y 的系数)代入点 (2,3) 算:∂f/∂x=2×2×3=12,∂f/∂y=2²=4。意思很直接:在这个点上,沿 x 方向每走 1 单位,函数值大概涨 12;沿 y 方向每走 1 单位,大概涨 4。

填空题填写空白处的代码
f(x,y) = x²·y # 对 x 求偏导(把 y 当常数):df/dx = # 填 2*x*y # 对 y 求偏导(把 x² 当常数):df/dy = # 填 x**2 # 在 (2,3) 处梯度 = [, 4] # 填 12
选择题

求 ∂f/∂x 时,对其他自变量(如 y)的正确处理是?

把偏导组装起来,就是多元函数的一阶线性近似(全微分):从 x 移动一小步 d,函数变化 Δf≈∇f·d=Σᵢ(∂f/∂xᵢ)·dxᵢ。梯度下降每步干的就是这个——用当前点的线性近似估计「沿 d 走损失会变多少」,再选 d=−η∇f。它只在步长足够小时准确。步长太大,被忽略的高阶项会让真实变化偏离估计,这从另一角度解释了学习率为何不能过大。梯度就是损失曲面在当前点的最佳线性近似,优化的每一步本质都是在用这个近似做一次受控的局部决策。

1.3 梯度:把所有偏导拼成一个向量

梯度把每个自变量方向的偏导按顺序拼成向量,记作 ∇f=[∂f/∂x, ∂f/∂y]。上例在 (2,3) 的梯度就是 [12,4]。它是一个与自变量同形状的向量——这一点在神经网络里极其重要:参数张量是什么形状,它的梯度就是什么形状,每个参数都对应一个「我增大一点点,损失会变多少」的数。

梯度同时编码了方向和大小。方向由各分量的相对比例决定(往哪个旋钮使劲更划算),大小 ‖∇f‖ 衡量当前位置曲面有多陡。沿梯度方向走,函数局部上升最快;反过来,沿负梯度 −∇f 走,函数局部下降最快,梯度下降算法因此得名。注意「最快」只在当前点的无穷小邻域成立,是彻头彻尾的局部结论,不保证通向全局最低点。

推导

为什么梯度方向恰好上升最快(点积推导)

沿任意单位方向 u 移动,函数的瞬时变化率叫方向导数,它等于梯度与该方向的点积:Dᵤf = ∇f·u = ‖∇f‖·‖u‖·cosθ = ‖∇f‖·cosθ(u 为单位向量)。要让变化率最大,就要让 cosθ 最大,cosθ 的最大值是 1,当且仅当 θ=0,也就是 u 与 ∇f 同向。结论沿梯度本方向,方向导数取到最大值 ‖∇f‖,所以梯度是最速上升方向,负梯度是最速下降方向。

手算验证:梯度 [12,4]。沿 x 轴单位方向 [1,0] 的方向导数=12×1+4×0=12;沿对角单位方向 [1/√2,1/√2]≈[0.707,0.707] 的方向导数=(12+4)×0.707≈11.31;沿梯度自身的单位方向 [12,4]/√160,方向导数=‖∇f‖=√(12²+4²)=√160≈12.65,确实是三者里最大的。

示例代码(可运行)

1.4 梯度与等高线垂直,负梯度指向「最陡下坡」

把二元函数想象成地形图,等高线连的是高度一样的点。沿着等高线走,高度不会变(方向导数为 0)。梯度方向和等高线处处垂直,指的是海拔升得最快的坡顶方向;负梯度就是垂直指向坡下。水流总顺着最陡的方向往下冲,跟梯度下降沿负梯度走是同一个几何逻辑。

单变量函数的导数,就是一个数,代表该点的切线斜率。它是标量,没方向可选,只有正负和大小的区别。

配对题把概念对到它在训练中的角色

用二维二次型把几何坐实:f(x,y)=a·x²+b·y² 的梯度是 [2ax,2by]。若 a≠b,等高线是一圈圈椭圆:沿系数大的轴梯度大、坡陡,沿系数小的轴梯度小、坡缓。朴素梯度下降并不直奔椭圆中心,而是在陡轴方向反复修正、沿缓轴缓慢推进,画出之字形轨迹——这就是病态条件,也是 l4 动量与自适应步长要解决的典型地形。可见梯度方向由各轴偏导比例决定,而曲面各方向曲率是否均衡,决定了优化本身难不难。

1.5 二阶视角:Hessian 与曲率,为判断极值埋伏笔

梯度只告诉你往哪走,不告诉你坡是越来越陡还是越来越缓,后者由二阶导数刻画。单变量 f″ 表示斜率本身的变化率(曲率):f″>0 曲线开口向上(碗形,有最小值),f″<0 开口向下(拱形,有最大值)。多元函数把所有二阶偏导排成矩阵就是 Hessian,记作 H,元素 Hᵢⱼ=∂²f/∂xᵢ∂xⱼ。

拿 f=x²y 来说,∂²f/∂x²=2y、混合偏导 ∂²f/∂x∂y=2x、∂²f/∂y²=0,所以 Hessian=[[2y,2x],[2x,0]],代入 (2,3) 就是 [[6,4],[4,0]]。l3 你记一下:临界点处梯度为 0,但到底是极小、极大还是鞍点,得看 Hessian 特征值的正负——一阶信息管「找到平的地方」,二阶信息管「辨认这是什么地方」。

泰勒公式把这三者串成一条线:f(x+d)≈f(x)+∇f·d+½·dᵀHd+更高阶。第一项是当前高度,一阶项 ∇f·d 是沿 d 的线性变化(梯度管方向),二阶项 ½dᵀHd 描述曲率(Hessian 管这一步是上坡还是下坡、弯得多急)。梯度下降只用一阶项,相当于把曲面局部当斜面;牛顿法进一步用 Hessian 修正方向和步长。理解这个展开,就理解了为什么一阶方法简单却在病态曲面上慢、二阶方法快却算不起 Hessian。

找 Bug正梯度是上升方向,做最小化必须用减号(负梯度);偏导每次只对一个变量算,不能把不同变量的偏导加在一起。
# 想沿负梯度最小化 f,有人把更新方向写反、还把偏导当全导 x, y = 2, 3 df_dx, df_dy = 12, 4 # 错误:沿「正梯度」更新,以为这样在下降 x = x + 0.1 * df_dx y = y + 0.1 * df_dy # 又对 f=x²y 声称 df/dx=2xy+ x²(把对 y 的偏导也加了进来)
🐍一线真相:梯度是「局部、昂贵、会骗人」的

梯度只反映当前点邻域,跨山谷要靠一步步迭代,不存在一步到位;大模型算一次梯度要反向传播整张计算图,成本约为两次前向,这是训练比推理贵的根源;梯度大小不代表离最优先近——平缓高原上梯度很小却可能离最优很远,陡峭崖壁梯度很大却可能一步之遥。判断进度要看损失趋势而非梯度范数。

⚠️两个高频误区

误区一:以为梯度指向全局最低点。它只指向当前最陡方向,遇到鞍点、峡谷、弯道会「之字形」震荡甚至原地打转。误区二:以为梯度为零就训练完成。∇f=0 只是驻点,可能是极小、极大或鞍点,必须结合二阶信息与损失值判断,l3 展开。

💡调试先核对梯度形状与有限差分

反向传播报错时,先断言 param.shape === grad.shape。再拿几个标量参数,用中心差分公式 (f(θ+ε)−f(θ−ε))/(2ε) 和解析梯度做对比,相对误差得在 1e−5 量级。这一步能定位 90% 的求导链错误。

选择题

关于梯度,下列说法正确的是?

本节小结

一条因果链:导数是单变量瞬时变化率(切线斜率)→ 多元函数固定其余、只对一个变量求偏导 → 偏导拼成与参数同形的梯度 ∇f → 方向导数=梯度·方向,点积证明梯度方向上升最快、负梯度下降最快、且与等高线垂直 → Hessian 用二阶偏导描述曲率,负责在临界点辨认极值类型。训练就是反复「算当前梯度、沿负梯度迈一小步」的局部迭代。

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

一条样本是一个特征向量,一批样本堆成矩阵,神经网络一层的变换本质就是矩阵乘法加激活。换基/特征值分解相当于找数据的主要方向(PCA 降维),GPU 之所以适合深度学习,正是因为它能大规模并行做矩阵运算。把「向量=对象、矩阵=变换」建立起直觉,后面公式就不再抽象。