过拟合与欠拟合
过拟合和欠拟合现象的定义
过拟合和欠拟合模型是深度学习模型在训练过程中比较容易出现的不好的现象。
当模型的表现能力弱于事件的真实表现时,会出现欠拟合现象。某个非线性模型合适的解如图1(a)所示。如果用线性模型去训练这个非线性问题,自然难以得到合适的解,如图1(b)所示。
![图片[1]-过拟合与欠拟合-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/02/20240201162808508.png)
相反,当模型的表现能力强于事件的真实表现时,会出现过拟合现象,过拟合现象是指模型为了追求训练集的准确率,过多地学习一些非普遍的特征,导致模型的泛化能力下降。虽然能很好地拟合训练集,但是在测试集上表现不佳。正常拟合的模型如图2(a)所示,过拟合的模型如图2(b)所示。
![图片[2]-过拟合与欠拟合-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/02/20240201162937943.png)
过拟合和欠拟合现象的产生原因
影响模型过拟合和欠拟合的原因主要有两个:数据(数据量大小)和模型容量(模型复杂度),其关系见下表1。
数据简单 | 数据复杂 | |
模型容量低 | 正常 | 欠拟合 |
模型容量高 | 过拟合 | 正常 |
从数据量的角度理解:当用于训练模型的数据太少容易出现过拟合现象;数据太多容易出现欠拟合现象。这个现象可以通过生活中的例子来解释:假设一个大学生正在努力准备期末考试。如果用于考试的备考题库(训练集)太简单,学生可能试图通过死记硬背考题的答案来做准备。他甚至可以完全记住过去考试的答案,实际上这样做他并没有真的理解题目。这种记住训练集中每个样本的现象被称之为过拟合。相反,如果用于考试的备考题库太多太难,超出学生记忆过的范围,同时学生也很难理解题目之间相关性以及分析数据的特征。这种训练集太难,模型无法胜任处理工作的现象被称之为欠拟合。
从模型复杂程度的角度理解:为什么一个大学生会想到背答案?如果换个幼儿园的小朋友来做题还会想到背答案这个方法吗?其实,一个大学生可以类比成一个复杂的模型,而一个幼儿园小朋友可以类比成一个简单的模型。由此可以轻易地判断出,一个复杂的模型更容易出现过拟合现象,因为它更容易记住训练集中的每个样本而不是学习到普适的特征。
最后,训练误差和泛化误差是衡量模型拟合效果的两个重要指标。首先解释一下什么是训练误差和泛化误差:
(1)训练误差(Training Error),指模型在训练数据集上计算得到的误差。
(2)泛化误差(Generalization Error),指模型应用在同样从原始样本的分布中抽取的无限多数据样本时,模型误差的期望。
问题是,我们永远不能准确地计算出泛化误差。这是因为无限多的数据样本是一个虚构的对象。在实际中,只能通过将模型应用于一个独立的测试集来估计泛化误差,该测试集由随机选取的、未曾在训练集中出现的数据样本构成。
过拟合现象的一个明显的特点是模型的训练误差很小,但是泛化误差很大。而欠拟合现象的体现是模型的训练误差和泛化误差都很大。训练模型的目的是希望模型能适用于真实世界,即模型的泛化误差要小,因此,过拟合和欠拟合现象都是在训练深度学习模型中应该尽量避免的问题。
过拟合的解决方案
L1正则
L1正则化(L1 Regularization)是机器学习和统计领域中用于防止模型过拟合的技术之一。它通过在损失函数中添加一个与模型参数的绝对值成正比的惩罚项来工作。假设我们有一个简单的神经网络,它由一个输入层、两个隐藏层和一个输出层组成。每个层之间的权重矩阵由W表示。
设神经网络的输出为 \(h\left(\boldsymbol{W}, \boldsymbol{x}^{(i)}\right)\), 真实值为 \(\boldsymbol{y}^{(i)}\), 则 MSE 损失函数定义为:
$$
J_{\text {MSE }}(\boldsymbol{W})=\frac{1}{m} \sum_{i=1}^m\left(h\left(\boldsymbol{W}, \boldsymbol{x}^{(i)}\right)-\boldsymbol{y}^{(i)}\right)^2
$$
其中: \(m\) 是训练样本的数量; \(\boldsymbol{W}\) 代表神经网络所有的权重。
当为其添加 L1 正则化时, 损失函数变为:
$$
J_{L 1}(\boldsymbol{W})=\frac{1}{m} \sum_{i=1}^m\left(h\left(\boldsymbol{W}, \boldsymbol{x}^{(i)}\right)-\boldsymbol{y}^{(i)}\right)^2+\lambda \sum_l \sum_i \sum_j\left|\boldsymbol{W}_{i j}^{(l)}\right|
$$
这里除了损失函数外的额外项就是当前添加的L1正则。在减小损失函数的过程中,由于正则项和原损失是相加的,所以它们都会在模型训练期间慢慢减小,又因为正则项是所有参数绝对值的求和,所以减小正则项就意味着限制模型中的所有参数不要太大,防止出现梯度不稳定的训练问题。
注意: \(\lambda\) 是正则化的强度参数。 \(\boldsymbol{W}_{i j}^{(l)}\) 是第 \(l\) 层的权重矩阵中的元素, 从第 \(i\) 个神经元到第 \(j\) 个神经元的连接。外部的求和覆盖了网络中的所有层、所有神经元及其连接。
L1正则化引入的效果是:
(1)权重稀疏性:L1正则化导致网络中很多权重趋近于0,从而引入了权重的稀疏性。
(2)简化模型:由于部分权重变为0,网络的某些连接实际上会被“关闭”,这有助于减少过拟合并简化模型。
正如之前提到的,选择适当的正则化强度(即\(\lambda\)值)是关键。太小的值可能不会有太大的正则化效果,而太大的值可能会导致过多的权重变为0,从而过度简化模型。通常,交叉验证是确定最佳\(\lambda\)值的好方法。
L2正则
L2 正则 (L2 Regularization) 是在损失函数上加一个 \(\boldsymbol{\omega}\) 的绝对值平方项, 产生让 \(\boldsymbol{\omega}\) 尽可能不要太大的效果。
\(\mathrm{L} 2\) 正则一般不考虑参数 \(b\) 的正则, 只是计入参数 \(\boldsymbol{\omega}\) 的正则, 因为 \(b\) 参数量小, 不易增加模型的复杂性,也不易带来模型输出的方差。正则化参数 \(b\) 反而可能导致模型欠拟合。
损失函数再加入 L2 正则后,新的损失函数 \(L^{\prime}\) 表示为:
$$
L^{\prime}=L+\frac{1}{2} \lambda\left\|\omega_{t-1}\right\|^2
$$
对损失函数 \(L^{\prime}\) 求导得到导数 \(g^{\prime}\) :
$$
g^{\prime}=g+\lambda \omega_{t-1}
$$
使用梯度下降算法更新参数 \(\boldsymbol{\omega}_t\) :
$$
\omega_t=\omega_t-\eta \boldsymbol{g}-\eta \lambda \omega_{t-1}=(1-\eta \lambda) \omega_t-\eta \boldsymbol{g}
$$
通常 \(\eta \lambda<1\), 所以与参数 \(\boldsymbol{\omega}\) 相乘时, 有衰减权重的作用, 因此 L2 正则又被称为权重衰减。
Dropout
深度学习中的正则可以看作通过约束模型复杂度来防止过拟合现象的一些手段。首先,模型复杂度是由模型的参数量大小和参数的可取值范围一起决定的。因此正则方法也分为两个方向:一个方向致力于约束模型参数的取值范围,例如权重衰减(Weight Decay);一个方向致力于约束模型参数量,例如丢弃法(Dropout)。
(1)通过限制参数值的取值范围来约束模型复杂度。
可以使用均方范数作为硬性限制, 让其小于某超参数 \(\theta\), 小的 \(\theta\) 意味着更强的约束:
$$
\min \ell(\boldsymbol{\omega}, b) \text { subject to }\|\boldsymbol{\omega}\|^2 \leq \theta
$$
此外, 也可以使用均方范数作为柔性限制, 方法如下:
$$
\min \left(\ell(\boldsymbol{\omega}, b)+\frac{\lambda}{2}\|\boldsymbol{\omega}\|^2\right)
$$
由于求最小值的括号里是两项相加的操作, 所以两个子项都要求最小, 第一个子项是训练损失的求解; 第二个子项则是添加的约束: 当 \(\lambda \rightarrow \infty\) 时, 为了求最小值, \(\omega\) 会趋近零,这相当于对权重的取值进行了约束; 当 \(\lambda=0\) 时, 子项也等于 0 , 这相当于没有约束。即 \(\lambda\) 越大, 对于权重取值范围的约束就越强。这种正则方法被称作 L2 正则或权重衰减。当带有这种正则项的损失函数进行梯度计算时:
$$
\frac{\partial}{\partial \boldsymbol{\omega}}\left(\ell(\boldsymbol{\omega}, b)+\frac{\lambda}{2}\|\boldsymbol{\omega}\|^2\right)=\frac{\partial \ell(\boldsymbol{\omega}, b)}{\partial \boldsymbol{\omega}}+\lambda \boldsymbol{\omega}
$$
然后使用梯度下降算法更新参数, 推导得出:
$$
\omega_{t+1}=(1-\eta \lambda) \omega_t-\eta \frac{\partial \lambda\left(\omega_t, b_t\right)}{\partial \omega_t}
$$
可以发现, 相较于正常的梯度下降算法公式, 此时多出了一个 \((1-\eta \lambda)\) 项, 这一项通常是小于 1 的, 因此相乘时会减弱权重 \(\omega_t\), 这也是它的名字权重衰减的由来。
此外, L1 范数也是常用的惩罚方法, 公式为 \(\alpha\|\omega\|\) 。L1 范数相对于 L2 范数能产生更加稀疏的模型, 在参数 \(\boldsymbol{\omega}\) 较小的情况下会直接缩减至 0 , 可以起到特征选择的作用, 也称之为Lasso回归。举例:对于一个数值很大的权重集合[98,56,14,77]。经过L1范数可能的结果是[36,27,0,31];经过L2范数可能的结果是[9,5,1,7]。两者对比发现L2范数后依然可以考虑到全部的特征,而L1范数可能会损失一些特征,即考虑不全面。
最后,从概率的角度分析,范数约束相当于对参数添加先验分布,其中L2范数相当于假定参数服从高斯先验分布;L1范数相当于假定参数服从拉普拉斯分布。
(2)通过限制参数值的容量范围来约束模型复杂度。
防止模型过拟合的第二个方向是通过限制参数值的容量范围来约束模型复杂度。在这个方向下,最著名的算法称为丢弃法,完整网络如图3(a)所示,丢弃法网络模型如图3(b)所示。在训练过程中,丢弃法随机地将一些神经元的输出置为零,即将其Dropout,这些被丢弃的神经元在当前训练样本的前向传播和反向传播过程中不会被激活或更新。
![图片[3]-过拟合与欠拟合-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/02/20240201164053583.png)
数据增强
上述解决方案从模型复杂度角度来防止过拟合现象的;本节主要是从训练集容量角度来防止过拟合现象,采用的方法叫作数据增强(Data Augmentation)。
原理很简单,只要提升训练数据集的样本数量就可以防止过拟合现象。以计算机视觉任务为例,可以从图像数据集中抽出每个样本,针对每个样本做不同的随机裁剪、水平翻转、颜色光照变换,对比度增减等操作,这样可以由一张原图得到很多的副本图像。将这些图像一起作为模型的训练集,即可增加数据集的容量,示例图片如下图4所示。
![图片[4]-过拟合与欠拟合-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/02/20240201164340169-1024x362.png)
当然,这种简单的方式已经比较古老了。现在也有人使用生成对抗网络(基于神经网络的一种变体,擅长生成数据)来生成新的样本作为训练样本,经过实验验证也是可行的。
到此,关于防止深度学习训练产生过拟合现象的两种手段已经介绍完了(正则和数据增强)。而防止模型欠拟合的方法比较简单,直接通过增加深度学习模型隐藏层的数量,让模型变深一些即可。
暂无评论内容