使用谱正则化改进深度学习的泛化性.
1. 神经网络的Lipschitz约束
一般地,一个实值函数$f$是$K$阶Lipschitz连续的,是指存在一个实数$K\geq 0$,使得对\(\forall x_1,x_2 \in \Bbb{R}\),有:
\[|| f(x_1)-f(x_2) || ≤K || x_1-x_2 ||\]通常一个连续可微函数满足Lipschitz连续,这是因为其微分(用$\frac{|f(x_1)-f(x_2)|}{|x_1-x_2|}$近似)是有界的。但是一个Lipschitz连续函数不一定是处处可微的,比如$f(x) = |x|$。
若神经网络具有Lipschitz连续性,意味着该网络对输入扰动不敏感,具有更好的泛化性。下面讨论如何对神经网络施加Lipschitz约束。
假设神经网络$f(x)$具有参数$W$,则Lipschitz常数$K$通常是由参数$W$决定的,此时Lipschitz约束为:
\[|| f_W(x_1)-f_W(x_2) ||\leq K(W) || x_1-x_2 ||\]首先考虑单层全连接层$f_W(x)=\sigma(Wx)$,其中$\sigma$是激活函数,对应Lipschitz约束:
\[|| \sigma(Wx_1)-\sigma(Wx_2) || \leq K(W) || x_1-x_2 ||\]对$\sigma(Wx)$进行Taylor展开并取一阶近似可得:
\[|| \frac{\partial \sigma}{\partial Wx} W(x_1-x_2) || \leq K(W) || x_1-x_2 ||\]$\frac{\partial \sigma}{\partial Wx}$表示激活函数的导数。通常激活函数的导数是有界的,比如ReLU函数的导数范围是$[0,1]$;因此这一项可以被忽略。则全连接层的Lipschitz约束为:
\[|| W(x_1-x_2) || \leq K(W) || x_1-x_2 ||\]上式对全连接层的参数$W$进行了约束。在实践中全连接网络是由全连接层组合而成,而卷积网络、循环网络等也可以表示为特殊的全连接网络,因此上述分析具有一般性。
2. 矩阵范数问题
全连接层的Lipschitz约束可以转化为一个矩阵范数问题(由向量范数诱导出来的矩阵范数,作用相当于向量的模长),定义为:
\[||W||_2 = \mathop{\max}_{x \neq 0} \frac{||Wx||}{||x||}\]当$W$为方阵时,上述矩阵范数称为谱范数(spectral norm)。此时问题转化为:
\[|| W(x_1-x_2) || \leq ||W||_2 \cdot || x_1-x_2 ||\]谱范数$||W||_2$等于$W^TW$的最大特征值(主特征值)的平方根;若$W$为方阵,则$||W||_2$等于$W$的最大特征值的绝对值。
⚪ 谱范数的证明
谱范数$||W||_2$的平方为:
\[||W||_2^2 = \mathop{\max}_{x \neq 0} \frac{x^TW^TWx}{x^Tx}\]上式右端为瑞利商(Rayleigh Quotient),取值范围是:
\[\lambda_{min}≤\frac{x^TW^TWx}{x^Tx}≤\lambda_{max}\]因此谱范数$||W||_2$的平方的取值为$W^TW$的最大特征值。
⚪ 谱范数的计算:幂迭代
$W^TW$的最大特征值可以通过幂迭代(power iteration)方法求解。
迭代格式1:
\[u \leftarrow \frac{(W^TW)u}{||(W^TW)u||}, ||W||_2^2 ≈ u^TW^TWu\]迭代格式2:
\[v \leftarrow \frac{W^Tu}{||W^Tu||},u \leftarrow \frac{Wv}{||Wv||}, ||W||_2 ≈ u^TWv\]其中$u,v$可以初始化为全$1$向量。下面以迭代格式1为例简单证明迭代过程收敛,记$A=W^TW$,初始化$u^{(0)}$,若$A$可对角化,则$A$的特征向量\(\{v_1 v_2 \cdots v_n\}\)构成一组完备的基,$u^{(0)}$可由这组基表示:
\[u^{(0)} = c_1v_1+c_2v_2+\cdots c_nv_n\]先不考虑迭代中分母的归一化,则迭代过程$u \leftarrow Au$经过$t$次后为:
\[A^tu^{(0)} = c_1A^tv_1+c_2A^tv_2+\cdots c_nA^tv_n\]注意到$Av=\lambda v$,则有:
\[A^tu^{(0)} = c_1\lambda_1^tv_1+c_2\lambda_2^tv_2+\cdots c_n\lambda_n^tv_n\]不失一般性地假设$\lambda_1$为最大特征值,则有:
\[\frac{A^tu^{(0)}}{\lambda_1^t} = c_1v_1+c_2(\frac{\lambda_2}{\lambda_1})^tv_2+\cdots c_n(\frac{\lambda_n}{\lambda_1})^tv_n\]注意到当$t \to \infty$时,$(\frac{\lambda_2}{\lambda_1})^t,\cdots (\frac{\lambda_n}{\lambda_1})^t \to 0$。则有:
\[\frac{A^tu^{(0)}}{\lambda_1^t} ≈ c_1v_1\]上述结果表明当迭代次数$t$足够大时,$A^tu^{(0)}$提供了最大特征根对应的特征向量的近似方向,对其归一化后相当于单位特征向量:
\[\begin{aligned} u &= \frac{A^tu^{(0)}}{||A^tu^{(0)}||} \\ A u &≈ \lambda_1 u \end{aligned}\]因此可求$A=W^TW$的最大特征值:
\[u^T A u ≈ \lambda_1\]3. 谱正则化 Spectral Norm Regularization
谱正则化(Spectral Norm Regularization)是指把谱范数的平方作为正则项:
\[\mathcal{L}(x,y;W) + \lambda ||W||_2^2\]谱正则化能够增强网络的Lipschitz连续性,减少网络对输入扰动的敏感程度,增强网络的泛化性。
下面给出pytorch中实现谱正则化的方法,采用迭代过程:
\[v \leftarrow \frac{W^Tu}{||W^Tu||},u \leftarrow \frac{Wv}{||Wv||}, ||W||_2 ≈ u^TWv\]def spectral_norm(w, t=5):
w = w.view(-1, w.shape[-1]) # [m, n]
u = torch.ones(1, w.shape[0]) # [1, m]
for i in range(t):
v = torch.mm(u, w) # [1, n]
v = v/torch.norm(v)
u = torch.mm(v, w.T) # [1, m]
u = u/torch.norm(u)
return torch.sum(torch.mm(torch.mm(u, w), v.T))