前言

上一章讲了过拟合的概念,过拟合实际上就是用过于复杂的模型来训练结构比较简单的数据。会出现训练出来的模型在训练数据上的误差非常低,但是在测试数据或者验证数据上的误差非常高的情况,这就使得这个模型变得毫无意义。出现过拟合现象的原因有很多,还有当训练数据很少的情况下,模型对于小样本数据的拟合还是很容易的,但是一旦碰到新的数据,模型可能就认不出它了,就会导致测试误差很大。
我们可以通过减少神经网络的神经元个数,也就是让权重的数量少一点来使得模型不那么复杂来解决过拟合。
我们也可以通过让权重的取值范围小一点来解决,这可以使得我们的模型波动没有那么大,也可以有效的降低模型复杂度,使得模型不会过拟合,那么这个方法就是权重衰退。

权重衰退原理

本文不会介绍特别多的原理,只是简单介绍。
在之前的博客中的所有深度学习算法实际上都是通过对损失函数作梯度下降来求得最优的权重值,那么我们要使得权重值的范围缩小,那么就要在梯度下降上做点处理了。
简单回顾一下:损失函数简写 L(w,b)
随机梯度下降后使得

然后我们对损失函数做一些改变,给他加上一个L2正则式子
这里的λ是一个超参数,用来限制w最终取值范围的。对这个新的损失函数求导就会变成这样:

代入权重值更新的公式中:

可以看到和原来的权重更新的公式相比,第二项一样,第一项多减了ηλWt,这就使得权重值范围缩小了。这个ηλ通常小于1。

例子

检验一下权重衰退能不能解决过拟合的问题。

导包

%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l

人工数据集生成

生成一个这样的数据集:

这个数据集的训练数据20个,权重有200个,相当于输入层200个神经元,这个模型十分复杂,而且训练数据非常小,这对于数据的过拟合非常有利。

n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5
true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05
train_data = d2l.synthetic_data(true_w, true_b, n_train)
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False)

初始化模型参数

w取正态分布,b取0.

def init_params():w = torch.normal(0, 1, size=(num_inputs, 1), requires_grad=True)b = torch.zeros(1, requires_grad=True)return [w, b]

定义L2惩罚函数

这个就是定义损失函数后面加出来的那项的。

def l2_penalty(w):return torch.sum(w.pow(2)) / 2

就是一个L2正则表达式,除2方便求导

训练模型

这个lambda x就是一种函数简写,相当于X是传入net函数的参数。

def train(lambd):w, b = init_params()net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_lossnum_epochs, lr = 100, 0.003animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',xlim=[5, num_epochs], legend=['train', 'test'])for epoch in range(num_epochs):for X, y in train_iter:# 增加了L2范数惩罚项,# 广播机制使l2_penalty(w)成为一个长度为batch_size的向量l = loss(net(X), y) + lambd * l2_penalty(w)l.sum().backward()d2l.sgd([w, b], lr, batch_size)if (epoch + 1) % 5 == 0:animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss),d2l.evaluate_loss(net, test_iter, loss)))print('w的L2范数是:', torch.norm(w).item())

效果

λ=0时,等同没有权重衰退情况


过拟合明显吧,这模型对测试数据完全没用。

λ=3


有效果了吧。

简洁实现权重衰退

这里的重点是在SGD这个方法里定义了weight_decay,这就是让输入lambda的,我们的框架还是挺全能的吧,但了解一下原理也没坏处,知道一下这个参数干嘛用的,该怎么设置最优。

def train_concise(wd):net = nn.Sequential(nn.Linear(num_inputs, 1))for param in net.parameters():param.data.normal_()loss = nn.MSELoss(reduction='none')num_epochs, lr = 100, 0.003# 偏置参数没有衰减trainer = torch.optim.SGD([{"params":net[0].weight,'weight_decay': wd},{"params":net[0].bias}], lr=lr)animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',xlim=[5, num_epochs], legend=['train', 'test'])for epoch in range(num_epochs):for X, y in train_iter:trainer.zero_grad()l = loss(net(X), y)l.sum().backward()trainer.step()if (epoch + 1) % 5 == 0:animator.add(epoch + 1,(d2l.evaluate_loss(net, train_iter, loss),d2l.evaluate_loss(net, test_iter, loss)))print('w的L2范数:', net[0].weight.norm().item())

这里结果和上面一样,不展示了。

小结

权重衰退可以有效的解决过拟合的情况,相比于减小模型复杂度,权重衰退的方法比较好实现的。

深度学习(8)——权重衰退相关推荐

  1. 14李沐动手学深度学习v2/权重衰退简洁实现

    # 权重衰退是广泛应用的正则化技术 %matplotlib inline import torch from torch import nn from d2l import torch as d2l ...

  2. 深度学习之权重初始化

    四种权重初始化方法: 把w初始化为0 对w随机初始化 Xavier initialization He initialization 把w初始化为0: 缺点: 因为如果把w初始化为0,那么每一层的神经 ...

  3. 深度学习的权重衰减是什么_权重衰减和L2正则化是一个意思吗?它们只是在某些条件下等价...

    权重衰减== L2正则化? 神经网络是很好的函数逼近器和特征提取器,但有时它们的权值过于专门化而导致过度拟合.这就是正则化概念出现的地方,我们将讨论这一概念,以及被错误地认为相同的两种主要权重正则化技 ...

  4. 深度学习的权重衰减是什么_【深度学习理论】一文搞透Dropout、L1L2正则化/权重衰减...

    前言 本文主要内容--一文搞透深度学习中的正则化概念,常用正则化方法介绍,重点介绍Dropout的概念和代码实现.L1-norm/L2-norm的概念.L1/L2正则化的概念和代码实现- 要是文章看完 ...

  5. 深度学习:权重衰减(weight decay)与学习率衰减(learning rate decay)

    正则化方法:防止过拟合,提高泛化能力 避免过拟合的方法有很多:early stopping.数据集扩增(Data augmentation).正则化(Regularization)包括L1.L2(L2 ...

  6. 送你一份不正经的深度学习简述(附论文)

    来源:机器之心 本文共3798字,建议阅读8分钟. 本文一反常态用讲故事的方式进行介绍,让你对深度学习产生新的认识. 作为人工智能领域里最热门的概念,深度学习会在未来对我们的生活产生显著的影响,或许现 ...

  7. 深度学习--超参数(持续更新)

    目录 超参数(Hyperparameter) 一.模型参数和超参数的区别 二.分类 (一)网络参数 1.网络层与层之间的交互方式(相加.相乘或者串接等) 2.卷积核数量和卷积核尺寸 3.神经网络层数( ...

  8. 超全大厂算法岗百问百答(推荐系统/机器学习/深度学习/C++/Spark/python)

    之前在准备秋招的时候,每次看到牛客网上那些大神手握七八个大厂的offer,就羡慕到不行,那会儿自己的机器学习算法水平还没法搬上台面,顶多也就是看了几个课程.做了两个比赛的水平,然后比赛还没得到任何的名 ...

  9. 深度学习提高trick小技巧

    在深度学习中,同一个模型使用不同方式的初始化,比如:数据预处理,batch_size, 学习率, 不同的优化器都能得到不同性能的参数. 学习率 学习率的设置应该随着迭代次数的增加而减小,每迭代完指定次 ...

  10. 【动手学深度学习PyTorch版】6 权重衰退

    上一篇移步[动手学深度学习PyTorch版]5 模型选择 + 过拟合和欠拟合_水w的博客-CSDN博客 目录 一.权重衰退 1.1 权重衰退 weight decay:处理过拟合的最常见方法(L2_p ...

最新文章

  1. linux命令详解-useradd,groupadd
  2. AR模型、MA(Moving Average)模型、ARMA模型、时间序列的定阶、ARIMA、SARIMAX
  3. mybatis 1 - 获取自增ID
  4. 【编译原理】FIRSTVT和LASTVT求法
  5. 【DI专题】在 DI 脚本文件中调用存储过程
  6. 现代软件工程 期中/期末总结博客作业
  7. awk工具的简单使用
  8. startService()和bindService()区别
  9. java添加关闭窗口事件_Java开发网 - 如何给JInternalFrame类的窗口添加关闭事件?...
  10. Json扩展 (转)
  11. 【信号检测】基于matlab双稳态随机共振的参数寻优算法【含Matlab源码 1700期】
  12. Windows最强ssh客户端 Bitvise SSH Client 与阿里堡垒服务
  13. 2019数据安装勾选_建筑CAD首选软件~【T20 天正建筑 V5.0 安装教程】
  14. 【sdx62】uci软件包文件中新增脚本文件functions.sh但未打包到文件系统解决方案
  15. Unity小游戏教程系列 | 创建小型太空射击游戏(一)
  16. 亚马逊查询订单listorders方法
  17. Liunx 创建隐藏文件夹
  18. 哈工大18年春软件构造课程讨论题
  19. 脉冲时滞微分方程matlab方程
  20. 13.分组曲线拟合与置信条带

热门文章

  1. 要学就学最难!附1T大数据免费学习全套资源!
  2. PHP如何去制作一个许愿墙,php许愿墙开发视频教程,php许愿墙源码
  3. 金蝶K3 WISE创新管理平台各个版本补丁情况数据探讨
  4. jQuery插件Magnify放大镜实现javascript图片放大功能
  5. matlab利用magnify作图
  6. 法国计划2020起征收数字税
  7. 如何实现将图片转成pdf
  8. 宝塔面板设置HTTPS+阿里云SSL证书
  9. 阿里云OSS PicGo 配置图床教程 超详细
  10. Android 缺少SO库(只有armabi)的解决办法