跳转至

第四章:数值计算

章节概述

本章系统探讨深度学习中涉及的数值计算核心问题。神经网络的训练过程本质上是一个数值优化问题,理解数值计算的数学基础对于设计高效、稳定的学习算法至关重要。本章首先分析计算机表示数字的固有限制如何导致上溢和下溢现象,以及如何设计数值稳定的算法来规避这些问题;随后引入条件数的概念,用于衡量问题对数值扰动的敏感程度;接着详细介绍梯度下降法和牛顿法等无约束优化方法,探讨学习率选择、线搜索策略等实践要点;然后扩展到约束优化领域,阐述KKT条件、罚函数法和拉格朗日乘数法;最后深入讨论Jacobian矩阵和Hessian矩阵在优化中的作用,以及共轭梯度法的原理与优势。本章内容为理解随机梯度下降、Adam优化器、动量法等现代训练技术提供了坚实的理论基础,并为进一步研究更高级的优化算法奠定了数学基础。


第一节:数值稳定性的基础——上溢与下溢

1.1 计算机算术的根本限制

深度学习算法涉及大量浮点数运算,而计算机浮点数系统具有固有的精度限制。现代计算机采用IEEE 754标准表示浮点数,将有限比特分配给符号位、指数位和尾数位。以六十四位双精度浮点数为例,共有壹位符号位、拾壹位指数位和伍拾贰位尾数位。这种表示方法将实数域映射到一个离散的、有限的集合上。一台计算机只能精确表示某个离散集合中的数字,而无法表示实数轴上的所有实数。这种离散表示引入了两种主要的数值危险:上溢(overflow)和下溢(underflow)。当计算机处理神经网络的前向传播和反向传播时,由于需要执行数十亿次浮点运算,这些数值危险可能多次出现并累积,最终导致计算失败或结果严重偏离真实值。理解这些限制是设计鲁棒深度学习系统的第一步,也是每一位深度学习工程师必须掌握的基础知识。

1.2 上溢与下溢的定义与机制

上溢发生在一个数值的大小超过了浮点数系统能表示的最大值。当计算结果达到或超过某个阈值(通常约为\(\exp(1024)\),对应双精度浮点数的指数上限)时,计算机会将其表示为无穷大。一旦出现无穷大,几乎任何后续算术运算都会产生无穷大或NaN(非数),导致整个计算崩溃。例如,在softmax函数中,如果所有输入都是非常大的正数,直接计算指数函数会导致上溢。神经网络的指数激活函数如ReLU的变体、权重初始化过大、批量归一化前的参数配置不当等情况都可能导致上溢。上溢问题在训练生成对抗网络或处理对数似然时尤为常见,因为这些场景涉及指数函数的多次应用。此外,在神经架构搜索中评估大量候选网络时,上溢问题可能成为限制搜索范围的瓶颈。

下溢发生在一个数值的绝对值小于浮点数能表示的最接近于零的正数时。当计算结果接近零但无法用最小正数表示时,计算机会将其截断为零。这种突然降为零的现象会引发严重问题,尤其是当被零化的数值随后用作除数或对数输入时。例如,在计算对数似然时,如果某个概率被下溢为零,对数运算将产生负无穷。在训练变分自编码器或计算交叉熵损失时,下溢问题尤为棘手,因为这些场景涉及对概率分布的运算。此外,批归一化层的方差计算、协方差矩阵的估计,以及神经网络的梯度计算都可能受到下溢的影响。神经网络中经常出现的概率计算,特别是当输出经过sigmoid或softmax函数转换时,极端情况下可能导致下溢。幸运的是,通过合理的数值稳定化设计,大多数下溢问题都可以有效规避。

1.3 数值稳定的设计策略

为了应对上溢和下溢问题,数值稳定的算法设计至关重要。以softmax函数为例,直接计算\(\text{softmax}(x)_i = \frac{\exp(x_i)}{\sum_j \exp(x_j)}\)\(x_i\)很大时会遭遇上溢,在\(x_i\)很负时会遭遇下溢。数值稳定的实现利用了以下数学恒等变换:

\[ \text{softmax}(x)_i = \frac{\exp(x_i - \max_j x_j)}{\sum_j \exp(x_j - \max_j x_j)} \]

证明如下:对于任意常数\(c\),我们有\(\frac{\exp(x_i)}{\sum_j \exp(x_j)} = \frac{\exp(x_i - c)}{\sum_j \exp(x_j - c)}\),因为分子分母同时除以\(\exp(c)\)。选择\(c = \max_j x_j\)作为归一化常数,所有指数参数都变为非正的,避免了上溢风险;同时,即使最负的参数对应指数下溢为零,\(\exp(0) = 1\)仍然保证分母至少为一,避免了除零错误。这个简单的技巧是深度学习框架中张量运算库的核心组成部分。

类似地,在计算对数softmax时,使用\(\log(\text{softmax}(x)_i) = x_i - \log\sum_j \exp(x_j)\)并对内和进行相同的稳定化变换。这种实现方式不仅避免了上溢和下溢,还保持了数值稳定性。在PyTorch和TensorFlow等框架中,这类函数都经过了严格的数值稳定性测试。类似地,在计算交叉熵损失时,将softmax和交叉熵合并计算可以有效避免中间步骤的数值问题。在实现自定义层或损失函数时,开发者应当始终考虑数值稳定性的影响,这是工程实践中的重要考量。

1.4 条件数的隐式影响

上溢和下溢往往不是孤立出现的,它们与问题的条件数密切相关。条件数是衡量问题对数值扰动敏感程度的根本度量。当一个问题具有较大的条件数时,输入的微小扰动会被放大为输出的巨大变化,而这种放大效应在数值计算中会与浮点精度限制产生复杂交互。一个条件数很大的矩阵求逆问题,即使矩阵元素本身没有上溢风险,由于条件数导致的有效精度损失,可能使得计算结果完全失去意义。因此,数值稳定性分析必须与条件数分析相结合,才能全面评估算法的可靠性。这对于设计鲁棒的深度学习系统至关重要,特别是在处理病态数据或训练不稳定网络时。此外,在分布式训练中,由于通信引入的数值误差,高条件数问题可能导致参数同步失败或训练发散。


第二节:病态条件数——问题敏感性的度量

2.1 条件数的定义与直观理解

条件数是线性代数和数值分析中的核心概念,用于量化一个问题对输入扰动的敏感程度。对于函数\(f(x)\),条件数定义为输出相对变化与输入相对变化的最大比值。在数学上,对于定义在范数空间上的函数,条件数可以表示为函数梯度的范数与函数值的范数之比。当条件数很大时,即使输入只有微小的测量误差或舍入误差,输出的误差也可能被放大数百倍甚至数千倍。这种敏感性使得高精度计算变得困难,因为有限的浮点精度无法捕捉如此微小的差异。在科学计算中,条件数是评估计算方法可靠性的关键指标。

在深度学习中,最常见的是矩阵的条件数。对于线性系统\(Ax = b\),条件数定义为矩阵范数与矩阵逆范数的乘积,等于最大奇异值与最小奇异值之比:

\[ \kappa(A) = \|A\| \cdot \|A^{-1}\| = \frac{\sigma_{\max}(A)}{\sigma_{\min}(A)} \]

\(\kappa(A)\)很大时,我们称矩阵\(A\)病态的;当\(\kappa(A)\)接近一时,矩阵是良态的。对于二维情况,可以将矩阵看作将单位圆变换为椭圆的线性映射,椭圆的长轴与短轴之比即为条件数。条件数越大,这个椭圆越扁,在求解线性系统时数值误差的放大效应就越明显。在神经网络的上下文中,矩阵条件数直接影响训练过程中梯度计算的稳定性和参数更新的有效性。

2.2 条件数与误差放大

病态矩阵带来的核心问题是数值误差的剧烈放大。假设我们有一个病态矩阵\(A\),其条件数\(\kappa(A) = 10^6\),这意味着输入\(b\)的相对误差最多可能被放大一百万倍。如果原始问题要求解线性系统\(Ax = b\),而由于浮点精度限制,\(b\)存在约\(10^{-16}\)量级的相对误差,那么解\(x\)的相对误差可能达到\(10^{-10}\),这对于许多应用来说已经无法接受。这种误差放大机制是数值线性代数的核心研究内容,也是理解深度学习优化困难的关键。从误差分析的角度,我们有相对误差关系:

\[ \frac{\|\Delta x\|}{\|x\|} \leq \kappa(A) \frac{\|\Delta b\|}{\|b\|} \]

这个不等式清晰地表明了解对输入扰动的敏感程度与条件数成正比。

在神经网络训练中,病态问题表现为损失函数的曲率变化剧烈。当Hessian矩阵的特征值差异巨大时,梯度下降方向与最优方向的偏差会被放大,导致收敛极慢。考虑一个简单的二次损失函数\(f(x) = \frac{1}{2}x^TQx - b^Tx\),其中\(Q\)是对称正定矩阵。梯度下降的收敛速度由谱半径决定:

\[ \rho(I - \alpha Q) = \frac{\lambda_{\max} - \lambda_{\min}}{\lambda_{\max} + \lambda_{\min}} = \frac{\kappa(Q) - 1}{\kappa(Q) + 1} \]

其中\(\lambda_{\max}\)\(\lambda_{\min}\)分别是\(Q\)的最大和最小特征值。当条件数\(\kappa = \frac{\lambda_{\max}}{\lambda_{\min}}\)很大时,这个比率接近于一,收敛速度极慢。这意味着即使优化算法本身是数值稳定的,收敛速度也会受到问题本身病态性的严重限制。这是深度学习优化中最根本的困难之一,也是为什么训练深层网络如此困难的主要原因之一。

2.3 深度学习中的病态问题

深度神经网络训练涉及大量病态优化问题。考虑一个简单的线性回归问题,其目标函数为\(f(w) = \|Xw - y\|^2\),对应的正规方程为\(X^TXw = X^Ty\)。当数据矩阵\(X\)的列之间存在近似线性相关时,\(X^TX\)接近奇异,其条件数很大。这种列相关在实际应用中非常常见,特别是当特征数量大于样本数量时,或者当某些特征之间存在冗余时。在深度学习中,即使对于简单的分类问题,神经网络的损失景观也展现出复杂的病态特性,其Hessian矩阵的条件数可能非常大。

神经网络的损失景观本身就极其复杂,充满了病态的局部区域。批归一化技术的引入在一定程度上改善了优化问题的条件数,因为它通过归一化层的输入来稳定梯度流,使得每一层的输入分布相对稳定。权重初始化策略如Xavier初始化和He初始化,正是通过合理设置初始权重尺度来避免前向传播和反向传播中的数值问题,使得信号在网络中能够合理流动。残差连接通过提供梯度流的短路通道,在一定程度上缓解了深层网络训练中的病态问题,使得梯度能够更容易地流向较早的层。学习率预热和梯度裁剪等策略也是在应对病态优化问题带来的挑战。所有这些技术的共同目标是将困难的病态问题转化为更容易优化的良态问题,从而加速训练并提高最终模型的性能。


第三节:梯度下降法——学习率与收敛性分析

3.1 梯度下降法的基本原理

梯度下降法是深度学习中最核心的优化算法。其基本思想来自微积分中的最速下降方向:对于一个可微函数\(f(x)\),在点\(x\)处沿着梯度相反方向\(- \nabla f(x)\)前进,函数值下降最快。迭代公式为:

\[ x^{(t+1)} = x^{(t)} - \alpha \nabla f(x^{(t)}) \]

其中\(\alpha > 0\)学习率,也称步长或学习步长。学习率决定了每次迭代中参数更新的幅度,是梯度下降法最重要的超参数之一。这个简单的公式构成了几乎所有深度学习训练算法的基础,从最基础的随机梯度下降到复杂的Adam和LAMB优化器,其核心思想都源于此。梯度下降法的魅力在于其简单性和有效性,尽管收敛速度可能较慢,但它能够可靠地找到局部极小点,这对于非凸的神经网络优化问题至关重要。

梯度下降法的收敛性可以从多个角度理解。从几何上看,梯度指向函数增长最快的方向,因此负梯度方向是函数下降最快的方向。从分析上看,对于光滑函数,梯度下降在适当的学习率下能够收敛到驻点。从数值上看,梯度下降每一步的计算复杂度为\(O(n)\),其中\(n\)是参数维度,这使得它能够处理大规模优化问题,例如具有数百万参数的深度神经网络。然而,梯度下降的收敛速度依赖于问题本身的特性,特别是条件数的影响。对于病态问题,标准梯度下降可能收敛得非常缓慢。

3.2 学习率的几何意义与选择策略

学习率的选择直接影响优化效果。过大的学习率会导致参数在极小点附近过度振荡,造成参数越过极小点甚至导致发散;过小的学习率则使收敛速度极慢,在实际应用中不可接受。考虑一个二次目标函数\(f(x) = \frac{1}{2}x^TQx - b^Tx\),其中\(Q\)是对称正定矩阵。梯度为\(\nabla f(x) = Qx - b\),最优解为\(x^* = Q^{-1}b\)。沿梯度下降方向的更新误差演化满足:

\[ \|x^{(t+1)} - x^*\| \leq \|I - \alpha Q\| \cdot \|x^{(t)} - x^*\| \]

谱半径\(\rho(I - \alpha Q) = \max_i|1 - \alpha\lambda_i(Q)|\),其中\(\lambda_i(Q)\)\(Q\)的特征值。收敛条件要求\(|1 - \alpha\lambda_i| < 1\)对所有特征值成立,因此学习率需满足\(0 < \alpha < \frac{2}{\lambda_{\max}(Q)}\)。最优学习率(关于收敛速度)为:

\[ \alpha^* = \frac{2}{\lambda_{\max}(Q) + \lambda_{\min}(Q)} \]

此时谱半径为\(\frac{\lambda_{\max} - \lambda_{\min}}{\lambda_{\max} + \lambda_{\min}} = \frac{\kappa(Q) - 1}{\kappa(Q) + 1}\)。条件数越大,收敛越慢——这正是前面讨论的病态问题在优化中的体现。这个分析揭示了学习率与问题条件数之间的深刻联系,也为学习率的自适应调整提供了理论依据。

3.3 学习率调度策略

实际应用中,固定学习率往往不是最优选择。学习率调度通过动态调整学习率来加速收敛,是深度学习训练的重要组成部分。常见策略包括以下几种:

步衰减(Step Decay):每隔固定轮数将学习率乘以某个衰减因子(如0.5或0.1)。公式为\(\alpha_t = \alpha_0 \cdot \gamma^{\lfloor t / T \rfloor}\),其中\(\gamma\)是衰减率,\(T\)是衰减周期。这种策略简单有效,在许多视觉任务中表现良好,被广泛用于ResNet等经典网络的训练中。

指数衰减(Exponential Decay):\(\alpha_t = \alpha_0 \cdot \gamma^t\),提供更平滑的学习率下降曲线。指数衰减在自然语言处理任务中广泛应用,特别是在Transformer架构的训练中。

余弦退火(Cosine Annealing):\(\alpha_t = \alpha_{\min} + \frac{1}{2}(\alpha_{\max} - \alpha_{\min})(1 + \cos(\frac{t\pi}{T}))\),学习率按余弦曲线从最大值降到最小值。余弦退火在学习率周期变化方面特别有效,被用于许多竞赛中的顶级方案。

热重启(Warm Restarts):在余弦退火基础上周期性地将学习率重置为最大值,有利于跳出局部极小找到更好的解。带重启的余弦退火在许多竞赛中取得优异成绩,它通过周期性的剧烈学习率变化来探索损失景观的不同区域。

线性热身(Linear Warmup):在训练初期将学习率从很小值逐渐增加到目标值,有助于模型在训练早期保持稳定。这种策略对于训练Transformer等深层网络特别重要,可以避免早期训练的不稳定性。

3.4 随机梯度下降与批量梯度下降

标准梯度下降每次使用全部数据计算梯度,梯度估计无偏但计算开销大。对于大规模数据集,单次迭代的计算成本不可接受。随机梯度下降每次只用单个样本估计梯度,计算高效但梯度方差大,可能导致优化路径振荡。小批量梯度下降作为折中方案,每次使用一小批(通常三十二到二百五十六个)样本估计梯度,既保证了梯度的相对稳定性,又保持了计算效率。深度学习框架中的随机梯度下降默认都是小批量版本。批量大小的选择是一个重要的超参数:大批量提供更稳定的梯度估计和更高的计算效率(利用矩阵运算的并行性),但可能导致泛化性能下降;小批量引入的随机性有助于跳出局部极小,但收敛路径更振荡,需要更多的迭代次数。

引入动量(Momentum)可以加速收敛并减少振荡。动量项累积历史梯度方向,在一致方向上加速,在振荡方向上相互抵消。标准动量更新为:

\[ v^{(t)} = \beta v^{(t-1)} + (1 - \beta) \nabla f(x^{(t)}) $$ $$ x^{(t+1)} = x^{(t)} - \alpha v^{(t)} \]

其中\(\beta\)是动量系数,通常取0.9左右。Nesterov动量是标准动量的改进:

\[ v^{(t)} = \beta v^{(t-1)} + \nabla f(x^{(t)} - \beta v^{(t-1)}) $$ $$ x^{(t+1)} = x^{(t)} - \alpha v^{(t)} \]

这种前瞻性更新在许多任务中表现更好,特别是在处理随机梯度估计的高方差问题时。AdaGrad、RMSProp、Adam等自适应学习率方法通过利用梯度的历史信息来实现学习率的自适应调整,是当前深度学习训练的主流方法。


第四节:二阶优化——牛顿法与拟牛顿法

4.1 牛顿法的基本形式

梯度下降法仅利用一阶导数信息,收敛速度受条件数影响大。牛顿法利用二阶导数曲率信息,可以获得更快的收敛速度。对于无约束优化问题\(\min_x f(x)\),牛顿法在当前点\(x^{(t)}\)处用二次函数近似目标函数:

\[ f(x) \approx f(x^{(t)}) + \nabla f(x^{(t)})^T (x - x^{(t)}) + \frac{1}{2}(x - x^{(t)})^T H(x^{(t)}) (x - x^{(t)}) \]

其中\(H(x^{(t)}) = \nabla^2 f(x^{(t)})\)是Hessian矩阵。求导并令近似函数的梯度为零,得到牛顿更新公式:

\[ x^{(t+1)} = x^{(t)} - H(x^{(t)})^{-1} \nabla f(x^{(t)}) \]

当Hessian正定时,牛顿方向\(p^{(t)} = -H^{-1}\nabla f\)指向极小点方向。对于二次函数,牛顿法一步即可收敛到最优解(达到机器精度);对于一般函数,在最优解附近具有二次收敛速度,即误差以平方速率下降,远快于梯度下降的线性收敛。这种快速收敛特性使得牛顿法在需要高精度解的场景中非常有价值,例如参数估计的精细调优。

4.2 牛顿法的优势与挑战

牛顿法的核心优势在于收敛速度快,特别适合在最优解附近进行精细调整。然而,它面临三个主要挑战,需要在实践中认真考虑:

计算成本高:Hessian矩阵的维度为\(n \times n\),对于具有百万参数的网络,存储成本为\(O(n^2)\),计算\(H^{-1}\)需要\(O(n^3)\)复杂度。以一个具有一百万参数的网络为例,Hessian矩阵包含一万亿个元素,仅存储就需要数十GB内存,这在实际中不可行。更大的网络如BERT有数十亿参数,其Hessian矩阵更是无法想象。

Hessian可能不正定:即使目标函数整体是凸的,Hessian在某些点也可能不正定(非凸区域)。在深度学习中,损失函数通常是非凸的,存在大量鞍点。不正定的Hessian会导致牛顿方向不是下降方向,甚至指向函数值增大的方向,使得算法无法保证收敛。

非凸损失景观:深度神经网络的损失函数是非凸的,存在大量鞍点和局部极小。牛顿法可能收敛到鞍点而非极小点,这与我们的优化目标不符。为了处理这个问题,人们发展了信任域方法和线搜索牛顿法的变体。

4.3 拟牛顿法与自适应学习率

拟牛顿法通过迭代逼近Hessian或其逆矩阵,避开直接计算和求逆。最流行的算法是BFGS(Broyden-Fletcher-Goldfarb-Shanno)和L-BFGS(Limited-memory BFGS)。BFGS通过低秩更新逐步逼近Hessian逆矩阵,避免了矩阵求逆操作。更新公式为:

\[ H_{k+1} = H_k - \frac{H_k y_k y_k^T H_k}{y_k^T H_k y_k} + \frac{s_k s_k^T}{y_k^T s_k} \]

其中\(s_k = x_{k+1} - x_k\)\(y_k = \nabla f_{k+1} - \nabla f_k\)。L-BFGS通过只存储最近\(m\)次迭代的梯度信息来逼近Hessian逆,内存需求为\(O(mn)\),在实践中\(m\)通常取3到20之间。这种内存效率使得L-BFGS能够处理较大规模的问题。

AdaGradRMSPropAdam等自适应学习率方法可以视为一阶方法的曲率自适应改进。Adam结合了动量(利用历史梯度的一阶矩)和RMSProp(利用梯度平方的二阶矩)的优点:

\[ m^{(t)} = \beta_1 m^{(t-1)} + (1 - \beta_1) g^{(t)} \quad \text{(梯度的一阶矩估计)} $$ $$ v^{(t)} = \beta_2 v^{(t-1)} + (1 - \beta_2) (g^{(t)})^2 \quad \text{(梯度的二阶矩估计)} $$ $$ \hat{m}^{(t)} = \frac{m^{(t)}}{1 - \beta_1^t}, \quad \hat{v}^{(t)} = \frac{v^{(t)}}{1 - \beta_2^t} \quad \text{(偏差校正)} $$ $$ \theta^{(t+1)} = \theta^{(t)} - \alpha \frac{\hat{m}^{(t)}}{\sqrt{\hat{v}^{(t)}} + \epsilon} \]

其中\(\beta_1 = 0.9\)\(\beta_2 = 0.999\)\(\epsilon = 10^{-8}\)是常用参数。这些方法通过对梯度进行归一化,实现了学习率的自适应调整,在很大程度上缓解了病态问题的影响,成为当前最流行的深度学习优化器。Adam的变体如AdamW(解耦权重衰减)、RAdam(修正自适应学习率)等进一步提升了性能。


第五节:约束优化——KKT条件、拉格朗日函数与罚函数

5.1 约束优化问题的标准形式

深度学习中许多问题都涉及约束优化,例如权重范数正则化(\(\|w\|_2 \leq 1\))、投影梯度下降(将参数限制在可行集内)、支持向量机的最大间隔约束、以及神经网络的批量约束等。约束优化问题的标准形式为:

\[ \min_x \ f(x) \quad \text{s.t.} \quad g_i(x) \leq 0, \ i = 1, \ldots, m, \quad h_j(x) = 0, \ j = 1, \ldots, p \]

其中\(f(x)\)是目标函数,\(g_i(x) \leq 0\)是不等式约束,\(h_j(x) = 0\)是等式约束。可行集(feasible set)是满足所有约束的点的集合。在深度学习中,约束通常用于编码归纳偏置、保证解的特性(如稀疏性或低秩性)、或满足物理或工程限制。理解约束优化问题的结构是设计相应求解算法的基础,也是分析优化算法收敛性的关键。

5.2 拉格朗日函数与KKT条件

拉格朗日函数将约束融入目标函数,提供了处理约束优化的基本框架:

\[ \mathcal{L}(x, \lambda, \nu) = f(x) + \sum_{i=1}^m \lambda_i g_i(x) + \sum_{j=1}^p \nu_j h_j(x) \]

其中\(\lambda_i \geq 0\)是不等式约束的拉格朗日乘子,\(\nu_j\)是等式约束的乘子。拉格朗日函数的引入将原始约束问题转化为关于\(x\)\(\lambda\)\(\nu\)的无约束问题。通过分析拉格朗日函数的鞍点,我们可以得到原约束优化问题的最优性条件。

对于约束优化问题,KKT条件(Karush-Kuhn-Tucker conditions)是最优性的必要条件(在高阶约束 Qualification 满足时也是充分条件)。KKT条件包括以下四个部分:

  1. 平稳性条件\(\nabla f(x^*) + \sum_i \lambda_i^* \nabla g_i(x^*) + \sum_j \nu_j^* \nabla h_j(x^*) = 0\)

  2. 原始可行性\(g_i(x^*) \leq 0\)\(h_j(x^*) = 0\)

  3. 对偶可行性\(\lambda_i^* \geq 0\)

  4. 互补松弛条件\(\lambda_i^* g_i(x^*) = 0\) for all \(i\)

KKT条件表明,在最优解处,目标函数的梯度可以表示为约束梯度的线性组合。互补松弛条件\(\lambda_i^* g_i(x^*) = 0\)意味着只有活跃约束(\(g_i(x^*) = 0\))才对应非零乘子。理解KKT条件对于设计约束优化算法和理解正则化技术的本质至关重要。例如,L2权重衰减(\(\|w\|_2^2 \leq c\))对应的KKT条件解释了为什么正则化项的梯度会推动参数向零收缩:当解不在约束边界上时,乘子为零,梯度为零给出无约束极小点;当解在约束边界上时,梯度必须与约束法向量对齐,这导致了参数收缩。

5.3 罚函数方法

罚函数法通过在目标函数中加入惩罚项来将约束优化转化为无约束优化。外点罚函数对违反约束的点施加惩罚:

\[ F(x; \mu) = f(x) + \mu \sum_{i=1}^m \max(0, g_i(x))^\beta + \mu \sum_{j=1}^p |h_j(x)|^\beta \]

其中\(\mu > 0\)是惩罚参数,\(\beta\)通常取1(二次罚)或2(势罚)。随着\(\mu \to \infty\),约束违反的代价趋于无穷,迫使迭代点保持在可行集内。然而,当\(\mu\)很大时,优化问题本身变得病态,因为目标函数的曲率被惩罚项主导,搜索方向变得病态。外点罚函数的主要缺点是随着\(\mu\)增大,问题条件数变差,导致后续迭代收敛缓慢。

障碍函数法则相反,只允许在可行集内部迭代。对于不等式约束,引入障碍项:

\[ F(x; \mu) = f(x) - \mu \sum_{i=1}^m \log(-g_i(x)) \]

\(x\)接近约束边界(\(g_i(x) \to 0\))时,障碍项趋于无穷大,阻止迭代越过边界。障碍函数法,也称内点法,通过跟踪\(\mu\)逐渐减小时的解轨迹来求解约束优化问题。每一步求解时,\(\mu\)相对较大使问题更容易优化(曲率较小);随着迭代进行,逐步减小\(\mu\)以提高解的精度。这种路径跟随方法在实践中非常有效,是当前主流约束优化算法的基础。

5.4 投影梯度法与近端方法

对于简单约束(如箱约束\(x_i \in [l_i, u_i]\)或球约束\(\|x\|_2 \leq r\)),投影梯度法将梯度下降与投影操作结合:

\[ x^{(t+1/2)} = x^{(t)} - \alpha \nabla f(x^{(t)}) \quad \text{(梯度步)} $$ $$ x^{(t+1)} = \Pi_{\mathcal{C}}(x^{(t+1/2)}) \quad \text{(投影步)} \]

其中\(\Pi_{\mathcal{C}}\)是到可行集\(\mathcal{C}\)的投影。对于欧氏范数球约束,投影到半径为\(r\)的球上的操作简单地将\(x\)缩放到范数为\(r\)(如果\(\|x\| > r\)),即:

\[ \Pi_{\{||x|| \leq r\}}(v) = \frac{r}{\|v\|} v \quad \text{当} \|v\| > r \text{时} \]

对于箱约束,投影操作逐元素地将值截断在给定范围内:

\[ \Pi_{[l, u]}(v)_i = \min(\max(v_i, l_i), u_i) \]

近端梯度法将目标函数分解为光滑项和非光滑项的组合:

\[ \min_x \ f(x) + g(x) \]

其中\(f\)是光滑可微的,\(g\)是非光滑但有近端算子的函数。近端梯度法的迭代为:

\[ x^{(t+1)} = \text{prox}_{\alpha g}(x^{(t)} - \alpha \nabla f(x^{(t)})) \]

近端算子\(\text{prox}_g(x) = \arg\min_y \{ g(y) + \frac{1}{2}\|y - x\|^2 \}\)对于许多非光滑正则化项如\(L^1\)范数、指示函数等有闭式解。例如,对于L1正则化,近端算子就是软阈值操作:

\[ \text{prox}_{\lambda \|x\|_1}(x) = \text{soft}(x, \lambda)_i = \begin{cases} x_i - \lambda & \text{if } x_i > \lambda \\ 0 & \text{if } |x_i| \leq \lambda \\ x_i + \lambda & \text{if } x_i < -\lambda \end{cases} \]

这使得近端梯度法成为稀疏优化的有效工具,也是lasso回归等问题的标准求解方法。交替方向乘子法(ADMM)是另一种处理约束优化的流行方法,通过将问题分解和交替优化来有效处理大规模分布式约束问题,在统计学习、信号处理和深度学习模型压缩中有广泛应用。


第六节:Jacobian矩阵与Hessian矩阵——多元微分的关键工具

6.1 Jacobian矩阵的定义与性质

Jacobian矩阵是多元向量值函数的一阶导数推广。设\(f: \mathbb{R}^n \to \mathbb{R}^m\)是一个从\(n\)维输入到\(m\)维输出的向量值函数,\(f = (f_1, f_2, \ldots, f_m)\),其中每个\(f_i: \mathbb{R}^n \to \mathbb{R}\)。Jacobian矩阵定义为:

\[ J(x) = \frac{\partial f}{\partial x} = \begin{pmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \cdots & \frac{\partial f_1}{\partial x_n} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_2}{\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_m}{\partial x_1} & \frac{\partial f_m}{\partial x_2} & \cdots & \frac{\partial f_m}{\partial x_n} \end{pmatrix}_{m \times n} \]

Jacobian矩阵的每一行是相应输出分量对输入向量的梯度。当\(m=1\)时,Jacobian矩阵退化为普通梯度向量。Jacobian矩阵在链式法则中扮演核心角色:若\(z = f(y)\)\(y = g(x)\),则\(\frac{\partial z}{\partial x} = \frac{\partial z}{\partial y} \frac{\partial y}{\partial x}\),即Jacobian的乘积。这允许我们计算深层神经网络中损失函数关于各层参数梯度的反向传播。在计算机科学中,Jacobian矩阵的张量流表示是现代深度学习框架自动微分的基础,也是理解梯度传播机制的关键数学工具。

6.2 Hessian矩阵的定义与性质

Hessian矩阵是标量函数\(f: \mathbb{R}^n \to \mathbb{R}\)的二阶导数矩阵,定义为梯度向量的Jacobian:

\[ H(x) = \nabla^2 f(x) = \frac{\partial^2 f}{\partial x^2} = \begin{pmatrix} \frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \\ \frac{\partial^2 f}{\partial x_2 \partial x_1} & \frac{\partial^2 f}{\partial x_2^2} & \cdots & \frac{\partial^2 f}{\partial x_2 \partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 f}{\partial x_n \partial x_1} & \frac{\partial^2 f}{\partial x_n \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_n^2} \end{pmatrix}_{n \times n} \]

对于光滑函数,Hessian是对称矩阵(Clairaut定理保证混合偏导可交换顺序)。Hessian矩阵的特征值分解揭示了目标函数的曲率特性:特征向量方向上的二阶导数等于对应特征值。正特征值表示该方向向上弯(局部极小点方向),负特征值表示向下弯(局部极大点或鞍点方向),零特征值表示平坦方向。在深度学习中,Hessian矩阵的这些性质对于理解优化 landscape、诊断收敛困难、以及设计更好的优化算法都至关重要。例如,通过分析Hessian的特征值,我们可以判断当前点是否为鞍点,以及在不同方向上的曲率如何影响梯度下降的行为。

6.3 深度学习中的Jacobian与Hessian应用

在深度学习中,Jacobian矩阵用于分析神经网络输入输出关系和梯度流。对于损失函数\(L = f(W^{(L)}, \ldots, W^{(1)})\),反向传播算法本质上是在计算Jacobian的链式乘积:

\[ \frac{\partial L}{\partial W^{(l)}} = \frac{\partial L}{\partial a^{(L)}} \cdot \frac{\partial a^{(L)}}{\partial a^{(L-1)}} \cdots \frac{\partial a^{(l+1)}}{\partial a^{(l)}} \cdot \frac{\partial a^{(l)}}{\partial W^{(l)}} \]

Jacobian范数\(\|J\|_2\)与网络的Lipschitz常数密切相关,影响网络的稳定性和泛化特性。梯度爆炸和梯度消失问题可以从Jacobian谱范数的角度理解:如果每层的Jacobian范数都大于1,梯度会指数增长;如果都小于1,梯度会指数衰减。残差连接通过使每层的Jacobian接近恒等矩阵,从而稳定梯度流动。谱归一化通过对网络进行谱范数约束来保证网络的Lipschitz连续性,这对于Wasserstein GAN等应用至关重要。

Hessian矩阵在以下场景中尤为重要:

二阶优化方法:如牛顿法需要\(H^{-1}\nabla f\)。虽然精确Hessian计算在大型网络中不可行,但Hessian-vector乘积\(\nabla^2 f(x) v\)可以通过反向传播高效计算:先计算关于\(x\)的梯度,再计算该梯度关于\(x\)的方向导数,即\((\nabla^2 f) v = \nabla(\nabla f \cdot v)\)。这不需要显式形成完整Hessian矩阵,使得二阶方法在大规模问题中变得可行。K-FAC(Kronecker-Factored Approximate Curvature)等方法通过对Hessian进行结构化近似,在保持二阶信息的同时大幅降低计算和存储成本。

曲率分析:Hessian的特征值分布反映了损失景观的曲率。最大特征值控制最速下降方向的收敛速度,最小特征值(接近零)表明存在平坦方向。条件数\(\kappa(H) = \lambda_{\max}/\lambda_{\min}\)越大,优化越困难。基于Hessian的谱分析工具可以帮助诊断训练困难,识别病态区域,以及理解不同优化算法的收敛行为。

自然梯度法:需要用到Fisher信息矩阵\(F = \mathbb{E}_{x \sim p_{\text{model}}} [J_{\log p}(x) J_{\log p}(x)^T]\),这是对数概率模型Jacobian的外积。自然梯度法将参数更新方向从欧氏空间转换为概率分布空间,在信息几何意义上更加自然,可以避免普通梯度下降在参数空间中的非均匀缩放问题。自然梯度在强化学习中的策略优化、变分推断中的平均场近似等场景有重要应用。


第七节:线搜索与共轭梯度法

7.1 线搜索的基本框架

线搜索是优化算法中确定步长的关键技术。在每一步迭代中,线搜索在给定的搜索方向\(p^{(t)}\)上寻找最优步长\(\alpha_t\)

\[ \alpha_t = \arg\min_{\alpha > 0} \ f(x^{(t)} + \alpha p^{(t)}) \]

精确线搜索要求找到沿该方向的全局最优步长,对于二次函数这可以通过解析公式\(\alpha^* = \frac{p^{T} b}{p^{T} A p}\)求解,但通常计算代价过高,特别是在函数形式复杂或计算成本高昂的情况下。在实际应用中,近似线搜索更为实用,因为它在可接受的计算成本下通常能够提供足够的步长精度。

回溯线搜索以计算量可控的方式找到一个"足够好"的步长:从大步长开始,不断收缩直到满足Armijo条件:

\[ f(x^{(t)} + \alpha p^{(t)}) \leq f(x^{(t)}) + c_1 \alpha \nabla f(x^{(t)})^T p^{(t)} \]

其中\(c_1 \in (0, 0.5)\)是收缩参数,通常取\(c_1 = 10^{-4}\)。Armijo条件确保步长使得函数值有足够下降。同时为避免步长过小,通常还要求满足曲率条件或Goldsfeld-ttw conditions:

\[ \nabla f(x^{(t)} + \alpha p^{(t)})^T p^{(t)} \geq c_2 \nabla f(x^{(t)})^T p^{(t)} \]

其中\(c_2 \in (c_1, 1)\),通常取\(c_2 = 0.9\)。Wolfe条件是Armijo条件和曲率条件的组合,是许多优化算法的标准线搜索终止准则,确保步长既不过大也不过小。线搜索与梯度下降、牛顿法等结合,构成了完整的优化框架,是大多数科学计算优化库的核心组件。

7.2 共轭梯度法的理论基础

共轭梯度法是求解大型稀疏线性系统\(Ax = b\)(其中\(A\)对称正定)的高效迭代算法,也可推广用于无约束非线性优化。其核心思想是在\(A\)-共轭方向上进行搜索,每一步都消除残差在当前搜索方向上的分量,从而在最多\(n\)步(\(n\)为维度)内收敛到精确解。这种有限步收敛的特性使共轭梯度法成为求解大型线性系统的首选方法之一。

一组方向\(\{p^{(0)}, p^{(1)}, \ldots, p^{(k)}\}\)称为\(A\)-共轭,如果\(p^{(i)T} A p^{(j)} = 0\) for all \(i \neq j\)。共轭正交性是正交性的更强形式:\(n\)个非零共轭方向必定线性无关,因此最多\(n\)个方向即可张成整个空间。共轭方向具有正交性类似的优良性质,但更强大:沿共轭方向依次精确最小化二次函数,每一步都完全消除在该方向上的误差,且不影响之前方向上的优化结果。这使得共轭梯度法在处理二次优化问题时具有极高的效率。

共轭梯度法的算法流程如下:

\[ r^{(0)} = b - Ax^{(0)}, \quad p^{(0)} = r^{(0)} $$ $$ \alpha^{(t)} = \frac{r^{(t)T} r^{(t)}}{p^{(t)T} A p^{(t)}} $$ $$ x^{(t+1)} = x^{(t)} + \alpha^{(t)} p^{(t)} $$ $$ r^{(t+1)} = r^{(t)} - \alpha^{(t)} A p^{(t)} $$ $$ \beta^{(t)} = \frac{r^{(t+1)T} r^{(t+1)}}{r^{(t)T} r^{(t)}} $$ $$ p^{(t+1)} = r^{(t+1)} + \beta^{(t)} p^{(t)} \]

其中\(r^{(t)}\)是第\(t\)步的残差,\(p^{(t)}\)是搜索方向。共轭梯度法的每一步迭代只需要一次矩阵-向量乘积,计算复杂度为\(O(n)\),远低于牛顿法的\(O(n^3)\),使得它能够处理大规模问题。在深度学习中,共轭梯度法可用于训练神经网络,特别是在需要精确求解线性系统的场景如基于Hessian-free优化的二阶方法。

7.3 非线性共轭梯度法

对于一般非线性目标函数,共轭梯度法的思想通过各种非线性共轭梯度法得到推广。关键修改包括使用变化的曲率信息(用Hessian或近似Hessian作用在搜索方向上)和新的\(\beta\)计算公式。Fletcher-Reeves公式和Polak-Ribière公式是两种常用的\(\beta\)计算方式:

\[ \beta_{FR}^{(t)} = \frac{r^{(t+1)T} r^{(t+1)}}{r^{(t)T} r^{(t)}}, \quad \beta_{PR}^{(t)} = \frac{r^{(t+1)T}(r^{(t+1)} - r^{(t)})}{r^{(t)T} r^{(t)}} \]

Fletcher-Reeves公式在理论上具有良好的收敛性保证,但Polak-Ribière公式在实践中往往表现更好,特别是在非精确线搜索的情况下。非线性共轭梯度法通常需要配合重置策略:每隔\(n\)步或当方向变得不下降时(即\(\nabla f(x^{(t)})^T p^{(t)} > 0\)),将搜索方向重置为负梯度方向。实践表明,在深度学习中,对于某些大规模问题,适当调优的共轭梯度法比标准随机梯度下降收敛更快,特别是在需要较少迭代但每次迭代计算量较大的场景。

7.4 Krylov子空间与预条件技术

共轭梯度法属于Krylov子空间方法,每次迭代在由初始残差生成的Krylov子空间\(\mathcal{K}_k = \text{span}\{r^{(0)}, A r^{(0)}, A^2 r^{(0)}, \ldots, A^{k-1} r^{(0)}\}\)中寻找近似解。Krylov子空间的维度随迭代增加,是原问题维度的高效低维近似。Krylov子空间方法的核心优势在于它只需要矩阵-向量乘积,不需要显式存储矩阵,这使得它特别适合求解大型稀疏线性系统。在深度学习中,许多涉及大型矩阵的问题都可以用Krylov子空间方法处理。

预条件通过引入易求逆的矩阵\(M\)来改善系统矩阵的条件数,将原问题\(Ax = b\)转化为\(M^{-1}Ax = M^{-1}b\)或等价形式。理想的预条件子\(M \approx A\)\(M^{-1}\)计算便捷。常见的预条件子包括对角预条件子(取\(M = \text{diag}(A)\),计算简单但效果有限)、不完全Cholesky分解(近似Cholesky因子,提供更好的近似但计算成本较高)、以及基于稀疏近似的预条件子。在深度学习中,Adam的自适应学习率可以视为一种在线预条件技术,它根据历史梯度信息动态调整参数空间的度量,使得优化过程在条件数较差的参数方向上也能有效前进。自然梯度也是基于信息几何的预条件方法,使用Fisher信息矩阵作为参数空间的度量。


附录:关键公式汇总表

公式名称 数学表达式 应用场景
softmax稳定化 \(\text{softmax}(x)_i = \frac{\exp(x_i - \max_j x_j)}{\sum_j \exp(x_j - \max_j x_j)}\) 避免上溢/下溢
矩阵条件数 \(\kappa(A) = \|A\| \cdot \|A^{-1}\| = \frac{\sigma_{\max}(A)}{\sigma_{\min}(A)}\) 问题敏感性分析
梯度下降更新 \(x^{(t+1)} = x^{(t)} - \alpha \nabla f(x^{(t)})\) 参数优化基础
牛顿法更新 \(x^{(t+1)} = x^{(t)} - H(x^{(t)})^{-1} \nabla f(x^{(t)})\) 二阶优化
Adam更新 \(\theta^{(t+1)} = \theta^{(t)} - \alpha \frac{\hat{m}^{(t)}}{\sqrt{\hat{v}^{(t)}} + \epsilon}\) 自适应学习率优化
拉格朗日函数 \(\mathcal{L}(x, \lambda, \nu) = f(x) + \sum_i \lambda_i g_i(x) + \sum_j \nu_j h_j(x)\) 约束优化
Jacobian矩阵 \(J_{ij} = \frac{\partial f_i}{\partial x_j}\) 多元向量函数微分
Hessian矩阵 \(H_{ij} = \frac{\partial^2 f}{\partial x_i \partial x_j}\) 二阶导数/曲率
共轭梯度步长 \(\alpha^{(t)} = \frac{r^{(t)T} r^{(t)}}{p^{(t)T} A p^{(t)}}\) 线性系统求解
Armijo条件 \(f(x^{(t)} + \alpha p^{(t)}) \leq f(x^{(t)}) + c_1 \alpha \nabla f^T p^{(t)}\) 线搜索停止准则

本章小结

本章系统介绍了深度学习中数值计算的核心概念与技术。首先,上溢和下溢是计算机浮点数系统的固有局限,数值稳定的算法设计通过巧妙的数学变换规避这些风险。softmax函数通过对每个输入减去最大值来避免指数运算的上溢和下溢问题,这是一个典型的数值稳定设计实例,展示了如何通过简单的数学恒等变换来解决实际的数值问题。这些技巧在深度学习框架的张量运算库中无处不在,是保证训练稳定性的基础。

其次,病态条件数揭示了问题本身对扰动敏感的程度,理解条件数对于诊断优化困难至关重要。条件数很大的矩阵会导致误差被剧烈放大,影响算法的可靠性。在深度学习中,病态优化问题广泛存在,批归一化、权重初始化、残差连接等技术的引入很大程度上是为了改善条件数,使得优化问题变得更容易求解。这些技术已经成为现代深度学习网络的标配组件。

梯度下降法作为深度学习训练的基石,其收敛速度直接受问题条件数影响,学习率调度策略和动量技术是实践中的重要改进。合适的学习率选择和动态调整策略可以显著加速收敛,并帮助跳出局部极小。学习率调度策略如余弦退火热重启等在竞赛和实际应用中取得优异成绩,证明了自适应学习率调整的重要性。

牛顿法利用二阶曲率信息实现快速收敛,但计算代价限制了其直接应用,拟牛顿法和自适应学习率方法提供了实用的折中。Adam优化器结合了一阶矩估计和二阶矩估计的自适应调整,成为当前最流行的深度学习优化器。理解二阶方法的原理有助于设计更好的优化算法和诊断训练困难。

约束优化通过KKT条件、拉格朗日函数和罚函数法将约束融入优化框架。理解KKT条件有助于把握约束优化问题的本质和正则化技术的机理。投影梯度法和近端梯度法为特定结构的约束问题提供了高效解决方案,在模型压缩、稀疏学习等场景有重要应用。

Jacobian和Hessian矩阵是处理多元微分的关键工具,分别对应一阶和二阶导数信息,在反向传播和二阶优化中扮演核心角色。Jacobian矩阵推广了向量值函数的导数概念,而Hessian矩阵捕捉了目标函数的曲率信息。这些矩阵分析工具是理解深度学习优化过程的数学基础。

线搜索与共轭梯度法代表了优化算法的两个重要方向:前者解决步长选择问题,后者提供高效的方向搜索策略。共轭梯度法通过在共轭方向序列上搜索,在有限步内精确求解二次优化问题。Krylov子空间方法和预条件技术进一步扩展了共轭梯度法的应用范围。

掌握这些数值计算基础,对于理解现代深度学习优化器的设计原理和进行高质量的算法研究都是不可或缺的。这些基础知识构成了深度学习数学理论的核心组成部分,为进一步学习和研究深度学习奠定了坚实基础,也是每一位深度学习研究人员和工程师必须掌握的内容。