对于任意一个实对称正定矩阵 Σ∈Rn×n\Sigma \in \mathbb{R}^{n \times n}Σ∈Rn×n,Cholesky 分解保证了它可以唯一分解为:
Σ=LLT\Sigma = L L^TΣ=LLT
其中:
- LLL 是一个下三角矩阵(Lower Triangular Matrix),即对角线以上全为 0。
- LLL 的对角线元素 LiiL_{ii}Lii 全部严格大于 0。
展开来看(以 3×33 \times 33×3 为例):
Σ=L1100L21L220L31L32L33L11L21L310L22L3200L33\Sigma = \begin{bmatrix} L_{11} & 0 & 0 \\ L_{21} & L_{22} & 0 \\ L_{31} & L_{32} & L_{33} \end{bmatrix} \begin{bmatrix} L_{11} & L_{21} & L_{31} \\ 0 & L_{22} & L_{32} \\ 0 & 0 & L_{33} \end{bmatrix}Σ= L11L21L310L22L3200L33 L1100L21L220L31L32L33
为什么说它实现了"无约束"?
因为通过这种形式,无论你如何向 LLL 中填入任意实数(只要对角线保持大于0),组合出来的 Σ=LLT\Sigma = LL^TΣ=LLT 永远在数学上绝对是对称正定的。 在实际参数化时,我们只需要做两件事:
- 下三角元素(不含对角线): 任意取值 ∈(−∞,+∞)\in (-\infty, +\infty)∈(−∞,+∞)。
- 对角线元素: 必须 >0>0>0。通常在工程或网络输出时,对预测值取一次 exp(指数函数),即 Lii=exp(αi)L_{ii} = \exp(\alpha_i)Lii=exp(αi),这样无论 αi\alpha_iαi 是多少,LiiL_{ii}Lii 都恒大于 0。
证明
第一步:为什么必定"对称"?
这个最直观,直接利用矩阵转置的数学性质即可。
对组合出来的 Σ\SigmaΣ 进行整体转置:
ΣT=(LLT)T\Sigma^T = (LL^T)^TΣT=(LLT)T
根据矩阵乘法转置的运算法则 (AB)T=BTAT(AB)^T = B^T A^T(AB)T=BTAT,我们将 A=L,B=LTA = L, B = L^TA=L,B=LT 带入:
ΣT=(LT)TLT\Sigma^T = (L^T)^T L^TΣT=(LT)TLT
因为一个矩阵转置两次等于它本身((LT)T=L(L^T)^T = L(LT)T=L),所以:
ΣT=LLT=Σ\Sigma^T = L L^T = \SigmaΣT=LLT=Σ
满足 ΣT=Σ\Sigma^T = \SigmaΣT=Σ,因此对称性是天然成立的,与 LLL 里面的具体数值完全无关。
第二步:为什么必定"正定"?
在数学上,一个对称矩阵 Σ\SigmaΣ 是严格正定的定义是:对于任意非零列向量 x≠0x \neq 0x=0,二次型的值都必须严格大于 0,即:
xTΣx>0x^T \Sigma x > 0xTΣx>0
我们把 Σ=LLT\Sigma = LL^TΣ=LLT 带入这个二次型公式中:
xTΣx=xT(LLT)xx^T \Sigma x = x^T (LL^T) xxTΣx=xT(LLT)x
利用矩阵乘法的结合律,我们可以把括号重新组合:
xTΣx=(xTL)(LTx)x^T \Sigma x = (x^T L) (L^T x)xTΣx=(xTL)(LTx)
注意到 (LTx)T=xTL(L^T x)^T = x^T L(LTx)T=xTL。也就是说,如果我们令一个新的列向量 y=LTxy = L^T xy=LTx,那么前一部分 xTLx^T LxTL 其实就是行向量 yTy^TyT。
于是公式简化为:
xTΣx=yTyx^T \Sigma x = y^T yxTΣx=yTy
关键点:向量的内积
yTyy^T yyTy 是向量 yyy 与自身的内积,展开来就是它所有元素的平方和:
yTy=∑i=1nyi2=y12+y22+⋯+yn2y^T y = \sum_{i=1}^{n} y_i^2 = y_1^2 + y_2^2 + \dots + y_n^2yTy=∑i=1nyi2=y12+y22+⋯+yn2
只要是有理数或实数,任何数的平方都必然 ≥0\ge 0≥0。所以,所有的平方和加起来,结果也必然满足:
xTΣx=yTy≥0x^T \Sigma x = y^T y \ge 0xTΣx=yTy≥0
这意味着 Σ\SigmaΣ 至少是一个半正定矩阵。
为什么只要对角线>0,就一定是"严格大于 0"(严格正定)?
要让 yTy=0y^T y = 0yTy=0,唯一的可能就是向量 yyy 本身是全零向量(y=0y = 0y=0)。
而我们已知 y=LTxy = L^T xy=LTx,且大前提是 xxx 是一个非零向量(x≠0x \neq 0x=0)。
那么,在什么情况下,一个非零向量 xxx 乘以一个矩阵 LTL^TLT 会变成全零向量呢?
只有当矩阵 LTL^TLT 的行列式为 0(即矩阵退化/不可逆)时,才可能把非零向量"投影"到零空间。
我们来看看 LTL^TLT 的行列式。因为 LLL(以及 LTL^TLT)是一个三角矩阵,三角矩阵的行列式极其特殊,它完美等于其对角线元素的乘积:
det(LT)=L11⋅L22⋅⋯⋅Lnn\det(L^T) = L_{11} \cdot L_{22} \cdot \dots \cdot L_{nn}det(LT)=L11⋅L22⋅⋯⋅Lnn
- 如果你允许对角线元素等于 0,那么 det(LT)=0\det(L^T) = 0det(LT)=0,矩阵不可逆,此时 Σ\SigmaΣ 就会退化为半正定(可能算出一两个特征值为 0)。
- 但只要你设定对角线元素全部严格大于 0(Lii>0L_{ii} > 0Lii>0),那么它们的乘积 det(LT)\det(L^T)det(LT) 就绝对不可能等于 0。
既然 det(LT)≠0\det(L^T) \neq 0det(LT)=0,说明矩阵 LTL^TLT 满秩、完全可逆。一个可逆矩阵乘以一个非零向量 xxx,得到的 yyy 绝对不可能为零向量(y≠0y \neq 0y=0)。
既然 y≠0y \neq 0y=0,那么它的平方和就绝对不可能为 0,必然严格大于 0:
xTΣx=yTy>0x^T \Sigma x = y^T y > 0xTΣx=yTy>0
为什么对角线不能 < 0
- 致命伤:如果不限制,分解就不唯一了
在数学和工程中,我们希望一个协方差矩阵对应的参数化表达是唯一的(一一对应映射)。
假设有一个 2×22 \times 22×2 的下三角矩阵 LLL:
L=2035L = \begin{bmatrix} 2 & 0 \\ 3 & 5 \end{bmatrix}L=2305
它组合出来的协方差矩阵是:
Σ=LLT=20352305=46634\Sigma = LL^T = \begin{bmatrix} 2 & 0 \\ 3 & 5 \end{bmatrix} \begin{bmatrix} 2 & 3 \\ 0 & 5 \end{bmatrix} = \begin{bmatrix} 4 & 6 \\ 6 & 34 \end{bmatrix}Σ=LLT=23052035=46634
现在,如果我们把第一列全部取反,变成:
Lnew=−20−35L_{\text{new}} = \begin{bmatrix} -2 & 0 \\ -3 & 5 \end{bmatrix}Lnew=−2−305
我们再来算一下 Σnew=LnewLnewT\Sigma_{\text{new}} = L_{\text{new}} L_{\text{new}}^TΣnew=LnewLnewT:
Σnew=−20−35−2−305=46634\Sigma_{\text{new}} = \begin{bmatrix} -2 & 0 \\ -3 & 5 \end{bmatrix} \begin{bmatrix} -2 & -3 \\ 0 & 5 \end{bmatrix} = \begin{bmatrix} 4 & 6 \\ 6 & 34 \end{bmatrix}Σnew=−2−305−20−35=46634
你看,结果一模一样!
对于一个 n×nn \times nn×n 的矩阵,由于每一列乘以 −1-1−1 都不影响 LLTLL^TLLT 的结果,这意味着同一个协方差矩阵 Σ\SigmaΣ,可以对应 2n2^n2n 个不同的 LLL 矩阵!
为什么"不唯一"在工程优化和网络训练中是个灾难?
- 梯度震荡与不收敛: 如果你在用神经网络预测 LLL 的元素,或者在用高斯-牛顿法优化 LLL。对于同一个最优的 Σ\SigmaΣ,算法既可以走向 L11=2L_{11} = 2L11=2,也可以走向 L11=−2L_{11} = -2L11=−2。这就造成了优化空间的多峰值(Multi-modality)。网络或优化器会在正负之间反复横跳、拉扯,导致梯度方向冲突,极难收敛。
- 数学定理失效: 著名的 Cholesky 分解定理中明确指出:"实对称正定矩阵可以唯一分解为 Σ=LLT\Sigma = LL^TΣ=LLT 的形式,当且仅当 LLL 的对角线元素严格大于 0"。为了保住"唯一性"这个极好的数学性质,必须把限制加在 >0>0>0 上。
- 直观的物理含义:对角线对应着"标准差"
我们在工程上(特别是在状态估计、轨迹预测中)之所以喜欢 Cholesky 分解,是因为 LLL 的元素具有非常直观的物理意义。
以 2×22 \times 22×2 的不确定性椭圆为例(比如预测车辆在 X,YX, YX,Y 方向的位置不确定性),我们把 Σ=LLT\Sigma = LL^TΣ=LLT 展开:
Σ=L110L21L22L11L210L22=L112L11L21L21L11L212+L222\Sigma = \begin{bmatrix} L_{11} & 0 \\ L_{21} & L_{22} \end{bmatrix} \begin{bmatrix} L_{11} & L_{21} \\ 0 & L_{22} \end{bmatrix} = \begin{bmatrix} L_{11}^2 & L_{11}L_{21} \\ L_{21}L_{11} & L_{21}^2 + L_{22}^2 \end{bmatrix}Σ=L11L210L22L110L21L22=L112L21L11L11L21L212+L222
对比标准的协方差矩阵定义:
Σ=σx2σxyσxyσy2\Sigma = \begin{bmatrix} \sigma_x^2 & \sigma_{xy} \\ \sigma_{xy} & \sigma_y^2 \end{bmatrix}Σ=σx2σxyσxyσy2
你可以清晰地看到:
- σx2=L112 ⟹ L11=σx\sigma_x^2 = L_{11}^2 \implies L_{11} = \sigma_xσx2=L112⟹L11=σx(XXX 方向的标准差)
在物理世界中,标准差(Standard Deviation)在定义上就必须是一个非负数。如果你的算法输出一个 L11=−2L_{11} = -2L11=−2,在物理上解释"XXX 方向的标准差是 −2-2−2 米"是没有意义的。
为什么Cholesky能够使求逆极快且数值极其稳定
- 为什么直接求逆 Σ−1b\Sigma^{-1} bΣ−1b 饱受诟病?
在数学书上,我们解 Σx=b\Sigma x = bΣx=b 时,最直观的公式就是 x=Σ−1bx = \Sigma^{-1} bx=Σ−1b。但在实际工程(如 Kalman 滤波、优化器更新)中,永远不要直接计算矩阵的逆 Σ−1\Sigma^{-1}Σ−1,原因有两个:
- 复杂度高(O(n3)O(n^3)O(n3)): 直接求逆或高斯消元法,需要对矩阵进行大量的全局行列变换。如果矩阵大小是 n×nn \times nn×n,它的计算量与 n3n^3n3 成正比。当 nnn 变大时(例如长时序的轨迹预测或稠密 SLAM),计算量会发生爆炸。
- 数值不稳定(精度丢失): 计算机内部使用的是浮点数(Float/Double)。直接求逆涉及到大量的除法和减法。如果矩阵中某个特征值很小(接近零),直接求逆会导致"分母接近 0",从而放大浮点数误差。其结果就像是在悬崖边缘走钢丝,一个小小的舍入误差都会导致最终输出的 xxx 彻底失真。
- 什么是"前向替换"与"后向替换"?
Cholesky 分解的核心魔力,在于它把一个密集的、复杂的协方差矩阵 Σ\SigmaΣ,拆成了两个三角矩阵 LLL 和 LTL^TLT。
三角矩阵是线性代数世界里的"软柿子",极度好捏。
我们将 Σx=b\Sigma x = bΣx=b 改写为:
L(LTx)=bL (L^T x) = bL(LTx)=b
为了求解这个方程,工程上引入了一个中间变量向量 yyy,令 y=LTxy = L^T xy=LTx。于是,原方程被拆解为两个分步方程: - 第一步(求 yyy): Ly=bL y = bLy=b
- 第二步(求 xxx): LTx=yL^T x = yLTx=y
这就是著名的"前向替换"和"后向替换"。
① 前向替换(Forward Substitution)解 Ly=bL y = bLy=b
因为 LLL 是下三角矩阵,我们把它展开(以 3×33 \times 33×3 为例):
L1100L21L220L31L32L33y1y2y3=b1b2b3\begin{bmatrix} L_{11} & 0 & 0 \\ L_{21} & L_{22} & 0 \\ L_{31} & L_{32} & L_{33} \end{bmatrix} \begin{bmatrix} y_1 \\ y_2 \\ y_3 \end{bmatrix} = \begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix} L11L21L310L22L3200L33 y1y2y3 = b1b2b3
观察第一行,你会发现它简单得令人发指:
L11y1=b1 ⟹ y1=b1L11L_{11} y_1 = b_1 \implies y_1 = \frac{b_1}{L_{11}}L11y1=b1⟹y1=L11b1
既然 y1y_1y1 已经算出来了,看第二行:
L21y1+L22y2=b2 ⟹ y2=b2−L21y1L22L_{21} y_1 + L_{22} y_2 = b_2 \implies y_2 = \frac{b_2 - L_{21}y_1}{L_{22}}L21y1+L22y2=b2⟹y2=L22b2−L21y1
以此类推,第三行:
L31y1+L32y2+L33y3=b3 ⟹ y3=b3−L31y1−L32y2L33L_{31} y_1 + L_{32} y_2 + L_{33} y_3 = b_3 \implies y_3 = \frac{b_3 - L_{31}y_1 - L_{32}y_2}{L_{33}}L31y1+L32y2+L33y3=b3⟹y3=L33b3−L31y1−L32y2
这个从上往下、顺藤摸瓜把 yyy 顺次解出来的过程,就叫前向替换。
② 后向替换(Backward Substitution)解 LTx=yL^T x = yLTx=y
得到了 yyy 之后,我们解第二个方程。因为 LTL^TLT 是上三角矩阵:
L11L21L310L22L3200L33x1x2x3=y1y2y3\begin{bmatrix} L_{11} & L_{21} & L_{31} \\ 0 & L_{22} & L_{32} \\ 0 & 0 & L_{33} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix} = \begin{bmatrix} y_1 \\ y_2 \\ y_3 \end{bmatrix} L1100L21L220L31L32L33 x1x2x3 = y1y2y3
这次我们反过来,从最后一行(最底下)开始看:
L33x3=y3 ⟹ x3=y3L33L_{33} x_3 = y_3 \implies x_3 = \frac{y_3}{L_{33}}L33x3=y3⟹x3=L33y3
知道了 x3x_3x3,看倒数第二行:
L22x2+L32x3=y2 ⟹ x2=y2−L32x3L22L_{22} x_2 + L_{32} x_3 = y_2 \implies x_2 = \frac{y_2 - L_{32}x_3}{L_{22}}L22x2+L32x3=y2⟹x2=L22y2−L32x3
最后看第一行,解出 x1x_1x1。这个从下往上、逆流而上解出最终答案 xxx 的过程,就叫后向替换。