overfitting(过拟合)和regularization(规范化)的详细介绍

overfitting过拟合

拥有大量自由参数的模型能够描述特别神奇的现象。但是即使这样的模型能够很好的拟合已有数据,他并不是一个好模型。因为这可能只是因为模型中⾜够的⾃由度使得它可以描述⼏乎所有给定⼤⼩的数据集,⽽不需要真正洞察现象的本质(即并没有找到他们的公共特征)。所以发⽣这种情形时,模型对已有的数据会表现的很好,但是对新的数据很难泛化。对⼀个模型真正的测验就是它对没有见过的场景的预测能⼒

让我们通过构造⼀个网络泛化能⼒很差的例⼦使这个问题更清晰。我们的⽹络有 30 个隐藏神经元,共 23,860 个参数。但是我们不会使⽤所有 50,000 幅 MNIST 训练图像。相反,我们只使⽤前 1,000 幅图像。使⽤这个受限的集合,会让泛化的问题突显。我们使⽤交叉熵代价函数,学习速率设置为 η \eta η = 0.5,并且将Mini-Batch设置为 10。不过这⾥我们要训练 400 个epoch,

使用上述网络,我们可以画出当网络学习时代价变化的情况:

image-20220118213832674

这看起来非常不错,因为代价函数有一个光滑的下降,跟我们预期一致(这里仅给出了后面200个迭代期)。

接下来我们看看分类准确率在测试集上的表现:

image-20220118213953083

这里还是聚焦到了后面的过程。在前二百个周期中准确率提升到了82%,然后学习逐渐变缓,最终,在280个epoch左右时分类准确率就停止了增长。后面的Epoch,仅仅看到了在280个迭代期所得到的准确率周围随机小波动。

将这幅图与前面的图进行对比,前面的图中和训练数据相关的代价持续平滑下降,如果我们仅看那个代价,会发现我们的模型变得更好。但是测试准确率展示了这种提升只是一种假象。我们的网络在280个迭代期后就不在能够推广到测试数据上,所以这不是有用的学习。我们这时候就认为我们的网络在280个Epoch后就 过度拟合(overfitting) 或者 过渡训练(overtraining)

接下来我们再看一下代价函数在测试数据上的变化:

image-20220118214838699

我们可以看到测试集上的代价在15个Epoch前一直在降低,随后越来越差尽管训练数据集上的代价表现是越来越好的。这其实是另一种模型过渡拟合的迹象。

但是,我们又碰到了另一个问题,从测试数据的准确率来看,过渡拟合是在280个Epoch之后的;从代价函数来看,过渡拟合是在15个Epoch之后的,那么究竟是将15还是280当做是过渡拟合开始影响学习的时间点呢?从实践的角度来看,我们真正关心的是提升测试数据集上的分类准确率,而测试集合上的代价不过是分类准确率的一个反映,所以更加合理的选择是将280迭代期看成过度拟合开始影响学习的时间点。

过度拟合是神经网络的⼀个主要问题。因为网络权重和偏置数量巨⼤,这在现代网络中特别正常。为了高效地训练,我们需要⼀种检测过度拟合是不是发⽣的技术,这样我们不会过度训练。并且我们也想要找到⼀些技术来降低过度拟合的影响。

检测过度拟合的明显方法是使用上面的方法 —— 跟踪测试数据集合上的准确率随训练变化情况。如果我们看到测试数据上的准确率不再提升,那么我们就停止训练。也就是说,一旦分类准确率已经饱和,就停止训练。这个策略被称为 early stopping(提前结束)

Regularization 规范化

增加训练样本的数量是一种减轻过拟合的方法。另一种可行的方法就是降低网络的规模。然而不幸的是,大的网络拥有一种比小网络更强的前路,所以这里存在一种应用冗余性的选项。

除此之外,还有其他的技术能够缓解过渡拟合,这里讲到的就是Regularization(规范化)。这里会给出一种最为常用的规范化手段——有时候被称为weight decay(权重衰减)或者L2规范化。

L2规范化的想法是增加一个额外的项到代价函数上,这个项叫做regularization term(规范化项)

下面是规范化的cross-entropy
C = − 1 n ∑ x j [ y j ln ⁡ a j L + ( 1 − y j ) ln ⁡ ( 1 − a j L ) ] + λ 2 n ∑ w w 2 (1) C=-\frac 1 n \sum_{xj}[y_j \ln a_j^L + (1-y_j)\ln(1-a_j^L)]+\frac \lambda {2n} \sum_w w^2 \tag1 C=n1xj[yjlnajL+(1yj)ln(1ajL)]+2nλww2(1)
其中第一项就是常规的cross-entropy表达式。第二个现在加入的就是所有权重的平方和。然后使用一个因子 λ 2 n \frac \lambda {2n} 2nλ进行量化调整,其中 λ > 0 \lambda \gt 0 λ>0称为regularization parameter(规范化项) n n n表示的还是训练集合的大小。需要注意的是,规范化项里面并不包含偏置

当然,对于其他的代价函数也可以进行规范化,类似的规范化形式可以写成这样,其中 C 0 C_0 C0是原始的代价函数:
C = C 0 + λ 2 n ∑ w w 2 (2) C=C_0+\frac \lambda {2n} \sum_w w^2 \tag2 C=C0+2nλww2(2)
直觉地看,规范化的效果是让网络倾向于学习小一点的权重,其他东西都是一样的。大的权重只有能够给出代价函数的第一项足够的提升后才会被允许。换言之,规范化可以当做一种寻找小的权重和最小化原始的代价函数之间的折中。这两部分之间相对的重要性就由 λ \lambda λ的值来控制, λ \lambda λ越小,就越倾向于最小化原始代价函数,反之,则倾向于小的权重。

接来下我们来了解一下如何将梯度下降算法应用在一个规范化的神经网络上。我们首先对式(2)求导得:
∂ C ∂ w = ∂ C 0 ∂ w + λ n w (3) \frac {\partial C}{\partial w} =\frac {\partial C_0}{\partial w}+\frac \lambda n w \tag3 wC=wC0+nλw(3)

∂ C ∂ b = ∂ C 0 ∂ b (4) \frac {\partial C}{\partial b} =\frac {\partial C_0}{\partial b}\tag4 bC=bC0(4)

通过公式我们可以看到其实计算规范化的代价函数的梯度是很简单的,$\frac {\partial C_0}{\partial w} 和 和 \frac {\partial C_0}{\partial b} 可 以 通 过 反 向 传 播 进 行 计 算 , 然 后 加 上 可以通过反向传播进行计算,然后加上 \frac \lambda n w$得到所有权重的偏导数。而偏置的偏导数就不要变化,所以偏置的梯度下降和学习规则不会发生变化:
b → b − η ∂ C 0 ∂ b (5) b\rightarrow b-\eta \frac{\partial C_0}{\partial b} \tag5 bbηbC0(5)
权重的下降规则则变成了:
w → w − η ∂ C 0 ∂ w − η λ n w = ( 1 − η λ n ) w − η ∂ C 0 ∂ w (6) \begin{aligned} w&\rightarrow w-\eta \frac {\partial C_0}{\partial w}-\frac{\eta \lambda}n w\\ &=(1-\frac {\eta \lambda}{n})w-\eta \frac{\partial C_0}{\partial w} \end{aligned} \tag 6 wwηwC0nηλw=(1nηλ)wηwC0(6)
这正和通常的梯度下降学习规则相同,除了通过一个因子 1 − η λ n 1-\frac {\eta \lambda}{n} 1nηλ重新调整了权重 w 0 w_0 w0。这种调整被称为weight decay(权重衰减),因为它使得权重变小。

这就是梯度下降工作的原理,接下来再说一下随机梯度下降是怎么工作的。

正如在没哟规范化的随机梯度下降中,我们可以通过平均m个训练样本的小批量数据来估计 ∂ C 0 ∂ w \frac {\partial C_0}{\partial w} wC0

因此,随机梯度下降的规范化学习规则就变成了:
w → ( 1 − η λ n ) w − η m ∑ x ∂ C x ∂ w (7) w\rightarrow(1-\frac {\eta \lambda}{n})w-\frac \eta m \sum_x \frac{\partial C_x}{\partial w} \tag7 w(1nηλ)wmηxwCx(7)
其中后面一项是在训练样本的小批量数据 x x x上进行的,而 C x C_x Cx是对每个训练样本的(无规范化的)代价。这其实和之前通常的随机梯度下降的规则是一样的,除了有一个权重下降的因子 1 − η λ n 1-\frac {\eta \lambda} n 1nηλ

偏置的规范化的学习规则与非规范化的情形一致:
b → b − η m ∂ C 0 ∂ b (8) b\rightarrow b-\frac \eta m \frac{\partial C_0}{\partial b} \tag8 bbmηbC0(8)

规范化对神经网络性能的影响

接下来规范化对于神经网络带来的性能提升。这里大多数和第一个例子一致,使用30个隐藏神经元,Mini-Batch为10,学习速率为0.5,使用交叉熵的神经网络,并且设置 λ = 0.1 \lambda = 0.1 λ=0.1

训练集上的代价函数如下,和前面无规范化的情况一样的规律:

image-20220118235130895

但是这次测试集上的准确率在整个400个Epoch内持续增加

image-20220118235211716

显然,规范化的使用能解决过渡拟合的问题,并且准确率相当高。同时,我们也可以确定,在400个Epoch后如果继续训练可以得到更好的结果

我们可以将规范化描述为一种减轻过度拟合和提高分类准确率的方法。实际上,这不是仅有的好处。实践标明,在使用不同的(随机)权重初始化进行多次MNIST网络训练的时候,无规范化的网络会偶然被限制住,明显困在了代价函数的局部最优值出。结果就是不同的运行会给出相差很大的结果。对比来看,规范化的网络能够提供更容易复制的结果

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
过拟合和欠拟合是机器学习中常见的两个问题,它们都与模型的泛化能力有关。 过拟合Overfitting)指的是模型在训练数据上表现得很好,但在新的未见过的数据上表现较差。过拟合通常是由于模型过于复杂,过度拟合了训练数据中的噪声和细节,导致对新数据的泛化能力较差。过拟合的特征包括训练集上表现很好但测试集上表现较差,模型参数较多,模型对训练数据中的噪声过于敏感等。 欠拟合(Underfitting)指的是模型无法很好地拟合训练数据,无法捕捉到数据中的关键特征和模式。欠拟合通常是由于模型过于简单或者训练数据量不足导致的,模型无法充分学习到数据的规律。欠拟合的特征包括训练集和测试集上表现都较差,模型无法捕捉到数据中的复杂关系等。 解决过拟合和欠拟合问题的方法有很多,以下是一些常见的方法: 1. 增加训练数据量:通过增加更多的训练样本,可以帮助模型更好地学习数据的规律,减少过拟合和欠拟合的问题。 2. 简化模型:减少模型的复杂度,可以降低过拟合的风险。可以通过减少模型的参数数量、降低模型的层数或者使用正则化等方法来简化模型。 3. 特征选择:选择对问题有用的特征,去除冗余和无关的特征,可以提高模型的泛化能力。 4. 正则化:通过在损失函数中引入正则化项,限制模型参数的大小,可以减少过拟合的问题。 5. 交叉验证:使用交叉验证来评估模型的性能,选择最优的模型参数和超参数,可以帮助避免过拟合和欠拟合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值