回答思路
过拟合的定义
由于模型过于复杂,模型学习能力过强,而用于训练的数据相对于复杂模型来说比较简单,因此模型学习到了数据中隐含的噪声,导致模型学习不到数据集的真正分布。
也就是说**:模型在训练集上的准确率很高,但在测试集上的准确率却很低。**
引起过拟合的原因
数据相对有限、简单,但模型结构过于复杂。
本质:算法从训练集的统计噪声中获取了信息并表达在模型结构的参数中。
解决办法(很多)
数据上
加数据
数据增强(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正则化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的概率随机关闭神经元