我们之前学习的 6 篇数值最优化方法都是目标函数处处可微的光滑函数。然而,在现实问题中,我们同样经常遇到梯度不存在的问题。比如说,在机器学习中,我们就可能会使用 LASSO 回归来得到稀疏解:
xminn1∥Ax−b∥22+μ∥x∥1
而在它折起来的那个“折点”,这些目标函数根本不可微。既然连 ∇f(x) 都找不到,那之前学的所有方法就都用不了了。
次微分
数学老师说,我们要把未知问题转化为已知问题来解决。考虑到正常来说我们要优化的函数绝无可能存在一堆不可微的点,就一般而言取到“折点”的测度为零,我们不妨“假装”函数处处可微,然后用传统方法继续做。
然而在折点的位置确实不可微,而且事实上优化算法的轨迹还偏偏容易被折点吸引,所以我们最好给它分配一个梯度。还是沿袭之前一贯的场景,对一个凸函数进行研究。不妨考虑这样的函数:
y={x2,4x−3,x≤1x>1

这个函数在 x=1 的地方存在一个“折点”:左边的导数是 2,右边的导数是 4。如果我们在 x=1 处想找到它的下降方向该怎么办呢?
假设这个地方有梯度,那我们就应该沿着它的反方向走。直观上,这个地方的梯度应该在 [2,4] 之间——对它的一阶泰勒展开式总归得“托住”整个函数图像嘛!而且,我们发现,这个地方梯度具体是多少好像还真不太要紧。不管是 2 还是 3 还是 4,往它们的反方向走总是下降的。也就是说,不管是拿 y−1=2(x−1)、y−1=3(x−1) 还是 y−1=4(x−1) 作为对这个点的线性近似,看上去都是可以接受的。
于是,我们把 g∈[2,4] 叫作这个“折点”的“次梯度”。把这个性质扩展到高维空间,当 g 满足
f(x+p)≥f(x)+g⊤p,∀p∈Rn
时,我们就称 g 是 f 在 x 处的一个次梯度。所有次梯度的集合称为次微分,记作 ∂f(x)。
定义了次微分后我们还得到一个很好的性质,那就是如果 0∈∂f(xk),那么 xk 就是函数的最小值点。这正是光滑条件 ∇f(x∗)=0 的完美扩充。
单步下降假象
原来次梯度下降跟普通梯度下降没两样嘛,随便抓一个次梯度走就完事了!你刚刚是这么以为的吗?然而事实并非如此。
构造反例函数 F(x)=∣x1∣+2∣x2∣。让我们取 (1,0) 看一看它的次梯度:
∂F(1,0)={(1,2g2)∣g2∈[−1,1]}
让我们挑一个合法的次梯度出来:(1,2),那此时的下降方向就是 (−1,−2)。让我们来看看新位置 (1−α,−2α):
F(1−α,−2α)=∣1−α∣+4∣α∣
根据绝对值三角不等式,这个式子的最小值仅在 α=0 处取到。也就是说,对于任何大于 0 的步长,新位置处的函数值都比旧位置处来得大!

向负梯度走并不保证单步函数值下降。既然连“单步变好”的信条都崩塌了,次梯度下降法到底凭什么收敛?
累积相消
然而,直觉上我们这样做是能成的。如果把刚才的场景建模成三维空间(x1 对应 X 轴,x2 对应 Y 轴,F(x) 对应 Z 轴),那就得到了一个四棱锥的侧面,并无限向上延伸。第一步垂直于棱走确实是向上的,可一到了平面上那可就总是下降了。
记 xk+1=xk−αkgk,其中 gk∈∂f(xk)。假设初始距离有界 ∥x1−x⋆∥2≤R,且满足 L-Lipschitz 连续(可得 ∥gi∥2≤L)。
考察到最优点 x⋆ 的欧式距离:
∥xk+1−x⋆∥22=∥xk−αkgk−x⋆∥22=∥xk−x⋆∥22−2αkgk⊤(xk−x⋆)+αk2∥gk∥22
根据次梯度“托底”的性质,我们有
gk⊤(xk−x⋆)≥f(xk)−f(x⋆)
代入上式,移项整理,得
2αk(f(xk)−f(x⋆))≤∥xk−x⋆∥22−∥xk+1−x⋆∥22+αk2∥gk∥22
右边是一个明显可以累加相消的形式。让我们累加一下:
i=1∑k2αi(f(xi)−f(x⋆))≤R2+L2i=1∑kαi2
考虑到每次迭代后函数不是单调递减的,所以我们记录到第 k 个点结束时函数的最小值 fbestk=min1≤i≤kf(xi)。显然 fbestk−f(x⋆)≤f(xi)−f(x⋆),所以
2(i=1∑kαi)(fbestk−f(x⋆))≤R2+L2i=1∑kαi2
即
fbestk−f(x⋆)≤2∑i=1kαiR2+L2∑i=1kαi2
步长法则
现在得到的这个公式可以指导我们怎么选步长。
如果我们选取了一个固定步长 αi=α,
k→∞lim(fbestk−f(x⋆))≤k→∞lim2∑i=1kαiR2+L2∑i=1kαi2=2αL2
固定步长只能保证最后收敛到最优值的一个固定邻域内。
而假设我们已知要跑 N 步,希望求一个固定的最优步长,那就对 α 求极值。可以解得 α⋆=LNR,回代后得到误差上界 NRL。
也可以取递减步长 αk=kc 或 αk=kc,则有 limk→∞2∑i=1kαiR2+L2∑i=1kαi2=0,此时误差上界收敛至零。
次梯度下降法的最优收敛速率就是 O(k1)(或写成 O(ϵ21))。它比任何在可微前提下的连续函数优化算法都慢,但也只有它能解决非光滑的问题。
LASSO 回归
让我们实操一下,看看 LASSO 回归是怎么下降的。
xminf(x)=n1∥Ax−b∥22+μ∥x∥1
对于前半截的光滑部分,∇(n1∥Ax−b∥22)=n2A⊤(Ax−b)。
对于后半截的非光滑部分,∂(μ∥x∥1)=μ∂∥x∥1。∥x∥1=1⋮1⊤∣x1∣⋮∣xn∣,∂∣xi∣=⎩⎨⎧{−1},{1},[−1,1],xi<0xi>0xi=0。不难得到
∂∥x∥1=⎩⎨⎧s1⋮snsi∈∂∣xi∣=⎩⎨⎧{−1},{1},[−1,1],xi<0xi>0xi=0⎭⎬⎫
在实际计算中,若遇到等于 0 的分量,只需在区间 [−1,1] 中任挑一个值(通常直接选 0),得到次梯度:gk=n2A⊤(Axk−b)+μsign(xk)。然后执行更新 xk+1=xk−αkgk。
这里也能导出 LASSO 回归的有趣特性:f(x) 的最小值处 0∈∂f(x⋆)。代入展开即得到
0∈n2A⊤(Ax⋆−b)+μ∂∥x⋆∥1
移项,有
n2A⊤(b−Ax⋆)∈μ∂∥x⋆∥1
令残差向量 r⋆=b−Ax⋆,矩阵的第 i 列特征为 Ai,对每行单独展开,有
n2Ai⊤r⋆∈μ∂∣xi⋆∣
那么,当 xi⋆>0 时,n2Ai⊤r⋆=μ;当 xi⋆<0 时,n2Ai⊤r⋆=−μ;而当 xi⋆=0 时,n2Ai⊤r⋆≤μ。
这意味着,只要某个特征与当前残差的相关性没有突破惩罚阈值(即处于 [−μ,μ] 区间内),该特征的系数就会被压缩为 0。这也就是 LASSO 回归稀疏性的数学原理。