权重衰减

【代码】
虽然增⼤训练数据集可能会减轻过拟合,但是获取额外的训练数据往往代价高昂。应对过拟合问题的常用方法:权重衰减。

1. 方法

权重衰减等价于L2L_2L2​范数正则化(regularization)。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常⽤⼿段。L2L_2L2​范数正则化在模型原损失函数基础上添加L2L_2L2​范数惩罚项,从而得到训练所需要最小化的函数。L2L_2L2​范数惩罚项指的是模型权重参数每个元素的平⽅和与⼀个正的常数的乘积。
不添加惩罚项的线性回归损失函数
l(w1,w2,b)=1n∑i=1n12(x1(i)w1+x2(i)w2+b−y(i))2(1)l(w_1,w_2,b)=\frac{1}{n} \sum_{i=1}^{n} \frac{1}{2} (x_1^{(i)}w_1+x_2^{(i)}w_2+b-y^{(i)})^2 \tag 1 l(w1​,w2​,b)=n1​i=1∑n​21​(x1(i)​w1​+x2(i)​w2​+b−y(i))2(1)
其中w1,w2w_1, w_2w1​,w2​是权重参数,bbb是偏差参数,样本iii的输⼊为x1(i),x2(i)x_1^{(i)},x_2^{(i)}x1(i)​,x2(i)​,标签为y(i)y^{(i)}y(i),样本数为nnn。将权重参数⽤向量w=[w1,w2]w = [w_1, w_2]w=[w1​,w2​]表⽰。

带有范数惩罚项的新损失函数为
l(w1,w2,b)+λ2n∣∣w∣∣2(2)l(w_1,w_2,b)+\frac{\lambda}{2n} ||w||^2 \tag 2 l(w1​,w2​,b)+2nλ​∣∣w∣∣2(2)
其中超参数λ>0\lambda > 0λ>0。当权重参数均为0时,惩罚项最小。当λ\lambdaλ较大时,惩罚项在损失函数中的比重较大,这通常会使学到的权重参数的元素较接近0.当λ\lambdaλ设为0时,惩罚项完全不起作用。
有了惩罚项之后,在小批量随机梯度下降中,w1,w2w_1,w_2w1​,w2​的迭代方式更改为:
w1←(1−ηλ∣B∣)w1−η∣B∣∑i∈∣B∣x1(i)(x1(i)w1+x2(i)w2+b−y(i)).w2←(1−ηλ∣B∣)w2−η∣B∣∑i∈∣B∣x2(i)(x1(i)w1+x2(i)w2+b−y(i)).(3)w_1 \leftarrow (1-\frac{\eta \lambda}{|B|})w_1 - \frac{\eta}{|B|}\sum_{i \in |B|} x_1^{(i)} (x_1^{(i)}w_1+x_2^{(i)}w_2+b-y^{(i)}). \\ w_2 \leftarrow (1-\frac{\eta \lambda}{|B|})w_2 - \frac{\eta}{|B|}\sum_{i \in |B|} x_2^{(i)} (x_1^{(i)}w_1+x_2^{(i)}w_2+b-y^{(i)}). \tag 3 w1​←(1−∣B∣ηλ​)w1​−∣B∣η​i∈∣B∣∑​x1(i)​(x1(i)​w1​+x2(i)​w2​+b−y(i)).w2​←(1−∣B∣ηλ​)w2​−∣B∣η​i∈∣B∣∑​x2(i)​(x1(i)​w1​+x2(i)​w2​+b−y(i)).(3)
可⻅,L2L_2L2​范数正则化令权重w1w_1w1​和w2w_2w2​先⾃乘小于1的数,再减去不含惩罚项的梯度。因此,L2L_2L2​范数正则化⼜叫权重衰减。权重衰减通过惩罚绝对值较⼤的模型参数为需要学习的模型增加了限制,这可能对过拟合有效。实际场景中,我们有时也在惩罚项中添加偏差元素的平⽅和。

2. 高维线性回归实验

以⾼维线性回归为例来引⼊⼀个过拟合问题,并使⽤权重衰减来应对过拟合。设数据样本特征的维度为ppp。对于训练数据集和测试数据集中特征为x1,x2,...,xpx_1, x_2, . . . , x_px1​,x2​,...,xp​的任⼀样本,我们使⽤如下的线性函数来⽣成该样本的标签:
y=0.05+∑i=1p0.01xi+ε(4)y=0.05+\sum_{i=1}^{p} 0.01x_i+\varepsilon \tag 4 y=0.05+i=1∑p​0.01xi​+ε(4)
其中噪声项ε\varepsilonε服从均值为0、标准差为0.01的正态分布。为了较容易地观察过拟合,我们考虑⾼维线性回归问题,如设维度p = 200;同时,我们特意把训练数据集的样本数设低,如20。

%matplotlib inline
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import data as gdata, loss as gloss, nn
n_train, n_test, num_inputs = 20, 100, 200
true_w, true_b = nd.ones((num_inputs, 1)) * 0.01, 0.05features = nd.random.normal(shape=(n_train + n_test, num_inputs))
labels = nd.dot(features, true_w) + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape)train_features, test_features = features[:n_train,:], features[n_train:,:]
train_labels, test_labels = labels[:n_train], labels[n_train:]

diy实现

初始化模型参数

⾸先,定义随机初始化模型参数的函数。该函数为每个参数都附上梯度。

def init_params():w = nd.random.normal(scale=1, shape=(num_inputs, 1))b = nd.zeros(shape=(1, ))w.attach_grad()b.attach_grad()return [w, b]

定义L2范数惩罚项

定义L2L_2L2​范数惩罚项。这⾥只惩罚模型的权重参数。

def l2_penalty(w):return (w**2).sum() / 2

定义训练和测试

定义如何在训练数据集和测试数据集上分别训练和测试模型。

from utils import linreg, squared_loss, sgd, semilogy
batch_size, num_epochs, lr = 1, 100, 0.003
net, loss = linreg, squared_loss
train_iter = gdata.DataLoader(gdata.ArrayDataset(train_features, train_labels), batch_size, shuffle=True)def fit_and_plot(lambd):w, b = init_params()train_ls, test_ls = [], []for _ in range(num_epochs):for X, y in train_iter:with autograd.record():# 添加了L2范数惩罚项l = loss(net(X, w, b), y) + lambd * l2_penalty(w)l.backward()sgd([w, b], lr, batch_size)train_ls.append(loss(net(train_features, w, b), train_labels).mean().asscalar())test_ls.append(loss(net(test_features, w, b), test_labels).mean().asscalar())semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'loss', range(1, num_epochs + 1), test_ls, ['train', 'test'])print('L2 norm of w:', w.norm().asscalar())

观察过拟合

训练并测试⾼维线性回归模型。当lambd设为0时,我们没有使⽤权重衰减。结果训练误差远小于测试集上的误差。这是典型的过拟合现象。

fit_and_plot(lambd=0)


L2 norm of w: 13.155678

使用权重衰减

使⽤权重衰减。可以看出,训练误差虽然有所提⾼,但测试集上的误差有所下降。过拟合现象得到⼀定程度的缓解。另外,权重参数的L2范数⽐不使⽤权重衰减时的更小,此时的权重参数更接近0。

fit_and_plot(lambd=3)



L2 norm of w: 0.042545244

简洁实现

在构造Trainer实例时通过wd参数来指定权重衰减超参数。默认下,Gluon会对权重和偏差同时衰减。我们可以分别对权重和偏差构造Trainer实例,从而只对权重衰减。

def fit_and_plot(wd):net = nn.Sequential()net.add(nn.Dense(1))net.initialize(init.Normal(sigma=1))# 对权重参数衰减trainer_w = gluon.Trainer(net.collect_params('.*weight'), 'sgd', {'learning_rate': lr, 'wd': wd})# 不对偏差参数衰减trainer_b = gluon.Trainer(net.collect_params('.*bias'), 'sgd', {'learning_rate': lr})train_ls, test_ls = [], []for _ in range(num_epochs):for X, y in train_iter:with autograd.record():l = loss(net(X), y)l.backward()# 对两个Trainer实例分别调⽤step函数,从⽽分别更新权重和偏差trainer_w.step(batch_size)trainer_b.step(batch_size)train_ls.append(loss(net(train_features), train_labels).mean().asscalar())test_ls.append(loss(net(test_features), test_labels).mean().asscalar())semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'loss', range(1, num_epochs + 1), test_ls, ['train', 'test'])print('L2 norm of w:', net[0].weight.data().norm().asscalar())
fit_and_plot(0)


L2 norm of w: 13.530375
fit_and_plot(3)


L2 norm of w: 0.04247173

权重衰减(基于线性回归)相关推荐

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

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

  2. 突破模糊定性分析,批归一化和权重衰减的球面优化机制

    本文内容整理自 PaperWeekly 和 biendata 在 B 站组织的直播回顾,点击文末阅读原文即可跳转至 B 站收看本次分享完整视频录像,如需嘉宾课件,请在 PaperWeekly 公众号回 ...

  3. 直播 | 旷视研究院最新理论成果:批归一化和权重衰减的球面优化机制

    「PW Live」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义, ...

  4. [pytorch、学习] - 3.12 权重衰减

    参考 3.12 权重衰减 本节介绍应对过拟合的常用方法 3.12.1 方法 正则化通过为模型损失函数添加惩罚项使学出的模型参数更小,是应对过拟合的常用手段. 3.12.2 高维线性回归实验 impor ...

  5. (pytorch-深度学习系列)pytorch避免过拟合-权重衰减的实现-学习笔记

    pytorch避免过拟合-权重衰减的实现 首先学习基本的概念背景 L0范数是指向量中非0的元素的个数:(L0范数难优化求解) L1范数是指向量中各个元素绝对值之和: L2范数是指向量各元素的平方和然后 ...

  6. pytorch学习笔记(十二):权重衰减

    文章目录 1. 方法 2. 高维线性回归实验 3. 从零开始实现 3.1 初始化模型参数 3.2 定义L2L_2L2​范数惩罚项 3.3 定义训练和测试 3.4 观察过拟合 3.5 使用权重衰减 4. ...

  7. 基于线性回归的股票预测案例

    基于线性回归的股票预测案例 本次的案例使用的是股票数据,数据源从www.quandl.com 获取.本次案例主要是为了练习线性回归 pip install quandl 安装quandl库. 在使用的 ...

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

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

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

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

  10. ECCV2020 | SOD100K:超低参数量的高效显著性目标检测算法,广义OctConv和动态权重衰减...

    点击上方"AI算法修炼营",选择"星标"公众号 精选作品,第一时间送达 这篇文章收录于ECCV2020,是一篇超高效的显著性目标检测的算法,仅有100K的参数量 ...

最新文章

  1. Beta阶段发布说明
  2. [图神经网络] 图神经网络GNN基础入门
  3. koa --- mongoose连接mongoDB
  4. 使用Arquillian测试Spring Data + Spring Boot应用程序(第2部分)
  5. python部分 + 数据库 + 网络编程
  6. 融创上海:从营销切入,建立自上而下的数据平台,实现数据应用
  7. Mybatis高级应用 整合Ehcache
  8. libevent 例子,从简单到复杂
  9. 特斯拉推出儿童版电动四轮越野摩托车
  10. Java并发编程-八锁问题带你彻底理解对象锁和类锁
  11. 3d激光雷达开发(多雷达标定)
  12. Linux联网配置-IP 网关 DNS
  13. 栈的效率为什么比堆高?为什么栈的运行速度比堆快?
  14. 云开发初探 —— 更简便的小程序开发模式
  15. mySQL | unrecognized service 错误解决办法
  16. Win10 Microsoft store无法加载页面: 0x80131500
  17. vue项目 构建 打包 发布 三部曲
  18. 推荐 OS X 下最方便实用的六款解压缩软件
  19. python输出数字三角形_Python|2020蓝桥杯之数字三角形
  20. python 矩阵元素查找位置函数_Python中二维数组中非零元素位置的快速查找方法...

热门文章

  1. python sqlserver 数据操作_python上手--python操作数据库
  2. 【转】NodeJs使用Mysql模块实现事务处理
  3. 01-信贷路由项目架构和 rose 框架的搭建
  4. Inno Setup脚本
  5. LINUX 查看分区UUID的两种方法
  6. C++高级进阶 第二季:mutable 关键字
  7. IOS 获取软件版本号的方法
  8. php 获取文件加的名称
  9. 我的JDBC通用DAO(续)
  10. VC++学习(5):文本编程