记输入为x,输出为y,模型为f,模型参数为\theta,记为:
很多时候,我们希望得到一个"稳健"的模型。何为稳健?一般来说有两种含义,一是对于参数扰动的稳定性,比如模型变成了f_{\theta}(x);二是对于输入扰动的稳定性,比如输入从x变成了x+\Delta x后,f_{\theta}(x+\Delta x)是否能给出相近的预测结果。读者或许已经听过深度学习模型存在"对抗攻击样本",比如图片只改变一个像素就给出完全不一样的分类结果,这就是模型对输入过于敏感的案例
所以,大多数时候我们都希望模型对输入扰动是不敏感的,这通常能提高模型的泛化性能。也就是说,我们希望\Vert x_1-x_2\Vert很小时
也尽可能地小。当然,"尽可能"究竟是怎样,谁也说不准。于是Lipschitz提出了一个更具体的约束,那就是存在某个常数
也就是说,希望整个模型被一个线性函数"控制"住。这便是L约束
换言之,在这里我们认为满足L约束的模型才是一个好模型,并且对于具体的模型,我们希望估算出C(\theta)的表达式,并且希望C(\theta)越小越好,越小意味着它对输入扰动越不敏感,泛化性越好
在这里我们对具体的神经网络进行分析,以观察神经网络在什么时候会满足L约束
简单起见,我们考虑单层的全连接f(Wx+b),这里的f是激活函数,而W,b则是参数矩阵/向量,这时(3)变为
让x_1,x_2充分接近,那么就可以将左边用一阶项近似,得到
这里就需要再次回顾一下高等数学中求导公式
不知道大家有没有想过分母为什么是\Delta x,实际上是由于分子两个f的参数相减得到的,那么类比我们就可以得到
最终回到式(5)
显然,我们希望左边不超过右边,\frac{\partial f}{\partial x}这一项(每个元素)的绝对值必须不超过某个常数。这就要求我们使用"导数有上下界"的激活函数,不过我们目前常用的激活函数,比如sigmoid、tanh、relu等,都满足这个条件。假定激活函数的梯度已经有界,尤其是我们常用的relu激活函数来说,这个界还是1。因此\frac{\partial f}{\partial x}这一项只带来一个常数,我们暂时忽略它,接下来我们只需要考虑\Vert W(x_1-x_2)\Vert
多层的神经网络可以逐步递归分析,从而最终还是单层的神经网络问题,而CNN、RNN等结构本质上还是特殊的全连接,所以照样可以用全连接的结果。因此,对于神经网络来说,问题变成了:如果
恒成立,那么C的表达式是什么?找出C的表达式后,我们就可以希望C尽可能小,从而给参数带来一个正则化项C^2
其实到这里,我们已经将问题转化为了一个矩阵范数问题(矩阵范数的作用相当于向量的模长),它定义为
式(7)中的x实际上可以看作是(x_1-x_2),那么有
如果W是一个方阵,那么该范数又称为"谱范数",在本文中就算它不是方阵我们也叫它"谱范数"好了。注意\Vert Wx\Vert和\Vert x\Vert指的都是向量的范数,就是普通的向量模长(向量范数与矩阵范数科普)。有了向量范数的概念后,我们就有
其实也没做啥,就换了个记号而已,将C换为\Vert W\Vert_2,而\Vert W\Vert_2等于多少我们还是没有搞出来
其实谱范数\Vert W\Vert_2的准确概念和计算方法要用到比较多的线性代数的概念,我们暂时不研究它,而是先研究一个更简单的范数:Frobenius范数,简称F范数。它的定义特别简单
说白了就是直接把矩阵当成一个向量,然后求向量的欧式模长。简单通过柯西不等式,我们就能证明
很明显\Vert W\Vert_F提供了\Vert W\Vert_2的一个上界,也就是说,你可以理解为\Vert W\Vert_2是式(6)中最准确的C(所有满足式(6)的C中最小的那个),但如果你不太关心精准度,你可以直接取C=\Vert W\Vert_F,也能使得(6)成立,毕竟\Vert W\Vert_F容易计算
前面已经说过,为了使神经网络尽可能好的满足L约束,我们应当希望C=\Vert W\Vert_2尽可能小,我们可以把C^2作为一个正则项加入到损失函数中。当然,我们还没有算出谱范数\Vert W\Vert_2,但我们算出了一个更大的上界\Vert W\Vert_F,那就先用着它吧,即loss为
其中第一部分是指模型原来的loss。我们再来回顾一下\Vert W\Vert_F的表达式,我们发现加入的正则项是
这不就是L2正则化吗?终于,捣鼓了一番,我们揭示了L2正则化(也称为weight decay)与L约束的联系,表明l2正则化能使得模型更好地满足L约束,从而降低模型对输入扰动的敏感性,增强模型的泛化性能