除了前面介绍的权重衰减以外,深度学习模型常常使用丢弃法(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

MXNET:丢弃法的更多相关文章

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

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

  2. 【神经网络】丢弃法(dropout)

    丢弃法是一种降低过拟合的方法,具体过程是在神经网络传播的过程中,随机"沉默"一些节点.这个行为让模型过度贴合训练集的难度更高. 添加丢弃层后,训练速度明显上升,在同样的轮数下测试集 ...

  3. Gluon 实现 dropout 丢弃法

    多层感知机中: hi 以 p 的概率被丢弃,以 1-p 的概率被拉伸,除以  1 - p import mxnet as mx import sys import os import time imp ...

  4. MXNET:卷积神经网络

    介绍过去几年中数个在 ImageNet 竞赛(一个著名的计算机视觉竞赛)取得优异成绩的深度卷积神经网络. LeNet LeNet 证明了通过梯度下降训练卷积神经网络可以达到手写数字识别的最先进的结果. ...

  5. dropout——gluon

    https://blog.csdn.net/lizzy05/article/details/80162060 from mxnet import nd def dropout(X, drop_prob ...

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

    训练误差和泛化误差 需要区分训练误差(training error)和泛化误差(generalization error).前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现 ...

  7. 机器学习(ML)十一之CNN各种模型

    深度卷积神经网络(AlexNet) 在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机.虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现 ...

  8. 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 ...

  9. LSTM调参经验

    0.开始训练之前先要做些什么? 在开始调参之前,需要确定方向,所谓方向就是确定了之后,在调参过程中不再更改 1.根据任务需求,结合数据,确定网络结构. 例如对于RNN而言,你的数据是变长还是非变长:输 ...

随机推荐

  1. P3819 松江1843路

    P3819 松江1843路sigema(r[i]*abs(x[i]-x[s]));令它最小,是带权中位数问题,s是带权中位数,s左边的r[i]之和+r[s]大于s左边的r[i]之和,反过来也成立.如果 ...

  2. 附001.Docker阿里云Registry加速器配置

    一 安装配置docker 1.1 安装docker 见<002.docker版本及安装>. 1.2 配置国内阿里云加速器 见<002.docker版本及安装>. 二 配置阿里云 ...

  3. TensorFlow 核心——数据流图

    1 计算模型 -- 计算图(Graph) 更多参考:数据流图 TensorFlow 中的所有计算都会被转化为计算图上的节点.TensorFlow 是一个通过计算图的形式来表述计算的编程系统.Tenso ...

  4. VUE 打包后关于 -webkit-box-orient: vertical; 消失,导致多行溢出不管用问题

    VUE 打包后 -webkit-box-orient: vertical; 样式消失,导致页面样式爆炸,看了看解决方案,在这里总结一下: 实际上是 optimize-css-assets-webpac ...

  5. SpringMVC中ModelAndView对象与“视图解析器”

    摘要: spring MVC这个环境中,Spring MVC会依据controller(或者你叫它handler)中处理方法的返回值,进行解析,解析之后提供一个视图,作为响应. 标注了@Control ...

  6. NOIP 竞赛注意事项

    <一>程序习惯注意 一.Linux与Windows的区别 a) 大小写敏感 i.   在Windows下,文件名大小写不敏感,例如A.c 与 a.c 与和a.C与A.C和没有区别. ii. ...

  7. 如何将Object类型转换成String类型

    1. Object.toString() obj.toString() 注意:必须保证Object不是null值,否则将抛出NullPointerException异常. 2. (String)Obj ...

  8. javac编译出现需要标识符问题解决

    因为没有写public static void mian(String[] args) 在类里面只有属性和方法,内部类.不能直接写System.out.println():

  9. How determine the RC time constant in PWM DAC low-pass filter?

    how determine the RC time constant in PWM digital to analog low-pass filter? I 'm looking for the be ...

  10. hdu2896之AC自动机

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...