MXNET:丢弃法

除了前面介绍的权重衰减以外,深度学习模型常常使用丢弃法(dropout)来应对过拟合问题。

方法与原理

为了确保测试模型的确定性,丢弃法的使用只发生在训练模型时,并非测试模型时。当神经网络中的某一层使用丢弃法时,该层的神经元将有一定概率被丢弃掉。

设丢弃概率为 \(p\)。具体来说,该层任一神经元在应用激活函数后,有 \(p\) 的概率自乘 0,有 \(1?p\) 的概率自除以 \(1?p\) 做拉伸。丢弃概率是丢弃法的超参数。

多层感知机中,隐层节点的输出:

\[h_i = \phi(x_1 w_1^{(i)} + x_2 w_2^{(i)} + x_3 w_3^{(i)} + x_4 w_4^{(i)} + b^{(i)}),\]

设丢弃概率为 \(p\),并设随机变量\(\xi_i\) 有 \(p\) 概率为 0,有 \(1?p\) 概率为 1。那么,使用丢弃法的隐藏单元 \(h_i\) 的计算表达式变为

\[h_i = \frac{\xi_i}{1-p} \phi(x_1 w_1^{(i)} + x_2 w_2^{(i)} + x_3 w_3^{(i)} + x_4 w_4^{(i)} + b^{(i)}).\]

注意到测试模型时不使用丢弃法。由于 \(\mathbb{E} (\frac{\xi_i}{1-p}) =\frac{\mathbb{E}(\xi_i)}{1-p}=1\),同一神经元在模型训练和测试时的输出值的期望不变。

输出层:
\[o_1 = \phi(h_1 w_1' + h_2 w_2' + h_3 w_3' + h_4 w_4' + h_5 w_5' + b')\]

都无法过分依赖 \(h_1,…,h_5\) 中的任一个。这样通常会造成 \(o_1\) 表达式中的权重参数 \(w_1',…,w_5'\) 都接近 0。因此,丢弃法可以起到正则化的作用,并可以用来应对过拟合。

实现

按照drop_prob丢弃X中的值。

def dropout(X, drop_prob):
    assert 0 <= drop_prob <= 1
    keep_prob = 1 - drop_prob
    # 这种情况下把全部元素都丢弃。
    if keep_prob == 0:
        return X.zeros_like()
    mask = nd.random.uniform(0, 1, X.shape) < keep_prob
    return mask * X / keep_prob

定义网络参数:三层网络结构,针对minst任务。

num_inputs = 784
num_outputs = 10
num_hiddens1 = 256
num_hiddens2 = 256

W1 = nd.random.normal(scale=0.01, shape=(num_inputs, num_hiddens1))
b1 = nd.zeros(num_hiddens1)
W2 = nd.random.normal(scale=0.01, shape=(num_hiddens1, num_hiddens2))
b2 = nd.zeros(num_hiddens2)
W3 = nd.random.normal(scale=0.01, shape=(num_hiddens2, num_outputs))
b3 = nd.zeros(num_outputs)

params = [W1, b1, W2, b2, W3, b3]
for param in params:
    param.attach_grad()

将全连接层和激活函数 ReLU 串起来,并对激活函数的输出使用丢弃法。我们可以分别设置各个层的丢弃概率。通常,建议把靠近输入层的丢弃概率设的小一点。网络结构如下:

drop_prob1 = 0.2
drop_prob2 = 0.5

def net(X):
    X = X.reshape((-1, num_inputs))
    H1 = (nd.dot(X, W1) + b1).relu()
    # 只在训练模型时使用丢弃法。
    if autograd.is_training():
        # 在第一层全连接后添加丢弃层。
        H1 = dropout(H1, drop_prob1)
    H2 = (nd.dot(H1, W2) + b2).relu()
    if autograd.is_training():
        # 在第二层全连接后添加丢弃层。
        H2 = dropout(H2, drop_prob2)
    return nd.dot(H2, W3) + b3

训练和测试:

num_epochs = 5
lr = 0.5
batch_size = 256
loss = gloss.SoftmaxCrossEntropyLoss()
train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)
gb.train_cpu(net, train_iter, test_iter, loss, num_epochs, batch_size, params,
             lr)

结果输出:

epoch 1, loss 0.9913, train acc 0.663, test acc 0.931
epoch 2, loss 0.2302, train acc 0.933, test acc 0.954
epoch 3, loss 0.1601, train acc 0.953, test acc 0.958
epoch 4, loss 0.1250, train acc 0.964, test acc 0.973
epoch 5, loss 0.1045, train acc 0.969, test acc 0.974

Gluon 实现

在训练模型时,Dropout 层将以指定的丢弃概率随机丢弃上一层的输出元素;在测试模型时,Dropout 层并不发挥作用。
使用 Gluon,我们可以更方便地构造多层神经网络并使用丢弃法。

import sys
sys.path.append('..')
import gluonbook as gb
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import loss as gloss, nn

drop_prob1 = 0.2
drop_prob2 = 0.5

net = nn.Sequential()
net.add(nn.Flatten())
net.add(nn.Dense(256, activation="relu"))
# 在第一个全连接层后添加丢弃层。
net.add(nn.Dropout(drop_prob1))
net.add(nn.Dense(256, activation="relu"))
# 在第二个全连接层后添加丢弃层。
net.add(nn.Dropout(drop_prob2))
net.add(nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))

训练和结果:

num_epochs = 5
batch_size = 256
loss = gloss.SoftmaxCrossEntropyLoss()
train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)

trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.5})
train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)
gb.train_cpu(net, train_iter, test_iter, loss, num_epochs, batch_size,None, None, trainer)
# output
epoch 1, loss 0.9815, train acc 0.668, test acc 0.927
epoch 2, loss 0.2365, train acc 0.931, test acc 0.952
epoch 3, loss 0.1634, train acc 0.952, test acc 0.968
epoch 4, loss 0.1266, train acc 0.963, test acc 0.972
epoch 5, loss 0.1069, train acc 0.969, test acc 0.976

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

时间: 2024-10-12 20:15:56

MXNET:丢弃法的相关文章

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

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

Gluon 实现 dropout 丢弃法

多层感知机中: hi 以 p 的概率被丢弃,以 1-p 的概率被拉伸,除以  1 - p import mxnet as mx import sys import os import time import gluonbook as gb from mxnet import autograd,init from mxnet import nd,gluon from mxnet.gluon import data as gdata,nn from mxnet.gluon import loss a

动手学深度学习 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次模型训练和验证.每?次,我们使??个?数据集验证模型,并使?

流量控制与拥塞控制

拥塞控制 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion).出现资源拥塞的条件:对资源需求的总和 > 可用资源若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降. 拥塞控制与流量控制的关系 拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷.拥塞控制是一个全局性的过程,涉及到所有的主机.所有的路由器,以及与降低网络传输性能有关的所有因素. 流量控制往往指在给定的发送端和

93、QOS区分式服务配置实验之队列

1.队列解析 2.First In First Out(FIFO) 接口带宽大于2.048M的接口,默认情况下,运行的是FIFO队列. 接口带宽小于2.048M的接口,默认情况下,运行的是WFQ队列. 3.Priority Queuing(PQ) 分类:PQ队列可以分为High.Medium.Normal.Low四个队列,默认流量都在Normal队列. 加队:默认各个队列缓存大小分别为20.40.60.80,采用尾丢弃法. 调度:只有当高一级流量发送完毕,才会发送低一级流量. 4.Custom

Recommending music on Spotify with deep learning 采用深度学习算法为Spotify做基于内容的音乐推荐

本文参考http://blog.csdn.net/zdy0_2004/article/details/43896015译文以及原文file:///F:/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Recommending%20music%20on%20Spotify%20with%20deep%20learning%20%E2%80%93%20Sander%20Dieleman.html 本文是比利时根特大学(Ghent University)的Reservoir 

《Python自然语言处理实战:核心技术与算法》PDF新书推介,附带链接地址

本书从各个方面着手,帮助读者理解NLP的过程,提供了各种实战场景,结合现实项目背景,帮助读者理解NLP中的数据结构和算法以及目前主流的NLP技术与方法论,结合信息检索技术与大数据应用等流行技术,终完成对NLP的学习和掌握. --黄英 阿里巴巴达摩院高级算法专家 目前市面上的NLP书籍,要么是针对研究人员的偏理论性的教科书,要么是针对资深工程师进一步深入了解NLP技术的高级读物.为了填补这一空白,三位来自工业界的资深NLP专家,结合真实的项目,让读者能够以快的速度掌握NLP技术的精髓.同时,穿插大