最小二乘优化笔记:从损失函数、正则项到 BA / 图优化

在进行轻量级sfm拼图开发时联想到神经网络的优化,实际上绝大多数算法问题都可以表述为优化问题。两者的异同点以及最小二乘法优化的一些相关知识记载如下:

很多建模问题都可以写成一个统一形式:

$$
\min_\theta L(\theta)
$$

也就是寻找一组参数 $\theta$,让目标函数或损失函数 $L(\theta)$ 尽可能小。

理解优化问题时,可以把它拆成三个层次:

层次 回答的问题 例子
损失函数 我们要最小化什么? 残差平方和、MSE、交叉熵
正则 / 约束 我们希望解具有什么性质? 平滑约束、权重衰减、bounds
优化算法 用什么方法把目标函数降下来? SGD、Adam、Gauss-Newton、LM

因此,最小二乘、平滑约束、SGD、Adam、least_squares 并不是同一类概念。它们处在优化问题的不同层次里。


1. 残差、RSS、MSE 与最小二乘

假设真实观测值是 $y_i$,模型预测值是 $\hat y_i$,那么残差就是:

$$
r_i = y_i - \hat y_i
$$

残差表示模型预测和真实观测之间的误差。

残差平方和为:

$$
RSS = \sum_{i=1}^N r_i^2
$$

最小二乘就是选择参数,让残差平方和最小:

$$
\min_\theta \sum_i r_i(\theta)^2
$$

所以可以简单理解为:

最小二乘 = 以残差平方和作为目标函数,并最小化它。

例如线性回归中:

$$
\hat y_i = wx_i + b
$$

目标函数是:

$$
\min_{w,b} \sum_i (y_i - wx_i - b)^2
$$

这里的“二乘”指残差平方,“最小”指让平方和最小。

如果把 RSS 除以样本数量 $N$,就得到均方误差 MSE:

$$
MSE = \frac{1}{N}\sum_{i=1}^N r_i^2
$$

当 $N$ 固定时,RSS 和 MSE 只差一个常数倍,因此不会改变最优解。但 MSE 更方便比较不同数据集或不同 batch 的平均误差,所以在机器学习中更常见。

需要注意的是,机器学习并不等于最小二乘。

如果损失函数是 MSE,那么它本质上是最小二乘思想;但分类任务常用交叉熵,排序任务有 ranking loss,对比学习也有 contrastive loss 或 triplet loss。

更准确地说:

机器学习是在优化损失函数;如果损失函数是平方残差,它就是最小二乘思想。


2. 正则项与约束

实际优化问题中,除了希望模型拟合观测数据,还常常希望解满足一些额外性质,例如:

  • 更平滑;
  • 不要偏离某个先验值;
  • 参数不要过大;
  • 参数不要超出某个范围。

这些额外要求通常通过正则项或约束项加入目标函数:

$$
\begin{aligned}
L(\theta)
&=
L_{\text{data}}(\theta)
+
\lambda L_{\text{reg}}(\theta)
\end{aligned}
$$

其中:

  • $L_{\text{data}}$ 是数据项,要求结果符合观测;
  • $L_{\text{reg}}$ 是正则项,要求解满足某种偏好;
  • $\lambda$ 是权重,用来控制正则项的重要程度。

$\lambda$ 越大,约束越强;$\lambda$ 越小,约束越弱。


3. 平滑约束

平滑约束是一类常见正则项,用来惩罚“不平滑”的解。

一阶平滑约束惩罚相邻变量之间的差:

$$
L_{\text{smooth}} = \sum_i (x_{i+1}-x_i)^2
$$

它希望相邻值不要差太多,常用于图像去噪、深度图平滑、时间序列平滑等问题。

二阶平滑约束惩罚相邻差分的变化:

$$
L_{\text{smooth}} = \sum_i (x_{i+1}-2x_i+x_{i-1})^2
$$

它不一定要求相邻值接近,而是希望变化趋势不要突然改变,常用于曲线拟合、轨迹平滑、运动规划等问题。

二者的区别可以这样理解:

类型 惩罚什么 适合场景
一阶平滑 相邻值差异 避免跳变
二阶平滑 变化量的变化 避免弯曲或加速度突变

简单判断:

希望相邻值接近,用一阶平滑;
希望变化趋势平滑,用二阶平滑。


4. 先验项、bounds 与额外残差

如果希望某个参数 $x$ 不要离常数 $c$ 太远,可以加入先验项:

$$
L_{\text{prior}} = (x-c)^2
$$

总损失变为:

$$
L =
L_{\text{data}}
+
\lambda_{\text{prior}}(x-c)^2
$$

它表示希望 $x$ 接近先验值 $c$,但不一定强制等于 $c$。

bounds 约束则要区分硬约束和软约束。

如果要求:

$$
a \le x \le b
$$

并且绝对不能越界,这就是硬约束,通常交给带约束优化器处理。

如果只是希望参数尽量留在范围内,可以写成软约束惩罚项:

$$
\begin{aligned}
L_{\text{bound}}
&=
\max(0, a-x)^2
+
\max(0, x-b)^2
\end{aligned}
$$

软约束不会绝对禁止越界,只是让越界付出代价。

在最小二乘框架里,正则项通常也可以写成额外残差。比如先验项:

$$
\lambda(x-c)^2
$$

可以写成:

$$
r_{\text{prior}} = \sqrt{\lambda}(x-c)
$$

因为:

$$
r_{\text{prior}}^2 = \lambda(x-c)^2
$$

因此,许多正则项都可以被看作往最小二乘问题里添加新的 residual block。

这也是 BA、图优化、Ceres、g2o、GTSAM 等框架中常见的建模方式:数据项、先验项、平滑项都可以表示成 residual、factor 或 edge。


5. 优化算法:least_squares、SGD 与 Adam

一个优化问题可以拆成两部分:

目标函数是什么 + 用什么算法求解。

例如:

$$
\min_\theta \sum_i r_i(\theta)^2
$$

这是一个最小二乘问题。

它可以用 Gauss-Newton、Levenberg-Marquardt、Dogleg、Trust Region 等方法求解,也可以用 SGD 或 Adam 求解。

区别在于,不同算法适合的问题结构不同。

least_squares 通常表示一类求解最小二乘问题的方法或接口,它面向的问题形式是:

$$
\min_x \sum_i r_i(x)^2
$$

对于非线性最小二乘,常见方法包括:

  • Gauss-Newton;
  • Levenberg-Marquardt;
  • Dogleg;
  • Trust Region;
  • Schur Complement;
  • PCG。

SGD 和 Adam 则是更通用的梯度优化器。它们不要求目标函数必须是残差平方和,只要损失函数可以计算梯度即可:

$$
\theta \leftarrow \theta - \eta \nabla_\theta L(\theta)
$$

二者可以这样对比:

项目 least_squares 类方法 SGD / Adam
目标形式 残差平方和 任意可微损失
是否利用残差结构 通常否
主要信息 残差、雅可比、近似 Hessian 梯度
数据使用方式 常用全量或局部全量 常用 mini-batch
适合场景 曲线拟合、BA、图优化 深度学习、大规模训练

所以:

least_squares 类方法更适合结构明确的最小二乘问题;
SGD / Adam 更适合大规模、mini-batch、复杂网络训练。


6. 为什么深度学习常用 SGD / Adam?

即使用 MSE 作为损失函数,深度学习通常也不会使用传统 least_squares 求解器。

主要原因有三个。

第一,神经网络参数规模太大,可能有几百万、几千万甚至几十亿参数。显式构造残差雅可比矩阵或求解近似 Hessian 系统通常不可行。

第二,深度学习适合 mini-batch 训练。每次只用一小批数据估计梯度,就可以处理海量数据,而不需要每次使用全部样本。

第三,深度学习训练机制更复杂,包括 dropout、batch normalization、数据增强、非凸网络结构以及各种非平方损失。SGD / Adam 更容易和这些机制结合。

因此:

深度学习可以使用最小二乘损失,但通常用 SGD / Adam 优化,而不是传统 least_squares 求解器。


7. 为什么 BA / 图优化适合非线性最小二乘?

BA 和图优化虽然规模也可能很大,但它们的大和深度学习的大不一样。

关键在于:

BA / 图优化具有很强的稀疏结构。

Bundle Adjustment 的目标通常是最小化重投影误差:

$$
\min_{\lbrace T_i\rbrace,\lbrace X_j\rbrace}
\sum_{i,j}
\left\lVert u_{ij} - \pi(T_i, X_j)\right\rVert^2
$$

其中:

  • $T_i$ 是相机位姿;
  • $X_j$ 是三维点;
  • $u_{ij}$ 是图像观测点;
  • $\pi(T_i, X_j)$ 是投影模型。

这正是非线性最小二乘问题。

BA 的关键特点是:一个观测残差通常只依赖一个相机位姿和一个三维点,而不依赖所有相机和所有点。因此它的雅可比矩阵虽然很大,但大部分元素都是 0。

同时,BA 的变量天然具有块结构:

变量 常见维度
相机位姿 6 或 7 维
三维点 3 维

这种稀疏块结构使得 BA 可以使用 Schur Complement、稀疏线性求解器、PCG 等方法高效求解。

所以,判断一个问题是否适合 least_squares 类方法,不能只看参数数量,还要看:

  • 残差数量;
  • 雅可比是否稀疏;
  • 变量是否有块结构;
  • 线性化后的系统能否高效求解。

BA / 图优化虽然也很大,但因为结构清晰、雅可比稀疏,所以非常适合稀疏非线性最小二乘方法。


8. BA / 图优化通常使用专门求解器

BA / 图优化属于 least-squares 问题,但实际中通常不会使用普通通用接口,而是使用专门的图优化或非线性最小二乘库,例如:

  • Ceres Solver;
  • g2o;
  • GTSAM;
  • miniSAM。

这些工具通常支持:

  • 稀疏块矩阵;
  • 李群上的位姿更新;
  • 鲁棒核函数;
  • Schur Complement;
  • 边缘化;
  • 先验因子;
  • 增量式优化。

因此更准确地说:

BA / 图优化使用的是 least-squares 思想和非线性最小二乘方法,但通常依赖专门的稀疏图优化求解器。


9. 总结

最小二乘是一类以残差平方和为目标的问题形式:

$$
\min_\theta \sum_i r_i(\theta)^2
$$

MSE 是残差平方和的平均形式,不改变固定样本数量下的最优解,但更方便比较不同数据集或 mini-batch 的误差水平。

平滑约束、先验约束、软 bounds 等正则项通常通过加权惩罚项加入损失函数;在最小二乘框架里,它们也可以写成额外 residual block。

least_squares 类方法会利用残差、雅可比和问题结构,适合曲线拟合、BA、图优化等结构化最小二乘问题。

SGD / Adam 是更通用的梯度优化器,适合深度学习这种参数巨大、数据巨大、适合 mini-batch 训练的问题。

BA / 图优化虽然规模也可能很大,但由于雅可比稀疏、变量有块结构,仍然非常适合稀疏非线性最小二乘方法。

一句话概括:

最小二乘描述的是“优化什么”,正则项描述的是“希望解具有什么性质”,而 SGD、Adam、GN、LM 等优化算法描述的是“怎么求解”。


最小二乘优化笔记:从损失函数、正则项到 BA / 图优化
https://nnnut-zhou.github.io/2026/05/10/最小二乘优化笔记:从损失函数、正则项到-BA-图优化/
作者
Lee Chou
发布于
2026年5月10日
许可协议