上节讲解了如何检测over-fitting现象,本节讲解如何减轻over-fitting。
首先复习一下之前所讲到的知识

图的underfitted表明预测函数模型所包含的参数量、复杂程度低于实际模型,但这种情况在目前较少见,原因在于随着电脑硬件、软件的越来越强。
上图的underfitted表明实际模型的参数量、复杂程度远高于自己所模拟出的神经网络结构。
因此在此背景下,有人提出了“Occam’s Razor”,即more things should not be used than are necessary,不是必要的东西不要使用,在神经网络中,不是必要的网络参数,要尽量选择最小的、最有可能的参数量。
而目前对于如何防止over-fitting,有如下几种主流的做法:
(1)提供更多的数据。
(2)降低模型的复杂度,不要“大炮打蚊子”,选择相应的最合适的。对于未知问题可以逐渐降低层数来尝试。
(3)Dropout法。(后续会讲解)。
(4)Data argumentation.(数据增强)。
(5)Early Stop(提前终结)。
而本节介绍的是Regularizaion。首先来回顾一下CrossEntropy公式

这种方法又称WeightDecay。

上图注意到,左侧图的分割面较复杂,不是光滑的曲线,表明函数模型的分割性较好、表达能力强,但有可能学到了一些噪声样本。右侧图是添加了regularization后的图,使得函数模型不会学习到一些噪声样本,表达能力不那么强,从而进行更好的划分。
Regularization有两种分类方式,一种是加一范数。

另一种是在原来基础上加Tensor的二范数。

最常用的是L2-regularization
使用代码如下
device = torch.device('cuda:0')
# 转移到GPU进行计算
net = MLP().to(device)
optimizer = optim.SGD(net.parameters(), lr=learning_rate, weight_decay=0.01)
# SGD会得到所有的网络参数,设置weight_decay=0.01以迫使二范数逐渐趋近于0
# 但要注意的是,若没有overfitting现象仍设置weight_decay参数,会使性能急剧下降但pyorch对L1-regulazation并没有很好的支持
这里一般用以下代码来讲解
这里要注意,一范数的添加公式为λ|W|,我们对前面的参数进行迭代即可解决以上问题。
regularization_loss = 0
for param in model.parameters():
regularization_loss += torch.sum(torch.abs(param))
# sum即为公式中的,abs为取绝对值
classify_loss = criteon(logits, target)
loss = classify_loss + 0.01*regularization_loss本文分享自 python pytorch AI机器学习实践 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!