致深度学习小白:一文理解拟合问题与经典解决方案

本文以作者阅读《Dive into Deep Learning》为线索,融合串联了自身理解感悟、原始论文、优秀文章等。如有无意侵权,请联系本人删除。

让我们用偏差 - 方差分解公式引入这个话题

\\\mathbf{E}(f;D)=bias\^2 (x)+var(x)+\\epsilon\^2\\

其中,

\\\begin{split} 学习能力:\&bias\^2(x) =(\\overline f(x)-y)\^2 \\\\ 数据充分性:\&var(x)=E_D\[(f(x;D)-\\overline f(x))\^2 \\ 学习难度:&\epsilon ^2=E_D(y_D-y)\^2 \end{split} \]

  • 若线性拟合,只能单独看一个特征,然后遍历以拟合,即大偏差小方差,泛化误差大,欠拟合。
  • 若复杂度过高的神经网络(如未正则化),对训练数据的微小噪声波动极敏感,小偏差大方差,泛化误差大,过拟合。
  • 若复杂度适中的神经网络,中等偏差中等方差,泛化误差小,最佳了。

得出结论:偏差是模型没学会,方差是模型学太杂

影响偏差与方差的三大因素

1. 学习算法能力(模型复杂度)

如果模型欠拟合(偏差大),就换更复杂的模型;如果过拟合(方差大),就换更简单的模型(或对复杂模型做正则化)。

2. 训练数据量

对偏差无影响,对方差影响大

如果模型过拟合(方差大),优先增加训练数据。

3. 学习任务本身的难度(任务复杂度)

如果任务简单但方差大,就控制模型复杂度或增加数据;如果任务复杂导致偏差大,就提升模型复杂度

如何判断模型是 "欠拟合(高偏差)" 还是 "过拟合(高方差)

  • 欠拟合(高偏差):训练误差大,测试误差也大(模型没学会核心规律,对训练和测试数据都判断不准)。应该换更复杂的模型、增加特征维数、增加 epoch_num 大小。
  • 过拟合(高方差):训练误差小,测试误差大(模型过于重视训练数据的噪声,对测试数据判断不准)。应该增加训练数据、正则化(如使用L1正则化、L2正则化即权重衰减、归一化、Dropout等)、剪枝降复杂度、降低特征维度。

先说权重衰减(\(L_2\)正则化):

  • 背景 :阶数过低(欠拟合)或阶数过高(过拟合,并且导致模型复杂度显著提升)都不行
  • \(Solution\):\(L_2\) 正则化 \((\space Weight\space Decay\space)\)
  • 就是惩罚增长过大的权重向量,通过函数与零的距离来衡量函数的复杂度,因为函数\(f(\mathbf{x})=0\) 永远是最简单的
  • 为保证权重向量比较小,将其范数 \(\| \mathbf{w} \|^2\) 作为惩罚项加入 \(\mathbf{L}\) 中,将训练目标从 最小化训练标签上的预测损失 变为 最小化预测损失和惩罚项之和 。我们就可以得到:
    首先原有损失为:

\L(\\mathbf{w}, b) = \\frac{1}{n}\\sum_{i=1}\^n \\frac{1}{2}\\left(\\mathbf{w}\^\\top \\mathbf{x}\^{(i)} + b - y\^{(i)}\\right)\^2. \\

引入超参数 \(\lambda\) 权衡 \(\| \mathbf{w} \|^2\)。即

\L_{new}(\\mathbf{w}, b) =L(\\mathbf{w}, b) + \\frac{\\lambda}{2} \\\|\\mathbf{w}\\\|\^2, \\

这里取 \(\frac{\lambda}{2}\) 是为了计算导数时的美观简单。

再说Bishop

我们从扰动的稳健性说起

经典泛化理论认为,为了缩小训练和测试性能之间的差距,应该以简单的模型为目标。简单性的另一个角度是平滑性,即函数不应该对其输入的微小变化敏感。即如果我们想样本添加一些随机噪声应该是对模型基本无影响。

在深层网络中注入噪声,会强制网络学习更加稳定、鲁棒的输入- 输出关系,使得微小的输入变化不会导致输出的剧烈跳变,从而增强映射的平滑性。

在输入数据中添加噪声 就等价于 Tikhonov正则化
Tikhonov正则化 实际上就是 L2正则化权重衰减

但是 Tikhonov正则化 存在一个问题:只是在输入层添加噪声。

然而对于一个多层的深层网络,如果只在输入层添加噪声,深层网络可能会忽略这些噪声,从而仍然过拟合。

而如果在每一层都添加噪声,即 在前向传播过程中,计算每一内部层的同时注入噪声 ,那么整个网络都被正则化,迫使每一层都要对噪声具有鲁棒性,这才是我们想要的。

如何注入噪声呢?我们将高斯噪声添加到线性模型。每次迭代,我们对\(\mathbf{x}\) :

\\\begin{split} 取分布\\space\\epsilon \&\\sim \\mathcal{N}(0,\\sigma\^2) \\\\ 使\\space \\mathbf{x}' \&= \\mathbf{x} + \\epsilon\\\\ 预期\\space E\[\\mathbf{x}' &= \mathbf{x} \end{split} \]

这就是Bishop方法

现在可以说说Dropout

对于每个中间激活值,

\\\begin{split}\\begin{aligned} h' = \\begin{cases} 0 \& \\text{ 概率为 } p \\\\ \\frac{h}{1-p} \& \\text{ 其他情况} \\end{cases} \\end{aligned}\\end{split} \\

那么 \(h\) 是什么?

\x\\xrightarrow{W_1,\\space b_1}z_1\\xrightarrow{\\sigma}h_1\\xrightarrow{Dropout}h'_1\\xrightarrow{W_2,\\space b_2}z_2\\xrightarrow{\\sigma}h_2\\xrightarrow{Dropout}h'_2\\rightarrow\\ldots \\

就是中间特征值。所以,我们用掩码去掉的,其实就是某层的整个某节点。

我们不难证明,\(Eh' = h\) (很简单的高中数学概率知识)

无 \(Dropout\) 的神经网络:

\\\begin{equation}\\begin{split} \\mathcal{z}_i\^{(l+1)} \&=\\mathbf{w}_i\^{(l+1)}\\mathbf{y}\^l+b_i\^{(l+1)}\\\\ \\mathcal{y}_i\^{(l+1)}\&=f(\\mathcal{z}_i\^{(l+1)}) \\end{split}\\end{equation}\\

有 \(Dropout\) 的神经网络(这是早期,原始论文,所以未进行缩放来维持期望):

\\\begin{equation}\\begin{split} \\mathcal{r}_j\^{(l)}\&\\sim \\mathbf{Bernoulli}(p) \\\\ \\mathbf{\\hat y}\^{(l)} \&=\\mathbf{r}\^{(l)} \\cdot \\mathbf{y}\^{(l)} \\\\ \\mathcal{z}_i\^{(l+1)} \&=\\mathbf{w}_i\^{(l+1)}\\mathbf{\\hat y}\^l+b_i\^{(l+1)}\\\\ \\mathcal{y}_i\^{(l+1)}\&=f(\\mathcal{z}_i\^{(l+1)}) \\end{split}\\end{equation}\\

\(\mathbf{Bernoulli(p) 就是对概率 p 的 0 - 1 分布}\)

代码实现:

python 复制代码
mask = (torch.rand(X.shape) > dropout).float()
return mask * X / (1.0 - dropout)

对于使用Dropoutnet构建:

python 复制代码
net = nn.Sequential(nn.Flatten(),
                    nn.Linear(784, 256),
                    nn.ReLU(),
                    nn.Dropout(dropout1),
                    nn.Linear(256, 256),
                    nn.ReLU(),
                    nn.Dropout(dropout2),
                    nn.Linear(256, 10))

拓展:更好理解Dropout(通过原论文理解)

类比一下,在自然界中,在中大型动物中,一般是有性繁殖,有性繁殖是指后代的基因从父母两方各继承一半。但是从直观上看,似乎无性繁殖更加合理,因为无性繁殖可以保留大段大段的优秀基因。而有性繁殖则将基因随机拆了又拆,破坏了大段基因的联合适应性。

但是自然选择中毕竟没有选择无性繁殖,而选择了有性繁殖,须知物竞天择,适者生存。我们可做一个假设,那就是基因的力量在于混合的能力而非单个基因的能力。

神经网络过拟合与每一层都依赖于前一层激活值相关,称这种情况为"共适应性"。 作者认为,暂退法会破坏共适应性,就像有性生殖会破坏共适应的基因一样。
\(Dropout\) 也能达到同样的效果,它强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,达到好的效果。消除减弱了神经元节点间的联合适应性,增强了泛化能力。

Dropping out 20% of the input units and 50% of the hidden units was often found to be optimal.

Dropout缺点:将训练时间延长至2~3倍,因为Each training case effectively tries to train a different random architecture

本文欢迎转载,但一定标注作者与出处!

相关推荐
王莎莎-MinerU8 分钟前
从 OCR 到 Context Engineering:用 MinerU 搭一个可复现文档解析评测
人工智能·深度学习·机器学习·pdf·ocr·个人开发
ZHW_AI课题组8 分钟前
基于KNN的帕尔默企鹅种类预测分类
人工智能·机器学习·分类·数据挖掘
xiaoxiaoxiaolll12 分钟前
《Light: Sci & Appl》论文解读:基于q-BIC-CIT的热调硅膜超表面,突破静态光子学极限
机器学习
学习3人组29 分钟前
Python 评论朴素贝叶斯文本情感分析示例
人工智能·python·机器学习
2401_8856651933 分钟前
从零搭建卷积神经网络:基于PyTorch实现MNIST手写数字分类
pytorch·python·神经网络·算法·机器学习·分类·cnn
大模型最新论文速读42 分钟前
06-10 · LLM 最新论文速览
论文阅读·人工智能·深度学习·机器学习·自然语言处理
苏州邦恩精密1 小时前
江苏三维扫描仪定制:制造企业如何提升检测效率?
人工智能·科技·机器学习·自动化·制造
DXM05211 小时前
第10期| 卷积神经网络CNN通俗详解:AI遥感的底层核心
人工智能·python·神经网络·机器学习·arcgis·cnn·文心一言
装不满的克莱因瓶1 小时前
掌握空间注意力 STN 模型结构——让神经网络学会自动“看准位置”
人工智能·python·深度学习·神经网络·机器学习·ai
数据科学小丫1 小时前
算法:随机森林算法
算法·随机森林·机器学习