2. 数学基础回顾:导数与梯度、凸函数与凹函数、泰勒展开与近似

说实话,很多人一听到优化就头大,觉得全是数学公式。但我做了这么多年算法落地,发现真正核心的数学工具就那么几个。你只要把导数、梯度、凸性、泰勒展开这四样东西吃透了,后面看各种优化算法就跟看说明书一样简单。

咱们这一章,就是把这四样东西掰开揉碎了讲。我不喜欢堆公式,我更愿意告诉你:这东西到底有什么用?

2.1 导数与梯度:从单变量到多变量的自然延伸

先从一个简单问题开始:怎么找到函数的最小值?

单变量函数 f(x),我们求导 f'(x),令其等于 0,解出 x。这是高中就学过的。但到了多变量场景,比如 f(x₁, x₂, ..., xₙ),你没法再问“导数等于 0”了——因为方向太多了。

这时候就需要梯度。

核心理解:梯度 ∇f 是一个向量,它的每个分量是函数对每个变量的偏导数。梯度的方向,是函数值上升最快的方向;梯度的反方向,就是下降最快的方向。

我在项目中遇到过一个问题:训练一个推荐模型,损失函数一直降不下去。我检查了梯度,发现某个特征的梯度几乎为 0,但特征值本身很大。后来发现是特征没做归一化,导致梯度消失。嗯,从那以后我每次做优化前,都会先看一眼梯度的量级分布。

概念 单变量 多变量
变化率 导数 f'(x) 偏导数 ∂f/∂xᵢ
方向信息 正/负号 梯度向量 ∇f
下降方向 负导数方向 负梯度方向 -∇f
几何意义 切线斜率 切平面的法向量

你想想看,梯度下降法为什么叫“梯度下降”?说白了,就是每次沿着负梯度方向走一小步。这个思想贯穿了整个优化课程。

2.2 凸函数与凹函数:为什么我们喜欢凸优化?

做优化的人,最怕什么?局部最优。

你辛辛苦苦找到一个最小值,结果发现只是一个小坑,真正的全局最小值在远处。怎么办?

这时候凸函数就派上用场了。

我的经验:在实际项目中,我尽量把问题建模成凸优化问题。不是因为凸优化理论更漂亮,而是因为凸优化有全局最优的保证。非凸问题?那就要拼调参的运气了。

凸函数的定义其实很直观:函数图像上任意两点连成的线段,都在函数图像的上方。凹函数则相反。

数学上,对于凸函数 f,有:

f(θx + (1-θ)y) ≤ θf(x) + (1-θ)f(y),  ∀θ ∈ [0,1]

这个不等式看着抽象,但它的含义很深刻:凸函数的局部最小值就是全局最小值。

我曾经踩过一个坑:用梯度下降优化一个非凸的神经网络,结果跑了 10 个小时,损失函数停在了一个很高的值。我以为是学习率问题,调了半天没效果。后来可视化了一下损失曲面,才发现是个鞍点。嗯,凸函数就不会有这种问题。

性质 凸函数 凹函数
二阶导数 f''(x) ≥ 0 f''(x) ≤ 0
Hessian 矩阵 半正定 半负定
局部最优 即全局最优 即全局最优
常见例子 f(x)=x², 对数损失 f(x)=log(x), 熵函数

注意:不要以为所有函数都是凸的。神经网络、决策树、大部分深度学习模型都是非凸的。凸优化是理想情况,现实往往需要妥协。

2.3 泰勒展开与近似:用局部信息推测全局

泰勒展开,说白了就是用多项式去逼近一个复杂函数。

为什么我们需要它?因为很多函数太复杂了,我们没法直接求最小值。但我们可以在某个点附近用一个简单的二次函数去近似它,然后在这个近似函数上求最小值。

一阶泰勒展开:

f(x) ≈ f(x₀) + f'(x₀)(x - x₀)

二阶泰勒展开:

f(x) ≈ f(x₀) + f'(x₀)(x - x₀) + ½ f''(x₀)(x - x₀)²

多变量版本:

f(x) ≈ f(x₀) + ∇f(x₀)ᵀ(x - x₀) + ½ (x - x₀)ᵀ H(x₀)(x - x₀)

其中 H 是 Hessian 矩阵,也就是二阶偏导数的矩阵。

我个人习惯把泰勒展开看作优化算法的设计蓝图:

  • 梯度下降:只用一阶项,沿着负梯度方向走
  • 牛顿法:用二阶项,直接跳到二次近似的极值点
  • 拟牛顿法:用近似 Hessian 矩阵,平衡计算量和精度

我在项目中遇到过一个问题:用梯度下降优化一个病态条件的问题,收敛极慢。后来换成牛顿法,一步就到位了。但牛顿法也有代价——计算 Hessian 矩阵的逆,在大规模问题上根本算不动。所以实际中,我更喜欢用 L-BFGS 这种拟牛顿法。

关键洞察:泰勒展开的阶数越高,近似越精确,但计算代价也越大。优化算法的演进史,本质上就是在精度和效率之间做权衡。

2.4 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作后续学习的导航图。

数学基础回顾知识体系 数学基础回顾:知识体系 优化数学基础 导数与梯度 凸函数与凹函数 泰勒展开与近似 偏导数 梯度向量 全局最优 Hessian正定 一阶近似 二阶近似 应用:优化算法设计 梯度下降 → 一阶泰勒 | 牛顿法 → 二阶泰勒 | 凸优化 → 全局保证

2.5 本章小结

这一章我们覆盖了三个核心工具:

  • 导数与梯度:告诉你往哪个方向走,函数值变化最快
  • 凸函数与凹函数:告诉你这个优化问题有没有全局最优的保证
  • 泰勒展开:告诉你如何用局部信息去近似全局,设计优化算法

我个人觉得,这三样东西是优化领域的三根支柱。后面的章节,无论是梯度下降、牛顿法、还是各种变体,本质上都是在这些基础上做文章。

你想想看,如果你已经理解了梯度方向、凸性保证、泰勒近似这三个概念,那后面看各种优化算法,是不是就像看不同厨师用同样的食材做不同的菜?