上一篇我们建立了度量工具箱——范数回答”矩阵有多大”,条件数回答”系统有多敏感”。但在 ML 中,矩阵不只被度量,更被优化。训练神经网络的本质是:给定损失函数 L(W),找到使 L 最小的权重矩阵 W。
要优化,就要求导。但 W 是一个矩阵——标量对矩阵求导意味着什么?梯度的形状是什么?多层网络中的链式法则如何推广为矩阵乘法?损失曲面的曲率如何用 Hessian 矩阵刻画?
这些正是矩阵微积分(Matrix Calculus)要回答的问题。它是 Art. 1 分解概述 六类矩阵操作中的第三件工具——微分:参数变了,输出怎么变。分解让我们理解矩阵的结构,度量让我们衡量近似的质量,微分则让我们改变矩阵以优化目标。这三件工具合在一起,构成了 ML 中矩阵分析的完整基础。
本文从最简单的标量对标量求导开始,逐级推广到标量对向量、向量对向量(Jacobian)、标量对矩阵,然后建立链式法则的矩阵形式(也就是反向传播的数学本质),最后深入 Hessian 矩阵和损失曲面的几何。
求导的四个层级
微积分的核心操作是求导——“输入变一点,输出变多少”。在标量世界中这是一个数,但当输入和输出都是向量或矩阵时,导数的”形状”也相应变化。下图展示了这四个层级的全貌:
第一层:标量对标量
最熟悉的情况。对函数 f:R→R,导数是:
dxdf=limϵ→0ϵf(x+ϵ)−f(x)
这是一个标量——输入一个数,输出一个数,导数也是一个数。例如 f(x)=x3,则 dxdf=3x2。
第二层:标量对向量——梯度
当函数的输入是向量 x=(x1,x2,…,xn)T∈Rn 而输出仍是标量 f:Rn→R 时,我们对每个分量分别求偏导数,组成一个向量——这就是梯度(gradient):
∇xf=∂x1∂f∂x2∂f⋮∂xn∂f∈Rn
逐项理解:
- ∇xf(读作”nabla x f“)表示 f 对向量 x 的梯度
- 梯度的第 i 个分量 ∂xi∂f 是 f 对 xi 的偏导数——固定其他分量,只让 xi 变化时 f 的变化率
- 梯度的形状与输入向量 x 相同:∇xf∈Rn
几何直觉:梯度 ∇f 指向 f 增长最快的方向,其长度 ∥∇f∥ 等于该方向上的变化率。梯度下降 x←x−η∇f 沿着 f 下降最快的方向更新参数。
例子:取 f(x)=aTx=a1x1+a2x2+⋯+anxn,则:
常用梯度公式
∇x(aTx)=a∇x(xTAx)=2Ax(A 对称)
验证:∂xk∂∑i,jAijxixj=∑jAkjxj+∑iAikxi=2∑jAkjxj=2(Ax)k(利用了 A=AT)。
第三层:向量对向量——Jacobian 矩阵
当输入和输出都是向量时——f:Rn→Rm,即 f(x)=(f1(x),f2(x),…,fm(x))T——导数变成了一个矩阵,称为 Jacobian 矩阵(雅可比矩阵)J∈Rm×n:
J=∂x∂f=∂x1∂f1∂x1∂f2⋮∂x1∂fm∂x2∂f1∂x2∂f2⋮∂x2∂fm⋯⋯⋱⋯∂xn∂f1∂xn∂f2⋮∂xn∂fm
逐项理解:
- Jij=∂xj∂fi:第 i 个输出对第 j 个输入的偏导数
- 行的含义:J 的第 i 行是 fi 的梯度 ∇fiT——标量函数 fi 对所有输入的敏感度
- 列的含义:J 的第 j 列告诉我们,当 xj 微小变化时,所有 m 个输出如何响应
- 形状:m 个输出 × n 个输入 = m×n 矩阵
Jacobian 的线性近似意义:类比标量求导的近似 f(x+ϵ)≈f(x)+f′(x)ϵ,Jacobian 给出向量函数的一阶线性近似:
f(x+ϵ)≈f(x)+Jϵ
其中 ϵ∈Rn 是微小扰动。J 是一个线性映射(矩阵),将输入空间的扰动映射到输出空间的变化——这正是导数的本质。
特殊情况:当 m=1 时(标量输出),J 退化为 1×n 的行向量,即梯度的转置 ∇fT。这就是第二层”标量对向量”的特例。
例子:取 f(x)=Ax,其中 A∈Rm×n。由于 fi=∑jAijxj,所以 ∂xj∂fi=Aij,因此:
J=∂x∂(Ax)=A
线性函数的 Jacobian 就是它自身的系数矩阵——这合理,因为线性函数的最佳线性近似就是它本身。
第四层:标量对矩阵
这是 ML 中最常见也最关键的情况:损失函数 L:Rm×n→R 以权重矩阵 W∈Rm×n 为参数,我们需要求 L 对 W 的导数。
定义很自然——对矩阵的每个元素分别求偏导:
∂W∂L=∂W11∂L⋮∂Wm1∂L⋯⋱⋯∂W1n∂L⋮∂Wmn∂L∈Rm×n
关键性质:∂W∂L 与 W 同形状。这既自然又实用——梯度下降的更新规则 W←W−η∂W∂L 中,梯度和参数可以直接逐元素相减。
按照符号表约定,我们将损失函数对权重矩阵的梯度记为 ∇WL=∂W∂L,其中 L 用花体 L 表示损失函数。
常用公式(见 The Matrix Cookbook, Petersen & Pedersen, 2012):
设 a,b 为不依赖 W 的向量,A,B 为不依赖 W 的矩阵:
-
∂W∂tr(AW)=AT
-
∂W∂tr(WTAW)=(A+AT)W(当 A 对称时 =2AW)
-
∂W∂tr(AWB)=ATBT(注意转置顺序)
-
∂W∂aTWb=abT
四层总结
| 层级 | 函数类型 | 导数名称 | 导数形状 |
|---|
| 标量→标量 | f:R→R | 导数 f′ | 标量 |
| 向量→标量 | f:Rn→R | 梯度 ∇f | Rn(与输入同形状) |
| 向量→向量 | f:Rn→Rm | Jacobian J | Rm×n |
| 矩阵→标量 | L:Rm×n→R | 矩阵梯度 ∇WL | Rm×n(与输入同形状) |
一个统一的观察:导数的作用总是把输入空间的微小扰动线性地映射到输出空间的变化。在标量情况下这是乘法(Δy≈f′Δx),在向量情况下是矩阵-向量乘法(Δy≈JΔx),在矩阵情况下是矩阵内积(ΔL≈⟨∇WL,ΔW⟩=tr(∇WLTΔW))。
链式法则:矩阵形式 = 反向传播
链式法则是微积分的核心定理之一——“复合函数的导数等于各步导数的乘积”。在标量情况下它简洁优雅:
dxdf(g(x))=f′(g(x))⋅g′(x)
在向量和矩阵的世界中,链式法则推广为 Jacobian 的矩阵乘法——这正是反向传播算法的数学本质。
链式法则 = 反向传播:Jacobian 矩阵乘法沿计算图反向传递
向量链式法则
设有复合函数 h=f∘g,即 h(x)=f(g(x)),其中 g:Rn→Rp,f:Rp→Rm。
记 z=g(x) 为中间变量,则复合函数的 Jacobian 是各步 Jacobian 的矩阵乘法:
Jh=∂x∂f=∂z∂f⋅∂x∂z=Jf⋅Jg
形状验证:Jf∈Rm×p,Jg∈Rp×n,乘积 Jh∈Rm×n ✓
逐元素展开,这就是多变量链式法则的经典形式:
(Jh)ij=∂xj∂fi=∑k=1p∂zk∂fi⋅∂xj∂zk
外层对中间变量求导,中间变量对输入求导,然后求和——对所有可能的”路径”求和。
多层网络中的链式法则
现在考虑一个 L 层前馈网络。记第 l 层的操作为:
z(l)=W(l)a(l−1)+b(l),a(l)=ϕ(z(l))
其中 W(l) 是权重矩阵,b(l) 是偏置,ϕ 是逐元素激活函数,a(0)=x 是输入。最终损失 L=ℓ(a(L),y) 是最后一层输出与标签的比较。
要计算 ∂W(l)∂L(第 l 层权重的梯度),需要沿着计算图反向传播。定义第 l 层的”误差信号”:
δ(l)=∂z(l)∂L∈Rdl
这是损失对第 l 层预激活值的梯度(行向量的转置)。
反向传播公式:
第一步:从输出层开始,δ(L) 由损失函数和激活函数直接给出。
第二步:对于 l=L−1,L−2,…,1,误差信号从后一层向前传播:
δ(l)=(W(l+1)Tδ(l+1))⊙ϕ′(z(l))
逐项理解:
- W(l+1)Tδ(l+1):将后一层的误差信号通过权重矩阵的转置”传回”当前层。这就是链式法则中 Jacobian 矩阵乘法的体现——W(l+1) 的 Jacobian 是 W(l+1) 本身,传播方向是转置
- ⊙ϕ′(z(l)):逐元素乘以激活函数的导数。如果 ϕ 是 ReLU,ϕ′(z)=1[z>0](通过或阻断)
第三步:有了 δ(l),权重梯度就是一个外积:
∂W(l)∂L=δ(l)a(l−1)T
形状验证:δ(l)∈Rdl,a(l−1)∈Rdl−1,外积 ∈Rdl×dl−1,恰好与 W(l)∈Rdl×dl−1 同形状 ✓
关键洞察:反向传播不是一个独立的算法,它就是链式法则在计算图上的高效实现。每一步都是 Jacobian 矩阵乘法,只不过利用了网络的特殊结构(线性层的 Jacobian 是权重矩阵、逐元素激活的 Jacobian 是对角矩阵)来避免显式构造完整的 Jacobian。
为什么是”反向”?
前向传播计算 x→z(1)→a(1)→⋯→a(L)→L。
如果用”前向模式”求导(从输入到输出),每次只能计算一个输入变量对所有输出的影响——需要 n 次前向传递来得到完整梯度(n 是参数总数,对于现代网络可达数十亿)。
反向模式从输出(标量损失 L)出发,一次传播就能计算 L 对所有参数的梯度。原因在于链式法则的结合律:
行向量∂a(L)∂L⋅矩阵∂z(L)∂a(L)⋅矩阵∂a(L−1)∂z(L)⋯
从左到右(反向模式):每步都是行向量乘矩阵,得到行向量——O(d2)。
从右到左(前向模式):每步是矩阵乘矩阵——O(d3)。
当输出是标量(m=1,如损失函数)而输入维度很高(n≫1,如网络参数)时,反向模式的效率远优于前向模式。这就是为什么深度学习用”反向”传播。
Hessian 矩阵与损失曲面的几何
梯度告诉我们损失曲面在某一点的”坡度”——往哪个方向走下降最快。但梯度不告诉我们坡度本身在怎么变化:前方是继续变陡还是趋于平坦?曲面是碗状的还是鞍形的?
要回答这些问题,我们需要二阶导数信息——Hessian 矩阵。
定义
对标量函数 f:Rn→R,Hessian 矩阵(黑塞矩阵)H∈Rn×n 定义为二阶偏导数构成的矩阵:
H=∇2f=∂x12∂2f∂x2∂x1∂2f⋮∂xn∂x1∂2f∂x1∂x2∂2f∂x22∂2f⋮∂xn∂x2∂2f⋯⋯⋱⋯∂x1∂xn∂2f∂x2∂xn∂2f⋮∂xn2∂2f
逐项理解:
- Hij=∂xi∂xj∂2f:先对 xj 求导,再对 xi 求导
- 如果 f 的二阶偏导连续(在 ML 的场景中通常成立),则 ∂xi∂xj∂2f=∂xj∂xi∂2f(Schwarz 定理),所以 H 是对称矩阵
- Hessian 的第 i 行(或列)是梯度第 i 个分量的梯度——H 是”梯度的 Jacobian”
与梯度的关系:梯度 ∇f 是一阶导数(n 维向量),Hessian H 是梯度的导数(n×n 矩阵):
H=J∇f=∂x∂(∇f)
Hessian 与二次型
Hessian 的几何意义通过二次型(quadratic form)体现。对于对称矩阵 H∈Rn×n 和向量 d∈Rn,二次型定义为:
Q(d)=dTHd=∑i=1n∑j=1nHijdidj
这个标量值 Q(d) 衡量了沿方向 d 的曲率。直觉上:
- 如果 Q(d)>0:函数沿方向 d 向上弯曲(碗底形状)
- 如果 Q(d)<0:函数沿方向 d 向下弯曲(山顶形状)
- 如果 Q(d)=0:函数沿方向 d 局部平坦(无曲率)
当 d 是单位向量(∥d∥=1)时,dTHd 就是函数在方向 d 上的方向曲率。
正定性与极值条件
根据二次型的符号,我们将对称矩阵分为三类:
| 类别 | 条件 | 几何含义 |
|---|
| 正定(positive definite) | 对所有 d=0,dTHd>0 | 所有方向曲率为正——碗底 |
| 负定(negative definite) | 对所有 d=0,dTHd<0 | 所有方向曲率为负——山顶 |
| 不定(indefinite) | 存在 d1,d2 使 d1THd1>0 且 d2THd2<0 | 某些方向上升、某些方向下降——鞍点 |
与极值的关系(二阶充分条件):
如果 ∇f(x∗)=0(一阶必要条件:驻点)且 H(x∗) 正定,则 x∗ 是严格局部极小值。
如果 ∇f(x∗)=0 且 H(x∗) 负定,则 x∗ 是严格局部极大值。
如果 ∇f(x∗)=0 且 H(x∗) 不定,则 x∗ 是鞍点。
判定正定性的一个等价条件:H 正定当且仅当 H 的所有特征值为正。这连接了 Hessian 分析与 Art. 2 特征分解 中的特征分解。
Hessian 正定性与损失曲面几何
特征值的正负决定曲面形状:碗底、山顶、鞍点
特征分解 = 主曲率方向
由于 H 是实对称矩阵,Art. 2 特征分解 的谱定理保证它可以正交对角化:
H=QΛQT=∑i=1nλiqiqiT
其中 λ1≥λ2≥⋯≥λn 是特征值,q1,…,qn 是对应的正交特征向量。
在这组正交基下,二次型变得极其简单。令 d=∑iciqi(在特征基下展开),则:
dTHd=∑i=1nλici2
每个特征方向 qi 的贡献完全独立,权重就是对应的特征值 λi。
几何意义:
- qi 是第 i 个主曲率方向——沿着 qi 运动时,曲面的弯曲程度由 λi 决定
- λi>0 且大:沿 qi 方向曲率大,曲面弯曲剧烈——函数在这个方向上变化很快
- λi>0 且小:沿 qi 方向曲率小,曲面几乎平坦——函数在这个方向上变化缓慢
- λi<0:沿 qi 方向曲面向下弯——这个方向不是极小
这给出了损失曲面等高线形状的精确描述。在正定的情况下(局部极小值附近),等高线 {x:xTHx=c} 是椭球面,椭球的半轴方向就是特征向量 qi,半轴长度正比于 1/λi。
用下面的交互组件感受 Hessian 特征值如何决定等高线形状:
损失曲面等高线与 Hessian 特征方向
Hessian 的特征向量 = 主曲率方向,特征值 = 曲率大小
Hessian 类型: 正定(局部极小)
κ(H) = 1.2
λ₁ = 2.40 (陡峭)
λ₂ = 2.00 (平坦)
两个特征值相近 → 等高线接近圆形 → 梯度下降收敛快
与条件数的联系:上一篇中我们定义了条件数 κ(A)=σmax/σmin。对于正定 Hessian,奇异值就是特征值(都为正),所以:
κ(H)=λminλmax
- κ(H)≈1:等高线接近圆形,梯度下降收敛快——所有方向的曲率相近
- κ(H)≫1:等高线是扁椭圆,梯度下降在窄谷中震荡——大曲率方向需要小步长,小曲率方向又收敛太慢。这就是梯度下降在高条件数损失曲面上表现差的根本原因,也是 Adam、L-BFGS 等自适应/二阶优化器存在的理由
矩阵 Taylor 展开
在标量微积分中,Taylor 展开是将函数局部近似为多项式的核心工具:
f(x+Δx)≈f(x)+f′(x)Δx+21f′′(x)(Δx)2
矩阵微积分的 Taylor 展开将这个思想推广到矩阵参数。
向量情形
对于 f:Rn→R,在点 x 处展开到二阶:
Taylor 二阶展开
f(x+Δx)≈f(x)+一阶:梯度∇fTΔx+二阶:Hessian 二次型21ΔxTHΔx
驻点处一阶项消失 → H 正定则局部最小,H 不定则鞍点。κ(H) 大则收敛慢。
矩阵情形
当参数是矩阵 W∈Rm×n 时,Taylor 展开变为:
L(W+ΔW)≈L(W)+tr(∇WLTΔW)+21vec(ΔW)THvec(ΔW)
逐项理解:
- L(W):当前损失——零阶项
- tr(∇WLTΔW):梯度与扰动的矩阵内积——一阶项。这里用到了 上一篇 定义的矩阵内积 ⟨A,B⟩=tr(ATB)。直觉:将 ∇WL 和 ΔW 都看成 mn 维向量做点积
- 21vec(ΔW)THvec(ΔW):Hessian 的二次型——二阶项。这里 vec(ΔW)∈Rmn 是将矩阵 ΔW 按列拉成向量的操作(vectorization),而 H∈Rmn×mn 是对 vec(W) 的完整 Hessian
注意 Hessian H 的大小是 mn×mn——对于一个 1000×1000 的权重矩阵,H 有 1012 个元素,在实践中无法显式存储。这就是为什么一阶方法(SGD、Adam)在深度学习中占主导——它们只需要梯度 ∇WL(mn 个数),而非完整的 Hessian(m2n2 个数)。
推导:从 vec 形式回到矩阵形式
上面的 tr(∇WLTΔW) 一阶项并非凭空出现,让我们推导它。
将 W 展平为向量 w=vec(W)∈Rmn,标量函数 L 的向量梯度为 ∇wL∈Rmn。标准 Taylor 展开的一阶项为:
∇wLTvec(ΔW)
现在利用一个关键等式:对任意两个同形状矩阵 A,B,有
vec(A)Tvec(B)=tr(ATB)
这就是矩阵内积的 vec 形式。因此一阶项可写成 tr(∇WLTΔW),比 vec 形式更紧凑也更有物理直觉。
数值例子
用一个具体的二维损失函数把前面的概念串起来。取:
L(w1,w2)=3w12+2w1w2+2w22
这是一个参数向量 w=(w1,w2)T 上的二次损失函数。
第一步:梯度
∇L=[∂w1∂L∂w2∂L]=[6w1+2w22w1+4w2]
在点 w=(1,1)T:∇L=(8,6)T。梯度下降会沿 (−8,−6) 方向更新。
验证:∇L=0 当且仅当 6w1+2w2=0 且 2w1+4w2=0,唯一解为 w∗=(0,0)T——原点是唯一驻点。
第二步:Hessian
H=[∂w12∂2L∂w2∂w1∂2L∂w1∂w2∂2L∂w22∂2L]=[6224]
对于二次函数,Hessian 是常数矩阵——曲率处处相同。
第三步:特征分解
H 的特征值:
det(H−λI)=(6−λ)(4−λ)−4=λ2−10λ+20=0
λ=210±100−80=210±20=5±5
λ1=5+5≈7.24,λ2=5−5≈2.76
两个特征值都为正,所以 H 正定 → 原点是严格局部极小值(也是全局极小值,因为二次函数只有一个驻点)。
条件数:
κ(H)=λ2λ1=5−55+5=25−5(5+5)2=2030+105=23+5≈2.62
条件数约为 2.62,属于良好条件——等高线是中等偏心率的椭圆,梯度下降收敛合理。
特征向量:对 λ1=5+5:
(H−λ1I)q1=0⇒[1−522−1−5]q1=0
取 q1∝(2,5−1)T,归一化后 q1≈(0.851,0.526)T。这是最大曲率方向——等高线椭圆的短轴方向。
类似地,q2≈(−0.526,0.851)T 是最小曲率方向——等高线椭圆的长轴方向。
第四步:Taylor 展开验证
在原点(w=0,L(0,0)=0,∇L=0)处展开:
L(Δw)≈0+0TΔw+21ΔwTHΔw=21ΔwTHΔw
取 Δw=(1,1)T:
21(1,1)[6224](11)=21(1,1)(86)=21(8+6)=7
直接计算:L(1,1)=3(1)2+2(1)(1)+2(1)2=3+2+2=7 ✓
对于二次函数,Taylor 展开是精确的(没有高阶项),所以这里”近似”恰好等于精确值。
从 Hessian 到 Intrinsic Dimensionality
Hessian 的特征分解不仅揭示了损失曲面的局部几何,更连接到一个深远的现象——intrinsic dimensionality(内在维度)。
关键观察
对于一个有 D 个参数的神经网络(D 可达数百万甚至数十亿),损失曲面的 Hessian H∈RD×D 的特征值分布极不均匀:
- 大部分特征值接近零——对应的方向几乎平坦,沿这些方向移动几乎不改变损失
- 只有少数特征值显著为正——对应的方向有明显曲率
这意味着尽管参数空间是 D 维的,损失曲面的”有效维度”远小于 D。
Li et al. (2018) 的度量
Li et al. (2018) 在”Measuring the Intrinsic Dimension of Objective Landscapes”中正式定义并量化了这一现象。他们的方法是:
- 将参数向量 θ∈RD 限制在一个随机子空间中:θ=θ0+Pd,其中 P∈RD×d 是随机投影矩阵,d∈Rd 是低维参数
- 只优化 d(d≪D),观察能否达到接近全参数优化的性能
- intrinsic dimension dint 是能达到原始性能 90% 所需的最小子空间维度 d
他们的实验结果令人惊讶:
- MNIST 上一个有 D≈650,000 参数的网络,dint≈750——只需要 0.1% 的维度
- CIFAR-10 上全连接网络的 dint 同样远低于参数总数
与 Hessian 的联系
intrinsic dimensionality 与 Hessian 特征谱直接相关。Hessian 的大特征值方向是损失变化敏感的方向——这些方向上的参数调整”重要”。小特征值(接近零)方向是冗余的——沿这些方向移动几乎不影响损失。
如果 Hessian 只有 k 个显著特征值(k≪D),那么有效优化只需要在这 k 个方向上进行——intrinsic dimension dint≈k。
连接 LoRA
这个发现为 LoRA(Art. 24)提供了理论基础。LoRA 的核心思想是:微调时不更新完整的权重矩阵 W∈Rm×n,而是限制更新量为低秩:
ΔW=BA,B∈Rm×r,A∈Rr×n,r≪min(m,n)
为什么低秩更新就够了?正是因为:
- 损失曲面的 Hessian 只有少数几个大特征值方向有显著曲率
- 这意味着权重空间中”重要”的变化方向是低维的
- 秩为 r 的 ΔW 在 mn 维参数空间中张成一个 r(m+n−r) 维子空间
- 只要这个子空间覆盖了 Hessian 的大特征值方向,微调就能有效进行
这是一条从 Hessian 特征分解出发,经由 intrinsic dimensionality,最终解释 LoRA 有效性的理论链条。我们将在 Art. 24 LoRA 中深入展开。
总结与展望
本文建立了矩阵微积分的完整框架——六类矩阵操作中的第三件工具”微分”。回顾关键要点:
- 求导的四个层级:标量→标量(导数)、向量→标量(梯度 ∇f∈Rn)、向量→向量(Jacobian J∈Rm×n)、矩阵→标量(矩阵梯度 ∇WL,与 W 同形状)
- 链式法则的矩阵形式:复合函数的 Jacobian 是各步 Jacobian 的矩阵乘积 Jh=Jf⋅Jg。反向传播是链式法则从输出到输入的高效实现,利用了标量输出 + 高维参数的结构特点
- Hessian 矩阵:二阶导数构成的对称矩阵 H,通过二次型 dTHd 刻画各方向的曲率。H 正定 ⟺ 局部极小,H 不定 ⟺ 鞍点
- Hessian 特征分解 = 主曲率方向:特征向量是等高线椭球的半轴方向,特征值是对应方向的曲率大小。条件数 κ(H)=λmax/λmin 衡量梯度下降的收敛难度
- 矩阵 Taylor 展开:L(W+ΔW)≈L(W)+tr(∇LTΔW)+21vec(ΔW)THvec(ΔW)
- Intrinsic dimensionality:实际损失曲面的 Hessian 只有少数大特征值——有效优化维度远低于参数总数——这是 LoRA 有效的理论根基
至此,Part 1 “拆”的核心数学工具已经齐备:分解(特征分解 + SVD)、度量(范数 + 条件数)、微分(梯度 + Hessian)。但有了地图不等于会走路——下一篇将学习优化算法(梯度下降、牛顿法、SGD),把这些微积分工具变成实际求解损失最小值的行进路线。