机器学习中的优化:从梯度下降到提升法、神经网络与 MAP

目录
先看一个答案几乎一眼就能看出的优化问题:在所有二维实数向量中,求一个参数向量 \(\mathbf{w}\),使目标函数 \(f(\mathbf{w})\) 取得最小值。
\[ \underset{\mathbf{w}\in\mathbb{R}^2}{\operatorname{minimize}} \quad f(\mathbf{w})=\frac{1}{2}w_1^2+10w_2^2,\qquad \mathbf{w}=\begin{bmatrix}w_1\\w_2\end{bmatrix}。 \]| 变量或记号 | 含义 |
|---|---|
| \(\operatorname{minimize}\) | 表示需要寻找使右侧目标函数尽可能小的参数 |
| \(\mathbb{R}^2\) | 由两个实数组成的二维参数空间,也是本例中 \(\mathbf{w}\) 的取值范围 |
| \(\mathbf{w}\) | 需要调整的二维参数向量 |
| \(w_1,w_2\) | 参数向量在横轴和纵轴方向上的两个分量 |
| \(f(\mathbf{w})\) | 参数取 \(\mathbf{w}\) 时的目标函数值;优化的任务是让它尽可能小 |
| \(1/2,10\) | 两个平方项的系数;第二个方向的曲率明显更大,因此等高线呈狭长的椭圆形 |
两个平方项都不会小于零,所以当 \(w_1=0\)、\(w_2=0\) 时,函数取得全局最小值 \(0\)。最低点在哪里并不难判断,真正的问题是:如果参数从 \((-8,4)\) 出发,算法要怎样走过去,又需要走多少步?
\[ \mathbf{w}_0=\begin{bmatrix}-8\\4\end{bmatrix},\qquad f(\mathbf{w}_0)=192。 \]| 变量或记号 | 含义 |
|---|---|
| \(\mathbf{w}_0\) | 优化开始时的参数位置;下标 \(0\) 表示尚未执行第一次更新 |
| \(f(\mathbf{w}_0)\) | 初始位置对应的目标函数值,本例为 \(192\) |
下面的互动图让梯度下降、牛顿法和 BFGS 从这个起点同时出发。切换算法并拖动迭代进度,可以直接比较它们的搜索方向、收敛速度和每一步的目标函数值。
最低点相同,并不意味着求解效率相同。梯度下降只使用一阶梯度;牛顿法利用二阶曲率;BFGS 不直接计算海森矩阵,而是根据相邻步骤的位置和梯度变化来近似曲率。它们掌握的信息不同,因此走出的路径也不同。
机器学习训练面对的正是这类问题,只是目标函数通常更复杂,待学习的参数可能只有几个,也可能多达数百万甚至更多。在代码中,数据科学家和工程师通常只需调用一次 model.fit(X, y),但 fit 只是一个统一接口:模型定义如何根据输入生成预测,目标函数定义什么结果算好,优化算法则负责寻找能让目标函数下降的参数。
数据科学家和工程师不必为每个模型从头实现优化器,但也不应把理解停留在调用 fit。当训练过程收敛缓慢、数值不稳定、结果过拟合,或者某个超参数的作用方向令人困惑时,分清模型、目标函数、正则化和优化算法,往往能帮助我们更快判断问题出在哪里。
下文会先回到这个可以手动计算的二维二次型,解释梯度下降、牛顿法和 BFGS 为什么产生不同轨迹;随后再沿着同一条主线,讨论最小二乘、Ridge、Lasso、Elastic Net、XGBoost、LightGBM、神经网络和 Prophet 各自在优化什么,以及它们怎样寻找答案。全文的大部分问题都可以借助下面这个结构理解:
\[ \min_{\theta} \underbrace{\mathcal{L}(\theta;X,y)}_{\text{拟合数据}} +\lambda\underbrace{\Omega(\theta)}_{\text{约束模型}}。 \]| 变量或记号 | 含义 |
|---|---|
| \(\min_\theta\) | 在所有允许的 \(\theta\) 中,寻找能使后面表达式取得最小值的参数 |
| \(X\) | 全部输入特征;第三章会进一步说明它的矩阵维度 |
| \(y\) | 全部真实观测或标签 |
| \(\mathcal{L}(\theta;X,y)\) | 给定数据和参数后的拟合损失 |
| \(\Omega(\theta)\) | 对参数或模型复杂度的惩罚 |
| \(\lambda\) | 数据拟合与模型约束之间的权衡强度 |
并非所有模型都能严格表示为这种形式,但我们可以借助它来理解本文讨论的大多数模型。
阅读前:本文的符号约定 #
不同教材、论文和软件库常使用不同符号表示同一概念。例如,学习率可能写作 \(\alpha\)、\(\eta\) 或 learning_rate;正则化强度可能写作 \(\lambda\),但在某些 API 中却被称为 alpha。为避免读者在不同记号间频繁切换,本文遵循以下三条规则:
- 同一个概念在全文只使用一个主符号;
- 一个主符号不在不同章节承担两个含义;
- 第一次引入公式时说明变量、维度和作用,遇到常见异名时再给出映射。
全文采用以下基本约定:
| 本文记号 | 固定含义 | 形式或维度 | 其他资料中的常见写法 |
|---|---|---|---|
| \(i\) | 样本索引 | \(i=1,\ldots,n\) | row index、observation index |
| \(j\) | 特征、叶节点或变点的局部索引 | 含义由所在章节明确说明 | feature/leaf/changepoint index |
| \(k\) | 数值优化的迭代编号 | \(k=0,1,2,\ldots\) | iteration、step |
| \(t\) | Boosting 轮次、神经网络更新步数或时间点 | 含义由所在章节明确说明 | round、step、time |
| \(\theta\) | 模型全部待学习参数 | 标量、向量或参数集合 | \(w\)、\(\beta\)、parameters |
| \(\mathcal{L}\) | 只包含数据拟合误差的损失 | 标量 | loss、data loss、empirical risk |
| \(\mathcal{J}\) | 优化器实际最小化的完整目标 | 标量 | objective、cost、risk |
| \(\Omega\) | 正则项或复杂度惩罚 | 标量函数 | penalty、regularizer |
| \(\eta\) | 学习率或预先设定的更新步长 | 正标量 | \(\alpha\)、step size、learning_rate |
| \(\lambda\) | 正则化强度 | 非负标量 | alpha、penalty weight |
本文用粗体小写字母表示向量(如 \(\mathbf{x}\)),用大写字母表示矩阵(如 \(X\)),而普通斜体小写字母通常表示标量。上标 \(\mathsf{T}\) 表示转置,\(\lVert\cdot\rVert_1\) 和 \(\lVert\cdot\rVert_2\) 分别表示 L1 范数和 L2 范数,符号上方的帽子表示估计值或预测值。后续的变量表仅解释各章新引入或含义变化的符号,不再重复此全局约定表。
1. 优化问题由什么组成? #
预测模型 \(f_\theta(\mathbf{x})\) 根据输入计算预测值。单个样本的损失函数 \(\ell(y_i,f_\theta(\mathbf{x}_i))\) 衡量此次预测的误差。训练集的经验风险通常是所有样本损失的平均值:
\[ \mathcal{L}(\theta)=\frac{1}{n}\sum_{i=1}^{n}\ell\left(y_i,f_\theta(\mathbf{x}_i)\right)。 \]| 变量或记号 | 含义 |
|---|---|
| \(n\) | 训练样本总数 |
| \(i\) | 当前样本索引,从 \(1\) 到 \(n\) |
| \(\mathbf{x}_i\) | 第 \(i\) 条样本的输入特征向量 |
| \(y_i\) | 第 \(i\) 条样本的目标值或标签 |
| \(f_\theta(\mathbf{x}_i)\) | 参数为 \(\theta\) 时,模型对 \(\mathbf{x}_i\) 的预测 |
| \(\ell(y_i,f_\theta(\mathbf{x}_i))\) | 第 \(i\) 条样本的损失 |
| \(\sum\) | 将全部样本的损失相加 |
| \(1/n\) | 把损失总和换算为每条样本的平均损失 |
完整的优化目标函数还可能包含正则项:
\[ \mathcal{J}(\theta)=\mathcal{L}(\theta)+\lambda\Omega(\theta)。 \]在这里,\(\mathcal{J}\) 代表优化器处理的完整目标函数,而 \(\mathcal{L}\) 仅指数据损失。尽管一些文献会将两者都表示为 \(L\) 或 loss,本文为避免忽略正则项,将两者明确区分。
优化算法利用目标函数提供的信息更新参数。例如,梯度下降只使用一阶导数,牛顿法还会利用二阶曲率,BFGS 则根据相邻两次迭代之间的梯度变化来近似曲率。
这些概念不能互换。最小二乘定义了优化目标;正规方程、QR 分解和梯度下降是求解该目标的不同方法。反向传播负责计算神经网络的梯度,而 SGD、动量法(Momentum)和 Adam 则根据梯度更新参数。
1.1 从一维抛物线理解梯度 #
考虑最简单的函数:
\[ f(w)=\frac{1}{2}w^2。 \]其导数为 \(f'(w)=w\)。当 \(w>0\) 时,向左移动可降低函数值;当 \(w<0\) 时,向右移动可降低函数值。因此,梯度下降法总是沿梯度的反方向进行更新:
\[ w_{k+1}=w_k-\eta f'(w_k)。 \]| 变量 | 含义 |
|---|---|
| \(w_k\) | 第 \(k\) 次迭代时的标量参数位置 |
| \(f(w)\) | 需要最小化的一维目标函数 |
| \(f'(w_k)\) | 目标函数在 \(w_k\) 处的导数,即局部斜率 |
| \(\eta\) | 学习率,控制一次更新的幅度 |
| \(w_{k+1}\) | 更新一次以后得到的新位置 |
此处 \(\eta>0\)。学习率过小,算法前进缓慢;学习率过大,参数可能反复越过最低点,甚至发散。一维函数隐藏了现实问题中最麻烦的部分:不同方向的曲率可能相差很大。
2. 二维二次型:不同算法怎样走向同一个最低点? #
文章开头的互动图使用的正是这个二维二次型。下面从目标函数、初始点和曲率开始,逐步解释三条轨迹为什么不同。
考虑目标函数:
\[ f(\mathbf{w})=\frac{1}{2}w_1^2+10w_2^2,\qquad \mathbf{w}=\begin{bmatrix}w_1\\w_2\end{bmatrix}。 \]| 变量 | 含义 | 本例取值或维度 |
|---|---|---|
| \(\mathbf{w}\) | 需要优化的参数向量 | 二维列向量 |
| \(w_1,w_2\) | 参数向量在两个坐标方向上的分量 | 标量 |
| \(f(\mathbf{w})\) | 参数取 \(\mathbf{w}\) 时的目标函数值 | 标量,越小越好 |
| \(1/2,10\) | 两个平方项的系数;对应方向的二阶导数分别为 \(1\) 和 \(20\) | 作者设定的教学示例,不是经验数据 |
它的极小值位于 \((0,0)\)。从同一个初始点出发:
\[ \mathbf{w}_0=\begin{bmatrix}-8\\4\end{bmatrix},\qquad f(\mathbf{w}_0)=192。 \]2.1 梯度、海森矩阵与条件数 #
梯度和海森矩阵(Hessian)分别为:
\[ \mathbf{g}(\mathbf{w})=\nabla f(\mathbf{w}) =\begin{bmatrix}w_1\\20w_2\end{bmatrix}, \]\[ \mathbf{H}=\nabla^2 f(\mathbf{w}) =\begin{bmatrix}1&0\\0&20\end{bmatrix}。 \]| 变量 | 含义 | 本例取值或维度 |
|---|---|---|
| \(\mathbf{g}(\mathbf{w})\) | 目标函数对各参数的一阶偏导组成的梯度 | 二维列向量 |
| \(\nabla\) | 对参数求一阶偏导的算子 | 不适用 |
| \(\mathbf{H}\) | 梯度对参数的导数,即海森矩阵(Hessian) | \(2\times2\) 矩阵 |
| \(\nu_{\min},\nu_{\max}\) | 海森矩阵的最小和最大特征值 | 本例为 \(1\) 和 \(20\) |
| \(\kappa(\mathbf{H})\) | 海森矩阵的条件数,本文定义为 \(\nu_{\max}/\nu_{\min}\) | 本例为 \(20\) |
两个特征值分别是 \(\nu_{\min}=1\) 和 \(\nu_{\max}=20\),所以条件数 \(\kappa(\mathbf{H})=20\)。本文用 \(\nu\) 表示特征值,避免它与表示正则化强度的 \(\lambda\) 冲突。由于 \(w_2\) 方向的曲率是 \(w_1\) 方向的 20 倍,等高线呈狭长的椭圆形。
2.2 学习率为什么存在上限? #
这个上限并不是一条需要背诵的经验规则。沿着海森矩阵的任意一个特征方向,梯度下降都会变成一个等比数列;学习率上限正是由等比数列的收敛条件推导出来的。
先只看本例的 \(w_2\) 方向。暂时固定其他方向后,目标函数可简化为一维函数:
\[ f_2(w_2)=10w_2^2。 \]它的一阶导数为:
\[ g_2(w_2)=\frac{\mathrm{d}f_2}{\mathrm{d}w_2}=20w_2。 \]| 变量或记号 | 含义 |
|---|---|
| \(f_2(w_2)\) | 只观察 \(w_2\) 方向时的一维目标函数 |
| \(g_2(w_2)\) | \(f_2\) 对 \(w_2\) 的一阶导数 |
| \(20\) | \(w_2\) 方向的二阶导数,也就是这个方向的曲率 |
把梯度代入更新公式:
\[ \begin{aligned} w_{2,k+1} &=w_{2,k}-\eta g_2(w_{2,k})\\ &=w_{2,k}-20\eta w_{2,k}\\ &=(1-20\eta)w_{2,k}。 \end{aligned} \]从初始值 \(w_{2,0}\) 开始连续更新 \(k\) 次,可以得到:
\[ w_{2,k}=(1-20\eta)^k w_{2,0}。 \]| 变量或记号 | 含义 |
|---|---|
| \(w_{2,k}\) | 第 \(k\) 次迭代时,参数在 \(w_2\) 方向上的分量 |
| \(w_{2,0}\) | \(w_2\) 方向的初始值,本例为 \(4\) |
| \(q=1-20\eta\) | 这个等比数列的公比,也是每次更新的缩放因子 |
| \(q^k\) | 连续更新 \(k\) 次以后,初始值被累计缩放的倍数 |
要让 \(w_{2,k}\) 在 \(k\to\infty\) 时收敛到零,公比必须满足:
\[ \lvert 1-20\eta\rvert<1。 \]解这个不等式:
\[ -1<1-20\eta<1 \quad\Longleftrightarrow\quad 0<\eta<\frac{2}{20}=0.1。 \]左端的 \(\eta>0\) 保证算法沿着负梯度方向前进;右端的 \(\eta<0.1\) 则保证每次更新都会缩小 \(w_2\) 的绝对值。等号不能保留,因为 \(\eta=0.1\) 时公比为 \(-1\),参数只会在原点两侧等幅跳动,并不会趋近于零。
设 \(w_{2,0}=4\),不同学习率会产生四种具有代表性的轨迹:
| 学习率 \(\eta\) | 公比 \(q=1-20\eta\) | \(w_2\) 的迭代轨迹 | 结果 |
|---|---|---|---|
| \(0.05\) | \(0\) | \(4\to0\) | 一步到达该方向的极小值 |
| \(0.08\) | \(-0.6\) | \(4\to-2.4\to1.44\to-0.864\to\cdots\) | 跨越原点振荡,但振幅逐步缩小 |
| \(0.10\) | \(-1\) | \(4\to-4\to4\to-4\to\cdots\) | 等幅振荡,不收敛 |
| \(0.12\) | \(-1.4\) | \(4\to-5.6\to7.84\to-10.976\to\cdots\) | 只要初始分量不为零,振幅就会不断增大 |
这个推导可以直接推广到多维二次型:
\[ f(\mathbf{w}) =\frac{1}{2}\mathbf{w}^{\mathsf{T}}\mathbf{H}\mathbf{w}, \qquad \nabla f(\mathbf{w})=\mathbf{H}\mathbf{w}。 \]梯度下降的更新公式因此变为:
\[ \mathbf{w}_{k+1} =(\mathbf{I}-\eta\mathbf{H})\mathbf{w}_k。 \]如果海森矩阵的第 \(i\) 个特征值为 \(\nu_i\),那么更新矩阵 \(\mathbf{I}-\eta\mathbf{H}\) 在对应特征方向上的缩放因子就是:
\[ q_i=1-\eta\nu_i。 \]要让任意初始向量都收敛到零,每个特征方向都必须满足 \(\lvert q_i\rvert<1\)。用矩阵语言表达,即更新矩阵的谱半径必须严格小于 \(1\):
\[ \operatorname{spr}(\mathbf{I}-\eta\mathbf{H}) =\max_i\lvert1-\eta\nu_i\rvert<1。 \]| 变量或记号 | 含义 |
|---|---|
| \(\nu_i\) | 海森矩阵在第 \(i\) 个特征方向上的特征值,也代表该方向的曲率 |
| \(q_i\) | 梯度下降在第 \(i\) 个特征方向上的单步缩放因子 |
| \(\operatorname{spr}(\cdot)\) | 矩阵的谱半径,即所有特征值绝对值中的最大值;其他资料通常写成 \(\rho(\cdot)\) |
| \(\nu_{\max}\) | 所有方向中最大的曲率 |
对于正定海森矩阵,上述条件等价于:
\[ 0<\eta<\frac{2}{\nu_{\max}}。 \]在本例中,\(w_1\) 方向只要求 \(\eta<2/1=2\),\(w_2\) 方向却要求 \(\eta<2/20=0.1\)。全局学习率必须同时满足两个方向的条件,所以最终上限由曲率最大的 \(w_2\) 方向决定。换句话说,所有方向共用一个学习率时,整个系统必须迁就最陡峭的方向。
这也解释了牛顿法和拟牛顿法为什么能够缓解尺度不一致的问题。牛顿法用 \(\mathbf{H}^{-1}\) 重新缩放梯度:在本例中,\(w_1\) 方向乘以 \(1\),\(w_2\) 方向乘以 \(1/20=0.05\)。算法不再用同一个尺度处理两个曲率相差 20 倍的方向,而是分别校正它们。
其他教材常用 \(\alpha\) 表示学习率,用 \(\lambda_i\) 表示海森矩阵的特征值。本文统一写成 \(\eta\) 和 \(\nu_i\),但推导和结论完全相同。
2.3 梯度下降:一个学习率照顾所有方向 #
更新式为:
\[ \mathbf{w}_{k+1}=\mathbf{w}_k-\eta\mathbf{g}_k。 \]| 变量 | 含义 |
|---|---|
| \(\mathbf{w}_k\) | 第 \(k\) 次迭代时的参数向量 |
| \(\mathbf{g}_k=\nabla f(\mathbf{w}_k)\) | 目标函数在当前位置的梯度 |
| \(\eta\) | 本节固定学习率;其他资料常写成 \(\alpha\) |
上一节已经推导出收敛条件 \(0<\eta<2/\nu_{\max}=0.1\)。现在令 \(\eta=0.08\),从初始梯度 \(\mathbf{g}_0=[-8,80]^\mathsf{T}\) 开始计算。第一次更新得到:
\[ \mathbf{w}_1 =\begin{bmatrix}-8\\4\end{bmatrix} -0.08\begin{bmatrix}-8\\80\end{bmatrix} =\begin{bmatrix}-7.36\\-2.40\end{bmatrix}, \]\[ f(\mathbf{w}_1)=84.6848。 \]继续两次更新:
\[ \mathbf{w}_2=\begin{bmatrix}-6.7712\\1.4400\end{bmatrix}, \qquad f(\mathbf{w}_2)\approx43.6606, \]\[ \mathbf{w}_3\approx\begin{bmatrix}-6.2295\\-0.8640\end{bmatrix}。 \]\(w_2\) 按照 \(4\to-2.4\to1.44\to-0.864\) 跨越谷底,单步缩放因子为 \(1-0.08\times20=-0.6\);\(w_1\) 每次只乘以 \(1-0.08\times1=0.92\)。同一个学习率使得陡峭方向振荡,而平缓方向收敛缓慢。
2.4 牛顿法:用曲率重新缩放梯度 #
牛顿法采用以下公式:
\[ \mathbf{w}_{k+1}=\mathbf{w}_k-\mathbf{H}_k^{-1}\mathbf{g}_k。 \]当前逆海森矩阵为:
\[ \mathbf{H}^{-1}=\begin{bmatrix}1&0\\0&0.05\end{bmatrix}。 \]所以:
\[ \Delta\mathbf{w}_0 =-\mathbf{H}^{-1}\mathbf{g}_0 =\begin{bmatrix}8\\-4\end{bmatrix}, \qquad \mathbf{w}_1=\mathbf{w}_0+\Delta\mathbf{w}_0 =\begin{bmatrix}0\\0\end{bmatrix}。 \]在此例中,牛顿法一步就到达全局极小值,因为目标函数恰好是严格凸二次型,且算法使用了精确的海森矩阵。一般的非线性问题没有这种保证。在工程实现中,程序通常通过求解线性方程组来计算牛顿方向,而不会显式求矩阵的逆;对于稠密的 \(d\times d\) 系统,直接分解的典型计算成本为 \(O(d^3)\)。
2.5 BFGS:从梯度变化中学习曲率 #
BFGS 不直接计算海森矩阵,而是利用前后两步的位置差和梯度差来估计曲率:
\[ \mathbf{s}_k=\mathbf{w}_{k+1}-\mathbf{w}_k,\qquad \mathbf{y}_k=\mathbf{g}_{k+1}-\mathbf{g}_k。 \]| 变量 | 含义 |
|---|---|
| \(\mathbf{s}_k\) | 第 \(k\) 步产生的参数位移 |
| \(\mathbf{y}_k\) | 同一步前后的梯度变化;不是监督学习标签 \(y\) |
| \(\mathbf{V}_k\) | 第 \(k\) 步对逆海森矩阵的近似 |
| \(\mathbf{p}_k\) | 第 \(k\) 步的搜索方向 |
将逆海森矩阵的初始近似设为 \(\mathbf{V}_0=\mathbf{I}\),得到第一个搜索方向:
\[ \mathbf{p}_0=-\mathbf{V}_0\mathbf{g}_0 =\begin{bmatrix}8\\-80\end{bmatrix}。 \]沿这个方向做精确线搜索。为避免与全文学习率 \(\eta\) 混淆,本节把线搜索中的临时标量记为 \(a\);不少教材会把它写成 \(\alpha_k\):
\[ \mathbf{w}(a)=\begin{bmatrix}-8+8a\\4-80a\end{bmatrix}, \]\[ \phi(a)=f(\mathbf{w}(a)) =64032a^2-6464a+192。 \]| 变量 | 含义 |
|---|---|
| \(a\) | 沿固定方向试探距离的线搜索变量 |
| \(\mathbf{w}(a)\) | 沿 \(\mathbf{p}_0\) 移动 \(a\) 倍后的位置 |
| \(\phi(a)\) | 把多变量目标限制在搜索直线上以后得到的一元函数 |
| \(a_0\) | 第一次线搜索选出的最优步长 |
令 \(\phi'(a)=0\),得到 \(a_0=101/2001\approx0.050474\),因此:
\[ \mathbf{w}_1\approx\begin{bmatrix}-7.596208\\-0.037920\end{bmatrix}, \qquad \mathbf{g}_1\approx\begin{bmatrix}-7.596208\\-0.758400\end{bmatrix}。 \]位置差和梯度差为:
\[ \mathbf{s}_0\approx\begin{bmatrix}0.403792\\-4.037920\end{bmatrix}, \qquad \mathbf{y}_0\approx\begin{bmatrix}0.403792\\-80.758400\end{bmatrix}。 \]令 \(c_k=1/(\mathbf{y}_k^\mathsf{T}\mathbf{s}_k)\),BFGS 按照下式更新逆海森矩阵的近似:
\[ \mathbf{V}_{k+1} =(\mathbf{I}-c_k\mathbf{s}_k\mathbf{y}_k^\mathsf{T}) \mathbf{V}_k (\mathbf{I}-c_k\mathbf{y}_k\mathbf{s}_k^\mathsf{T}) +c_k\mathbf{s}_k\mathbf{s}_k^\mathsf{T}。 \]| 变量 | 含义 |
|---|---|
| \(c_k\) | 位置变化与梯度变化内积的倒数;BFGS 文献常记为 \(\rho_k\) |
| \(\mathbf{I}\) | 与 \(\mathbf{V}_k\) 同维度的单位矩阵 |
| \(\mathbf{s}_k\mathbf{y}_k^\mathsf{T}\) | 两个向量的外积,结果是矩阵 |
| \(\mathbf{V}_{k+1}\) | 加入最新曲率信息后的逆海森矩阵近似 |
代入本例数据:
\[ \mathbf{V}_1\approx \begin{bmatrix}1.009490&0.000047\\0.000047&0.050000\end{bmatrix}。 \]矩阵右下角的元素已经接近真实的逆曲率 \(1/20=0.05\)。第二个搜索方向约为 \(\mathbf{p}_1=[7.6683,0.0383]^\mathsf{T}\)。再次进行精确线搜索后,BFGS 到达原点附近。在满足适当条件并采用精确线搜索时,全量 BFGS 最多可以用 \(d\) 步重建一个 \(d\) 维严格凸二次型所需的曲率信息;非线性、数值误差和非精确线搜索都会改变这个结论[1]。
2.6 L-BFGS:保存有限历史,而不是完整矩阵 #
BFGS 需要保存完整的 \(d\times d\) 近似矩阵,空间复杂度为 \(O(d^2)\)。L-BFGS 只保存最近 \(m\) 组 \(\mathbf{s}_k\) 和 \(\mathbf{y}_k\),再通过双循环递归(two-loop recursion)计算搜索方向,因此空间复杂度降为 \(O(md)\)。这里,\(d\) 是待优化参数的数量,\(m\) 是 L-BFGS 保留的历史更新对数,通常远小于 \(d\)。两者采用相同的割线更新思想,但不能因此把同一条数值轨迹同时视为 BFGS 和 L-BFGS 的结果。
下表比较的不是谁在所有问题上“最好”,而是每种方法每次更新需要什么信息、需要保存多少状态,以及它首先会遇到什么限制:
| 方法 | 使用的信息 | 典型内存 | 主要限制 |
|---|---|---|---|
| 梯度下降 | 一阶梯度 | \(O(d)\) | 对尺度和条件数敏感 |
| 牛顿法 | 梯度与海森矩阵 | \(O(d^2)\) | 构造和分解海森矩阵的成本较高 |
| BFGS | 梯度差近似曲率 | \(O(d^2)\) | 高维问题的内存开销较大 |
| L-BFGS | 最近 \(m\) 组历史 | \(O(md)\) | 更适合光滑目标 |
到这里,我们回答了“怎样寻找最低点”。
3. 最小二乘法:优化怎样变成模型训练? #
普通最小二乘回归(OLS)主要用于预测连续数值(如房价、销量、温度或交付时间)。它假设预测值可以表示为输入特征的线性组合,是理解损失函数、闭式解、条件数和正则化的基础模型。OLS 本身不适用于分类任务;分类通常需要逻辑回归等能够输出类别概率的模型。
线性回归假设:
\[ \hat{y}_i=\mathbf{x}_i^\mathsf{T}\boldsymbol{\beta}。 \]普通最小二乘法选择 \(\boldsymbol{\beta}\),使残差平方和最小:
\[ \min_{\boldsymbol{\beta}} \mathcal{J}(\boldsymbol{\beta}) =\frac{1}{2n}\lVert\mathbf{y}-X\boldsymbol{\beta}\rVert_2^2。 \]| 变量 | 含义 | 维度 |
|---|---|---|
| \(n\) | 训练样本数量 | 标量 |
| \(p\) | 输入特征数量;不直接出现在公式中,但决定矩阵维度 | 标量 |
| \(X\) | 设计矩阵,每行是一条样本,每列是一个特征 | \(n\times p\) |
| \(\mathbf{x}_i\) | 第 \(i\) 条样本的特征向量 | \(p\) 维向量 |
| \(\boldsymbol{\beta}\) | 线性模型需要学习的系数 | \(p\) 维向量 |
| \(\mathbf{y}\) | 全部真实目标值组成的向量 | \(n\) 维向量 |
| \(\hat{y}_i\) | 模型对第 \(i\) 条样本的预测值 | 标量 |
| \(\mathbf{y}-X\boldsymbol{\beta}\) | 所有样本的残差向量 | \(n\) 维向量 |
| \(\lVert\cdot\rVert_2^2\) | 各分量平方后求和;平方范数中不保留外层平方根 | 标量 |
| \(1/(2n)\) | 对样本取平均,并用 \(1/2\) 抵消求导产生的系数 \(2\) | 标量 |
平方损失可以避免正负误差相互抵消,而且会对较大的误差施加更强的惩罚。由此得到的目标函数光滑且凸。如果进一步假设误差相互独立,并且服从同方差的高斯分布,那么最小化平方损失也等价于最大化数据似然[2]。
为了简化公式,本章假设特征和目标已经中心化,因此省略截距。实际建模如果显式加入截距,多数实现不会对截距项施加正则化;后面的 Ridge、Lasso 和 Elastic Net 公式也沿用这一约定。
目标函数的梯度为:
\[ \nabla\mathcal{J}(\boldsymbol{\beta}) =\frac{1}{n}X^\mathsf{T}(X\boldsymbol{\beta}-\mathbf{y})。 \]令梯度等于零。当 \(X^\mathsf{T}X\) 可逆时,可以得到:
\[ \hat{\boldsymbol{\beta}} =(X^\mathsf{T}X)^{-1}X^\mathsf{T}\mathbf{y}。 \]这个公式适合解释数学结构,但实际计算通常不会显式求逆。QR 分解和奇异值分解(SVD)往往更加稳定;当样本或参数很多时,也可以采用迭代方法。因此,最小二乘规定的是“优化什么”,而不是“只能怎样求解”[3]。
最小二乘目标的海森矩阵为 \(X^\mathsf{T}X/n\)。如果不同特征的尺度相差很大,或者特征之间高度相关,这个矩阵的条件数就可能很大。此时,目标函数会形成第二章所示的狭长谷底:优化算法更难收敛,回归系数也更容易受到数据扰动的影响。
4. Ridge、Lasso 与 Elastic Net:正则化改变了什么? #
Ridge、Lasso 和 Elastic Net 都是带正则化的线性回归模型,主要用于连续数值预测。它们保留了线性模型易于解释、训练成本低的特点,同时通过限制回归系数来减少模型对训练数据噪声的过拟合。Ridge 倾向于保留大多数特征并稳定相关系数;Lasso 能够将部分系数精确收缩到零,常用于稀疏建模和变量筛选;Elastic Net 则在稀疏性和相关特征的稳定性之间提供折衷。
正则化会直接改变训练目标,而不是在模型训练结束后进行修补。
4.1 Ridge:用 L2 惩罚收缩系数 #
\[ \min_{\boldsymbol{\beta}} \frac{1}{2n}\lVert\mathbf{y}-X\boldsymbol{\beta}\rVert_2^2 +\lambda\lVert\boldsymbol{\beta}\rVert_2^2。 \]| 新变量或记号 | 含义 |
|---|---|
| \(\lambda\ge0\) | 正则化强度;越大越重视限制系数,而不是只追求训练误差 |
| \(\lVert\boldsymbol{\beta}\rVert_2^2=\sum_{j=1}^{p}\beta_j^2\) | 所有系数平方之和 |
| \(j\) | 本章表示特征或回归系数的索引 |
L2 惩罚会压缩较大的系数,但通常不会将系数精确收缩到零。从矩阵角度看,它相当于在海森矩阵的对角线上增加正值,这通常可以减小条件数,缓解矩阵的病态性,并让高度相关的特征获得更稳定的权重。这种收缩会引入一些偏差,但可能换来更低的方差和更稳定的预测。
4.2 Lasso:L1 的尖角为什么产生稀疏解? #
\[ \min_{\boldsymbol{\beta}} \frac{1}{2n}\lVert\mathbf{y}-X\boldsymbol{\beta}\rVert_2^2 +\lambda\lVert\boldsymbol{\beta}\rVert_1。 \]| 新变量或记号 | 含义 |
|---|---|
| \(\lVert\boldsymbol{\beta}\rVert_1=\sum_{j=1}^{p}\lvert\beta_j\rvert\) | 所有系数绝对值之和 |
| \(\lvert\beta_j\rvert\) | 第 \(j\) 个系数的绝对值;在 \(\beta_j=0\) 处不可导 |
为了理解稀疏解的几何来源,我们可以将上述惩罚形式转换为与某个 \(\lambda\) 对应的约束形式:在 \(\lVert\boldsymbol{\beta}\rVert_1\le c\) 的区域内最小化数据损失,其中 \(c\ge0\) 是 L1 范数的上限。对于给定数据,惩罚形式中的某些 \(\lambda\) 可以与约束形式中的某些 \(c\) 对应,但两者的数值不能直接互换。
L1 约束区域在坐标轴上有尖角,损失函数的椭圆等高线更容易在这些尖角处与约束边界接触。当接触点落在坐标轴上时,就意味着某些系数精确等于零。然而,\(|\beta_j|\) 在零点不可导,因此不能直接套用针对光滑目标的普通牛顿法。常见的求解方法包括坐标下降、次梯度法和近端梯度法。近端更新使用的软阈值函数(soft-thresholding)为:
\[ \operatorname{soft}(z,\gamma) =\operatorname{sign}(z)\max(|z|-\gamma,0)。 \]| 新变量或记号 | 含义 |
|---|---|
| \(z\) | 完成一次普通梯度步骤后、尚未执行 L1 收缩的临时值 |
| \(\gamma\ge0\) | 当前近端步骤的收缩阈值,通常由步长和 L1 强度共同决定 |
| \(\operatorname{sign}(z)\) | 返回 \(z\) 的正负号 |
| \(\operatorname{soft}(z,\gamma)\) | 软阈值函数的输出;绝对值不超过阈值时为零 |
当 \(|z|\le\gamma\) 时,软阈值函数直接返回零。这说明 Lasso 的稀疏性不仅来自约束区域的几何形状,也来自求解算法中的阈值操作。
4.3 Elastic Net:在稀疏性和稳定性之间折中 #
\[ \min_{\boldsymbol{\beta}} \frac{1}{2n}\lVert\mathbf{y}-X\boldsymbol{\beta}\rVert_2^2 +\lambda\left[ \rho\lVert\boldsymbol{\beta}\rVert_1 +\frac{1-\rho}{2}\lVert\boldsymbol{\beta}\rVert_2^2 \right]。 \]| 新变量或记号 | 含义 | 常见异名 |
|---|---|---|
| \(\rho\in[0,1]\) | L1 在混合惩罚中的比例 | l1_ratio、\(\alpha\) |
| \(1-\rho\) | L2 在混合惩罚中的比例 | 不适用 |
| \(\lambda\) | L1 与 L2 组合后的整体强度 | Scikit-learn API 中常叫 alpha |
\(\lambda\) 控制整体正则化强度,而 \(\rho\) 决定 L1 和 L2 各自所占的比例。当 \(\rho=1\) 时,Elastic Net 退化为 Lasso;当 \(\rho=0\) 时,目标函数只保留 L2 惩罚。如果数据中有多组高度相关的特征,Lasso 可能只保留其中一个,且选择结果可能随样本扰动而变化。Elastic Net 中的 L2 部分倾向于让相关特征共同保留,而 L1 部分则继续提供稀疏性。值得注意的是,即使 Lasso 将某些系数收缩到零,被保留的变量也并不自动具有因果意义;变量选择还会受到特征尺度、相关性和样本扰动的影响。
下表中的“稀疏系数”表示模型是否会把部分回归系数精确压到零;“常见求解方式”列举典型路线,不表示每个软件库只能使用这一种算法:
| 模型 | 正则项 | 稀疏系数 | 常见求解方式 |
|---|---|---|---|
| OLS | 无 | 否 | QR、SVD、迭代法 |
| Ridge | L2 | 通常否 | 线性代数、迭代法 |
| Lasso | L1 | 是 | 坐标下降、近端方法 |
| Elastic Net | L1 + L2 | 是 | 坐标下降 |
5. XGBoost 与 LightGBM:怎样在函数空间中逐轮加树? #
XGBoost 和 LightGBM 都属于梯度提升决策树模型。它们能处理回归(如价格、需求预测)、二分类、多分类和排序任务(如客户流失判断、风险等级识别、搜索结果排序)。它们特别适用于表格数据,因为决策树能直接捕捉非线性关系和特征交互,且不要求输入特征与目标间存在线性关系。具体支持哪些目标函数和数据类型,仍取决于软件版本与配置。
提升法(Boosting)逐轮加入新的弱学习器,每一轮都在已有模型的基础上修正预测。先不考虑学习率,可以写成:
\[ \hat{y}_i^{(t)}=\hat{y}_i^{(t-1)}+f_t(\mathbf{x}_i)。 \]| 变量 | 含义 |
|---|---|
| \(t\) | Boosting 轮次,不表示日历时间 |
| \(\mathbf{x}_i\) | 第 \(i\) 条样本的输入特征向量 |
| \(\hat{y}_i^{(t-1)}\) | 加入第 \(t\) 棵树之前的累计预测 |
| \(f_t(\mathbf{x}_i)\) | 第 \(t\) 棵树对样本 \(i\) 给出的修正值 |
| \(\hat{y}_i^{(t)}\) | 加入本轮新树后的累计预测 |
实际实现通常还会用学习率 \(\eta\) 缩小新树的贡献,即把更新量写成 \(\eta f_t(\mathbf{x}_i)\)。下一节先按照 XGBoost 的常见推导求出未缩放的新树,再在更新预测时应用学习率。训练过程要选择的不只是固定树中的连续参数,还包括分裂特征、分裂阈值和整棵树的结构。因此,不能把 Boosting 简单理解为“对决策树做梯度下降”。
以带 \(1/2\) 系数的平方损失为例:
\[ \ell_i=\frac{1}{2}(y_i-\hat{y}_i)^2, \]其负梯度为:
\[ -\frac{\partial\ell_i}{\partial\hat{y}_i} =y_i-\hat{y}_i。 \]| 变量或记号 | 含义 |
|---|---|
| \(\ell_i\) | 第 \(i\) 条样本的损失 |
| \(y_i\) | 第 \(i\) 条样本的真实标签 |
| \(\hat{y}_i\) | 当前模型对第 \(i\) 条样本的预测 |
| \(\partial\ell_i/\partial\hat{y}_i\) | 损失对当前预测的一阶偏导 |
| \(y_i-\hat{y}_i\) | 本节所定义平方损失下的残差,也等于负梯度 |
对于平方损失,新树拟合的就是残差;从函数空间的角度看,这相当于沿着最能降低当前损失的方向修正模型。换成其他可微损失以后,新树拟合的则是相应的伪残差。
5.1 XGBoost:用二阶近似评价新树 #
XGBoost 在当前预测附近进行二阶泰勒(Taylor)展开[4][5]:
\[ \mathcal{J}^{(t)} \approx\sum_{i=1}^{n} \left[g_i f_t(\mathbf{x}_i)+\frac{1}{2}h_i f_t^2(\mathbf{x}_i)\right] +\Omega(f_t), \]| 新变量或记号 | 含义 |
|---|---|
| \(\mathcal{J}^{(t)}\) | 第 \(t\) 轮加入新树时需要近似最小化的目标 |
| \(g_i\) | 损失对样本 \(i\) 当前预测的一阶导数 |
| \(h_i\) | 损失对样本 \(i\) 当前预测的二阶导数 |
| \(\Omega(f_t)\) | 对第 \(t\) 棵树的叶子数量、叶权重等复杂度施加的惩罚 |
| \(\approx\) | 当前预测附近的二阶泰勒近似,不是恒等式 |
其中,\(g_i\) 和 \(h_i\) 分别表示损失函数对当前预测的一阶和二阶导数。对叶节点 \(j\),记 \(G_j=\sum_{i\in I_j}g_i\)、\(H_j=\sum_{i\in I_j}h_i\)。在常见的 L2 叶权重正则化下:
\[ w_j^*=-\frac{G_j}{H_j+\lambda}。 \]| 新变量或记号 | 含义 |
|---|---|
| \(j\) | 本节表示叶节点索引,不再表示线性模型的特征索引 |
| \(I_j\) | 落入叶节点 \(j\) 的训练样本集合 |
| \(G_j=\sum_{i\in I_j}g_i\) | 叶节点 \(j\) 内的一阶导数之和 |
| \(H_j=\sum_{i\in I_j}h_i\) | 叶节点 \(j\) 内的二阶导数之和 |
| \(w_j^*\) | 固定树结构下,叶节点 \(j\) 的最优输出权重 |
| \(\lambda\) | 叶权重的 L2 正则化强度,与前文含义一致 |
算法可以根据分裂前后 \(G\)、\(H\) 的变化计算候选分裂的增益。由此可见,一阶和二阶导数不仅决定固定树结构下的叶节点权重,也直接参与候选分裂和树结构的搜索。
5.2 LightGBM:目标相近,搜索方式不同 #
LightGBM 同样以梯度提升树为基础,也会使用损失函数对当前预测的一阶和二阶导数。它与其他实现的主要差别在于训练工程和树的生长策略[6][7]:
- 算法先把连续特征离散到有限的直方图区间,因此搜索分裂点的工作量更多取决于 bin 的数量;
- LightGBM 默认逐叶生长(leaf-wise,也称 best-first),每次选择预计能让损失下降最多的叶节点继续分裂;
- 在叶节点总数相同的情况下,逐叶生长往往能更快降低训练损失,但在小数据集上也更容易过拟合,因此需要用
num_leaves、max_depth、min_data_in_leaf等参数约束模型复杂度; - GOSS 和 EFB 是进一步的加速策略,但是否启用以及具体行为取决于配置和版本。
因此,不能简单地把 LightGBM 称为“比 XGBoost 更先进的优化器”。两者采用相同的梯度提升框架,但在树的生长方式、分裂搜索、数据表示和工程实现上有所不同。最终效果取决于具体数据、目标函数、特征、超参数和计算环境。
6. 神经网络:损失、反向传播与优化器如何配合? #
神经网络不是一个单一模型,而是一类由多层计算单元和可学习参数构成的模型家族。它们可以完成分类、回归、序列预测、表示学习和内容生成等任务。虽然不同网络的连接方式决定了它们如何处理空间、时间或上下文关系,但其训练过程都遵循同一条主线:计算预测值与损失,通过反向传播计算梯度,最后由优化器更新参数。
6.1 常见神经网络分别解决什么问题? #
前馈全连接网络是最简单的神经网络类型,足以说明其基本机制。信息单向从输入层流经一个或多个隐藏层,最终到达输出层;同一层的神经元通常与前一层的所有输出全连接。它可以用于表格数据分类和回归,也常作为其他复杂网络中的输出头。其局限在于没有引入针对图像空间结构或序列顺序的归纳偏置。
卷积神经网络(Convolutional Neural Network, CNN)通过局部连接和共享卷积核提取空间模式,最典型的应用是图像分类、目标检测和图像分割。卷积也可以用于语音、时间序列等具有局部结构的数据[8]。
循环神经网络(Recurrent Neural Network, RNN)通过将前一步的隐藏状态传递给下一步,因此擅长处理序列数据。长短期记忆网络(Long Short-Term Memory, LSTM)通过在循环结构中引入门控机制,缓解了普通 RNN 难以学习长期依赖的问题。它曾广泛用于时间序列、语音和自然语言序列建模,目前在部分序列任务中仍然实用[9]。
自编码器(Autoencoder)由编码器和解码器组成。编码器将输入压缩为潜在表示,解码器则尝试重建原始输入。模型通常通过最小化重建误差学习表示,可用于降维、去噪、异常检测和预训练;但较低的重建误差并不自动保证潜在表示具有业务上需要的语义[10]。
Transformer 利用注意力机制建立序列中不同位置之间的关系,不再像 RNN 那样沿序列逐步传递隐藏状态,从而使得同一层中的不同位置在训练时更容易并行计算。原始论文主要验证了机器翻译和英语成分句法分析;后来的大语言模型进一步展示了这种架构在给定上下文窗口内建模长文本依赖的实际能力[11]。
GPT 是采用仅解码器式(decoder-only)Transformer 架构的自回归语言模型家族。训练时,模型根据前序 token 预测下一个 token;推理时,则反复执行此过程生成文本。GPT-3 展示了大规模自回归语言模型通过文本提示完成零样本、单样本和少样本任务的能力[12]。大语言模型(Large Language Model, LLM)则是更宽泛的类别:GPT 属于 LLM,但并非所有 LLM 都采用完全相同的网络结构、训练数据或训练目标。
| 网络类型 | 主要结构特点 | 常见任务 | 典型训练目标 |
|---|---|---|---|
| 前馈全连接网络 | 信息逐层向前传递,层与层之间通常全连接 | 表格分类、回归、其他网络的输出头 | 交叉熵、均方误差 |
| CNN | 局部连接、共享卷积核 | 图像分类、检测、分割、局部序列模式提取 | 交叉熵、检测或分割损失 |
| RNN / LSTM | 隐藏状态沿序列传递,LSTM 使用门控记忆 | 时间序列、语音、序列分类与预测 | 序列交叉熵、回归损失 |
| 自编码器 | 编码器压缩表示,解码器重建输入 | 降维、去噪、异常检测、表示学习 | 重建损失及其他约束 |
| Transformer | 用注意力连接不同位置 | 机器翻译、文本与其他序列任务 | 取决于任务和训练方式 |
| GPT 类语言模型 | 仅解码器式 Transformer,自回归生成 | 文本生成、问答、摘要、代码等 | 下一个 token 的交叉熵 |
无论采用何种结构,神经网络都可以统一表示为 \(\hat{\mathbf{y}}=f_\theta(\mathbf{x})\)。分类任务通常使用交叉熵等损失函数,回归任务可能使用均方误差,自编码器常使用重建损失,自回归语言模型则计算下一个 token 的预测损失。完整的训练目标还可以包含权重衰减等正则项。
不同资料对 loss、cost 和 objective 的用法并不完全一致。本文不依赖这三个英文单词划分概念,而是用 \(\ell_i\) 表示单个样本的损失,用 \(\mathcal{L}\) 表示数据损失的汇总,用 \(\mathcal{J}\) 表示包含正则项在内的完整优化目标。阅读其他资料时,仍要先确认作者采用的定义。
6.2 反向传播不是梯度下降 #
前向传播负责计算预测值和损失,反向传播则利用链式法则计算 \(\nabla_\theta\mathcal{J}(\theta)\)。反向传播回答的是“梯度是多少”,并不决定“参数下一步更新到哪里”。以随机梯度下降(SGD)为例:
\[ \theta_{t+1}=\theta_t-\eta\widehat{\nabla\mathcal{J}}_t。 \]| 变量或记号 | 含义 |
|---|---|
| \(t\) | 本章表示神经网络的参数更新步数 |
| \(\theta_t\) | 第 \(t\) 步时网络全部可训练参数的集合 |
| \(\widehat{\nabla\mathcal{J}}_t\) | 当前样本或小批量(mini-batch)对完整目标梯度的估计;帽子表示估计量 |
| \(\eta\) | 优化器学习率,与前文保持一致 |
在典型的 PyTorch 训练循环中,loss.backward() 负责计算并累积梯度,optimizer.step() 负责更新参数,optimizer.zero_grad() 负责清除或重置梯度。三个操作各有自己的职责[13]。
6.3 为什么通常使用小批量训练? #
\[ \widehat{\nabla\mathcal{J}}_t =\frac{1}{|B_t|}\sum_{i\in B_t}\nabla_\theta\ell_i(\theta_t) +\lambda\nabla_\theta\Omega(\theta_t)。 \]| 新变量或记号 | 含义 |
|---|---|
| \(B_t\) | 第 \(t\) 步抽取的小批量样本集合 |
| \(\lvert B_t\rvert\) | 当前小批量包含的样本数;竖线表示集合大小,不是绝对值 |
| \(\ell_i(\theta_t)\) | 当前参数下第 \(i\) 条样本的损失 |
| \(\nabla_\theta\ell_i\) | 单个样本损失对全部参数的梯度 |
| \(\lambda\nabla_\theta\Omega(\theta_t)\) | 可微正则项对完整目标梯度的贡献;没有显式正则项时省略 |
全批量梯度使用全部训练数据,方向稳定但每次更新的计算成本高昂;单样本梯度虽然更新频繁,但噪声也很大。小批量(mini-batch)训练则在计算吞吐量和梯度噪声之间实现了折中。上式描述了将可微正则项直接写入目标函数的情况;若无显式正则项,公式仅保留前面的批量平均梯度。批量大小还会影响硬件利用率、归一化统计和泛化表现,不能简单理解为“批量越大,梯度就越准确,模型也一定越好”。
6.4 动量法怎样利用历史梯度? #
动量法会累积过去的梯度方向:
\[ \mathbf{u}_t=\mu\mathbf{u}_{t-1}+\mathbf{g}_t,\qquad \theta_{t+1}=\theta_t-\eta\mathbf{u}_t。 \]| 新变量或记号 | 含义 |
|---|---|
| \(\mathbf{g}_t\) | 第 \(t\) 步计算出的梯度;本文沿用第二章的梯度记号 |
| \(\mathbf{u}_t\) | 累积历史方向后的动量状态;这里改用 \(\mathbf{u}\),避免与 Adam 的二阶矩记号冲突 |
| \(\mu\in[0,1)\) | 动量衰减系数,决定保留多少历史方向 |
如果连续多步的梯度方向大致一致,历史方向会相互叠加,使参数沿该方向移动得更快。反过来,当梯度在高曲率方向上反复改变符号时,历史信息会抵消部分摆动,从而减弱振荡。
6.5 Adam 怎样调整每个参数的更新尺度? #
Adam 在动量思想的基础上,进一步估计每个参数方向上的梯度尺度。为简化记号,将第 \(t\) 步的小批量梯度写成:
\[ \mathbf{g}_t=\widehat{\nabla\mathcal{J}}_t。 \]Adam 首先计算梯度一阶矩和未中心化二阶矩的指数移动平均[14]:
\[ \mathbf{m}_t =\beta_1\mathbf{m}_{t-1}+(1-\beta_1)\mathbf{g}_t, \]\[ \mathbf{v}_t =\beta_2\mathbf{v}_{t-1} +(1-\beta_2)(\mathbf{g}_t\odot\mathbf{g}_t)。 \]\(\mathbf{m}_t\) 是近期梯度的平滑平均,保留了梯度的方向和带符号大小,其作用类似于动量。\(\mathbf{v}_t\) 记录近期梯度平方的平均水平,用来衡量每个参数方向上的梯度尺度。算法通常将 \(\mathbf{m}_0\) 和 \(\mathbf{v}_0\) 初始化为零向量,因此训练初期的两个移动平均都会偏向零,需要进行偏差修正:
\[ \widehat{\mathbf{m}}_t =\frac{\mathbf{m}_t}{1-\beta_1^t},\qquad \widehat{\mathbf{v}}_t =\frac{\mathbf{v}_t}{1-\beta_2^t}。 \]最后,Adam 用修正后的一阶矩决定更新方向,并用修正后二阶矩的平方根分别调整各参数的更新幅度:
\[ \theta_{t+1} =\theta_t -\eta\frac{\widehat{\mathbf{m}}_t} {\sqrt{\widehat{\mathbf{v}}_t}+\epsilon}。 \]上式中的平方、平方根和除法都按向量分量逐一计算。如果某个参数近期的梯度平方经常较大,其分母就会增大,实际更新幅度通常也会相应减小;梯度尺度较小的参数则可能获得相对更大的更新。Adam 根据历史梯度为每个参数调整尺度,但它并不会像牛顿法那样计算或使用海森矩阵的逆,因此不能将两者等同起来。
| 新变量或记号 | 含义 |
|---|---|
| \(\mathbf{m}_t\) | 第 \(t\) 步梯度的一阶矩指数移动平均,可理解为近期梯度带符号大小的平滑估计 |
| \(\mathbf{v}_t\) | 第 \(t\) 步梯度的未中心化二阶矩指数移动平均,可理解为近期梯度平方尺度的平滑估计 |
| \(\beta_1\in[0,1)\) | 一阶矩衰减系数;越接近 1,保留的一阶矩历史越长 |
| \(\beta_2\in[0,1)\) | 二阶矩衰减系数;越接近 1,保留的梯度平方历史越长 |
| \(\mathbf{g}_t\odot\mathbf{g}_t\) | 梯度向量与自身逐元素相乘,即每个分量分别平方 |
| \(\widehat{\mathbf{m}}_t\) | 经过初始零值偏差修正的一阶矩估计;帽子表示修正后的估计量 |
| \(\widehat{\mathbf{v}}_t\) | 经过初始零值偏差修正的二阶矩估计 |
| \(\epsilon>0\) | 加在分母中的很小常数,用于避免除以零并改善数值稳定性 |
Adam 原论文建议采用 \(\beta_1=0.9\)、\(\beta_2=0.999\) 和 \(\epsilon=10^{-8}\) 作为默认值,但具体软件库或训练配置可能使用不同设置[14]。Adam 经常能让训练损失在早期下降得更快,但这并不保证模型在测试集上表现更好,也不保证算法能在非凸目标上找到全局最优解。
6.6 如何理解神经网络的非凸优化地形? #
典型深度神经网络的目标函数通常是非凸的。参数之间的对称性、鞍点、平坦区域和尺度差异,共同形成了复杂的优化地形。实际训练通常追求损失较低且泛化表现稳定的解,而不是证明算法找到了唯一的全局最低点。参数初始化、网络结构、归一化方法、学习率调度和正则化方式都会影响最终结果。
7. MAP:用概率语言重新理解正则化 #
MAP(Maximum A Posteriori,最大后验估计)并非一种独立的预测模型,而是一种参数估计方法。线性回归、Prophet 以及其他概率模型,都可以在给定似然函数和先验分布后,通过 MAP 选取使后验密度最大的参数点。它将“模型如何解释数据”与“我们对参数的先验偏好”整合到同一个优化目标中。
根据贝叶斯公式(Bayes’ theorem):
\[ p(\theta\mid y)\propto p(y\mid\theta)p(\theta)。 \]| 变量或记号 | 含义 |
|---|---|
| \(p(\theta\mid y)\) | 观察到数据 \(y\) 以后,参数 \(\theta\) 的后验密度 |
| \(p(y\mid\theta)\) | 给定参数以后观察到数据的似然 |
| \(p(\theta)\) | 观察数据以前对参数的先验密度 |
| \(\propto\) | 两边只相差一个与 \(\theta\) 无关的归一化常数 |
MAP 的数学表达式为:
\[ \hat{\theta}_{\mathrm{MAP}} =\arg\min_\theta\left[-\log p(y\mid\theta)-\log p(\theta)\right]。 \]| 新变量或记号 | 含义 |
|---|---|
| \(\hat{\theta}_{\mathrm{MAP}}\) | 使后验密度最大的参数点估计 |
| \(\arg\min_\theta\) | 返回令后面表达式最小的参数,而不是返回最小函数值 |
| \(-\log p(y\mid\theta)\) | 负对数似然,对应数据拟合项 |
| \(-\log p(\theta)\) | 负对数先验,对应正则化项 |
第一项衡量参数对观测数据的解释程度,第二项衡量参数是否符合先验分布。当先验超参数固定,并忽略与待估参数无关的常数后,MAP 的负对数目标在数学结构上等同于“数据损失加正则项”。
具体来说,如果误差服从高斯分布,负对数似然便与残差平方和成正比,从而得到最小二乘目标。若系数的先验分布为 \(\beta_j\sim\mathcal{N}(0,s^2)\),其负对数先验中会出现 \(\beta_j^2/(2s^2)\),这对应于 L2 正则化(Ridge 回归)。如果系数改为服从拉普拉斯(Laplace)分布:
\[ p(\beta_j\mid b)=\frac{1}{2b}\exp\left(-\frac{|\beta_j|}{b}\right), \]| 新变量或记号 | 含义 |
|---|---|
| \(\beta_j\) | 第 \(j\) 个回归系数 |
| \(b>0\) | 拉普拉斯分布的尺度;越小表示先验越集中在零附近 |
| \(\exp(\cdot)\) | 自然指数函数 |
| \(p(\beta_j\mid b)\) | 给定尺度 \(b\) 时,\(\beta_j\) 在某个位置的概率密度,不是该点的概率 |
其负对数先验就会包含 \(|\beta_j|/b\),这与 L1 正则化(Lasso 回归)的形式一致。这里的“对应”是指目标函数中惩罚项的形状相同;具体的正则化系数还会受到似然方差、先验尺度和损失归一化方式的影响。这种对应关系只用于解释 MAP 点估计;完整的贝叶斯推断关注整个后验分布,不能与 MAP 混为一谈。
8. Prophet:MAP 怎样约束趋势和季节性? #
Prophet 是一款时间序列预测模型,特别适用于包含长期趋势、季节性和节假日效应的数据,例如业务量、访问量或需求量。它解决的是随时间变化的数值预测问题,而非分类任务。Prophet 的优势在于将趋势、周期和事件效应拆解成可解释的组成部分;如果数据没有明显的这类结构,或者预测高度依赖复杂的特征交互,其他模型可能更适合。
在默认的加法模式下,Prophet 将观测到的时间序列分解为以下几部分[15]:
\[ y(t)=g(t)+s(t)+h(t)+\varepsilon_t。 \]| 变量 | 含义 |
|---|---|
| \(t\) | 本章表示时间点,不再表示 Boosting 轮次或优化步数 |
| \(y(t)\) | 时间 \(t\) 的观测值 |
| \(g(t)\) | 趋势项,描述非周期性的长期变化 |
| \(s(t)\) | 季节性项,描述周期性变化 |
| \(h(t)\) | 节假日和事件效应 |
| \(\varepsilon_t\) | 模型未解释的随机误差 |
如果季节性波动的幅度会随趋势水平增大,Prophet 也支持乘法模式。此时,季节性和节假日效应按趋势的相对比例变化,不再只是固定幅度的加法项[16]。
当 mcmc_samples=0 时,Prophet 的 Python API 使用 MAP 点估计。只有将 MCMC 样本数设为大于零的值,程序才会对后验分布进行采样[15]。
8.1 趋势变点:拉普拉斯先验怎样产生稀疏调整? #
Prophet 在候选变点上引入趋势变化量:
\[ \delta_j\sim\operatorname{Laplace}(0,\tau)。 \]| 新变量或记号 | 含义 |
|---|---|
| \(j\) | 本节表示候选趋势变点的索引 |
| \(\delta_j\) | 第 \(j\) 个候选变点处的趋势斜率变化量 |
| \(\sim\) | “服从某个概率分布”,不是近似等于 |
| \(\operatorname{Laplace}(0,\tau)\) | 位置为 \(0\)、尺度为 \(\tau\) 的拉普拉斯分布 |
| \(\tau>0\) | 变点调整先验的尺度;越小,向零收缩越强 |
相应的 MAP 目标包含一个与 \(|\delta_j|/\tau\) 成正比的惩罚项。Prophet 可以预先设置较多候选变点;当某个候选变点带来的拟合改善足以抵消先验惩罚时,相应的趋势变化量才更可能保留较大的非零值。
changepoint_prior_scale 控制趋势变化的灵活程度。较大的先验尺度意味着约束更宽松,模型可以拟合更明显的趋势变化;较小的值会加强收缩,使趋势更加平滑。由于它表示先验尺度,其作用方向与传统正则化系数 \(\lambda\) 相反:prior scale 越大,等效约束通常越弱[17]。
8.2 季节性与回归系数:正态先验怎样平滑收缩系数? #
Prophet 可以将季节性、节假日和额外回归变量组织到设计矩阵 \(X\) 中,并用 \(\boldsymbol{\beta}\) 表示相应的系数:
\[ \beta_j\sim\mathcal{N}(0,\sigma_j^2)。 \]| 新变量或记号 | 含义 |
|---|---|
| \(j\) | 本节表示季节性、节假日或额外回归特征的系数索引 |
| \(\beta_j\) | 设计矩阵第 \(j\) 列对应的回归系数 |
| \(\mathcal{N}(0,\sigma_j^2)\) | 均值为 \(0\)、方差为 \(\sigma_j^2\) 的正态(Normal)分布 |
| \(\sigma_j>0\) | 第 \(j\) 个系数的先验标准差;越小,收缩越强 |
在 MAP 目标中,这个正态先验对应 L2 型惩罚。seasonality_prior_scale 和 holidays_prior_scale 控制相应先验的尺度:值越大,模型越能拟合幅度较大的季节性或节假日效应;值越小,相关系数越接近零。通过 add_regressor 添加的额外回归变量可以分别设置 prior_scale,不一定共用季节性或节假日的先验尺度[18]。
不能仅凭历史拟合曲线看起来是否“顺眼”来选择这些参数。更可靠的做法是:在对数尺度上设置一组候选值,采用相同的历史窗口、预测步长和截断点(cutoff)进行滚动时间序列交叉验证,比较口径一致的业务指标,同时检查趋势与季节性分解,并确认训练过程没有使用未来信息[19]。
9. 一张统一地图:模型究竟在优化什么? #
下表用四个问题概括了核心理念:“优化对象”说明算法正在调整什么;“数据目标”说明模型怎样衡量预测误差;“约束或先验”说明模型偏好什么样的解;“常见求解思路”说明算法怎样寻找这个解。表中只列出代表性方法,并未穷举所有实现,也不代表任何软件版本的固定行为。
| 模型或方法 | 优化对象 | 数据目标 | 约束或先验 | 常见求解思路 |
|---|---|---|---|---|
| OLS | 线性系数 | 平方误差 | 无 | QR、SVD、迭代法 |
| Ridge | 线性系数 | 平方误差 | L2 / 高斯先验 | 线性代数、迭代法 |
| Lasso | 线性系数 | 平方误差 | L1 / 拉普拉斯先验 | 坐标下降、近端方法 |
| Elastic Net | 线性系数 | 平方误差 | L1 + L2 | 坐标下降 |
| XGBoost | 加法树函数 | 任务相关损失 | 树复杂度、叶权重 | 二阶近似、逐轮加树 |
| LightGBM | 加法树函数 | 任务相关损失 | 树复杂度 | 梯度提升、直方图与逐叶搜索 |
| 神经网络 | 网络权重 | 任务相关损失 | 权重衰减等 | 反向传播计算梯度,SGD/Adam 等更新参数 |
| Prophet MAP | 趋势与特征参数 | 负对数似然 | 参数先验 | 数值优化 |
这张表中真正稳定的,是以下三个层次:
- 目标函数决定什么结果算好。 平方误差、交叉熵和负对数似然以不同方式衡量预测与观测之间的不一致。
- 正则化或先验决定偏好什么样的解。 L1 偏好稀疏,L2 偏好平滑收缩,树复杂度惩罚限制结构增长。
- 优化算法决定怎样寻找这个解。 梯度下降、牛顿法、BFGS、坐标下降和逐轮加树利用的信息与计算代价不同。
以后再遇到新的机器学习模型,不必先背参数名称。可以先问四个问题:它怎样产生预测?怎样定义损失?模型受到哪些约束?训练过程又怎样寻找更好的解?只要能回答这四个问题,眼前的模型就不再只是一组彼此孤立的 API。
参考资料 #
[1] Jorge Nocedal, Stephen J. Wright. Numerical Optimization. Springer, 2006.
[2] Trevor Hastie, Robert Tibshirani, Jerome Friedman. The Elements of Statistical Learning. Springer, 2009.
[3] Scikit-learn. Linear Models User Guide.
[4] Tianqi Chen, Carlos Guestrin. XGBoost: A Scalable Tree Boosting System. KDD, 2016.
[5] XGBoost. Tree Methods.
[6] Guolin Ke et al. LightGBM: A Highly Efficient Gradient Boosting Decision Tree. NeurIPS, 2017.
[7] LightGBM. Features.
[8] Yann LeCun, Léon Bottou, Yoshua Bengio, Patrick Haffner. Gradient-Based Learning Applied to Document Recognition. Proceedings of the IEEE, 1998.
[9] Sepp Hochreiter, Jürgen Schmidhuber. Long Short-Term Memory. Neural Computation, 1997.
[10] Geoffrey E. Hinton, Ruslan R. Salakhutdinov. Reducing the Dimensionality of Data with Neural Networks. Science, 2006.
[11] Ashish Vaswani et al. Attention Is All You Need. NeurIPS, 2017.
[12] Tom B. Brown et al. Language Models are Few-Shot Learners. NeurIPS, 2020.
[13] PyTorch. Autograd mechanics.
[14] Diederik P. Kingma, Jimmy Ba. Adam: A Method for Stochastic Optimization. ICLR, 2015.
[15] Sean J. Taylor, Benjamin Letham. Forecasting at Scale. The American Statistician, 2018.
[16] Prophet. Multiplicative Seasonality.
[17] Prophet. Trend Changepoints.
[18] Prophet. Seasonality, Holiday Effects, And Regressors.
[19] Prophet. Diagnostics.