丢弃法(dropout)

  • 丢弃法
    • 方法
    • 从零开始实现
      • 定义模型参数
      • 定义模型
      • 训练和测试模型
    • 简洁实现
    • 小结
    • 参考文献

丢弃法

除了前一节介绍的权重衰减以外,深度学习模型常常使用丢弃法(dropout)[1] 来应对过拟合问题。丢弃法有一些不同的变体。本节中提到的丢弃法特指倒置丢弃法(inverted dropout)。

方法

回忆一下,3.8节(多层感知机)的图3.3描述了一个单隐藏层的多层感知机。其中输入个数为4,隐藏单元个数为5,且隐藏单元hih_ihi​(i=1,…,5i=1, \ldots, 5i=1,…,5)的计算表达式为

hi=ϕ(x1w1i+x2w2i+x3w3i+x4w4i+bi)h_i = \phi\left(x_1 w_{1i} + x_2 w_{2i} + x_3 w_{3i} + x_4 w_{4i} + b_i\right) hi​=ϕ(x1​w1i​+x2​w2i​+x3​w3i​+x4​w4i​+bi​)

这里ϕ\phiϕ是激活函数,x1,…,x4x_1, \ldots, x_4x1​,…,x4​是输入,隐藏单元iii的权重参数为w1i,…,w4iw_{1i}, \ldots, w_{4i}w1i​,…,w4i​,偏差参数为bib_ibi​。当对该隐藏层使用丢弃法时,该层的隐藏单元将有一定概率被丢弃掉。设丢弃概率为ppp,那么有ppp的概率hih_ihi​会被清零,有1−p1-p1−p的概率hih_ihi​会除以1−p1-p1−p做拉伸。丢弃概率是丢弃法的超参数。具体来说,设随机变量ξi\xi_iξi​为0和1的概率分别为ppp和1−p1-p1−p。使用丢弃法时我们计算新的隐藏单元hi′h_i'hi′​

hi′=ξi1−phih_i' = \frac{\xi_i}{1-p} h_i hi′​=1−pξi​​hi​

由于E(ξi)=1−pE(\xi_i) = 1-pE(ξi​)=1−p,因此

E(hi′)=E(ξi)1−phi=hiE(h_i') = \frac{E(\xi_i)}{1-p}h_i = h_i E(hi′​)=1−pE(ξi​)​hi​=hi​

丢弃法不改变其输入的期望值。让我们对图3.3中的隐藏层使用丢弃法,一种可能的结果如图3.5所示,其中h2h_2h2​和h5h_5h5​被清零。这时输出值的计算不再依赖h2h_2h2​和h5h_5h5​,在反向传播时,与这两个隐藏单元相关的权重的梯度均为0。由于在训练中隐藏层神经元的丢弃是随机的,即h1,…,h5h_1, \ldots, h_5h1​,…,h5​都有可能被清零,输出层的计算无法过度依赖h1,…,h5h_1, \ldots, h_5h1​,…,h5​中的任一个,从而在训练模型时起到正则化的作用,并可以用来应对过拟合。在测试模型时,我们为了拿到更加确定性的结果,一般不使用丢弃法。

图3.5 隐藏层使用了丢弃法的多层感知机

从零开始实现

根据丢弃法的定义,我们可以很容易地实现它。下面的dropout函数将以drop_prob的概率丢弃X中的元素。

%matplotlib inline
import torch
import torch.nn as nn
import numpy as np
import sys
sys.path.append("..")
import d2lzh_pytorch as d2ldef dropout(X, drop_prob):X = X.float()assert 0 <= drop_prob <= 1keep_prob = 1 - drop_prob# 这种情况下把全部元素都丢弃if keep_prob == 0:return torch.zeros_like(X)mask = (torch.rand(X.shape) < keep_prob).float()# print((torch.rand(5) < 0.5).float())  # tensor([1., 1., 0., 0., 1.])return mask * X / keep_prob

我们运行几个例子来测试一下dropout函数。其中丢弃概率分别为0、0.5和1。

X = torch.arange(16).view(2, 8)
dropout(X, 0)
dropout(X, 0.5)
dropout(X, 1.0)

定义模型参数

实验中,我们依然使用3.6节(softmax回归的从零开始实现)中介绍的Fashion-MNIST数据集。我们将定义一个包含两个隐藏层的多层感知机,其中两个隐藏层的输出个数都是256。

num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256W1 = torch.tensor(np.random.normal(0, 0.01, size=(num_inputs, num_hiddens1)), dtype=torch.float, requires_grad=True)
b1 = torch.zeros(num_hiddens1, requires_grad=True)
W2 = torch.tensor(np.random.normal(0, 0.01, size=(num_hiddens1, num_hiddens2)), dtype=torch.float, requires_grad=True)
b2 = torch.zeros(num_hiddens2, requires_grad=True)
W3 = torch.tensor(np.random.normal(0, 0.01, size=(num_hiddens2, num_outputs)), dtype=torch.float, requires_grad=True)
b3 = torch.zeros(num_outputs, requires_grad=True)params = [W1, b1, W2, b2, W3, b3]

定义模型

下面定义的模型将全连接层激活函数ReLU串起来,并对每个激活函数的输出使用丢弃法。我们可以分别设置各个层的丢弃概率。通常的建议是把靠近输入层的丢弃概率设得小一点

在这个实验中,我们把第一个隐藏层的丢弃概率设为0.2,把第二个隐藏层的丢弃概率设为0.5。我们可以通过参数is_training来判断运行模式为训练还是测试,并只需在训练模式下使用丢弃法。

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

我们在对模型评估的时候不应该进行丢弃,所以我们修改一下d2lzh_pytorch中的evaluate_accuracy函数:

# 本函数已保存在d2lzh_pytorch
def evaluate_accuracy(data_iter, net):acc_sum, n = 0.0, 0for X, y in data_iter:if isinstance(net, torch.nn.Module):net.eval() # 评估模式, 这会关闭dropoutacc_sum += (net(X).argmax(dim=1) == y).float().sum().item()net.train() # 改回训练模式else: # 自定义的模型if('is_training' in net.__code__.co_varnames): # 如果有is_training这个参数# 将is_training设置成Falseacc_sum += (net(X, is_training=False).argmax(dim=1) == y).float().sum().item() else:acc_sum += (net(X).argmax(dim=1) == y).float().sum().item() n += y.shape[0]return acc_sum / n

注:将上诉evaluate_accuracy写回d2lzh_pytorch后要重启一下jupyter kernel才会生效。

训练和测试模型

这部分与之前多层感知机的训练和测试类似。

num_epochs, lr, batch_size = 5, 100.0, 256
loss = torch.nn.CrossEntropyLoss()
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params, lr)

输出:

epoch 1, loss 0.0044, train acc 0.574, test acc 0.648
epoch 2, loss 0.0023, train acc 0.786, test acc 0.786
epoch 3, loss 0.0019, train acc 0.826, test acc 0.825
epoch 4, loss 0.0017, train acc 0.839, test acc 0.831
epoch 5, loss 0.0016, train acc 0.849, test acc 0.850

注:这里的学习率设置的很大,原因同3.9.6节。

简洁实现

PyTorch中,我们只需要在全连接层后添加Dropout层并指定丢弃概率。在训练模型时,Dropout层将以指定的丢弃概率随机丢弃上一层的输出元素;在测试模型时(即model.eval()后),Dropout层并不发挥作用。

net = nn.Sequential(d2l.FlattenLayer(),nn.Linear(num_inputs, num_hiddens1),nn.ReLU(),nn.Dropout(drop_prob1),nn.Linear(num_hiddens1, num_hiddens2), nn.ReLU(),nn.Dropout(drop_prob2),nn.Linear(num_hiddens2, 10))for param in net.parameters():nn.init.normal_(param, mean=0, std=0.01)

下面训练并测试模型。

optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)

输出:

epoch 1, loss 0.0045, train acc 0.553, test acc 0.715
epoch 2, loss 0.0023, train acc 0.784, test acc 0.793
epoch 3, loss 0.0019, train acc 0.822, test acc 0.817
epoch 4, loss 0.0018, train acc 0.837, test acc 0.830
epoch 5, loss 0.0016, train acc 0.848, test acc 0.839

注:由于这里使用的是PyTorch的SGD而不是d2lzh_pytorch里面的sgd,所以就不存在3.9.6节那样学习率看起来很大的问题了。

小结

  • 我们可以通过使用丢弃法应对过拟合。
  • 丢弃法只在训练模型时使用。

参考文献

[1] Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I., & Salakhutdinov, R. (2014). Dropout: a simple way to prevent neural networks from overfitting. JMLR


注:本节除了代码之外与原书基本相同,原书传送门

本人出于学习的目的,引用本书内容,非商业用途,推荐大家阅读此书,一起学习!!!


加油!

感谢!

努力!

《动手学深度学习》丢弃法(dropout)相关推荐

  1. 丢弃法——dropout

    <动手学深度学习pytorch>部分学习笔记,仅用作自己复习. 丢弃法--dropout 除了权重衰减以外,深度学习模型常使⽤丢弃法(dropout) 来应对过拟合问题.丢弃法有一些不同的 ...

  2. 丢弃法Dropout

    丢弃法Dropout:一种抑制过拟合的方法. 上图中提到的两种解决方案:1.downgrade_in_infer:训练时随机丢弃一部分神经元:预测时不丢弃神经元,这里提到的不丢弃神经元是指预测时不丢弃 ...

  3. 丢弃法(dropout)

    1 对于丢弃法的一点小思考 (1) 对于模型设计我们可以把隐藏层设计的稍微大一点然后用drop out控制隐藏层大小这样的设计可能比隐藏层设计的小一点的效果更好,防止过拟合,drop out 其实就是 ...

  4. 【pytorch】过拟合的应对办法 —— 丢弃法(dropout)

    文章目录 一.什么是丢弃法,为什么丢弃法可以缓解过拟合? 二.丢弃法的手动实现 三.丢弃法的pytorch实现 参考 关于过拟合.欠拟合的解释可以参考我的博文:[pytorch]过拟合和欠拟合详解,并 ...

  5. PyTorch——Dropout(丢弃法)

    参考链接 https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter03_DL-basics/3.13_dropout dropout 深度学习模型常常使 ...

  6. 【深度学习】丢弃法(dropout)

    丢弃法 在小虾的这篇文章中介绍了权重衰减来应对过拟合问题(https://blog.csdn.net/qq_33432841/article/details/107879937),下面在介绍一种应对过 ...

  7. [pytorch、学习] - 3.13 丢弃法

    参考 3.13 丢弃法 过拟合问题的另一种解决办法是丢弃法.当对隐藏层使用丢弃法时,隐藏单元有一定概率被丢弃. 3.12.1 方法 3.13.2 从零开始实现 import torch import ...

  8. Pytorch与drop_out(丢弃法)

    简述 深度学习模型常常使用丢弃法(dropout)[1] 来应对过拟合问题.丢弃法有一些不同的变体.文中提到的丢弃法特指倒置丢弃法(inverted dropout). 对于激活函数而言有: hi=ϕ ...

  9. 动手学深度学习V2.0(Pytorch)——13.丢弃法

    文章目录 1. 课件讲解 插一句(正则的分类) 2. Q&A 2.1 dropout是初次生效,还是每次都重新选取概率 2.2 dropout的感性评价 2.3 dropout随机置0对求梯度 ...

最新文章

  1. 【实用快捷键】设置WebStorm中Show in Explorer(在资源管理器中打开)快捷键Alt+Shift+R(类似VSCode)
  2. 比较双曲正切tanh与sigmoid激活函数的性能差异
  3. Go语言重点知识点1
  4. linq To DataTable
  5. Windows XP、Windows Server 2003 等微软操作系统的源代码被指遭泄露
  6. c语言 不显示dos窗口,运行DOS批处理不显示DOS窗口的方法
  7. Flume+Kafka+Spark Streaming+MySQL实时日志分析
  8. SVN分支创建,合并,多分支并行
  9. java调用百度Ocr识别以及报错SDK108的解决办法
  10. 【新书推荐】【2017.07】创新的雷达技术与应用第一卷:实孔径阵列雷达、成像雷达与无源多基地雷达
  11. 文件排版2.2 (python)
  12. 微信小程序:简单舒服新UI装逼制作神器
  13. 八、在创业公司工作的心理历程
  14. 网络安全体系与网络安全模型
  15. 硅烷聚乙二醇硅烷,Silane-PEG-Silane同官能团科研试剂,化学结构式
  16. PAT 1085 PAT单位排行 (Microsoft_zzt)
  17. Android仿抖音APP
  18. (4)图像增强- Part1. 对比度增强
  19. 局部二值模式(Local Binary Patterns)纹理灰度与旋转不变性
  20. java面试之JVM和并发

热门文章

  1. 关于mcu启动中内存数据搬运的总结
  2. python内置函数用法,超级详细
  3. 《Concurrency in Go》阅读笔记 -- 第三章:Go语言并发组件
  4. 常见web漏洞及防范(转)
  5. Wonderware INSQL historian SDK开发
  6. python实现图书管理系统(课设)
  7. 第十六章——保存、加载数据和应用程序状态
  8. 通过js得到em标签中的值,统计文字数量
  9. S905盒子应该使用的dtb包
  10. Aspose.Words使用教程之如何在文档中添加水印