过拟合与欠拟合以及防止过拟合的常用方法

13 篇文章 0 订阅
6 篇文章 0 订阅

这篇博客是继IMDB数据集的例子写的,关于数据集准备以及model.compile(),model.fit()可以参见IMDB数据集的例子

IMDB数据集的例子中,模型在留出的验证数据上的性能总是在几轮之后达到最高点,然后开始下降也就是,模型很快就在那训练数据上开始过拟合。过拟合存在于所有机器学习问题中,学会如何处理过拟合对掌握机器学习至关重要。
机器学习的根本问题是优化和泛化之间的对立。优化是指调节模型以在训练数据集上取得最佳性能,即机器学习中的学习,而泛化是指训练好的模型在前所未见的数据上的性能好坏。机器学习无法控制泛化,所以只能基于训练数据,调节模型。
训练开始时,训练数据上的损失越小,测试数据上的损失也越小。这时的模型是欠拟合的,仍有改进的空间,网络还没有对训练数据中所有相关模式建模。但在训练数据上迭代一定次数后,泛化不再提高,验证指标先是不变,然后开始变差,即模型开始过拟合。
为了防止模型从训练数据中学到错误或无关紧要的模式,最优解决方法是获取更多的训练数据。模型的训练数据越多,泛化能力自然越好。
如果无法获取更多数据,次优解决方法是调节模型允许存储的信息量,或对模型允许存储的信息加以约束。
如果一个网络只能记住几个模式,那么优化过程会迫使模型集中学习最重要的模式。这种降低过拟合的方法叫做正则化。先介绍几种最常见的正则化方法。

一、减少网络大小
防止模型过拟合最简单的方法就是减小模型大小,即减少模型中可以学习参数的个数,这由层数和每层的单元个数决定。在深度学习中,模型中可学习参数的个数通常被称为模型的容量。直观上来看,参数更多的模型拥有更多的记忆容量,因此能够在训练样本在训练样本和目标之间轻松学会完美的字典式映射,但这种映射没有任何泛化能力。

始终牢记:深度学习模型通常都很擅长拟合训练数据,但真正的挑战在于泛化,而不是拟合。

与此相反,如果网络的记忆资源有限,则无法轻松学会这种映射。
因此,为了让损失最小化,网络必须学会对目标具有很强预测能力的压缩表示,这也正是我们感兴趣的数据表示。同时也需要注意,使用的模型应该具有足够多的参数,以防止欠拟合,即模型应避免记忆资源不足,在容量过大(参数过多)与容量不足(参数不足)之间找到一个折中。没有一种切确切的公式能够确定最佳层数或者每层的最佳大小。因此,必须通过评估一些不同的网络架构(当然是在验证集上评估,而不是在测试集上评估),以便找到最佳的模型大小。要找到合适的模型大小,一般的工作流程是开始时选择相对较少的层和参数,然后逐渐增加层的大小或者增加新层,直到这种增加对验证损失的影响变得很小。
在电影评论分类的网络上测试一下。
原始网络如下:

#原始模型
from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

通过减少每层的单元个数,使模型的容量更小:

#容量更小的模型
model = models.Sequential()
model.add(layers.Dense(4, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(4, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

下图比较了原始网络与更小网络的验证损失。圆点是更小网络的验证损失值,十字是原始网络的验证损失值。

在这里插入图片描述
从图中可见,更小的网络开始过拟合的时间(validation loss开始上升的时候表示模型开始过拟合)要晚于参考网络,更小的网络11轮(11个epoch)之后开始过拟合,更大的网络4轮(4个epoch)之后就开始过拟合了。而且更小的网络开始过拟合之后,性能变差的速度也更慢。即过拟合后,validation loss曲线上升得也更慢。

再比较一个容量更大(参数更多)的模型:

#容量更大的模型。容量远大于问题所需
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

下图比较了原始网络与更大网络的验证损失。圆点是更大网络的验证损失值,十字是原始网络的验证损失值。
在这里插入图片描述
从图中可以看出:更大的网络只过了2轮(2个epoch)就开始过拟合,过拟合也更严重

下图同时给出这两个网络的训练损失:
在这里插入图片描述
从图中可以看出:更大网络的训练损失很亏就接近于0(第6个epoch)。网络的容量越大(参数越多),它拟合训练数据(得到很小的训练损失)的速度也越快,但也更容易过拟合,导致训练损失和验证损失有很大差异。

二、添加权重正则化
‘’’
奥卡姆剃刀原理:如果一件事情有两种解释,那么最可能正确的解释就是最简单的那个,即假设更少的那个。这个原理也适用于神经网络学到的模型:给定一些训练数据和一种网络架构,很多组权重值(即很多模型)都可以解释这些数据。简单模型比复杂模型更不容易过拟合。或者反过来说,复杂模型比简单模型更容易过拟合。

这里的简单模型是指:参数值分布的熵更小的模型;或者是参数更少的模型,比如IMDB中更小的例子(每层单元个数分别为4,4,1)。
因此,一种常见的降低过拟合的方法就是强制让模型权重只能取较小的值,从而限制模型的复杂度,让参数遵从一定规则的变小。这使得权重值的分布更加规则。这种方法叫做权重正则化。其实现方法是向网络损失函数中添加与较大权重值相关的成本。这种成本有两种形式:
(1)L1正则化:添加的成本与权重系数的绝对值成正比
(2)L2正则化:添加的成本与权重系数的平方成正比。神经网络的L2正则化也叫权重衰减,weight decay。权重衰减与L2正则化在数学上是完全相同的。
在keras中,添加权重正则化的方法是:向层传递 权重正则化项实例 作为关键字参数。

from keras import regularizers

model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer = regularizers.l2(0.001),
                       activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16,kernel_regularizer = regularizers.l2(0.001), 
                       activation='relu'))
'''
l2(0.001)的意思是该层权重矩阵的每个系数都会使网络总损失增加 0.001 * weight_coefficient_value.
注意,由于这个惩罚项只在训练时添加,所以这个网络的训练损失会比测试损失大很多。
训练损失比测试损失大很多,说明训练集损失值大,测试集损失值小
'''
model.add(layers.Dense(1, activation='sigmoid'))

下图显示了L2正则化惩罚的影响:
在这里插入图片描述
从图中可以看出:即使两个模型的参数个数相同,具有L2正则化的模型(圆点)比参考模型(十字)更不容易过拟合。

Keras中不同的权重正则化项:

#keras中不同的权重正则化项
from keras import regularizers

regularizers.l1(0.001)#L1正则化
regularizers.l1_l2(l1=0.001, l2=0.001)#同时使用L1和L2正则化

三、添加dropout正则化
dropout是神经网络最有效也是最常用的正则化方法之一,它是由多伦多大学的Geoffrey Hinton和他的学生们开发的。对某一层使用dropout,就是在训练过程中随机将该层的一些输出特征舍弃(设置为0)。假设在训练过程中,某一层对给定输入样本的返回值应该是向量[0.2, 0.5, 1.3, 0.8, 1,1],使用dropout后,这个向量会有几个随机的元素变成0,比如 [0, 0.5, 1.3, 0, 1.1]。dropout比率是被设为0的特征所占的比例,通常在0.2~0.5范围内。测试时没有单元被舍弃,而该层的输出值需要按dropout比率缩小,因为这时比训练时有更多的单元被激活,需要加以平衡。
在Keras中,可以通过Dropout层向网络中引入dropout,dropout将被应用于前面一层的输出

model.add(layers.Dropout(0.5))

现在向IMDB网络中添加两个Dropout层,来看一下它们降低过拟合的效果。

#向IMDB网络中添加dropout
model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))

下图显示了dropouut正则化惩罚的影响:
在这里插入图片描述
从图中可以看出:再次见到,dropout正则化方法的性能相比参考网络有明显提高(验证损失有下降)。

总结:防止神经网络过拟合的常用方法包括:
(1)获取更多的训练数据;
(2)减少网络容量;
(3)添加权重正则化
(4)添加dropout。

说明:本文摘抄自《Python深度学习》 [美]弗朗索瓦·肖莱 著 张亮 译。由于没有链接,所以文章标注为【原创】。在这个平台上发布这篇文章,一来,可以提供给需要的人作一些参考;二来,是为了自己查阅和回顾方便。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO和SSD是两种常用的目标检测算法。针对过拟合欠拟合问题,可以使用一些正则化技术进行处理。 正则化技术有助于避免过拟合问题。其中,L1和L2正则化可以通过对模型的权重进行惩罚来降低过拟合的风险。Dropout技术可以在训练过程中随机丢弃一部分神经元,以减少模型的复杂度和依赖性,从而降低过拟合的可能性。Early Stopping是一种基于验证集性能的策略,当验证集性能不再提升时停止训练,以防止过拟合。数据增强是一种通过对训练数据进行扩充来增加样本多样性的方法,可以减少过拟合。 对于欠拟合问题,可以考虑增加模型的复杂度或增加训练数据量。通过增加模型的复杂度,例如增加网络层数或增加每层的神经元数量,可以提高模型的表达能力,从而减少欠拟合。如果训练数据量较少,可以使用数据增强技术来扩充数据集,提高模型的泛化能力。 综上所述,针对过拟合问题,可以使用正则化技术如L1和L2正则化、Dropout、Early Stopping和数据增强。对于欠拟合问题,可以增加模型复杂度或增加训练数据量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [目标检测YOLO实战应用案例100讲-自动驾驶场景下的三维目标检测技术研究](https://blog.csdn.net/qq_36130719/article/details/130657588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [《从零深入理解Yolo系列v1-v8全家桶 + 目标检测面试提问+目标检测算法总览》](https://blog.csdn.net/weixin_54338498/article/details/128714742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值