首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >pytorch-Regularuzation

pytorch-Regularuzation

作者头像
用户6719124
发布2019-11-17 21:52:47
发布2019-11-17 21:52:47
55700
代码可运行
举报
运行总次数:0
代码可运行

上节讲解了如何检测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

使用代码如下

代码语言:javascript
代码运行次数:0
运行
复制
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|,我们对前面的参数进行迭代即可解决以上问题。

代码语言:javascript
代码运行次数:0
运行
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python pytorch AI机器学习实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档