神经网络的正则化

正则化的介绍和推导

神经网络的模型如果比较复杂,数据集相对而言又比较简单,那么因为模型能力强大到可以记住每一个样本,其中不乏噪声数据,会导致模型的过拟合。

因此,我们需要对过拟合的模型进行简化,让模型变得简单的一种方式是让参数变少,一种是让参数变小。

让参数个数变少,那么模型的拟合能力自然会变差。让参数的值变小,那么参数对于数据的敏感度会降低。比如\(y=wx+b\)线性回归,如果\(w\)比较大,那么\(x\)很小的变化也会导致模型的值发生比较大的改变,如果\(w\)比较小,就算\(x\)变化幅度比较大,\(y\)的变化量也会比较小。

为了让模型的参数数据量变小,我们可以在损失函数中添加一个惩罚项,比如,对于一个样本\((\mathbf{x}, \mathbf{y})\),预测输出为\(\mathbf{\hat y}\)\[ L = l(\mathbf{\hat y}, \mathbf{y}) + \frac{\lambda}{2}||\mathbf{w}||^2 \] 或者 \[ L = l(\mathbf{\hat y}, \mathbf{y}) + ||w||_1 \] 其中,第一个式子中的\(||\mathbf{w}||^2\)是向量\(\mathbf{w}\)的F范数,也就是\(L_2\)范数的平方,这个正则化的方式称为L2正则化;第二个式子中的\(||\mathbf{w}||_1\)是向量\(\mathbf{w}\)的L1范数,这个正则化的方式称为L1正则化

上面只是对一个神经元的参数\(\mathbf{w}\)添加惩罚项,神经网络有很多个神经元,我们需要对这些神经元都添加惩罚项: \[ L = l(\mathbf{\hat y}, \mathbf{y}) + \frac{\lambda}{2}\sum_i||\mathbf{w}_i||^2 \] 或者 \[ L = l(\mathbf{\hat y}, \mathbf{y}) +\sum_i||\mathbf{w}_i||_1 \] \(\mathbf{w}_i\)表示第\(i\)个神经元的权重向量

同样的,对于多个样本组成的矩阵或多维张量\((\mathbf{X}, \mathbf{Y})\)\[ L = l(\mathbf{\hat Y}, \mathbf{Y}) + \frac{\lambda}{2}\sum_i||\mathbf{w}_i||^2 \] 或者 \[ L = l(\mathbf{\hat Y}, \mathbf{Y}) + \sum_i||\mathbf{w}_i||_1 \]

现在对含有L2正则项的损失函数反向求梯度: \[ \frac{\partial L}{\partial \mathbf{w}_j} = \frac{\partial l(\mathbf{\hat Y}, \mathbf{Y})}{\partial \mathbf{w}_j} + \frac{\partial \Big(\frac{\lambda}{2}\sum_i||\mathbf{w}_i||^2\Big)}{\partial \mathbf{w}_j} \] 其中\(\frac{\partial l(\mathbf{\hat Y}, \mathbf{Y})}{\partial \mathbf{w}_j}\)就是没有添加L2正则项之前的梯度,因此,添加了L2正则项后,梯度变成了没有添加之前的梯度再加上\(\frac{\partial \Big(\frac{\lambda}{2}\sum_i||\mathbf{w}_i||^2\Big)}{\partial \mathbf{w}_j}\)

\[ \frac{\partial \Big(\frac{\lambda}{2}\sum_i||\mathbf{w}_i||^2\Big)}{\partial \mathbf{w}_j} = \lambda\mathbf{w}_j \] L2正则化的参数更新: \[ \mathbf{w}_j \longleftarrow \mathbf{w}_j - \eta\frac{\partial L}{\partial \mathbf{w}_j} \]\[ \mathbf{w}_j \longleftarrow (1-\eta\lambda)\mathbf{w}_j - \eta\frac{\partial l(\mathbf{\hat Y}, \mathbf{Y})}{\partial \mathbf{w}_j} \] 一般情况下\(0<\eta\lambda<1\),也就是每次参数更新等价于将参数缩放后减去梯度

在实际的训练中,我们一般不会直接在损失函数中添加惩罚项,而是直接在优化器中设置weight_decay(也就是直接在梯度下降时使用上述公式),也就是\(\lambda\),减小计算量

对L1正则项的损失函数反向求梯度: \[ \frac{\partial L}{\partial \mathbf{w}_j} = \frac{\partial l(\mathbf{\hat Y}, \mathbf{Y})}{\partial \mathbf{w}_j} + \frac{\partial \Big(\sum_i||\mathbf{w}_i||_1\Big)}{\partial \mathbf{w}_j} \]\[ \frac{\partial \Big(\sum_i||\mathbf{w}_i||_1\Big)}{\partial \mathbf{w}_j} = \mathbf{1} \] \(\mathbf{1}\)为维度与\(\mathbf{w}_j\)维度相同的全一向量

L1正则化的参数更新: \[ \mathbf{w}_j \longleftarrow \mathbf{w}_j - \eta\frac{\partial L}{\partial \mathbf{w}_j} \]\[ \mathbf{w}_j \longleftarrow \mathbf{w}_j - \eta\frac{\partial l(\mathbf{\hat Y}, \mathbf{Y})}{\partial \mathbf{w}_j} - \eta \] 也就是每次参数更新等价于将参数减去一个常数\(\eta\)后再减去梯度

L1正则化和L2正则化的区别

L1正则化倾向于产生稀疏解,即许多参数变为零。这是因为L1正则化的损失函数在参数为零时不可导,导致优化过程中参数容易跳跃到零值。

L2正则化倾向于产生平滑解,即参数的值普遍较小。这是因为L2正则化的损失函数是参数的二次函数,对大参数值施加了较大的惩罚。在梯度下降过程中,L2正则化的梯度是参数的线性函数,导致每次更新时参数都会按比例缩小,从而使得参数值逐渐减小。

在实际使用中,L2正则化往往比L1正则化有着更好的效果


神经网络的正则化
https://blog.shinebook.net/2025/03/15/人工智能/理论基础/深度学习/神经网络的正则化/
作者
X
发布于
2025年3月15日
许可协议