首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【动手学深度学习笔记】之通过权重衰减法解决过拟合问题

【动手学深度学习笔记】之通过权重衰减法解决过拟合问题

作者头像
树枝990
发布于 2020-08-19 14:33:43
发布于 2020-08-19 14:33:43
1.6K00
代码可运行
举报
文章被收录于专栏:拇指笔记拇指笔记
运行总次数:0
代码可运行

点击【拇指笔记】,关注我的公众号。

1.通过权重衰减解决过拟合问题

1.1 权重衰减

为了减轻上一篇文章提到的过拟合现象,往往需要增大训练集,但增大训练集的代价往往是高昂的。

因此这里介绍一种常用的缓解过拟合问题的方法:权重衰减。

1.2 实现方法

权重衰减通过惩罚绝对值较大的模型参数为需要学习的模型增加了限制。权重衰减等价于范数正则化。正则化通过为模型损失函数添加惩罚项使学习得到的模型参数值较小。

范数正则化在模型原损失函数基础上添加范数惩罚项,范数惩罚项指的是模型权重参数()每个元素的平方和与一个正的常数的乘积。

以如下这个损失函数为例

对应的迭代方程为

它的带有范数惩罚项的新损失函数为

其中为超参数()。当较大时,惩罚项比重较大,这会使学到的权重参数较接近0。当为0时,惩罚项完全不起作用。

当优化算法为小批量随机梯度下降(SGD)时,的迭代方程b变为

由此可见,因为添加了范数正则化,迭代方程中的权重参数自乘了一个小于1的数()。因此范数正则化又叫做权重衰减。实际场景中,有时也需要在惩罚项中添加偏差元素的平方和。

1.3 引入过拟合问题

以高维线性回归为例,引入过拟合问题。

以下面这个维度为的线性函数为例,生成人工数据集。

噪声项服从均值为0,标准差为0.01的正态分布。假设,训练集样本数为20。

1.3.1 生成人工数据集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
根据模型,随机生成特征值,计算得到标签。
n_train,n_test,num_inputs = 20,100,200
true_w,true_b = torch.ones(num_inputs,1)*0.01,0.05
#设置为与输入数据同形,方便计算
features = torch.randn((n_train+n_test,num_inputs))
#随机生成训练集和测试集中的特征值
labels = torch.matmul(features,true_w)+true_b
labels += torch.tensor(np.random.normal(0,0.01,size = labels.size()),dtype = torch.float)
#生成训练集和测试集中的标签
train_features = features[:n_train,:]
test_features = features[n_train:,:]
train_labels = labels[:n_train,:]
test_labels = labels[n_train:,:]
#分割测试集和训练集

1.3.2 定义和初始化模型

先将权重参数和偏差参数初始化,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def init():
	w = torch.randn((num_inputs,1),requires_grad = True)
    b = torch.zeros(1,requires_grad = True)
    return [w,b]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def linear(x,w,b):    return torch.mm(x,w)+b

1.3.3 定义损失函数和优化函数

使用之前在线性回归中介绍的平方误差函数和小批量随机梯度下降算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#平方误差损失函数
def square_loss(y_hat,y):
    return (y_hat-y.view(y_hat.size()))**2/2

#小批量随机梯度下降
def sgd(params,lr,batch_size):
    for param in params:
        param.data -= lr*param.grad/batch_size

1.3.4 定义范数惩罚项

这里只惩罚权重参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def l2(w):    return (w**2).sum()/2

1.3.5 训练模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
batch_size,num_epochs,lr = 1,100,0.003
net,loss = linear,square_loss

dataset = torch.utils.data.TensorDataset(train_features,train_labels)
train_iter = torch.utils.data.DataLoader(dataset,batch_size,shuffle = True)

def train(lambda1):
#通过设置lambda=0,可以实现过拟合效果。设置lambda=3,实现权重衰减,减轻过拟合。
    w,b = init()
    train_ls,test_ls = [],[]
    for epoch in range(num_epochs+1):
        for x,y in train_iter:
            l = loss(net(x,w,b),y) +lambda1*l2(w)
            l = l.sum()
            
            if w.grad is not None:
                #如果权重参数的梯度信息不是None,代表已经开始计算,需要进行梯度清零
                w.grad.data.zero_()
                b.grad.data.zero_()
            l.backward()
            sgd([w,b],lr,batch_size)
        train_ls.append(loss(net(train_features,w,b),train_labels).mean().item())
        test_ls.append(loss(net(test_features,w,b),test_labels).mean().item())
        print('权重参数的L2范数',w.norm().item())

1.3.6 过拟合效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#令lambda=0L2范数为0。即不开启权重衰减
train(0)

过拟合情况下,对数化的训练误差和泛化误差随学习周期的变化如图

可以看出,出现了严重的过拟合。

1.3.7 使用权重衰减矫正过拟合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

#令lambda=3,开启权重衰减
train(3)

使用权重衰减后,对数化的训练误差和泛化误差随学习周期的变化如图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
不难看出,使用权重衰减法后, 过拟合现象得到一定程度的缓解。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拇指笔记 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动手学深度学习(四) 过拟合欠拟合及其解决方案
在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
致Great
2020/02/25
1.3K0
动手学深度学习(四) 过拟合欠拟合及其解决方案
从零开始学Pytorch(五)之欠拟合和过拟合
训练误差(training error)指模型在训练数据集上表现出的误差,泛化误差(generalization error)指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
墨明棋妙27
2022/09/23
9320
【动手学深度学习】多层感知机之权重衰减研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究​​​​​​​环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/06
2060
【动手学深度学习】多层感知机之权重衰减研究详情
【动手学深度学习笔记】之过拟合与欠拟合实例
每个小批量设置为10,使用TensorDataset转换为张量,使用DataLoader生成迭代器。
树枝990
2020/08/20
7090
【深度学习基础】多层感知机 | 权重衰减
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/22
3500
【深度学习基础】多层感知机 | 权重衰减
深度学习相关基础知识点
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
村雨遥
2019/09/09
5690
深度学习相关基础知识点
【动手学深度学习】多层感知机模型选择、欠拟合和过拟合研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/06
2420
【动手学深度学习】多层感知机模型选择、欠拟合和过拟合研究详情
【动手学深度学习】多层感知机之暂退法问题研究详情
如果更改第一层和第二层的暂退法概率,会发生什么情况?具体地说,如果交换这两个层,会发生什么情况?设计一个实验来回答这些问题,定量描述该结果,并总结定性的结论
SarPro
2024/06/06
1930
【动手学深度学习】多层感知机之暂退法问题研究详情
动手学DL——MLP多层感知机【深度学习】【PyTorch】
加入一个或多个隐藏层+激活函数来克服线性模型的限制, 使其能处理更普遍的函数关系类型,这种架构通常称为多层感知机(multilayer perceptron)。
来杯Sherry
2023/08/10
1.8K0
动手学DL——MLP多层感知机【深度学习】【PyTorch】
[深度学习概念]·模型选择、欠拟合和过拟合原理分析(基于MXNet实现)
如果你改变过实验中的模型结构或者超参数,你也许发现了:当模型在训练数据集上更准确时,它在测试数据集上却不一定更准确。这是为什么呢?
小宋是呢
2019/06/27
1K0
[深度学习概念]·模型选择、欠拟合和过拟合原理分析(基于MXNet实现)
动手学深度学习(五) 梯度消失、梯度爆炸
深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion)。
致Great
2020/02/25
6680
动手学深度学习(五) 梯度消失、梯度爆炸
【深度学习基础】多层感知机 | 模型选择、欠拟合和过拟合
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/22
1740
【深度学习基础】多层感知机 | 模型选择、欠拟合和过拟合
机器学习经典问题:如何理解欠拟合和过拟合问题
从数学和统计学的角度来理解过拟合和欠拟合,我们需要考虑模型的参数数量和拟合数据的程度。
皮大大
2023/05/05
1.6K0
【深度学习基础】多层感知机 | 实战Kaggle比赛:预测房价
  之前几节我们学习了一些训练深度网络的基本工具和网络正则化的技术(如权重衰减、暂退法等)。本节我们将通过Kaggle比赛,将所学知识付诸实践。Kaggle的房价预测比赛是一个很好的起点。此数据集由Bart de Cock于2011年收集,涵盖了2006-2010年期间亚利桑那州埃姆斯市的房价。这个数据集是相当通用的,不会需要使用复杂模型架构。它比哈里森(Harrison)和鲁宾菲尔德(Rubinfeld)的波士顿房价数据集要大得多,也有更多的特征。
Francek Chen
2025/02/02
3630
【深度学习基础】多层感知机 | 实战Kaggle比赛:预测房价
【动手学深度学习笔记】之线性回归实现
这一节不牵扯深度学习框架,仅使用Tensor和autograd库来训练线性回归模型。
树枝990
2020/08/20
7240
深度学习前置知识
由于单层的感知机模型的表达能力很差,只能表示线性模型,连最简单的 XOR 函数模型都无法表示,所以出现了多层感知机模型,加入了隐藏层,最简单的多层感知机模型有三层,分别为输入层、隐藏层、输出层,其中隐藏层的元素个数和层数是超参数(即自定义的),如下图所示:
Here_SDUT
2022/09/19
1.5K0
深度学习前置知识
【动手学深度学习笔记】之通过丢弃法缓解过拟合问题
除了上一篇文章介绍的权重衰减法,深度学习常用的缓解过拟合问题的方法还有丢弃法。本文介绍倒置丢弃法及其实现。
树枝990
2020/08/19
1.1K0
动手学深度学习(二)——正则化(从零开始)
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/79488569
Tyan
2019/05/25
4370
动手学深度学习(一) 线性回归
为了简单起见,这里我们假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。接下来我们希望探索价格与这两个因素的具体关系。线性回归假设输出与各个输入之间是线性关系:
致Great
2020/02/24
6020
Pytorch实战Kaggle房价预测比赛
这是分享的第一个Kaggle比赛,也是Kaggle中难度最低的比赛之一,房价预测是一个回归问题,给出了房子的一些特征要求预测房子的价格。本文使用Pytorch构建一个线性模型来完成预测。比赛地址为:我们可以在房价预测⽐赛的⽹⻚上了解⽐赛信息和参赛者成绩,也可以下载数据集并提交⾃⼰的预测结果。该⽐赛的⽹⻚地址是 https://www.kaggle.com/c/house-prices-advanced-regression-techniques 。
BBuf
2019/12/04
3.5K1
Pytorch实战Kaggle房价预测比赛
推荐阅读
相关推荐
动手学深度学习(四) 过拟合欠拟合及其解决方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档