数值计算 --- 知识点详解
一、上溢和下溢(Overflow and Underflow)
1.1 基本概念
下溢(Underflow): 当接近零的数被四舍五入为零时发生。例如,在浮点数表示中,一个极小的正数(如 10−4010^{-40}10−40)可能超出浮点数能表示的最小范围,被直接截断为 000。
上溢(Overflow): 当数值过大,超出了浮点数能表示的最大范围时发生。例如,计算 e1000e^{1000}e1000 会产生 inf(无穷大)。
1.2 为什么重要
在数值计算中,许多数学表达式在理论上是良定义的,但在有限精度的计算机上执行时会出现问题:
- Softmax 函数中的下溢: softmax(xi)=exi∑jexj\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}softmax(xi)=∑jexjexi,当 xix_ixi 为很大的负数时,exi→0e^{x_i} \to 0exi→0,发生下溢;当 xix_ixi 为很大的正数时,exi→∞e^{x_i} \to \inftyexi→∞,发生上溢。
- 解决办法: 使用 softmax(xi−maxjxj)\text{softmax}(x_i - \max_j x_j)softmax(xi−maxjxj),即减去最大值,确保指数的输入不超过 0,避免上溢,同时不改变结果。
1.3 典型的数值稳定化技巧
| 技巧 | 公式 | 作用 |
|---|---|---|
| log-sum-exp 技巧 | log∑iexi=c+log∑iexi−c\log\sum_i e^{x_i} = c + \log\sum_i e^{x_i - c}log∑iexi=c+log∑iexi−c,取 c=maxixic = \max_i x_ic=maxixi | 避免指数上溢 |
| Softmax 平移 | softmax(x−max(x))\text{softmax}(x - \max(x))softmax(x−max(x)) | 避免指数上溢 |
| 使用对数空间 | 在对数域中做乘法变为加法 | 避免极小概率连乘下溢 |
避免 log(0) |
加一个微小常数 ϵ\epsilonϵ(如 10−810^{-8}10−8) | 防止对数下溢 |
1.4 机器学习中的影响
- 条件概率计算: 连乘大量概率值(如语言模型中长句子的概率)会导致严重的下溢,因此通常在对数空间中计算。
- 高斯分布的 PDF: 计算 N(x∣μ,σ2)=12πσexp(−(x−μ)22σ2)N(x|\mu, \sigma^2) = \frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)N(x∣μ,σ2)=2π σ1exp(−2σ2(x−μ)2) 时,指数部分可能很大或很小。
二、病态条件(Poor Conditioning)
2.1 基本定义
条件数(Condition Number): 对于函数 f(x)=A−1xf(x) = A^{-1}xf(x)=A−1x,其中 A∈Rn×nA \in \mathbb{R}^{n \times n}A∈Rn×n 为方阵,条件数定义为:
cond(A)=∥A∥⋅∥A−1∥\text{cond}(A) = \|A\| \cdot \|A^{-1}\|cond(A)=∥A∥⋅∥A−1∥
当使用 L2L^2L2 范数时,条件数等于矩阵 AAA 的最大奇异值与最小奇异值之比:
cond(A)=σmax(A)σmin(A)\text{cond}(A) = \frac{\sigma_{\max}(A)}{\sigma_{\min}(A)}cond(A)=σmin(A)σmax(A)
2.2 直观理解
- 条件数小(接近 1):矩阵是"良态"的,输入的小扰动只会引起输出的小变化。
- 条件数大:矩阵是"病态"的,输入的微小扰动(如浮点误差)会被极大地放大,导致输出结果严重失真。
2.3 对机器学习的影响
- 线性方程组求解: 求解 Ax=bAx = bAx=b 时,如果 AAA 的条件数很大,即使 bbb 中有极小的误差,解 xxx 也会产生巨大的偏差。
- 梯度下降中的影响: 当 Hessian 矩阵的条件数很大时,损失函数的等高线呈极度扁平的椭圆形,梯度方向与最优方向偏差很大,导致优化过程中出现锯齿形震荡,收敛速度极慢。
- 矩阵求逆: 病态矩阵的逆矩阵中元素值非常大,放大了数值误差。
2.4 数学示例
考虑矩阵:
A=(1111.0001)A = \begin{pmatrix} 1 & 1 \\ 1 & 1.0001 \end{pmatrix}A=(1111.0001)
- AAA 的条件数约为 4×1044 \times 10^44×104
- 若 b=(22)b = \begin{pmatrix} 2 \\ 2 \end{pmatrix}b=(22),则 x=(20)x = \begin{pmatrix} 2 \\ 0 \end{pmatrix}x=(20)
- 若 bbb 变为 (22.0001)\begin{pmatrix} 2 \\ 2.0001 \end{pmatrix}(22.0001),则 xxx 变化巨大
2.5 缓解方法
- 正则化: 给矩阵加上 λI\lambda IλI,使 A+λIA + \lambda IA+λI 的条件数改善
- 预处理(Preconditioning): 使用预处理矩阵改善迭代方法的收敛性
- 数值分解: 使用 SVD、QR 分解等数值稳定的分解方法
三、基于梯度的优化方法
3.1 为什么使用梯度
- 导数的含义: 导数 f′(x)f'(x)f′(x) 表示函数 fff 在 xxx 处沿 xxx 轴正方向的变化率。
- 梯度的含义: 梯度 ∇xf(x)\nabla_x f(x)∇xf(x) 是导数的多变量推广,它指向函数值增长最快的方向,其大小表示该方向上的变化率。
- 优化核心思想: 沿梯度的反方向移动可以减小函数值,这就是梯度下降的本质。
3.2 梯度下降法(Gradient Descent)
更新公式:
xk+1=xk−η∇xf(xk)x_{k+1} = x_k - \eta \nabla_x f(x_k)xk+1=xk−η∇xf(xk)
其中 η\etaη 为学习率(步长)。
基本形式分类:
| 方法 | 描述 | 特点 |
|---|---|---|
| 批量梯度下降(BGD) | 使用全部数据计算梯度 | 精确但慢 |
| 随机梯度下降(SGD) | 使用单个样本计算梯度 | 快但噪声大 |
| 小批量梯度下降(Mini-batch GD) | 使用一个 mini-batch 计算梯度 | 折中方案 |
3.3 Jacobian 矩阵
对于函数 f:Rm→Rnf: \mathbb{R}^m \to \mathbb{R}^nf:Rm→Rn,Jacobian 矩阵 J∈Rn×mJ \in \mathbb{R}^{n \times m}J∈Rn×m 定义为:
Ji,j=∂f(x)i∂xjJ_{i,j} = \frac{\partial f(x)_i}{\partial x_j}Ji,j=∂xj∂f(x)i
当 fff 为标量函数时,Jacobian 矩阵退化为梯度(行向量)。
3.4 Hessian 矩阵
对于二阶偏导数信息,Hessian 矩阵 H∈Rn×nH \in \mathbb{R}^{n \times n}H∈Rn×n 定义为:
Hi,j=∂2f∂xi∂xjH_{i,j} = \frac{\partial^2 f}{\partial x_i \partial x_j}Hi,j=∂xi∂xj∂2f
重要性质:
- 对称性: 当二阶偏导数连续时,Hessian 矩阵是对称的(由 Schwarz 定理保证)。
- 正定性与极值:
- HHH 正定 → 局部极小值
- HHH 负定 → 局部极大值
- HHH 不定 → 鞍点
- 二阶泰勒展开:
f(x)≈f(x0)+(x−x0)Tg+12(x−x0)TH(x−x0)f(x) \approx f(x_0) + (x - x_0)^T g + \frac{1}{2}(x - x_0)^T H (x - x_0)f(x)≈f(x0)+(x−x0)Tg+21(x−x0)TH(x−x0)
其中 g=∇f(x0)g = \nabla f(x_0)g=∇f(x0)。
3.5 Hessian 在优化中的作用
- 最速下降方向: −g-g−g(负梯度方向)
- 牛顿方向: −H−1g-H^{-1}g−H−1g(利用二阶信息)
- 当 Hessian 的条件数很大时,梯度下降会在陡峭方向震荡、在平坦方向进展缓慢
- Hessian 矩阵决定了梯度下降的有效学习率:在 Hessian 特征值大的方向上,等效学习率大;特征值小的方向上,等效学习率小
3.6 局部极小值 vs 鞍点
- 局部极小值: 在该点的所有方向上,函数值都不小于该点的函数值。
- 鞍点(Saddle Point): 在某些方向上是极小值,在另一些方向上是极大值。
- 高维空间中鞍点远多于局部极小值: 在 nnn 维空间中,Hessian 矩阵有 nnn 个特征值,全部同号的概率随维度增大而指数级减小。因此在高维空间中,鞍点是更常见的临界点。
3.7 牛顿法(Newton's Method)
更新公式:
xk+1=xk−H−1gx_{k+1} = x_k - H^{-1}gxk+1=xk−H−1g
优点:
- 利用二阶曲率信息,收敛速度快(二阶收敛)
- 在极小值附近,步长自适应调整
缺点:
- 需要计算和存储 Hessian 矩阵,计算复杂度 O(n2)O(n^2)O(n2)
- 需要求解线性方程组 HΔx=gH\Delta x = gHΔx=g,复杂度 O(n3)O(n^3)O(n3)
- 当 HHH 非正定时(如鞍点附近),牛顿法可能朝错误方向移动
3.8 梯度下降的收敛性
- 对于凸函数,梯度下降可以收敛到全局最小值
- 对于非凸函数,梯度下降只能保证收敛到驻点(梯度为零的点),可能是局部极小值或鞍点
- 学习率的选择至关重要:
- 太大 → 震荡甚至发散
- 太小 → 收敛极慢
- 常用学习率调度策略:阶梯衰减、余弦退火、指数衰减
3.9 优化算法中的动量(Momentum)
带动量的 SGD:
vk+1=αvk−η∇f(xk)v_{k+1} = \alpha v_k - \eta \nabla f(x_k)vk+1=αvk−η∇f(xk)
xk+1=xk+vk+1x_{k+1} = x_k + v_{k+1}xk+1=xk+vk+1
- α\alphaα 为动量系数(通常取 0.9)
- 物理类比:小球在损失面上滚动,动量使其在一致方向上加速,在震荡方向上抑制
- 可以加速收敛并减少震荡
四、约束优化(Constrained Optimization)
4.1 基本形式
约束优化问题的一般形式:
minxf(x)\min_x f(x)xminf(x)
s.t. g(x)≤0(不等式约束,m 个)\text{s.t. } g(x) \leq 0 \quad \text{(不等式约束,} m \text{ 个)}s.t. g(x)≤0(不等式约束,m 个)
s.t. h(x)=0(等式约束,p 个)\text{s.t. } h(x) = 0 \quad \text{(等式约束,} p \text{ 个)}s.t. h(x)=0(等式约束,p 个)
4.2 可行域(Feasible Region)
- 满足所有约束条件的 xxx 的集合构成可行域
- 优化只能在可行域内进行
- 最优解可能在可行域内部或边界上
4.3 Karush-Kuhn-Tucker (KKT) 条件
KKT 条件是约束优化问题的最优性必要条件(在满足一定正则性条件下)。
引入拉格朗日函数:
L(x,λ,μ)=f(x)+∑i=1mλigi(x)+∑j=1pμjhj(x)L(x, \lambda, \mu) = f(x) + \sum_{i=1}^m \lambda_i g_i(x) + \sum_{j=1}^p \mu_j h_j(x)L(x,λ,μ)=f(x)+i=1∑mλigi(x)+j=1∑pμjhj(x)
其中 λi\lambda_iλi 和 μj\mu_jμj 为拉格朗日乘子。
KKT 四个条件:
-
驻点条件(Stationarity): ∇xL(x∗,λ∗,μ∗)=0\nabla_x L(x^*, \lambda^*, \mu^*) = 0∇xL(x∗,λ∗,μ∗)=0
-
原始可行性(Primal Feasibility):
- gi(x∗)≤0,i=1,...,mg_i(x^*) \leq 0, \quad i = 1, \dots, mgi(x∗)≤0,i=1,...,m
- hj(x∗)=0,j=1,...,ph_j(x^*) = 0, \quad j = 1, \dots, phj(x∗)=0,j=1,...,p
-
对偶可行性(Dual Feasibility): λi∗≥0,i=1,...,m\lambda_i^* \geq 0, \quad i = 1, \dots, mλi∗≥0,i=1,...,m
-
互补松弛条件(Complementary Slackness): λi∗gi(x∗)=0,i=1,...,m\lambda_i^* g_i(x^*) = 0, \quad i = 1, \dots, mλi∗gi(x∗)=0,i=1,...,m
4.4 互补松弛条件的直观含义
- 若 λi∗>0\lambda_i^* > 0λi∗>0,则必须 gi(x∗)=0g_i(x^*) = 0gi(x∗)=0(约束是"紧"的/active)
- 若 gi(x∗)<0g_i(x^*) < 0gi(x∗)<0(约束是"松"的/inactive),则 λi∗=0\lambda_i^* = 0λi∗=0
- 直观理解:只有当约束对最优解有"束缚"时,对应的乘子才不为零
4.5 等式约束的处理
- 等式约束 hj(x)=0h_j(x) = 0hj(x)=0 可以看作同时满足 hj(x)≤0h_j(x) \leq 0hj(x)≤0 和 hj(x)≥0h_j(x) \geq 0hj(x)≥0
- 等式约束对应的乘子 μj\mu_jμj 不受符号限制(可正可负)
4.6 拉格朗日对偶性(Lagrangian Duality)
原始问题: minxmaxλ≥0,μL(x,λ,μ)\min_x \max_{\lambda \geq 0, \mu} L(x, \lambda, \mu)minxmaxλ≥0,μL(x,λ,μ)
对偶问题: maxλ≥0,μminxL(x,λ,μ)\max_{\lambda \geq 0, \mu} \min_x L(x, \lambda, \mu)maxλ≥0,μminxL(x,λ,μ)
弱对偶性: 对偶问题的最优值 ≤\leq≤ 原始问题的最优值(总是成立)
强对偶性: 对偶问题的最优值 === 原始问题的最优值(在 Slater 条件下成立)
- Slater 条件: 存在一个严格可行点(对于不等式约束,存在 xxx 使 gi(x)<0g_i(x) < 0gi(x)<0)
- 凸优化 + Slater 条件 → 强对偶性成立
4.7 支持向量机中的应用
- SVM 的对偶形式就是通过 KKT 条件推导得到的
- 互补松弛条件意味着只有支持向量的拉格朗日乘子不为零
- 核方法的使用依赖于对偶形式
4.8 常见的约束优化方法
| 方法 | 描述 |
|---|---|
| 投影法 | 将梯度下降的结果投影回可行域 |
| 罚函数法 | 将约束违反作为罚项加入目标函数 |
| 增广拉格朗日法 | 结合罚函数和拉格朗日乘子法 |
| 内点法(障碍法) | 在可行域边界设置"障碍",防止越界 |
| 拉格朗日乘子法 | 通过引入乘子将约束优化转化为无约束优化 |
五、实例:线性最小二乘(Linear Least Squares)
5.1 问题定义
给定数据集 {(x(1),y(1)),...,(x(m),y(m))}\{(x^{(1)}, y^{(1)}), \dots, (x^{(m)}, y^{(m)})\}{(x(1),y(1)),...,(x(m),y(m))},线性回归模型为:
y^=Xw\hat{y} = Xwy^=Xw
其中 X∈Rm×nX \in \mathbb{R}^{m \times n}X∈Rm×n 为设计矩阵,w∈Rnw \in \mathbb{R}^nw∈Rn 为参数向量。
目标函数(最小化均方误差):
J(w)=12∥Xw−y∥22=12(Xw−y)T(Xw−y)J(w) = \frac{1}{2} \|Xw - y\|_2^2 = \frac{1}{2}(Xw - y)^T(Xw - y)J(w)=21∥Xw−y∥22=21(Xw−y)T(Xw−y)
5.2 无约束情况
梯度计算:
∇wJ(w)=XT(Xw−y)\nabla_w J(w) = X^T(Xw - y)∇wJ(w)=XT(Xw−y)
推导过程:
J(w)=12(Xw−y)T(Xw−y)=12(wTXTXw−2wTXTy+yTy)J(w) = \frac{1}{2}(Xw - y)^T(Xw - y) = \frac{1}{2}(w^TX^TXw - 2w^TX^Ty + y^Ty)J(w)=21(Xw−y)T(Xw−y)=21(wTXTXw−2wTXTy+yTy)
∇wJ(w)=XTXw−XTy=XT(Xw−y)\nabla_w J(w) = X^TXw - X^Ty = X^T(Xw - y)∇wJ(w)=XTXw−XTy=XT(Xw−y)
令梯度为零(正规方程/Normal Equation):
XTXw=XTyX^TXw = X^TyXTXw=XTy
w∗=(XTX)−1XTyw^* = (X^TX)^{-1}X^Tyw∗=(XTX)−1XTy
条件: XTXX^TXXTX 必须可逆(非奇异)
5.3 XTXX^TXXTX 不可逆的情况
当 XTXX^TXXTX 不可逆时(特征数 > 样本数,或特征线性相关),需要处理:
- 方法一: 加入正则化项,使用 w∗=(XTX+λI)−1XTyw^* = (X^TX + \lambda I)^{-1}X^Tyw∗=(XTX+λI)−1XTy(岭回归/Ridge Regression)
- 方法二: 使用 Moore-Penrose 伪逆:w∗=X+yw^* = X^+yw∗=X+y
- 方法三: 使用 SVD 分解 X=UΣVTX = U\Sigma V^TX=UΣVT,则 X+=VΣ+UTX^+ = V\Sigma^+U^TX+=VΣ+UT
5.4 使用梯度下降求解
迭代更新:
wk+1=wk−ηXT(Xwk−y)w_{k+1} = w_k - \eta X^T(Xw_k - y)wk+1=wk−ηXT(Xwk−y)
收敛性分析:
- 线性最小二乘的目标函数是凸二次函数
- 收敛速率取决于 Hessian H=XTXH = X^TXH=XTX 的条件数
- 条件数大时,需要选择较小的学习率,收敛慢
5.5 带等式约束的最小二乘
minw12∥Xw−y∥22\min_w \frac{1}{2}\|Xw - y\|_2^2wmin21∥Xw−y∥22
s.t. Aw=b\text{s.t. } Aw = bs.t. Aw=b
拉格朗日函数:
L(w,λ)=12∥Xw−y∥22+λT(Aw−b)L(w, \lambda) = \frac{1}{2}\|Xw - y\|_2^2 + \lambda^T(Aw - b)L(w,λ)=21∥Xw−y∥22+λT(Aw−b)
KKT 条件求解:
∇wL=XT(Xw−y)+ATλ=0\nabla_w L = X^T(Xw - y) + A^T\lambda = 0∇wL=XT(Xw−y)+ATλ=0
Aw=bAw = bAw=b
写成矩阵形式:
(XTXATA0)(wλ)=(XTyb)\begin{pmatrix} X^TX & A^T \\ A & 0 \end{pmatrix} \begin{pmatrix} w \\ \lambda \end{pmatrix} = \begin{pmatrix} X^Ty \\ b \end{pmatrix}(XTXAAT0)(wλ)=(XTyb)
这是一个 KKT 系统,也称为 saddle point system。
5.6 带不等式约束的最小二乘
minw12∥Xw−y∥22\min_w \frac{1}{2}\|Xw - y\|_2^2wmin21∥Xw−y∥22
s.t. wi≥0∀i\text{s.t. } w_i \geq 0 \quad \forall is.t. wi≥0∀i
- 这称为非负最小二乘(Non-negative Least Squares, NNLS)
- 不能用闭式解,需要迭代方法
- 常用算法:投影梯度下降法------每步梯度更新后,将负分量投影为 0
- KKT 条件为:
- ∇wJ(w∗)i≥0\nabla_w J(w^*)_i \geq 0∇wJ(w∗)i≥0
- wi∗≥0w^*_i \geq 0wi∗≥0
- wi∗⋅∇wJ(w∗)i=0w^*_i \cdot \nabla_w J(w^*)_i = 0wi∗⋅∇wJ(w∗)i=0(互补松弛)
5.7 条件数与数值稳定性
- 正规方程中的 XTXX^TXXTX 的条件数是 XXX 的条件数的平方 :cond(XTX)=cond(X)2\text{cond}(X^TX) = \\text{cond}(X)^2cond(XTX)=cond(X)2
- 这意味着使用正规方程求解时,数值误差会被平方级放大
- 更稳定的替代方案: 使用 QR 分解或 SVD 分解求解最小二乘
- QR 分解:X=QRX = QRX=QR,则 w=R−1QTyw = R^{-1}Q^Tyw=R−1QTy
- SVD 分解:数值上最稳定
总结表
| 主题 | 核心要点 |
|---|---|
| 上溢和下溢 | 使用 log-sum-exp 技巧、softmax 平移、对数空间计算保证数值稳定 |
| 病态条件 | 条件数衡量矩阵对扰动的敏感度;大条件数导致数值不稳定;使用正则化/SVD 缓解 |
| 梯度优化 | 梯度下降是基础;Hessian 提供曲率信息;鞍点在高维中更常见;动量可加速收敛 |
| 约束优化 | KKT 条件是核心;拉格朗日对偶性连接原始与对偶问题;互补松弛揭示 active constraints |
| 线性最小二乘 | 正规方程提供闭式解;条件数的平方放大效应;QR/SVD 更稳定;可推广到带约束情形 |