基于权重正则的结构化剪枝:原理、方法与应用
深度神经网络已经在计算机视觉、自然语言处理等领域取得了巨大成功,但随之而来的是模型参数量和计算量的急剧增加。在资源受限的环境中部署这些模型面临严峻挑战。网络剪枝作为模型压缩的关键技术,通过去除冗余参数来减少计算和存储需求,其中基于权重正则化的结构化剪枝方法尤为重要。
权重正则化基础理论
正则化的优化视角
神经网络训练过程中,标准的优化目标可表示为最小化损失函数:
min θ L ( θ ; X , Y ) \min_{\theta} \mathcal{L}(\theta; X, Y) θminL(θ;X,Y)
其中 L \mathcal{L} L是损失函数, θ ∈ R d \theta \in \mathbb{R}^d θ∈Rd表示模型参数, ( X , Y ) (X, Y) (X,Y)是训练数据。引入正则化后,优化目标变为:
min θ L ( θ ; X , Y ) + λ R ( θ ) \min_{\theta} \mathcal{L}(\theta; X, Y) + \lambda \mathcal{R}(\theta) θminL(θ;X,Y)+λR(θ)
R ( θ ) \mathcal{R}(\theta) R(θ)是正则化项, λ > 0 \lambda > 0 λ>0是控制正则化强度的超参数。正则化项对权重的某些特性施加惩罚,鼓励更简单的模型以获得更好的泛化能力。
从数学上看,这是一个由两部分组成的优化问题:
- 数据拟合项 L ( θ ; X , Y ) \mathcal{L}(\theta; X, Y) L(θ;X,Y),通常是凸的(如线性回归中的均方误差)或非凸的(如神经网络中的交叉熵损失)
- 正则化项 R ( θ ) \mathcal{R}(\theta) R(θ),可以是凸的(如L1、L2范数)或非凸的(如L0范数)
当考虑简单的线性模型 y = X θ y = X\theta y=Xθ时,带L2正则化的最小二乘问题有闭式解:
θ ^ = ( X T X + λ I ) − 1 X T y \hat{\theta} = (X^TX + \lambda I)^{-1}X^Ty θ^=(XTX+λI)−1XTy
而带L1正则化的问题则没有闭式解,需要通过迭代优化方法求解。
正则化的贝叶斯解释
从贝叶斯角度看,正则化相当于对模型参数施加先验分布。正则化损失函数对应于最大后验估计(MAP):
L reg ( θ ) = L ( θ ; X , Y ) + λ R ( θ ) ∝ − log p ( Y ∣ X , θ ) − log p ( θ ) \mathcal{L}_{\text{reg}}(\theta) = \mathcal{L}(\theta; X, Y) + \lambda \mathcal{R}(\theta) \propto -\log p(Y|X,\theta) - \log p(\theta) Lreg(θ)=L(θ;X,Y)+λR(θ)∝−logp(Y∣X,θ)−logp(θ)
其中 p ( θ ) p(\theta) p(θ)是参数的先验分布。通过对MAP估计应用负对数变换,可以得到:
θ ^ M A P = arg max θ p ( θ ∣ X , Y ) = arg max θ p ( Y ∣ X , θ ) p ( θ ) p ( Y ∣ X ) \hat{\theta}_{MAP} = \arg\max_{\theta} p(\theta|X,Y) = \arg\max_{\theta} \frac{p(Y|X,\theta)p(\theta)}{p(Y|X)} θ^MAP=argθmaxp(θ∣X,Y)=argθmaxp(Y∣X)p(Y∣X,θ)p(θ)
= arg max θ p ( Y ∣ X , θ ) p ( θ ) = arg min θ [ − log p ( Y ∣ X , θ ) − log p ( θ ) ] = \arg\max_{\theta} p(Y|X,\theta)p(\theta) = \arg\min_{\theta} [-\log p(Y|X,\theta) - \log p(\theta)] =argθmaxp(Y∣X,θ)p(θ)=argθmin[−logp(Y∣X,θ)−logp(θ)]
这正好对应了带正则化的损失函数,其中 L ( θ ; X , Y ) = − log p ( Y ∣ X , θ ) \mathcal{L}(\theta; X, Y) = -\log p(Y|X,\theta) L(θ;X,Y)=−logp(Y∣X,θ)是负对数似然, λ R ( θ ) = − log p ( θ ) \lambda\mathcal{R}(\theta) = -\log p(\theta) λR(θ)=−logp(θ)是负对数先验。
不同正则化项对应不同先验分布:
-
L2正则化(权重衰减)对应高斯先验:
若 p ( θ ) ∝ exp ( − ∥ θ ∥ 2 2 2 σ 2 ) p(\theta) \propto \exp(-\frac{\|\theta\|_2^2}{2\sigma^2}) p(θ)∝exp(−2σ2∥θ∥22),则 − log p ( θ ) ∝ ∥ θ ∥ 2 2 2 σ 2 -\log p(\theta) \propto \frac{\|\theta\|_2^2}{2\sigma^2} −logp(θ)∝2σ2∥θ∥22,对应 R ( θ ) = 1 2 ∥ θ ∥ 2 2 \mathcal{R}(\theta) = \frac{1}{2}\|\theta\|_2^2 R(θ)=21∥θ∥22, λ = 1 σ 2 \lambda = \frac{1}{\sigma^2} λ=σ21 -
L1正则化对应拉普拉斯先验:
若 p ( θ ) ∝ exp ( − ∥ θ ∥ 1 b ) p(\theta) \propto \exp(-\frac{\|\theta\|_1}{b}) p(θ)∝exp(−b∥θ∥1),则 − log p ( θ ) ∝ ∥ θ ∥ 1 b -\log p(\theta) \propto \frac{\|\theta\|_1}{b} −logp(θ)∝b∥θ∥1,对应 R ( θ ) = ∥ θ ∥ 1 \mathcal{R}(\theta) = \|\theta\|_1 R(θ)=∥θ∥1, λ = 1 b \lambda = \frac{1}{b} λ=b1 -
弹性网络对应高斯-拉普拉斯混合先验:
p ( θ ) ∝ exp ( − α ∥ θ ∥ 1 − ( 1 − α ) ∥ θ ∥ 2 2 ) p(\theta) \propto \exp(-\alpha\|\theta\|_1 - (1-\alpha)\|\theta\|_2^2) p(θ)∝exp(−α∥θ∥1−(1−α)∥θ∥22) -
组套索对应组结构的拉普拉斯先验:
p ( θ ) ∝ exp ( − ∑ g ∈ G ∥ θ g ∥ 2 ) p(\theta) \propto \exp(-\sum_{g \in G}\|\theta_g\|_2) p(θ)∝exp(−∑g∈G∥θg∥2),其中 θ g \theta_g θg表示第 g g g组的参数
正则化与泛化误差关系的理论分析
从统计学习理论角度,正则化通过控制模型复杂度来减少泛化误差。对于权重为 θ \theta θ的线性模型,泛化误差可以分解为:
E [ ( f θ ( x ) − y ) 2 ] = 偏差 2 + 方差 + 不可约误差 \mathbb{E}[(f_{\theta}(x) - y)^2] = \text{偏差}^2 + \text{方差} + \text{不可约误差} E[(fθ(x)−y)2]=偏差2+方差+不可约误差
其中偏差反映模型的欠拟合程度,方差反映模型对训练数据波动的敏感度。
对于L2正则化,可以证明其可以有效减少方差,但会增加偏差。具体来说,对于线性回归问题,L2正则化的偏差-方差权衡可以表示为:
偏差
2
≈
λ
2
∥
θ
∗
∥
2
2
(随
λ
增加而增加)
\text{偏差}^2 \approx \lambda^2 \|\theta^*\|_2^2 \text{(随$\lambda$增加而增加)}
偏差2≈λ2∥θ∗∥22(随λ增加而增加)
方差
≈
σ
2
tr
(
(
X
T
X
+
λ
I
)
−
1
X
T
X
(
X
T
X
+
λ
I
)
−
1
)
n
(随
λ
增加而减少)
\text{方差} \approx \frac{\sigma^2 \text{tr}((X^TX + \lambda I)^{-1}X^TX(X^TX + \lambda I)^{-1})}{n} \text{(随$\lambda$增加而减少)}
方差≈nσ2tr((XTX+λI)−1XTX(XTX+λI)−1)(随λ增加而减少)
其中 θ ∗ \theta^* θ∗是真实参数, σ 2 \sigma^2 σ2是噪声方差, n n n是样本数。
对于神经网络,虽然没有严格的理论分析,但实验表明正则化确实能够控制模型复杂度,减少过拟合。深度学习中,L2正则化通常被称为权重衰减,因为在梯度下降的情况下,L2正则化相当于在每次更新时对权重进行一定比例的缩减:
θ t + 1 = θ t − η ∇ θ L ( θ t ) − η λ θ t = ( 1 − η λ ) θ t − η ∇ θ L ( θ t ) \theta_{t+1} = \theta_t - \eta \nabla_{\theta}\mathcal{L}(\theta_t) - \eta\lambda\theta_t = (1-\eta\lambda)\theta_t - \eta \nabla_{\theta}\mathcal{L}(\theta_t) θt+1=θt−η∇θL(θt)−ηλθt=(1−ηλ)θt−η∇θL(θt)
正则化如何促进网络剪枝
权重正则化之所以能促进网络剪枝,主要基于以下数学机制:
-
诱导稀疏性:某些正则化方法(如L1)会将不重要的权重精确推向零,自然形成稀疏模型。
对于L1正则化,其子梯度方程为:
∂ ∥ θ ∥ 1 = { { 1 } if θ i > 0 { − 1 } if θ i < 0 [ − 1 , 1 ] if θ i = 0 \partial \|\theta\|_1 = \begin{cases} \{1\} & \text{if } \theta_i > 0 \\ \{-1\} & \text{if } \theta_i < 0 \\ [-1, 1] & \text{if } \theta_i = 0 \end{cases} ∂∥θ∥1=⎩ ⎨ ⎧{1}{−1}[−1,1]if θi>0if θi<0if θi=0
当梯度下降更新时,如果 ∣ ∂ θ i L ( θ ) ∣ < λ |\partial_{\theta_i} \mathcal{L}(\theta)| < \lambda ∣∂θiL(θ)∣<λ,则 θ i \theta_i θi会被精确地推向零。这一特性在数学上可以通过近端梯度法更清晰地解释。对于L1正则化,近端算子为软阈值操作:
prox λ ∥ ⋅ ∥ 1 ( w ) i = { w i − λ if w i > λ 0 if ∣ w i ∣ ≤ λ w i + λ if w i < − λ \text{prox}_{\lambda\|\cdot\|_1}(w)_i = \begin{cases} w_i - \lambda & \text{if } w_i > \lambda \\ 0 & \text{if } |w_i| \leq \lambda \\ w_i + \lambda & \text{if } w_i < -\lambda \end{cases} proxλ∥⋅∥1(w)i=⎩ ⎨ ⎧wi−λ0wi+λif wi>λif ∣wi∣≤λif wi<−λ
这意味着小于阈值 λ \lambda λ的权重会被完全置零,形成稀疏结构。
-
结构化稀疏:通过对权重组施加组约束(如Group Lasso),可以使整组权重(如卷积滤波器、通道)同时趋近于零。
对于组套索,近端算子对整个组应用软阈值:
prox λ ∥ ⋅ ∥ 2 , 1 ( θ g ) = { θ g ( 1 − λ ∥ θ g ∥ 2 ) if ∥ θ g ∥ 2 > λ 0 otherwise \text{prox}_{\lambda\|\cdot\|_{2,1}}(\theta_g) = \begin{cases} \theta_g \left(1 - \frac{\lambda}{\|\theta_g\|_2}\right) & \text{if } \|\theta_g\|_2 > \lambda \\ 0 & \text{otherwise} \end{cases} proxλ∥⋅∥2,1(θg)={θg(1−∥θg∥2λ)0if ∥θg∥2>λotherwise
可以看出,当组的L2范数小于阈值 λ \lambda λ时,整个组会被设置为零,实现结构化稀疏。
-
重要度区分:数学上,权重正则化可以理解为一种隐式的重要性度量。考虑梯度下降更新:
θ t + 1 = θ t − η ∇ θ L ( θ t ) − η λ ∇ θ R ( θ t ) \theta_{t+1} = \theta_t - \eta \nabla_{\theta} \mathcal{L}(\theta_t) - \eta \lambda \nabla_{\theta} \mathcal{R}(\theta_t) θt+1=θt−η∇θL(θt)−ηλ∇θR(θt)
对于重要的权重,数据驱动的梯度 ∇ θ L ( θ t ) \nabla_{\theta} \mathcal{L}(\theta_t) ∇θL(θt)会抵消正则化梯度 ∇ θ R ( θ t ) \nabla_{\theta} \mathcal{R}(\theta_t) ∇θR(θt)的影响,使这些权重保持较大的幅度。而对于不重要的权重,正则化梯度占主导,逐渐将它们推向零。
-
隐式特征选择:从数学上看,正则化可以视为一种嵌入式特征选择方法。以L1正则化为例,其有效地选择出最具表现力的特征,可以证明,在满足一定条件下(如特征之间相关性不高),L1正则化可以恢复真实的稀疏参数。假设真实模型是 k k k-稀疏的(只有 k k k个非零参数),在样本数 n n n满足 n ≥ C k log ( d / k ) n \geq C k \log(d/k) n≥Cklog(d/k)(其中 C C C是常数, d d d是参数总数)且设计矩阵满足受限等距性质(RIP)的条件下,L1正则化可以以高概率恢复真实的稀疏模式。
正则化稀疏性的定量分析
对于线性回归问题,L1正则化解的稀疏程度可以通过KKT条件分析。对于优化问题:
min θ 1 2 ∥ X θ − y ∥ 2 2 + λ ∥ θ ∥ 1 \min_{\theta} \frac{1}{2}\|X\theta - y\|_2^2 + \lambda\|\theta\|_1 θmin21∥Xθ−y∥22+λ∥θ∥1
其KKT条件为:
X T ( X θ − y ) + λ s = 0 X^T(X\theta - y) + \lambda s = 0 XT(Xθ−y)+λs=0
其中 s s s是 θ \theta θ的子梯度,满足 s i = sign ( θ i ) s_i = \text{sign}(\theta_i) si=sign(θi)如果 θ i ≠ 0 \theta_i \neq 0 θi=0,或者 s i ∈ [ − 1 , 1 ] s_i \in [-1, 1] si∈[−1,1]如果 θ i = 0 \theta_i = 0 θi=0。
从这个条件可以得出,当 ∣ X j T ( y − X θ ) ∣ < λ |X_j^T(y - X\theta)| < \lambda ∣XjT(y−Xθ)∣<λ时,必有 θ j = 0 \theta_j = 0 θj=0。这意味着当特征 j j j与残差的相关性小于阈值 λ \lambda λ时,对应的参数将被置零。当 λ \lambda λ增大时,更多的参数会被置零,从而增加稀疏性。理论上,当 λ ≥ ∥ X T y ∥ ∞ \lambda \geq \|X^Ty\|_{\infty} λ≥∥XTy∥∞时,所有参数都会被置零。
剪枝中的权重正则化方法
L1正则化(Lasso)及其数学原理
L1正则化是最基本的稀疏诱导方法,其正则化项为:
R L 1 ( θ ) = ∥ θ ∥ 1 = ∑ i ∣ θ i ∣ \mathcal{R}_{L1}(\theta) = \|\theta\|_1 = \sum_{i} |\theta_i| RL1(θ)=∥θ∥1=i∑∣θi∣
从凸优化理论角度,L1正则化的稀疏诱导性可通过其近端算子来解释。在近端梯度法中,每次迭代包含两个步骤:
- 梯度步骤: θ ~ t + 1 = θ t − η ∇ θ L ( θ t ) \tilde{\theta}_{t+1} = \theta_t - \eta \nabla_{\theta}\mathcal{L}(\theta_t) θ~t+1=θt−η∇θL(θt)
- 近端步骤: θ t + 1 = prox η λ ∥ ⋅ ∥ 1 ( θ ~ t + 1 ) \theta_{t+1} = \text{prox}_{\eta\lambda\|\cdot\|_1}(\tilde{\theta}_{t+1}) θt+1=proxηλ∥⋅∥1(θ~t+1)
L1范数的近端算子是软阈值化操作:
prox λ ∥ ⋅ ∥ 1 ( w ) = sign ( w ) ⋅ max ( ∣ w ∣ − λ , 0 ) \text{prox}_{\lambda\|\cdot\|_1}(w) = \text{sign}(w) \cdot \max(|w| - \lambda, 0) proxλ∥⋅∥1(w)=sign(w)⋅max(∣w∣−λ,0)
此操作可以组件形式表示为:
[ prox λ ∥ ⋅ ∥ 1 ( w ) ] i = { w i − λ if w i > λ 0 if ∣ w i ∣ ≤ λ w i + λ if w i < − λ [\text{prox}_{\lambda\|\cdot\|_1}(w)]_i = \begin{cases} w_i - \lambda & \text{if } w_i > \lambda \\ 0 & \text{if } |w_i| \leq \lambda \\ w_i + \lambda & \text{if } w_i < -\lambda \end{cases} [proxλ∥⋅∥1(w)]i=⎩ ⎨ ⎧wi−λ0wi+λif wi>λif ∣wi∣≤λif wi<−λ
从上式可以明确看出软阈值化的稀疏诱导性质:当组件绝对值小于或等于 λ \lambda λ时,该组件被精确置零。
在标准梯度下降中,对于每个权重 w w w,L1正则化的更新规则可表示为:
w t + 1 = w t − η ∂ L ∂ w t − η λ ⋅ sign ( w t ) w_{t+1} = w_t - \eta\frac{\partial \mathcal{L}}{\partial w_t} - \eta\lambda \cdot \text{sign}(w_t) wt+1=wt−η∂wt∂L−ηλ⋅sign(wt)
这里需要注意的是,由于L1范数在零点不可微,严格来说应该使用次梯度:
∂ ∣ w ∣ = { { 1 } if w > 0 { − 1 } if w < 0 [ − 1 , 1 ] if w = 0 \partial |w| = \begin{cases} \{1\} & \text{if } w > 0 \\ \{-1\} & \text{if } w < 0 \\ [-1, 1] & \text{if } w = 0 \end{cases} ∂∣w∣=⎩ ⎨ ⎧{1}{−1}[−1,1]if w>0if w<0if w=0
对于随机梯度下降(SGD),我们通常使用次梯度的某个元素(如 sign ( w ) \text{sign}(w) sign(w))作为L1正则化的梯度。
理论分析:为什么L1正则化导致稀疏性
从几何角度看,带L1约束的优化问题等价于在L1-球上寻找最优解。L1-球的几何特性(具有尖角)使得优化过程更有可能在坐标轴上找到解,即大部分坐标为零的稀疏解。
从数学上严格证明,考虑简单的优化问题:
min θ 1 2 ∥ y − X θ ∥ 2 2 + λ ∥ θ ∥ 1 \min_{\theta} \frac{1}{2}\|y - X\theta\|_2^2 + \lambda\|\theta\|_1 θmin21∥y−Xθ∥22+λ∥θ∥1
其KKT(Karush-Kuhn-Tucker)条件为:
X T ( X θ − y ) + λ s = 0 X^T(X\theta - y) + \lambda s = 0 XT(Xθ−y)+λs=0
其中 s s s是 ∥ θ ∥ 1 \|\theta\|_1 ∥θ∥1的次梯度。对于每个组件 i i i:
- 若 θ i > 0 \theta_i > 0 θi>0,则 s i = 1 s_i = 1 si=1
- 若 θ i < 0 \theta_i < 0 θi<0,则 s i = − 1 s_i = -1 si=−1
- 若 θ i = 0 \theta_i = 0 θi=0,则 s i ∈ [ − 1 , 1 ] s_i \in [-1, 1] si∈[−1,1]
从这些条件可以推导出:
- 对于非零组件 θ i ≠ 0 \theta_i \neq 0 θi=0,必有 [ X T ( y − X θ ) ] i = λ ⋅ sign ( θ i ) [X^T(y - X\theta)]_i = \lambda \cdot \text{sign}(\theta_i) [XT(y−Xθ)]i=λ⋅sign(θi)
- 对于零组件 θ i = 0 \theta_i = 0 θi=0,必有 ∣ [ X T ( y − X θ ) ] i ∣ ≤ λ |[X^T(y - X\theta)]_i| \leq \lambda ∣[XT(y−Xθ)]i∣≤λ
这说明当特征 X i X_i Xi与残差 y − X θ y - X\theta y−Xθ的相关性小于阈值 λ \lambda λ时,对应的参数 θ i \theta_i θi将严格等于零,形成稀疏解。
L2正则化(Ridge)及其与剪枝的关系
L2正则化定义为:
R L 2 ( θ ) = ∥ θ ∥ 2 2 = ∑ i θ i 2 \mathcal{R}_{L2}(\theta) = \|\theta\|_2^2 = \sum_{i} \theta_i^2 RL2(θ)=∥θ∥22=i∑θi2
L2正则化的近端算子是收缩操作:
prox λ ∥ ⋅ ∥ 2 2 ( w ) = w 1 + 2 λ = w ⋅ 1 1 + 2 λ \text{prox}_{\lambda\|\cdot\|_2^2}(w) = \frac{w}{1 + 2\lambda} = w \cdot \frac{1}{1 + 2\lambda} proxλ∥⋅∥22(w)=1+2λw=w⋅1+2λ1
与L1正则化不同,L2近端算子是一个连续的收缩操作,将所有权重向零收缩但通常不会将它们精确置为零。权重更新规则为:
w t + 1 = w t − η ∂ L ∂ w t − η λ ⋅ w t = ( 1 − η λ ) w t − η ∂ L ∂ w t w_{t+1} = w_t - \eta\frac{\partial \mathcal{L}}{\partial w_t} - \eta\lambda \cdot w_t = (1 - \eta\lambda)w_t - \eta\frac{\partial \mathcal{L}}{\partial w_t} wt+1=wt−η∂wt∂L−ηλ⋅wt=(1−ηλ)wt−η∂wt∂L
从以上公式可以看出,L2正则化本质上是权重衰减(weight decay),即每次更新都将权重缩小一个因子 ( 1 − η λ ) (1 - \eta\lambda) (1−ηλ)。
尽管L2正则化不直接导致稀疏性,但它有助于剪枝过程。通过收缩不重要的权重使其接近于零,L2正则化为基于幅度的剪枝方法提供了更明确的权重重要性区分。此外,L2正则化还具有以下数学性质:
-
特征值收缩:对于线性模型,L2正则化等效于对协方差矩阵 X T X X^TX XTX的特征值进行收缩,通过将 X T X X^TX XTX替换为 X T X + λ I X^TX + \lambda I XTX+λI。这有助于处理特征共线性并提高数值稳定性。
-
Tikhonov正则化:从求解逆问题的角度,L2正则化是一种Tikhonov正则化,能够处理病态问题(ill-posed problems)。
-
权重均衡作用:与L1不同,L2正则化倾向于将权重均匀分布在所有特征上,而不是集中在少数特征上。这可以通过比较两者的最优解来说明:
- L1正则化的解通常在多个等效特征中选择一个
- L2正则化的解会在多个等效特征间均匀分配权重
L2正则化与权重剪枝的数学联系
虽然L2正则化本身不直接产生稀疏解,但它与剪枝有深刻联系。对于特定的剪枝方法,如迭代软阈值剪枝,可以证明它等效于求解特定形式的正则化问题。
考虑带掩码的损失函数:
L ( m ⊙ θ ; X , Y ) \mathcal{L}(m \odot \theta; X, Y) L(m⊙θ;X,Y)
其中 m m m是二元掩码,决定哪些参数被保留。一种剪枝方法是迭代性寻找使得 ∥ m ∥ 0 ≤ k \|m\|_0 \leq k ∥m∥0≤k且损失最小的掩码,这本质上是在求解带L0约束的优化问题。可以证明,在特定条件下,先应用L2正则化再基于幅度剪枝的两阶段方法是上述问题的一个近似解。
组套索(Group Lasso)的深入数学分析
组套索是L1正则化的扩展,用于在组级别诱导稀疏性,特别适合结构化剪枝。组套索惩罚定义为:
R group ( θ ) = ∑ g ∈ G ∥ θ g ∥ 2 \mathcal{R}_{\text{group}}(\theta) = \sum_{g \in G} \|\theta_g\|_2 Rgroup(θ)=g∈G∑∥θg∥2
其中 G G G是预定义的参数组集合, θ g \theta_g θg表示组 g g g中的参数。直观上理解,组套索对每个组的L2范数施加L1惩罚,实现组层面的稀疏性。
从优化理论角度,组套索的次梯度为:
∂ R group ( θ ) = { ∑ g ∈ G s g : s g ∈ ∂ ∥ θ g ∥ 2 } \partial \mathcal{R}_{\text{group}}(\theta) = \{\sum_{g \in G} s_g : s_g \in \partial \|\theta_g\|_2\} ∂Rgroup(θ)={g∈G∑sg:sg∈∂∥θg∥2}
其中:
∂ ∥ θ g ∥ 2 = { θ g ∥ θ g ∥ 2 if θ g ≠ 0 { s : ∥ s ∥ 2 ≤ 1 } if θ g = 0 \partial \|\theta_g\|_2 = \begin{cases} \frac{\theta_g}{\|\theta_g\|_2} & \text{if } \theta_g \neq 0 \\ \{s : \|s\|_2 \leq 1\} & \text{if } \theta_g = 0 \end{cases} ∂∥θg∥2={∥θg∥2θg{s:∥s∥2≤1}if θg=0if θg=0
这表明,当组 g g g的所有参数都为零时,次梯度是二范数单位球;当组不为零时,次梯度是该组参数的单位向量。
组套索的近端算子可以表示为:
prox λ ∥ ⋅ ∥ 2 , 1 ( θ g ) = { θ g ( 1 − λ ∥ θ g ∥ 2 ) if ∥ θ g ∥ 2 > λ 0 otherwise \text{prox}_{\lambda\|\cdot\|_{2,1}}(\theta_g) = \begin{cases} \theta_g \left(1 - \frac{\lambda}{\|\theta_g\|_2}\right) & \text{if } \|\theta_g\|_2 > \lambda \\ 0 & \text{otherwise} \end{cases} proxλ∥⋅∥2,1(θg)={θg(1−∥θg∥2λ)0if ∥θg∥2>λotherwise
这个近端算子对整个组应用软阈值操作:当组的L2范数小于阈值 λ \lambda λ时,整个组被设置为零;否则,组被收缩但保持其方向不变。
对于卷积神经网络,权重张量 W ∈ R N × C × H × W W \in \mathbb{R}^{N\times C\times H\times W} W∈RN×C×H×W(其中 N N N是输出通道数, C C C是输入通道数, H × W H\times W H×W是核大小),组套索可以有不同的应用方式,对应不同的结构化剪枝策略:
-
滤波器级剪枝(移除输出通道):
R filter ( W ) = λ ∑ i = 1 N ∥ W i , : , : , : ∥ F \mathcal{R}_{\text{filter}}(W) = \lambda \sum_{i=1}^N \|W_{i,:,:,:}\|_F Rfilter(W)=λi=1∑N∥Wi,:,:,:∥F其中 ∥ W i , : , : , : ∥ F = ∑ j = 1 C ∑ k = 1 H ∑ l = 1 W W i , j , k , l 2 \|W_{i,:,:,:}\|_F = \sqrt{\sum_{j=1}^C\sum_{k=1}^H\sum_{l=1}^W W_{i,j,k,l}^2} ∥Wi,:,:,:∥F=∑j=1C∑k=1H∑l=1WWi,j,k,l2是第 i i i个滤波器的Frobenius范数。
这种正则化鼓励整个滤波器(对应一个输出通道)趋于零,从而可以完全移除该输出通道。
-
通道级剪枝(移除输入通道):
R channel ( W ) = λ ∑ j = 1 C ∥ W : , j , : , : ∥ F \mathcal{R}_{\text{channel}}(W) = \lambda \sum_{j=1}^C \|W_{:,j,:,:}\|_F Rchannel(W)=λj=1∑C∥W:,j,:,:∥F这种正则化鼓励所有滤波器对特定输入通道的权重趋于零,从而可以移除该输入通道。
-
形状级剪枝(简化滤波器形状):
R shape ( W ) = λ ∑ k = 1 H ∑ l = 1 W ∥ W : , : , k , l ∥ F \mathcal{R}_{\text{shape}}(W) = \lambda \sum_{k=1}^H \sum_{l=1}^W \|W_{:,:,k,l}\|_F Rshape(W)=λk=1∑Hl=1∑W∥W:,:,k,l∥F这种正则化鼓励所有滤波器在特定空间位置的权重趋于零,从而可以简化滤波器的空间形状。
组套索的统计性质分析
从统计角度,组套索具有"组织同时选择"(selecting factors together)的特性。这与变量选择的统计理论有关:当一组变量高度相关时,套索(L1)倾向于随机选择其中一个,而组套索则会同时选择或排除整个组。可以证明,在特定条件下(如组内变量相关性高,组间相关性低),组套索能够实现一致的组别选择(group selection consistency),即随着样本数增加,组套索能够正确识别真实的非零组。具体来说,对于有 G G G个组的线性模型,假设真实系数只有 s s s个非零组,若样本数 n n n满足 n ≳ s log ( G ) n \gtrsim s \log(G) n≳slog(G)且设计矩阵满足组间受限等距性质,组套索能以高概率恢复正确的组稀疏模式。
稀疏组套索(Sparse Group Lasso)的理论与实现
稀疏组套索结合了L1和组套索正则化,同时在组级别和个体参数级别实现稀疏性:
R sparse group ( θ ) = α ∑ i ∣ θ i ∣ + ( 1 − α ) ∑ g ∈ G ∥ θ g ∥ 2 \mathcal{R}_{\text{sparse group}}(\theta) = \alpha \sum_{i} |\theta_i| + (1-\alpha) \sum_{g \in G} \|\theta_g\|_2 Rsparse group(θ)=αi∑∣θi∣+(1−α)g∈G∑∥θg∥2
其中 α ∈ [ 0 , 1 ] \alpha \in [0, 1] α∈[0,1]平衡个体稀疏性和组稀疏性。 α = 1 \alpha = 1 α=1时退化为普通L1正则化, α = 0 \alpha = 0 α=0时退化为标准组套索。
从优化理论角度看,稀疏组套索的近端算子可以分解为L1近端算子和组套索近端算子的组合:
prox λ R sparse group ( w ) ≈ prox λ α ∥ ⋅ ∥ 1 ( prox λ ( 1 − α ) ∥ ⋅ ∥ 2 , 1 ( w ) ) \text{prox}_{\lambda\mathcal{R}_{\text{sparse group}}}(w) \approx \text{prox}_{\lambda\alpha\|\cdot\|_1}(\text{prox}_{\lambda(1-\alpha)\|\cdot\|_{2,1}}(w)) proxλRsparse group(w)≈proxλα∥⋅∥1(proxλ(1−α)∥⋅∥2,1(w))
这种分解不是严格等价的,但提供了一种有效的计算近似。更准确的近端算子计算需要使用迭代算法。
稀疏组套索的梯度可以表示为L1梯度和组套索梯度的加权和:
∇ R sparse group ( θ ) = α ⋅ sign ( θ ) + ( 1 − α ) ⋅ ∑ g ∈ G θ g ∥ θ g ∥ 2 1 { θ g ≠ 0 } \nabla \mathcal{R}_{\text{sparse group}}(\theta) = \alpha \cdot \text{sign}(\theta) + (1-\alpha) \cdot \sum_{g \in G} \frac{\theta_g}{\|\theta_g\|_2} \mathbb{1}_{\{\theta_g \neq 0\}} ∇Rsparse group(θ)=α⋅sign(θ)+(1−α)⋅g∈G∑∥θg∥2θg1{θg=0}
其中第二项只对非零组 θ g \theta_g θg有贡献。
稀疏组套索的统计性质
从统计学角度,稀疏组套索结合了组套索和L1正则化的优点,能够同时实现:
- 组层面的选择:识别并保留重要的组变量
- 组内的特征选择:在选定的组内进一步选择重要的个体变量
可以证明,在特定条件下,稀疏组套索能够实现双层一致性(bi-level consistency),即随着样本量增加,它能够以高概率同时识别出:
- 哪些组应该被保留(组选择一致性)
- 在这些组内,哪些个体变量应该被保留(变量选择一致性)
具体来说,假设有 G G G个组,每组有 p g p_g pg个变量,真实系数只有 s s s个非零组和总共 k k k个非零元素,若样本数 n n n满足 n ≳ max ( s log ( G ) , k log ( ∑ g p g ) ) n \gtrsim \max(s\log(G), k\log(\sum_g p_g)) n≳max(slog(G),klog(∑gpg))且设计矩阵满足一定的条件,稀疏组套索能以高概率恢复正确的稀疏模式。
L0正则化的精确数学表述及近似方法
L0正则化直接惩罚非零参数的数量:
R L 0 ( θ ) = ∥ θ ∥ 0 = ∑ i 1 [ θ i ≠ 0 ] \mathcal{R}_{L0}(\theta) = \|\theta\|_0 = \sum_{i} 1[\theta_i \neq 0] RL0(θ)=∥θ∥0=i∑1[θi=0]
其中 1 [ ⋅ ] 1[\cdot] 1[⋅]是指示函数。L0正则化最直接地对应剪枝过程,但由于其非凸且不连续的特性,无法直接用梯度方法优化。
一种数学严谨的L0近似方法是使用连续松弛(continuous relaxation)。具体来说,可以用参数化的连续函数 s β ( z ) s_{\beta}(z) sβ(z)来近似 1 [ z ≠ 0 ] 1[z \neq 0] 1[z=0]:
s β ( z ) = z 2 z 2 + β s_{\beta}(z) = \frac{z^2}{z^2 + \beta} sβ(z)=z2+βz2
其中 β > 0 \beta > 0 β>0是控制近似精度的参数。随着 β → 0 \beta \to 0 β→0, s β ( z ) → 1 [ z ≠ 0 ] s_{\beta}(z) \to 1[z \neq 0] sβ(z)→1[z=0]。这样,L0正则化可以近似为:
R L 0 , β ( θ ) = ∑ i s β ( θ i ) = ∑ i θ i 2 θ i 2 + β \mathcal{R}_{L0,\beta}(\theta) = \sum_{i} s_{\beta}(\theta_i) = \sum_{i} \frac{\theta_i^2}{\theta_i^2 + \beta} RL0,β(θ)=i∑sβ(θi)=i∑θi2+βθi2
这个近似是可微的,可以用梯度方法优化。其梯度为:
∂ R L 0 , β ∂ θ i = 2 θ i β ( θ i 2 + β ) 2 \frac{\partial \mathcal{R}_{L0,\beta}}{\partial \theta_i} = \frac{2\theta_i\beta}{(\theta_i^2 + \beta)^2} ∂θi∂RL0,β=(θi2+β)22θiβ
Louizos等人(2017)提出了一种使用"硬具体"分布的随机门控方法,使L0正则化可微。他们将问题重新表述为:
E [ ∥ θ ∥ 0 ] = ∑ j P ( z j ≠ 0 ) \mathbb{E}[\|\theta\|_0] = \sum_{j} P(z_j \neq 0) E[∥θ∥0]=j∑P(zj=0)
其中 z j z_j zj是应用于权重 w j w_j wj的二进制门控变量。他们引入了一个连续的随机变量 u j u_j uj,通过"硬具体"变换得到 z j z_j zj:
z j = min ( 1 , max ( 0 , u j ) ) z_j = \text{min}(1, \text{max}(0, u_j)) zj=min(1,max(0,uj))
其中 u j u_j uj服从位置参数为 α j \alpha_j αj的分布,如被截断的正态分布或被截断的物镜均匀分布。这样,整体目标函数变为:
min θ , α E z ∼ q ( z ∣ α ) [ L ( θ ⊙ z ; X , Y ) ] + λ ∑ j ( 1 − q ( z j = 0 ∣ α j ) ) \min_{\theta, \alpha} \mathbb{E}_{z \sim q(z|\alpha)}[\mathcal{L}(\theta \odot z; X, Y)] + \lambda \sum_{j} (1 - q(z_j = 0|\alpha_j)) θ,αminEz∼q(z∣α)[L(θ⊙z;X,Y)]+λj∑(1−q(zj=0∣αj))
其中 q ( z ∣ α ) q(z|\alpha) q(z∣α)是基于"硬具体"分布的近似,可以通过重参数化技巧高效训练。
L0正则化与剪枝的等价性
从形式上看,带L0约束的优化问题:
min θ L ( θ ; X , Y ) s.t. ∥ θ ∥ 0 ≤ k \min_{\theta} \mathcal{L}(\theta; X, Y) \text{ s.t. } \|\theta\|_0 \leq k θminL(θ;X,Y) s.t. ∥θ∥0≤k
与固定阈值 τ \tau τ剪枝过程:
m
i
=
1
[
∣
θ
i
∣
>
τ
]
m_i = 1[|\theta_i| > \tau]
mi=1[∣θi∣>τ]
θ
pruned
=
θ
⊙
m
\theta_{\text{pruned}} = \theta \odot m
θpruned=θ⊙m
在特定条件下是等价的。具体来说,对于一个已训练的模型 θ \theta θ,如果我们设置 τ \tau τ使得 ∥ θ pruned ∥ 0 = k \|\theta_{\text{pruned}}\|_0 = k ∥θpruned∥0=k,那么 θ pruned \theta_{\text{pruned}} θpruned就是上述带L0约束优化问题的一个近似解,精确度取决于原始模型 θ \theta θ与优化目标的接近程度。
增长正则化(Growing Regularization)的理论基础
增长正则化是一种自适应方法,根据训练进程调整正则化强度:
λ i ( t + 1 ) = λ i ( t ) + δ λ ⋅ 1 [ m i = 0 ] \lambda_i^{(t+1)} = \lambda_i^{(t)} + \delta\lambda \cdot 1[m_i = 0] λi(t+1)=λi(t)+δλ⋅1[mi=0]
其中 m i m_i mi是权重的掩码(1表示保留,0表示剪枝), δ λ \delta\lambda δλ是正则化增量。
从理论上分析,增长正则化可以看作是求解一个带有时变惩罚的优化问题:
min θ L ( θ ; X , Y ) + ∑ i λ i ( t ) ∣ θ i ∣ \min_{\theta} \mathcal{L}(\theta; X, Y) + \sum_i \lambda_i^{(t)} |\theta_i| θminL(θ;X,Y)+i∑λi(t)∣θi∣
在每次迭代后,被标记为剪枝的权重 θ i \theta_i θi(即 m i = 0 m_i = 0 mi=0)对应的正则化系数 λ i \lambda_i λi会增加,这增强了对这些权重趋近于零的压力。
从数学上证明,在满足特定条件的凸优化问题中,这种增长正则化策略可以收敛到原始L0约束问题的解。对于非凸的神经网络优化,虽然没有严格的理论保证,但实验表明这种方法确实能有效增加稀疏性并保持模型性能。
增长正则化与再训练的关系
传统的迭代剪枝方法往往采用"剪枝+再训练"的策略,而增长正则化提供了一种更优雅的替代方案。从数学上看,这两种方法处理被剪枝权重的方式不同:
- 传统方法: θ i ⋅ m i \theta_i \cdot m_i θi⋅mi(被剪枝的权重直接置零)
- 增长正则化:通过增加 λ i \lambda_i λi,逐渐将 θ i \theta_i θi推向零
增长正则化的优势在于它保留了梯度信息流动,允许被剪枝的权重在训练过程中"复活",如果它们变得重要的话。这可以看作是一种软性约束,相比传统方法的硬性置零约束更为灵活。理论上,当 δ λ → ∞ \delta\lambda \to \infty δλ→∞时,增长正则化等价于硬性剪枝后再训练;当 δ λ → 0 \delta\lambda \to 0 δλ→0时,它等价于标准L1正则化。通过调整 δ λ \delta\lambda δλ,可以在这两个极端之间取得平衡。
结构化剪枝的数学优化框架
优化目标的数学形式
结构化剪枝可以表述为带约束的优化问题,主要有以下三种等价的数学形式:
-
基于惩罚的形式:
min θ L ( θ ; X , Y ) + λ R ( θ ) \min_{\theta} \mathcal{L}(\theta; X, Y) + \lambda \mathcal{R}(\theta) θminL(θ;X,Y)+λR(θ)其中 R ( θ ) \mathcal{R}(\theta) R(θ)是促进结构化稀疏性的正则化项,如组套索。
-
约束优化形式:
min θ L ( θ ; X , Y ) subject to R ( θ ) ≤ c \min_{\theta} \mathcal{L}(\theta; X, Y) \text{ subject to } \mathcal{R}(\theta) \leq c θminL(θ;X,Y) subject to R(θ)≤c其中 c c c是控制稀疏程度的常数。
-
拉格朗日形式:
L Lagrangian ( θ , λ ) = L ( θ ; X , Y ) + λ ( R ( θ ) − c ) \mathcal{L}_{\text{Lagrangian}}(\theta, \lambda) = \mathcal{L}(\theta; X, Y) + \lambda(\mathcal{R}(\theta) - c) LLagrangian(θ,λ)=L(θ;X,Y)+λ(R(θ)−c)这是约束形式的拉格朗日表述,其中 λ \lambda λ是拉格朗日乘子。
这三种形式在特定条件下是等价的。具体来说,根据凸优化理论,对于凸目标函数和凸约束,存在一个拉格朗日乘子 λ ∗ \lambda^* λ∗,使得形式1和形式2的解相同。
理论分析:基于惩罚和基于约束方法的关系
考虑一个简单的线性回归问题带L1约束:
min θ 1 2 ∥ X θ − y ∥ 2 2 s.t. ∥ θ ∥ 1 ≤ c \min_{\theta} \frac{1}{2}\|X\theta - y\|_2^2 \text{ s.t. } \|\theta\|_1 \leq c θmin21∥Xθ−y∥22 s.t. ∥θ∥1≤c
该问题的拉格朗日形式为:
L ( θ , λ ) = 1 2 ∥ X θ − y ∥ 2 2 + λ ( ∥ θ ∥ 1 − c ) \mathcal{L}(\theta, \lambda) = \frac{1}{2}\|X\theta - y\|_2^2 + \lambda(\|\theta\|_1 - c) L(θ,λ)=21∥Xθ−y∥22+λ(∥θ∥1−c)
根据KKT条件,最优解 θ ∗ \theta^* θ∗必须满足:
- ∇ θ L ( θ ∗ , λ ∗ ) = 0 \nabla_{\theta}\mathcal{L}(\theta^*, \lambda^*) = 0 ∇θL(θ∗,λ∗)=0,即 X T ( X θ ∗ − y ) + λ ∗ ∂ ∥ θ ∗ ∥ 1 = 0 X^T(X\theta^* - y) + \lambda^* \partial\|\theta^*\|_1 = 0 XT(Xθ∗−y)+λ∗∂∥θ∗∥1=0
- λ ∗ ( ∥ θ ∗ ∥ 1 − c ) = 0 \lambda^*(\|\theta^*\|_1 - c) = 0 λ∗(∥θ∗∥1−c)=0(互补松弛条件)
- ∥ θ ∗ ∥ 1 ≤ c \|\theta^*\|_1 \leq c ∥θ∗∥1≤c(原始可行性)
- λ ∗ ≥ 0 \lambda^* \geq 0 λ∗≥0(对偶可行性)
从条件2可知,当 ∥ θ ∗ ∥ 1 < c \|\theta^*\|_1 < c ∥θ∗∥1<c时,必有 λ ∗ = 0 \lambda^* = 0 λ∗=0,这意味着约束不起作用,解退化为普通最小二乘解。当 ∥ θ ∗ ∥ 1 = c \|\theta^*\|_1 = c ∥θ∗∥1=c时, λ ∗ > 0 \lambda^* > 0 λ∗>0,约束是有效的。可以证明,对于每个 c > 0 c > 0 c>0,存在一个对应的 λ \lambda λ,使得约束问题和惩罚问题有相同的解。这种对应关系称为"正则化路径",不同的 ( c , λ ) (c, \lambda) (c,λ)对应路径上的不同点。
非可微正则化的平滑近似及其数学性质
许多有效的剪枝正则化项(如L1、组套索)在零点不可微,给基于梯度的优化带来挑战。为解决这一问题,可以使用平滑近似。
对于L1正则化,常用的平滑近似为:
R L 1 − s m o o t h ( θ ) = ∑ i θ i 2 + ϵ \mathcal{R}_{L1-smooth}(\theta) = \sum_{i} \sqrt{\theta_i^2 + \epsilon} RL1−smooth(θ)=i∑θi2+ϵ
其中 ϵ > 0 \epsilon > 0 ϵ>0是一个小常数。这个函数在整个定义域内都是可微的,其梯度为:
∇ R L 1 − s m o o t h ( θ ) i = θ i θ i 2 + ϵ \nabla \mathcal{R}_{L1-smooth}(\theta)_i = \frac{\theta_i}{\sqrt{\theta_i^2 + \epsilon}} ∇RL1−smooth(θ)i=θi2+ϵθi
当 ∣ θ i ∣ ≫ ϵ |\theta_i| \gg \sqrt{\epsilon} ∣θi∣≫ϵ时,梯度近似为 sign ( θ i ) \text{sign}(\theta_i) sign(θi),与L1正则化梯度一致;当 ∣ θ i ∣ → 0 |\theta_i| \to 0 ∣θi∣→0时,梯度连续趋近于零。
从理论上可以证明,当 ϵ → 0 \epsilon \to 0 ϵ→0时,平滑近似函数 R L 1 − s m o o t h \mathcal{R}_{L1-smooth} RL1−smooth一致收敛到L1范数 ∥ θ ∥ 1 \|\theta\|_1 ∥θ∥1。具体来说,可以证明:
∥ θ ∥ 1 ≤ R L 1 − s m o o t h ( θ ) ≤ ∥ θ ∥ 1 + ϵ d \|\theta\|_1 \leq \mathcal{R}_{L1-smooth}(\theta) \leq \|\theta\|_1 + \sqrt{\epsilon}d ∥θ∥1≤RL1−smooth(θ)≤∥θ∥1+ϵd
其中 d d d是参数的维度。这意味着近似误差上界为 ϵ d \sqrt{\epsilon}d ϵd,随着 ϵ \epsilon ϵ减小而减小。
对于组套索,类似的平滑近似为:
R group-smooth ( θ ) = ∑ g ∈ G ∥ θ g ∥ 2 2 + ϵ \mathcal{R}_{\text{group-smooth}}(\theta) = \sum_{g \in G} \sqrt{\|\theta_g\|_2^2 + \epsilon} Rgroup-smooth(θ)=g∈G∑∥θg∥22+ϵ
其梯度为:
∇ θ g R group-smooth ( θ ) = θ g ∥ θ g ∥ 2 2 + ϵ \nabla_{\theta_g} \mathcal{R}_{\text{group-smooth}}(\theta) = \frac{\theta_g}{\sqrt{\|\theta_g\|_2^2 + \epsilon}} ∇θgRgroup-smooth(θ)=∥θg∥22+ϵθg
与L1近似类似,当 ∥ θ g ∥ 2 ≫ ϵ \|\theta_g\|_2 \gg \sqrt{\epsilon} ∥θg∥2≫ϵ时,梯度近似为 θ g ∥ θ g ∥ 2 \frac{\theta_g}{\|\theta_g\|_2} ∥θg∥2θg;当 ∥ θ g ∥ 2 → 0 \|\theta_g\|_2 \to 0 ∥θg∥2→0时,梯度连续趋近于零。
平滑近似的优化理论分析
从优化理论角度,使用平滑近似有几个关键优势:
-
梯度稳定性:原始非平滑函数的次梯度可能在某些点(如零点)变化剧烈,导致优化不稳定。平滑近似提供了连续变化的梯度,使优化更加稳定。
-
收敛速度:对于 ϵ \epsilon ϵ-平滑函数,梯度下降在 T T T次迭代后的收敛误差为 O ( 1 / T ) O(1/\sqrt{T}) O(1/T);但对于 L L L-Lipschitz连续可微函数,收敛误差可以提高到 O ( 1 / T ) O(1/T) O(1/T)。
-
二阶方法适用性:平滑近似允许使用牛顿法、拟牛顿法等二阶优化方法,这些方法通常具有更快的收敛速度。
然而,平滑近似也有一个缺点:它不再产生精确的稀疏解。为弥补这一点,可以将平滑优化作为预训练步骤,然后应用阈值操作或精确的近端梯度步骤获得真正的稀疏解。
近端梯度方法的理论与实现
近端梯度方法能有效优化非可微的正则化目标。对于目标函数 F ( θ ) = f ( θ ) + g ( θ ) F(\theta) = f(\theta) + g(\theta) F(θ)=f(θ)+g(θ),其中 f f f是可微的(如损失函数), g g g是可能不可微的凸函数(如正则化项),近端梯度迭代为:
θ ( t + 1 ) = prox η g ( θ ( t ) − η ∇ f ( θ ( t ) ) ) \theta^{(t+1)} = \text{prox}_{\eta g}(\theta^{(t)} - \eta \nabla f(\theta^{(t)})) θ(t+1)=proxηg(θ(t)−η∇f(θ(t)))
其中 η \eta η是步长, prox η g \text{prox}_{\eta g} proxηg是 g g g的近端算子,定义为:
prox η g ( v ) = arg min θ { g ( θ ) + 1 2 η ∥ θ − v ∥ 2 2 } \text{prox}_{\eta g}(v) = \arg\min_{\theta} \left\{ g(\theta) + \frac{1}{2\eta}\|\theta - v\|_2^2 \right\} proxηg(v)=argθmin{g(θ)+2η1∥θ−v∥22}
近端算子可以看作是对梯度步骤的正则化修正,对于各种正则化项都有封闭形式或高效算法。
近端梯度法的收敛性分析
对于凸函数,近端梯度法的收敛性可以通过李雅普诺夫函数分析。具体来说,定义:
V t = F ( θ ( t ) ) − F ( θ ∗ ) V_t = F(\theta^{(t)}) - F(\theta^*) Vt=F(θ(t))−F(θ∗)
其中 θ ∗ \theta^* θ∗是最优解。可以证明,在适当的步长 η \eta η下(如 η < 1 L \eta < \frac{1}{L} η<L1,其中 L L L是 ∇ f \nabla f ∇f的Lipschitz常数),有:
V t + 1 ≤ V t − η 2 ∥ ∇ F ( θ ( t ) ) ∥ 2 2 V_{t+1} \leq V_t - \frac{\eta}{2}\|\nabla F(\theta^{(t)})\|_2^2 Vt+1≤Vt−2η∥∇F(θ(t))∥22
这表明函数值单调下降。进一步分析可得到收敛速率:
F ( θ ( T ) ) − F ( θ ∗ ) = O ( 1 T ) F(\theta^{(T)}) - F(\theta^*) = O\left(\frac{1}{T}\right) F(θ(T))−F(θ∗)=O(T1)
对于强凸函数,收敛速率可以提高到:
F ( θ ( T ) ) − F ( θ ∗ ) = O ( e − μ T ) F(\theta^{(T)}) - F(\theta^*) = O\left(e^{-\mu T}\right) F(θ(T))−F(θ∗)=O(e−μT)
其中 μ \mu μ是强凸性参数。
加速近端梯度法
通过Nesterov加速技术,可以将近端梯度法的收敛速率从 O ( 1 / T ) O(1/T) O(1/T)提高到 O ( 1 / T 2 ) O(1/T^2) O(1/T2)。加速近端梯度法的迭代公式为:
y ( t ) = θ ( t ) + β t ( θ ( t ) − θ ( t − 1 ) ) θ ( t + 1 ) = prox η g ( y ( t ) − η ∇ f ( y ( t ) ) ) \begin{aligned} y^{(t)} &= \theta^{(t)} + \beta_t(\theta^{(t)} - \theta^{(t-1)}) \\ \theta^{(t+1)} &= \text{prox}_{\eta g}(y^{(t)} - \eta \nabla f(y^{(t)})) \end{aligned} y(t)θ(t+1)=θ(t)+βt(θ(t)−θ(t−1))=proxηg(y(t)−η∇f(y(t)))
其中 β t \beta_t βt是加速参数,可以设置为 β t = t − 1 t + α − 1 \beta_t = \frac{t-1}{t+\alpha-1} βt=t+α−1t−1, α ≥ 3 \alpha \geq 3 α≥3。
交替方向乘子法(ADMM)在结构化剪枝中的应用
对于组套索等结构化稀疏正则化,交替方向乘子法(ADMM)是一种特别有效的优化算法。ADMM通过变量分解将原问题转化为多个更容易解决的子问题。
考虑问题:
min θ L ( θ ; X , Y ) + λ R ( θ ) \min_{\theta} \mathcal{L}(\theta; X, Y) + \lambda \mathcal{R}(\theta) θminL(θ;X,Y)+λR(θ)
引入辅助变量 z z z和约束 θ = z \theta = z θ=z,得到等价问题:
min θ , z L ( θ ; X , Y ) + λ R ( z ) s.t. θ = z \min_{\theta, z} \mathcal{L}(\theta; X, Y) + \lambda \mathcal{R}(z) \text{ s.t. } \theta = z θ,zminL(θ;X,Y)+λR(z) s.t. θ=z
ADMM的增广拉格朗日函数为:
L ρ ( θ , z , u ) = L ( θ ; X , Y ) + λ R ( z ) + u T ( θ − z ) + ρ 2 ∥ θ − z ∥ 2 2 \mathcal{L}_{\rho}(\theta, z, u) = \mathcal{L}(\theta; X, Y) + \lambda \mathcal{R}(z) + u^T(\theta - z) + \frac{\rho}{2}\|\theta - z\|_2^2 Lρ(θ,z,u)=L(θ;X,Y)+λR(z)+uT(θ−z)+2ρ∥θ−z∥22
其中 u u u是拉格朗日乘子, ρ > 0 \rho > 0 ρ>0是惩罚参数。ADMM迭代为:
θ ( k + 1 ) = arg min θ L ρ ( θ , z ( k ) , u ( k ) ) z ( k + 1 ) = arg min z L ρ ( θ ( k + 1 ) , z , u ( k ) ) u ( k + 1 ) = u ( k ) + ρ ( θ ( k + 1 ) − z ( k + 1 ) ) \begin{aligned} \theta^{(k+1)} &= \arg\min_{\theta} \mathcal{L}_{\rho}(\theta, z^{(k)}, u^{(k)}) \\ z^{(k+1)} &= \arg\min_{z} \mathcal{L}_{\rho}(\theta^{(k+1)}, z, u^{(k)}) \\ u^{(k+1)} &= u^{(k)} + \rho(\theta^{(k+1)} - z^{(k+1)}) \end{aligned} θ(k+1)z(k+1)u(k+1)=argθminLρ(θ,z(k),u(k))=argzminLρ(θ(k+1),z,u(k))=u(k)+ρ(θ(k+1)−z(k+1))
对于神经网络优化, θ \theta θ-更新涉及网络的标准训练(带有额外的二次惩罚),可以使用随机梯度下降解决; z z z-更新涉及近端算子计算,对于多种正则化项都有封闭形式解。
ADMM的优势在于它将复杂的正则化优化分解为更简单的子问题,特别适合处理难以直接优化的结构化稀疏正则化。
从理论到实践:结构化剪枝的具体实现
基于PyTorch的结构化剪枝数学实现
组套索正则化的数学原理与实现
在PyTorch中实现组套索正则化,我们需要首先定义组结构,然后计算相应的正则化项及其梯度。下面的代码展示了对卷积网络实现滤波器级结构化剪枝的数学原理和实现:
def group_lasso_regularizer(model, lambda_gl):
"""计算网络的组套索正则化项"""
reg_loss = 0
for name, param in model.named_parameters():
if 'weight' in name:
if param.dim() == 4: # 卷积层
# 计算每个滤波器的L2范数:||W_{i,:,:,:}||_2
filter_norms = torch.sqrt(torch.sum(param.pow(2), dim=[1, 2, 3]) + 1e-8)
# 对所有滤波器范数求和(L1范数)
reg_loss += lambda_gl * torch.sum(filter_norms)
elif param.dim() == 2: # 全连接层
# 计算每个输出神经元的L2范数:||W_{i,:}||_2
neuron_norms = torch.sqrt(torch.sum(param.pow(2), dim=1) + 1e-8)
# 对所有神经元范数求和(L1范数)
reg_loss += lambda_gl * torch.sum(neuron_norms)
return reg_loss
# 在训练循环中应用
for inputs, targets in trainloader:
optimizer.zero_grad()
outputs = model(inputs)
# 计算标准损失
ce_loss = criterion(outputs, targets)
# 计算组套索正则化项
gl_loss = group_lasso_regularizer(model, lambda_gl=0.001)
# 总损失
loss = ce_loss + gl_loss
# 反向传播和参数更新
loss.backward()
optimizer.step()
从数学上看,对于卷积层权重 W ∈ R N × C × H × W W \in \mathbb{R}^{N \times C \times H \times W} W∈RN×C×H×W,滤波器级组套索正则化计算每个滤波器 W i , : , : , : W_{i,:,:,:} Wi,:,:,:的L2范数,然后对这些范数求和:
R filter ( W ) = λ ∑ i = 1 N ∑ j = 1 C ∑ k = 1 H ∑ l = 1 W W i , j , k , l 2 + ϵ \mathcal{R}_{\text{filter}}(W) = \lambda \sum_{i=1}^N \sqrt{\sum_{j=1}^C\sum_{k=1}^H\sum_{l=1}^W W_{i,j,k,l}^2 + \epsilon} Rfilter(W)=λi=1∑Nj=1∑Ck=1∑Hl=1∑WWi,j,k,l2+ϵ
其中 ϵ \epsilon ϵ是一个小常数,确保数值稳定性和处理范数为零的情况。
基于近端梯度法的结构化剪枝算法
近端梯度法提供了另一种实现结构化剪枝的方法,不通过正则化而是直接通过近端算子实现。以下代码展示了如何实现组套索的近端算子进行滤波器剪枝:
def group_lasso_proximal_operator(param, threshold):
"""组套索的近端算子"""
if param.dim() == 4: # 卷积层
# 计算每个滤波器的L2范数
filter_norms = torch.sqrt(torch.sum(param.pow(2), dim=[1, 2, 3]) + 1e-8)
# 计算收缩因子
shrinkage_factors = torch.maximum(torch.zeros_like(filter_norms),
1 - threshold / filter_norms)
# 应用收缩
for i in range(param.shape[0]):
param.data[i] = param.data[i] * shrinkage_factors[i]
return param
# 在训练循环中应用
for inputs, targets in trainloader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
# 在优化器步骤后应用近端算子
with torch.no_grad():
for name, param in model.named_parameters():
if 'weight' in name and param.dim() == 4:
group_lasso_proximal_operator(param, threshold=0.01)
从数学上看,组套索的近端算子为:
prox λ ∥ ⋅ ∥ 2 , 1 ( θ g ) = θ g ⋅ max ( 0 , 1 − λ ∥ θ g ∥ 2 ) \text{prox}_{\lambda\|\cdot\|_{2,1}}(\theta_g) = \theta_g \cdot \max\left(0, 1 - \frac{\lambda}{\|\theta_g\|_2}\right) proxλ∥⋅∥2,1(θg)=θg⋅max(0,1−∥θg∥2λ)
这个操作对每个组(滤波器)应用软阈值,当组的范数小于阈值 λ \lambda λ时将其置零,否则按比例收缩。
这种近端梯度法的实现有一个重要优势:它在优化过程中直接产生稀疏结构,无需额外的后处理步骤。
网络瘦身(Network Slimming)的数学解析
网络瘦身是一种特殊的结构化剪枝方法,它通过对BatchNorm层的缩放因子 γ \gamma γ应用L1正则化来实现通道剪枝:
import torch
import torch.nn as nn
# 定义函数对BatchNorm缩放因子添加L1正则化
def update_bn(model, sparsity_factor):
"""对BN层的缩放因子应用L1正则化"""
for m in model.modules():
if isinstance(m, nn.BatchNorm2d):
m.weight.grad.data.add_(sparsity_factor * torch.sign(m.weight.data))
# 训练循环
for epoch in range(epochs):
for inputs, targets in trainloader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
# 对BatchNorm缩放因子应用L1正则化
update_bn(model, sparsity_factor=0.0001)
optimizer.step()
# 剪枝缩放因子小的通道
def prune_channels(model, threshold=0.01):
"""根据BN缩放因子值剪枝通道"""
for name, module in model.named_modules():
if isinstance(module, nn.BatchNorm2d):
# 创建二元掩码:保留大于阈值的通道
channel_mask = module.weight.data.abs() > threshold
# 应用掩码到缩放因子和偏置
module.weight.data.mul_(channel_mask.float())
module.bias.data.mul_(channel_mask.float())
# 找到对应的卷积层并剪枝输出通道
# 这需要知道网络结构,此处省略具体实现
从数学角度看,网络瘦身基于以下观察:假设第 l l l层的激活为 a l = B N ( W l ∗ a l − 1 ) a^l = BN(W^l * a^{l-1}) al=BN(Wl∗al−1),其中 B N BN BN表示BatchNorm,当BN的缩放因子 γ i l \gamma^l_i γil接近零时,对应的整个通道 i i i的输出接近零,可以剪枝而不影响性能。
L1正则化损失为:
L r e g = λ ∑ l ∑ i ∣ γ i l ∣ \mathcal{L}_{reg} = \lambda \sum_{l} \sum_{i} |\gamma^l_i| Lreg=λl∑i∑∣γil∣
这促使不重要的 γ i l \gamma^l_i γil趋向于零。剪枝时,我们移除满足 ∣ γ i l ∣ < τ |\gamma^l_i| < \tau ∣γil∣<τ的通道,其中 τ \tau τ是选定的阈值。
网络瘦身的数学优点在于:
- BatchNorm层的缩放因子自然作为通道重要性的指标,无需额外计算。
- 剪枝通道数量可以通过调整正则化强度 λ \lambda λ和阈值 τ \tau τ灵活控制。
- 通道重要性是全局衡量的,允许不同层有不同的剪枝比例。
TensorFlow实现的数学推导与代码分析
TensorFlow中实现结构化剪枝的核心同样是定义适当的正则化函数并将其应用到损失中:
import tensorflow as tf
def group_lasso_regularizer(model, lambda_gl=0.001):
"""计算模型的组套索正则化项"""
loss = 0
for layer in model.layers:
if isinstance(layer, tf.keras.layers.Conv2D):
# 获取层权重
weights = layer.kernel
# 按输出通道分组(在TensorFlow中是最后一个维度)
# 将输出通道维度移到第一位便于计算
weights_t = tf.transpose(weights, [3, 0, 1, 2])
# 计算每个滤波器的L2范数
filter_norms = tf.sqrt(tf.reduce_sum(tf.square(weights_t), axis=[1, 2, 3]) + 1e-8)
# 对所有滤波器范数求和
loss += lambda_gl * tf.reduce_sum(filter_norms)
return loss
# 带有组套索正则化的自定义模型
class GroupLassoModel(tf.keras.Model):
def __init__(self, base_model, lambda_gl=0.001):
super().__init__()
self.base_model = base_model
self.lambda_gl = lambda_gl
def call(self, inputs, training=None):
return self.base_model(inputs, training=training)
def train_step(self, data):
x, y = data
with tf.GradientTape() as tape:
y_pred = self(x, training=True)
# 基础损失
loss = self.compiled_loss(y, y_pred)
# 添加组套索正则化
loss += group_lasso_regularizer(self.base_model, self.lambda_gl)
# 计算梯度并更新权重
trainable_vars = self.trainable_variables
gradients = tape.gradient(loss, trainable_vars)
self.optimizer.apply_gradients(zip(gradients, trainable_vars))
# 更新度量
self.compiled_metrics.update_state(y, y_pred)
return {m.name: m.result() for m in self.metrics}
在TensorFlow中,卷积权重张量的维度排列与PyTorch不同:TF中为 [ H , W , C i n , C o u t ] [H, W, C_{in}, C_{out}] [H,W,Cin,Cout],而PyTorch中为 [ C o u t , C i n , H , W ] [C_{out}, C_{in}, H, W] [Cout,Cin,H,W]。因此在实现时需要通过转置调整维度顺序。
组套索正则化的数学表示为:
R ( W ) = λ ∑ i = 1 C o u t ∑ h = 1 H ∑ w = 1 W ∑ j = 1 C i n W h , w , j , i 2 + ϵ \mathcal{R}(W) = \lambda \sum_{i=1}^{C_{out}} \sqrt{\sum_{h=1}^H \sum_{w=1}^W \sum_{j=1}^{C_{in}} W_{h,w,j,i}^2 + \epsilon} R(W)=λi=1∑Couth=1∑Hw=1∑Wj=1∑CinWh,w,j,i2+ϵ
这与PyTorch实现中的数学形式本质上相同,只是张量维度顺序不同。
近端算子在TensorFlow中的实现
以下代码展示了如何在TF中实现组套索的近端算子:
@tf.function
def group_lasso_proximal_operator(weights, threshold):
"""组套索的近端算子"""
# 转置权重使输出通道在前
weights_t = tf.transpose(weights, [3, 0, 1, 2])
# 计算每个滤波器的L2范数
filter_norms = tf.sqrt(tf.reduce_sum(tf.square(weights_t), axis=[1, 2, 3]) + 1e-8)
# 计算收缩因子
shrinkage_factors = tf.maximum(0.0, 1.0 - threshold / filter_norms)
# 应用收缩
# 首先将收缩因子reshape以便广播
shrinkage_factors = tf.reshape(shrinkage_factors, [-1, 1, 1, 1])
# 应用收缩并转置回原始形状
weights_shrunk = tf.transpose(weights_t * shrinkage_factors, [1, 2, 3, 0])
return weights_shrunk
# 在训练后应用近端算子的自定义回调
class ProximalCallback(tf.keras.callbacks.Callback):
def __init__(self, threshold=0.01):
super().__init__()
self.threshold = threshold
def on_batch_end(self, batch, logs=None):
for layer in self.model.layers:
if isinstance(layer, tf.keras.layers.Conv2D):
w = layer.kernel.numpy()
w_pruned = group_lasso_proximal_operator(w, self.threshold).numpy()
layer.kernel.assign(w_pruned)
数学上,近端算子的实现与PyTorch版本相同,只是需要处理TensorFlow的维度排列差异。