深度学习pytorch——减少过拟合的几种方法(持续更新)

1、增加数据集

2、正则化(Regularization)

正则化:得到一个更加简单的模型的方法。

以一个多项式为例:

随着最高次的增加,会得到一个更加复杂模型,模型越复杂就会更好的拟合输入数据的模型(图-1),拟合的程度越大,表现在参数上的现象就是高次的系数趋近于0,如果直接将趋近于0的高次去掉,就可以得到一个更加简单的模型,这种方法称为正则化
图-1

直观的看,经过正则化的模型更加平滑(图-2).
图-2

正则化的方法:

(1)L1-正则化:在原来的模型基础上加上一个 1-范数(这里使用二分类模型作为示例):

(2)L2-正则化:在原来的模型基础上加上一个 2-范数(这里使用二分类模型作为示例):

代码示例:

python 复制代码
# L2-正则化
device = torch.device('cuda:0')
net = MLP.to(device)
optimizer = optim.SGD(net.parameters,lr = learning_rate,weight_decay=0.01) #weight_decay=0.01就代表进行L2-正则化
criteoon = nn.CrossEntropyLoss().to(device)
python 复制代码
# L1-正则化
# 对于L1-正则化,pytorch并没有提供直接的方法,就只能使用人工去做了
regularization_loss = 0
for param in model.parameters():                # 相求1-范数的总和
    regularization_loss += torch.sum(torch.abs(param))

classify_loss = criteon(logits,target)
loss = classify_loss + 0.01*regularization_loss     # 再将得到的正则损失加入模型损失,其中0.01是1-范数总和前面的系数

optimizer.zero_grad()
loss.backward()
optimizer.step()

3、加入动量(momentum)

动量即惯性------本次向哪移动,还需要考虑上一次移动的方向。

正常更新梯度的公式(公式-1):
公式-1

加入动量之后的公式(公式-2):
公式-2

将z(k+1)带入梯度更新公式,即公式-1减去,其中Z(k)相当于上一次的梯度,系数和β的大小决定了是当前梯度对方向的决定性大,还是上一梯度对方向的决定性大。

当动量为0时的梯度更新情况(图-3):
图-3

动量不为0时的梯度更新情况(图-4):
图-4

将图-3和图-4对比,可以得出动量不为0,即考虑上一梯度,梯度更新更加稳定,不会出现巨大的跳跃情况,并且不加动量的没有找到最小点,一直在局部最小值点徘徊,如果加入动量,考虑到上一梯度,可以在一定程度上解决这种情况(图-4是加入动量之后最好的情况)。

代码演示,直接在优化器部分使用momentum属性就可以了,但是如果使用Adam优化器,就不需要添加,因为在Adam优化器内部定义的有momentum属性:

4、学习率(Learning Rate )

不同学习率梯度更新情况(图-5):
图-5

当学习率太小的时候,梯度更新比较慢,需要较多次的更新。

当学习率太大的时候,梯度更新比较激烈,找到的极值点Loss太大。

如何找到正确的的学习率?

在训练之初,可以先设置一个较大的学习率加快更新的速度,然后逐步减小学习率,即设置一个动态学习率。
图-6

从图-6,可以看到有一个突然下降的点,这个点就是学习率训练一些数据之后,学习率突然变小导致的结果。在此之前可以看到Loss趋于不变,可以合理的猜测是因为学习率太大了,出现了来回摇摆不定的情况(图-7):
图-7

当学习率突然减小,梯度更新变慢,易找到极小点(图-8):
图-8

代码演示:

5、dropout

dropout:减少神经元之间的连接,减少模型的学习量。标准的神经网络是全连接的,相比经过dropout的神经网络减少了一些连接(图-9)。
图-9

代码演示,可以使用Dropout方法断开连接,0.5代表断开两层之间的50% :

这种方法被用在模型训练中,但当模型测试过程中,为了提高test的表现,要结束这个操作,将所有的连接都使用上,可以使用net_dropped.eval()方法结束这个操作,代码演示如下:

6、随机梯度下降 (Strochastic Gradient Descent )

这里的随机并不是指任意,这里面是有一套规则的,是一套映射的关系,即将原来的数据x送入f(x)得到一种分布。经过随机从原数据中得到一组小数据,使用这一小组数据训练模型。

学习:课时60 Early stopping, dropout等_哔哩哔哩_bilibili

相关推荐
珠海西格电力1 分钟前
零碳园区管理系统“云-边-端”架构协同的核心价值
大数据·人工智能·分布式·微服务·架构·能源
伏 念3 分钟前
大模型技术之机器学习
人工智能·机器学习
阿杰学AI4 分钟前
AI核心知识143—大语言模型之 奖励作弊(简洁且通俗易懂版)
人工智能·ai·语言模型·自然语言处理·aigc·reward hacking·奖励作弊
深小乐4 分钟前
AI 周刊【2026.04.20-04.26】:OpenAI 图像推理突破、模型开始偏科、国产模型5天5款
人工智能
阿杰学AI5 分钟前
AI核心知识144—大语言模型之 红队(简洁且通俗易懂版)
人工智能·ai·语言模型·自然语言处理·aigc·红队·红队测试
weixin_446260855 分钟前
从零到精通大型语言模型(LLM)应用的开发路线图
人工智能·语言模型·自然语言处理
池佳齐5 分钟前
论云原生环境下的AI系统架构设计
人工智能·云原生·系统架构
南境十里·墨染春水6 分钟前
C++笔记——STL map
开发语言·c++·笔记
数智工坊6 分钟前
【DAB-DETR论文阅读】:动态锚框作为更优查询,彻底解决DETR训练收敛慢难题
网络·论文阅读·人工智能·深度学习·cnn