列表

详情


14. 过拟合有哪些,你会从哪方面调节

回答思路

过拟合的定义

由于模型过于复杂,模型学习能力过强,而用于训练的数据相对于复杂模型来说比较简单,因此模型学习到了数据中隐含的噪声,导致模型学习不到数据集的真正分布。

也就是说**:模型在训练集上的准确率很高,但在测试集上的准确率却很低。**

引起过拟合的原因

数据相对有限、简单,但模型结构过于复杂。

本质:算法从训练集的统计噪声中获取了信息并表达在模型结构的参数中。

解决办法(很多)

数据上

加数据

数据增强(mix up,fix up等扩增方式)

理论上来讲:只要数据足够充足,就不会出现过拟合与欠拟合,但是显而易见,数据集的采集和制作成本很大。

模型上

使用小模型

L1和L2正则化

Dropout

BatchNormalization (BN)

使用残差结构(ResNet中提出)

数据不好扩增的话,可以限制模型的表达能力,选择合适的网络结构,通过减少网络的深度、神经元数量、全连接层数等,降低网络的参数规模。

简化模型的另一个好处是能让模型更轻便、训练速度更快,计算速度也会更快。

还可以使用正则化、drop out等技巧。

训练方式上

Early stopping

在神经网络的训练过程中,如果迭代次数过小,模型那么可能会欠拟合,但迭代次数过多,则会导致过拟合的发生。所以我们可以关注训练误差和测试误差的变化,在过拟合之前停止训练,下图可以帮助理解:

示例代码

pytorch已经支持了很多函数,我们可以很方便地调用,比如L2正则化

optimizer = torch.optim.SGD(model.parameters(),lr=0.01,weight_decay=0.001)  weight_decay参数即调节L2正则化的超参数

但L1正则化需要自己手动实现

 L1正则化regularization_loss = 0 for param in model.parameters():     regularization_loss += torch.sum(abs(param))  calssify_loss = criterion(pred,target) loss = classify_loss + lamda * regularization_loss  optimizer.zero_grad() loss.backward() optimizer.step()

 dropout函数torch.nn.Dropout(p=0.5)   以0.5的概率随机关闭神经元

上一题