权重衰减是应对过拟合问题的常用方法。

\(L_2\)范数正则化

在深度学习中,我们常使用L2范数正则化,也就是在模型原先损失函数基础上添加L2范数惩罚项,从而得到训练所需要最小化的函数。

L2范数惩罚项指的是模型权重参数每个元素的平方和与一个超参数的乘积。如:\(w_1\),\(w_2\)是权重参数,b是偏差参数,带\(L_2\)范数惩罚项的新损失函数为:

\[\ell(w_1, w_2, b) + \frac{\lambda}{2}(w_1^2 + w_2^2),
\]

\(\lambda\)调节了惩罚项的比重。

有了\(L_2\)范数后,在随机梯度下降中,以单层神经网络为例,权重的迭代公式变更为:

\[w_1 \leftarrow w_1 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_1^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) - \lambda w_1,
\]

\[w_2 \leftarrow w_2 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_2^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) - \lambda w_2.
\]

\(\eta\)为学习率,\(\mathcal{B}\)为样本数目,可见:\(L_2\)范数正则化令权重的每一步更新分别添加了\(-\lambda w_1\)和\(\lambda w_2\)。这就是\(L_2\)范数正则化被称为权重衰减(weight decay)的原因。

在实际中,我们有时也在惩罚项中添加偏差元素的平方和

假设神经网络中某一个神经元的输入是\(x_1,x_2\),使用激活函数\(\phi\)并输出\(\phi(x_1w_1+x_2w_2+b)\)。假设激活函数\(\phi\)是ReLU、tanh或sigmoid,如果\(w_1,w_2,b\)都非常接近0,那么输出也接近0。也就是说,这个神经元的作用比较小,甚至就像是令神经网络少了一个神经元一样。这样便有效降低了模型的复杂度,降低了过拟合。

高维线性回归实验

我们通过高维线性回归为例来引入一个过拟合问题,并使用L2范数正则化来试着应对过拟合。

生成数据集

设数据样本特征的维度为p。对于训练数据集和测试数据集中特征为\(x_1,x_2,…,x_n\)的任一样本,我们使用如下的线性函数来生成该样本的标签:

\[y = 0.05 + \sum_{i = 1}^p 0.01x_i + \epsilon,
\]

其中噪音项ϵ服从均值为0和标准差为0.1的正态分布。

为了较容易地观察过拟合,我们考虑高维线性回归问题,例如设维度p=200;同时,我们特意把训练数据集的样本数设低,例如20。

n_train = 20
n_test = 100 num_inputs = 200 true_w = nd.ones((num_inputs, 1)) * 0.01
true_b = 0.05 features = 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:]

初始化模型参数

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

定义L2范数惩罚项

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

定义训练和测试

batch_size = 1
num_epochs = 10
lr = 0.003 net = gb.linreg
loss = gb.squared_loss
def fit_and_plot(lambd):
w, b = params = init_params()
train_ls = []
test_ls = []
for _ in range(num_epochs):
for X, y in gb.data_iter(batch_size, n_train, features, labels):
with autograd.record():
# 添加了 L2 范数惩罚项。
l = loss(net(X, w, b), y) + lambd * l2_penalty(w)
l.backward()
gb.sgd(params, 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())
gb.semilogy(range(1, num_epochs+1), train_ls, 'epochs', 'loss',
range(1, num_epochs+1), test_ls, ['train', 'test'])
return 'w[:10]:', w[:10].T, 'b:', b

设置lambd=0,训练误差远小于测试(泛化)误差,这是典型的过拟合现象。

fit_and_plot(lambd=0)
# output
('w[:10]:',
[[ 0.30343655 -0.08110731 0.64756584 -1.51627898 0.16536537 0.42101485
0.41159022 0.8322348 -0.66477555 3.56285167]]
<NDArray 1x10 @cpu(0)>, 'b:',
[ 0.12521751]
<NDArray 1 @cpu(0)>)

使用正则化,过拟合现象得到一定程度上的缓解。然而依然没有学出较准确的模型参数。这主要是因为训练数据集的样本数相对维度来说太小

fit_and_plot(lambd=5)
# output
('w[:10]:',
[[ 0.01602661 -0.00279179 0.03075662 -0.07356022 0.01006496 0.02420521
0.02145572 0.04235912 -0.03388886 0.17112994]]
<NDArray 1x10 @cpu(0)>, 'b:',
[ 0.08771407]
<NDArray 1 @cpu(0)>)

MXNET:权重衰减的更多相关文章

  1. MXNET:权重衰减-gluon实现

    构建数据集 # -*- coding: utf-8 -*- from mxnet import init from mxnet import ndarray as nd from mxnet.gluo ...

  2. 调参过程中的参数 学习率,权重衰减,冲量(learning_rate , weight_decay , momentum)

    无论是深度学习还是机器学习,大多情况下训练中都会遇到这几个参数,今天依据我自己的理解具体的总结一下,可能会存在错误,还请指正. learning_rate , weight_decay , momen ...

  3. 权重衰减(weight decay)与学习率衰减(learning rate decay)

    本文链接:https://blog.csdn.net/program_developer/article/details/80867468“微信公众号” 1. 权重衰减(weight decay)L2 ...

  4. 从头学pytorch(六):权重衰减

    深度学习中常常会存在过拟合现象,比如当训练数据过少时,训练得到的模型很可能在训练集上表现非常好,但是在测试集上表现不好. 应对过拟合,可以通过数据增强,增大训练集数量.我们这里先不介绍数据增强,先从模 ...

  5. MXNET:丢弃法

    除了前面介绍的权重衰减以外,深度学习模型常常使用丢弃法(dropout)来应对过拟合问题. 方法与原理 为了确保测试模型的确定性,丢弃法的使用只发生在训练模型时,并非测试模型时.当神经网络中的某一层使 ...

  6. mxnet深度学习实战学习笔记-9-目标检测

    1.介绍 目标检测是指任意给定一张图像,判断图像中是否存在指定类别的目标,如果存在,则返回目标的位置和类别置信度 如下图检测人和自行车这两个目标,检测结果包括目标的位置.目标的类别和置信度 因为目标检 ...

  7. [深度学习] pytorch学习笔记(3)(visdom可视化、正则化、动量、学习率衰减、BN)

    一.visdom可视化工具 安装:pip install visdom 启动:命令行直接运行visdom 打开WEB:在浏览器使用http://localhost:8097打开visdom界面 二.使 ...

  8. 小白学习之pytorch框架(6)-模型选择(K折交叉验证)、欠拟合、过拟合(权重衰减法(=L2范数正则化)、丢弃法)、正向传播、反向传播

    下面要说的基本都是<动手学深度学习>这本花书上的内容,图也采用的书上的 首先说的是训练误差(模型在训练数据集上表现出的误差)和泛化误差(模型在任意一个测试数据集样本上表现出的误差的期望) ...

  9. face recognition[variations of softmax][ArcFace]

    本文来自<ArcFace: Additive Angular Margin Loss for Deep Face Recognition>,时间线为2018年1月.是洞见的作品,一作目前在 ...

随机推荐

  1. Burp Suite之Scaner模块(三)

    Burp Suite之Scaner模块(三) Scaner模块配置详解 Scan Queue Active Scanning(主动扫描)过程通常包括发送大量请求到服务器为所扫描的每个基本的请求,这可能 ...

  2. 论文--Topic-Sensitive PageRank

    背景 原有的PageRank方法:通过web上链接结构信息得到页面之间相对的重要性,和特定的查询内容无关 论文涉及到的其他算法 HITS Hilltop,处理常见的流行查询 popular query ...

  3. PyPDF2详解

    工作中可能会涉及处理pdf文件,PyPDF2就是这样一个库, 使用它可以轻松的处理pdf文件,它提供了读.写.分割.合并.文件转换等多种操作.官方地址:http://mstamy2.github.io ...

  4. [HDU5685]Problem A

    来源: 2016"百度之星" - 资格赛(Astar Round1) 思路: 首先处理出所有前缀的哈希$f$,对于所有的询问$[a,b]$,答案即为$\frac{f[b]}{f[a ...

  5. C++ 类模板基础知识

    类模板与模板类 为什么要引入类模板:类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类 ...

  6. (转)【Java线程】Java内存模型总结

    Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变 ...

  7. Python初识及变量

    第一句python,输出 Hello world #!/usr/bin/evn python #指定解释器 #_*_ coding:utf- _*_ #指定编码 print("hello w ...

  8. 归一化(softmax)、信息熵、交叉熵

    机器学习中经常遇到这几个概念,用大白话解释一下: 一.归一化 把几个数量级不同的数据,放在一起比较(或者画在一个数轴上),比如:一条河的长度几千甚至上万km,与一个人的高度1.7m,放在一起,人的高度 ...

  9. git存储用户名与密码

    git config credential.helper store git config --global credential.helper cache ... which tells git t ...

  10. android: 动态加载碎片布局的技巧

    虽然动态添加碎片的功能很强大,可以解决很多实际开发中的问题,但是它毕竟只是在 一个布局文件中进行一些添加和替换操作.如果程序能够根据设备的分辨率或屏幕大小在运 行时来决定加载哪个布局,那我们可发挥的空 ...