MXNET:权重衰减

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

\(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)>)

原文地址:https://www.cnblogs.com/houkai/p/9520998.html

时间: 2024-10-12 20:16:01

MXNET:权重衰减的相关文章

MXNET:权重衰减-gluon实现

构建数据集 # -*- coding: utf-8 -*- from mxnet import init from mxnet import ndarray as nd from mxnet.gluon import loss as gloss import gb n_train = 20 n_test = 100 num_inputs = 200 true_w = nd.ones((num_inputs, 1)) * 0.01 true_b = 0.05 features = nd.rando

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

无论是深度学习还是机器学习,大多情况下训练中都会遇到这几个参数,今天依据我自己的理解具体的总结一下,可能会存在错误,还请指正. learning_rate , weight_decay , momentum这三个参数的含义. 并附上demo. 我们会使用一个例子来说明一下: 比如我们有一堆数据,我们只知道这对数据是从一个黑盒中得到的,我们现在要寻找到那个具体的函数f(x),我们定义为目标函数T. 我们现在假定有存在这个函数并且这个函数为: 我们现在要使用这对数据来训练目标函数. 我们可以设想如果

深度学习之权重衰减——2020.27

?????过拟合现象,即模型的训练误差远?于它在测试集上的误差.虽然增?训练数据集可能会减轻过拟合,但是获取额外的训练数据往往代价?昂.本节介绍应对过拟合问题的常??法:权重衰减(weight decay). 一.方法 ?????权重衰减等价于 范数正则化(regularization).正则化通过为模型损失函数添加惩罚项使学出的模型参数值较?,是应对过拟合的常??段.我们先描述 范数正则化,再解释它为何?称权重衰减. ?????范数正则化在模型原损失函数基础上添加 范数惩罚项,从?得到训练所需

MXNET:丢弃法

除了前面介绍的权重衰减以外,深度学习模型常常使用丢弃法(dropout)来应对过拟合问题. 方法与原理 为了确保测试模型的确定性,丢弃法的使用只发生在训练模型时,并非测试模型时.当神经网络中的某一层使用丢弃法时,该层的神经元将有一定概率被丢弃掉. 设丢弃概率为 \(p\).具体来说,该层任一神经元在应用激活函数后,有 \(p\) 的概率自乘 0,有 \(1?p\) 的概率自除以 \(1?p\) 做拉伸.丢弃概率是丢弃法的超参数. 多层感知机中,隐层节点的输出: \[h_i = \phi(x_1

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

下面要说的基本都是<动手学深度学习>这本花书上的内容,图也采用的书上的 首先说的是训练误差(模型在训练数据集上表现出的误差)和泛化误差(模型在任意一个测试数据集样本上表现出的误差的期望) 模型选择 验证数据集(validation data set),又叫验证集(validation set),指用于模型选择的在train set和test set之外预留的一小部分数据集 若训练数据不够时,预留验证集也是一种luxury.常采用的方法为K折交叉验证.原理为:把train set分割成k个不重合

动手学深度学习 3-5 Others

其他问题 1. 模型选择.欠拟合和过拟合 1.1 训练误差和泛化误差 1.2 模型选择 1.2.1 验证数据集 1.2.2 \(K\) 折交叉验证 由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈.一种改善的方法是\(K\)折交叉验证(\(K\)-fold cross-validation).在\(K\)折交叉验证中,我们把原始训练数据集分割成\(K\)个不重合的子数据集,然后我们做\(K\)次模型训练和验证.每一次,我们使用一个子数据集验证模型,并使用其他\(K-

机器学习(ML)七之模型选择、欠拟合和过拟合

训练误差和泛化误差 需要区分训练误差(training error)和泛化误差(generalization error).前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似.计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数. 直观地解释训练误差和泛化误差这两个概念.训练误差可以认为是做往年高考试题(训练题)时的错误率,泛化误差则可以通过真正参加高

Task03 打卡

模型过拟合欠拟合 训练误差和泛化误差 训练误差指模型在训练数据集上表现出的误差 泛化误差指模型在任意?个测试数据样本上表现出的误差的期望 我们的注意力应集中于降低泛化误差,使模型具有更好的普适性. 模型选择 验证数据集 (validation set) 预留?部分在训练数据集和测试数据集以外的数据来进?模型选择.这部分数据被称为验证数据集,简称验证集. \(K\)折交叉验证 我们把原始训练数据集分割成K个不重合的?数据集,然后我们做K次模型训练和验证.每?次,我们使??个?数据集验证模型,并使?

正则化方法:L1和L2 regularization、数据集扩增、dropout

本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器学习/深度学习算法中常用的正则化方法.(本文会不断补充) 正则化方法:防止过拟合,提高泛化能力 在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合).其直观的表现如下图所示,随着训练过程,网络在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大--因为训练出来的网络过拟合了训练集,对训练集外的数据却不work