我们在深度学习中,追求解决的核心问题是要设计一个不仅在训练集上表现很好,而且在测试集上也要有一个好的泛化性能。正则化就是一系列用来降低测试误差的策略。
正则化的定义是:
旨在减少泛化误差而不是训练误差,从而对学习算法进行的修改
很多正则化方法都是给目标函数
J
加上一个参数范数惩罚
\Omega(\theta)
,这样就会限制模型的学习能力。(因为模型不能够获得准确的损失函数值,而是一个求和的结果),将正则化后的目标函数记为
\tilde{J}
,则有
\tilde{J}(\theta;X,y)=J(\theta;X,y)+\alpha\Omega(\theta)
其中
\alpha \in [0,\infty]
,是权衡范数惩罚
\Omega
相对于目标函数
J
的贡献的超参数,当
\alpha=0
时,表示没有正则化。
\alpha
越大,表示正则化惩罚程度越大。
在模型对
\tilde{J}
进行最小化时,不仅会最小化误差函数
J
,同时还会降低某些参数
\theta
通过惩罚函数
\Omega(\theta)
得出的值,一般这些值都是在某些衡量规则下参数
\theta
的规模。
对哪些参数进行正则化?
在神经网络中,一般的参数包括两种:仿射变换的权重
W
和偏置
b
,通常只考虑对权重做惩罚。主要原因是精确拟合偏置所需要的数据量一般比拟合权重要少的多。且每个权重都指定了两个变量之间如何进行相互作用,要拟合权重就需要大量的数据来对两个变量各种情况下的取值进行观察,才能确定两个变量的相互作用方式。而偏置仅控制一个单变量,不进行正则化也不会导致过大的方差,同时正则化偏置有可能会导致欠拟合。
一般为了减少参数搜索的代价,选择在所有层使用相同的正则化方式。
L^2
参数正则化
L^2
正则化定义
L2正则化通常被称为权重衰减(weight decay),也被称为岭回归或是Tikhonov正则。策略是通过向目标函数添加一个正则项
\Omega(\theta) = \frac{1}{2}||\omega||_2^2
使得权重接近原点。
简化一下目标函数
\tilde{J}
,我们假设模型中不存在偏置参数,于是目标函数为:
\tilde{J}(\omega;X,y) = \frac{\alpha}{2}\omega^\top\omega+J(\omega;X,y)
对
\omega
求一下梯度可以得到:
\nabla_\omega \tilde{J}(\omega;X,y) = \alpha\omega+\nabla_\omega J(\omega;X,y)
既然得到了梯度,那么假设学习率是
\epsilon
,可以进行梯度下降。
\omega \gets \omega - \epsilon(\alpha\omega+\nabla_\omega J(\omega;X,y))
把
\omega
合并有:
\omega \gets (1-\epsilon\alpha)\omega - \epsilon\nabla_\omega J(\omega;X,y)
可以看到,在加入了正则化之后,梯度下降时会首先收缩权重
\omega
,即乘上一个小于1的常数。
在整个训练过程中,L2正则化又会产生怎么样的影响?在分析其作用时,我们主要关注的是,在正则化之前的最优解会受到正则化怎样的影响?
于是我们令
\omega^*
表示未正则化的目标函数取得最小训练误差时的权重向量,即
\omega^*=arg\ min_\omega J(\omega)
由于忽略损失函数具体的形式,我们就采用泰勒公式在
\omega^*
的邻域对目标函数做一个二次的近似
\hat{J}(\theta)
:
\hat{J}(\theta) = J(\omega^*)+\frac{1}{2}(\omega-\omega^*)^\top H(\omega-\omega^*)
在上式中,
H
为目标函数
J
在
\omega^*
处计算的Hessian矩阵,在多元函数的泰勒公式中,使用Hessian矩阵是一种更加简洁的表示方式。我们注意到该式中不存在一阶导数项,这是因为我们假设
\omega^*
为损失函数最小的点,因此一阶导数为0。而且由于Hessian矩阵的性质,在
\omega^*
处的Hessian矩阵一定至少是一个半正定矩阵。
这样,当
\hat{J}
到达最小的时候,梯度可以通过上面的公式求导得到:
\nabla{\hat{J}}(\omega) = H(\omega-\omega^*)=0
还记得之前我们求
\nabla{\tilde{J}}
的公式吗?我们用这里求出的导数去替换
\nabla_\omega J(\omega;X,y)
,可以得到:
\nabla_\omega \tilde{J}(\omega;X,y) = \alpha\omega+ H(\omega-\omega^*)
在加上正则项之后,目标函数最小时的解很可能就不再是
\omega^*
了,我们假设现在的最优解是
\tilde{\omega}
,那么
\nabla_{\tilde{\omega}} \tilde{J}(\omega;X,y) =0\\
\alpha\tilde{\omega}+ H(\tilde{\omega}-\omega^*)=0\\
(H+\alpha I)\tilde{\omega}=H\omega^*\\
\tilde{\omega} = (H+\alpha I)^{-1}H\omega^*
观察最后一个式子,当
\alpha=0
时,
\tilde{\omega}
趋向于
\omega^*
。而当
\alpha
增大时,由于
H
是一个实对称矩阵,我们可以将其分解成一个对角矩阵
\Lambda
和
H
的一组特征向量的标准正交基
Q
,有
H=Q\Lambda Q^\top\\
\begin{align}
\tilde{\omega} &= (Q\Lambda Q^\top+\alpha I)^{-1}Q\Lambda Q^\top\omega^*\\
&=(Q\Lambda Q^\top+\alpha QQ^\top)^{-1}Q\Lambda Q^\top\omega^*\\
&=(Q^\top(\Lambda+\alpha I)Q)^{-1}Q\Lambda Q^\top\omega^*\\
&=Q(\Lambda+\alpha I)^{-1}Q^\top Q\Lambda Q^\top\omega^*\\
&=Q(\Lambda+\alpha I)^{-1}\Lambda Q^\top\omega^*
\end{align}
这里插播一则消息
矩阵乘法与向量收缩
在之前的描述中我们知道了一个实对称矩阵
H \in R^{n \times n}
可以分解为一个对角矩阵
\Lambda \in R^{n \times n}
和一组特征向量标准正交基
Q \in R^{n \times n}
,
\Lambda
对角线上的元素即为
H
的特征值
\lambda_1,\lambda_2,...,\lambda_n
。我们知道,一组标准正交基可以表示向量空间中的任何一个向量,它可以看成是一套坐标轴。那么对于一个向量
u \in R^n
,可以通过
n
个正交基表示为
u=[u_1,u_2,...,u_n]
那么
Hu
的结果是什么呢?
Hu=[\lambda_1u_1,\lambda_2u_2,...,\lambda_nu_n]
注意这里的坐标对应的是H的标准正交基,而不是一般的笛卡尔坐标系。可以看出,乘积的结果是将该向量沿着正交基方向拉伸了对应的特征值的倍数。
插播完毕。
那么回到刚才,容易得到
(\Lambda+\alpha I)^{-1}\Lambda
的特征值为
[\frac{\lambda_1}{\lambda_1+\alpha},\frac{\lambda_2}{\lambda_2+\alpha},...,\frac{\lambda_n}{\lambda_n+\alpha}]
如果把
(\Lambda+\alpha I)^{-1}\Lambda
看成一个整体,就有了一点内味儿。
于是!
\tilde{\omega}
就可以看成是将
\omega^*
沿着
H
定义的每一条特征向量放缩对应的
\frac{\lambda_i}{\lambda_i+\alpha}
倍。
分析这个放缩倍数,我们可以知道,如果
\lambda_i >> \alpha
,那么其实放缩效果并不明显,但是如果
\lambda_i << \alpha
,那么
\omega^*
对应的分量就会被收缩到0。
继续往回思考,我们定义的
H
是Hessian矩阵,且是目标函数
J
在
\omega^*
处求得到的。
知乎里“石逍遥”大佬这么解释,Hessian矩阵的特征值的含义是曲面在局部的凹凸性,由于这个矩阵是半正定的矩阵,因此函数
J
定义的曲面在特征值对应的特征向量方向为凸的,且特征值越大,凸性越强。我们可以把曲面比作一个山区。在山地,大的那个特征值所对应的特征向量其实就是“最陡的”那条上(下)山的路,小的那个就是最平缓的。
因此,在特征值最大,即最陡,梯度最大的方向上,我们会保留这个分量,因为这个方向对于降低误差很有帮助,而在特征值较小的方向上,就会逐渐衰减对应分量的值。
打赏
点赞