1.Dropout原理

1.概述
作用:防止过拟合
方法:训练时,随机停止某些神经元的参数训练
2. Dropout工作流程及使用
2.1 Dropout具体工作流程
假设我们要训练这样一个神经网络,如图2所示。

上图表示标准的神经网络。

输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。使用Dropout之后,过程变成如下:
(1)首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图3中虚线为部分临时被删除的神经元)

(2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。

(3)然后继续重复这一过程:

. 恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)

. 从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。

. 对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。

Dropout在神经网络中的使用

Dropout的具体工作流程上面已经详细的介绍过了,但是具体怎么让某些神经元以一定的概率停止工作(就是被删除掉)?代码层面如何实现呢?

下面,我们具体讲解一下Dropout代码层面的一些公式推导及代码实现思路。

(1)在训练模型阶段

无可避免的,在训练网络的每个单元都要添加一道概率流程。

图4:标准网络和带有Dropout网络的比较

对应的公式变化如下:

. 没有Dropout的网络计算公式:

. 采用Dropout的网络计算公式:


上面公式中Bernoulli函数是为了生成概率r向量,也就是随机生成一个0、1的向量。

代码层面实现让某个神经元以概率p停止工作,其实就是让它的激活函数值以概率p变为0。比如我们某一层网络神经元的个数为1000个,其激活函数输出值为y1、y2、y3、…、y1000,我们dropout比率选择0.4,那么这一层神经元经过dropout后,1000个神经元中会有大约400个的值被置为0。

注意: 经过上面屏蔽掉某些神经元,使其激活值为0以后,我们还需要对向量y1……y1000进行缩放,也就是乘以1/(1-p)。如果你在训练的时候,经过置0后,没有对y1……y1000进行缩放(rescale),那么在测试的时候,就需要对权重进行缩放,操作如下。

在测试模型阶段

预测模型的时候,每一个神经单元的权重参数要乘以概率p。

图5:预测模型时Dropout的操作
测试阶段Dropout公式:

3.通过代码理解

# coding:utf-8
import numpy as np# dropout函数的实现,函数中,x是本层网络的激活值。Level就是dropout就是每个神经元要被丢弃的概率。
def dropout(x, level):if level < 0. or level >= 1: #level是概率值,必须在0~1之间raise ValueError('Dropout level must be in interval [0, 1[.')retain_prob = 1. - level# 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样# 硬币 正面的概率为p,n表示每个神经元试验的次数# 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了print(random_tensor)x *= random_tensorprint(x)x /= retain_probreturn x#对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果
x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
print(dropout(x,0.4))
import torch
import torch.nn as nn
import torch.nn.functional as Fclass LinearFC(nn.Module):def __init__(self):super(LinearFC, self).__init__()self.fc = nn.Linear(3, 2)def forward(self, input):out = self.fc(input)out = F.dropout(out, p=0.5, training=self.training)return outNet = LinearFC()
x = torch.randint(10, (2, 3)).float()  # 随机生成不大于10的整数,转为float, 因为nn.linear需要float类型数据
Net.train()
output = Net(x)
print(output)# train the Net
  1. 第一步Net = LinearFC(),生成WWW和bbb:
W=tensor([[-0.5347,  0.3559,  0.0637],[-0.5676, -0.0257,  0.1802]], requires_grad=True)
b=tensor([0.4141, 0.4688], requires_grad=True)
  1. 第二步x = torch.randint(10, (2, 3)).float(),随机生成不大于10的整数,转为float, 因为nn.linear需要float类型数据
x=tensor([[3., 2., 0.],[2., 6., 8.]])
  1. 第三步 output = Net(x) out = self.fc(input)进入forward, out=x×WT+bout = x \times W^T + bout=x×WT+b,代码实现:torch.mm(x, Net.fc.weight.t()) + Net.fc.bias
tensor([[-0.4783, -1.2855],[ 1.9898,  0.6210]], grad_fn=<AddBackward0>)
  1. 第四步,dropout,公式out=out/(1−0.5)在以0.5概率置为0out = out/(1-0.5)在以0.5概率置为0out=out/(1−0.5)在以0.5概率置为0
(torch.mm(x, Net.fc.weight.t()) + Net.fc.bias)/(1-0.5)=
tensor([[-0.9565, -2.5710],[ 3.9796,  1.2420]], grad_fn=<DivBackward0>)
out=
tensor([[-0.0000, -0.0000],[0.0000, 1.2420]], grad_fn=<MulBackward0>)

可以看到经过dropout之后,数据变为:tensor([[-0.0000, -0.0000], [0.0000, 1.2420]], grad_fn=<MulBackward0>)

转载:https://blog.csdn.net/powu0193/article/details/99573632

dropout理解(一)相关推荐

  1. 深度学习正则化(L1 norm/L2 norm)以及dropout理解

    正则化知识其实是深度学习领域较为基础的知识点,初入此门的时候受限于正则化三个字的逼格,一直不求甚解:后期虽然了解但也仅限于L1和L2范数而已.恰巧上周在谢毅博士的课上旁听,讲到过拟合相关知识,后续和捷 ...

  2. dropout理解(三)

    本节使用的pytorch版本为1.8.1,其中的torch.nn.functional函数中的dropout方法中的参数training默认为True: 下面进入正文,首先创建一个简单的模型: imp ...

  3. dropout理解(二)

    Dropout在做什么 Train时Dropout在做什么? 当dropout(p)时,意味着每个neuron, 有p%的可能性被去除;(这里需要注意的是,不是去除p%的neuron) 我们可以看到的 ...

  4. 深度学习(二十二)Dropout浅层理解

    Dropout浅层理解 原文地址:http://blog.csdn.net/hjimce/article/details/50413257 作者:hjimce 一.相关工作 本来今天是要搞<Ma ...

  5. dropout+Batch Normalization理解

    Dropout理解: 在没有dropout时,正向传播如下: 加入dropout后: 测试时,需要每个权值乘以P:  Dropout官方源码: #dropout函数实现 def dropout(x, ...

  6. 深度学习(二十二)Dropout浅层理解与实现

    Dropout浅层理解与实现 原文地址:http://blog.csdn.net/hjimce/article/details/50413257 作者:hjimce 一.相关工作 本来今天是要搞< ...

  7. Coursera | Andrew Ng (02-week-1-1.7)—理解 Dropout

    该系列仅在原课程基础上部分知识点添加个人学习笔记,或相关推导补充等.如有错误,还请批评指教.在学习了 Andrew Ng 课程的基础上,为了更方便的查阅复习,将其整理成文字.因本人一直在学习英语,所以 ...

  8. Dropout 的前世与今生

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 Dropout 是一类用于神经网络训练或推理的随机化技术,这类技术 ...

  9. Dropout的前世与今生

    选自arXiv 作者:Alex Labach等 机器之心编译 参与:Geek AI.张倩 Dropout 是一类用于神经网络训练或推理的随机化技术,这类技术已经引起了研究者们的广泛兴趣,并且被广泛地应 ...

最新文章

  1. 【廖雪峰Python学习笔记】函数式编程
  2. oracle10g ora 29702,ORA-29702,请帮助一下。
  3. jQuery选择器和选取方法 http://www.cnblogs.com/MaxIE/p/4078869.html
  4. Vcastr 3.0 - flash video(flv) player (开源 Open Source)
  5. Android 高效的`InjectView – ButterKnife`
  6. selenium+python面试题目总结,完整度80%,看看你会多少?
  7. Java多线程的几种写法
  8. vue 日期选择器默认时间_vue-datepicker
  9. 月活用户达7.55亿,阿里淘系如何在后流量时代引爆用户增长?
  10. 湘潭大学oracle考试,湘潭大学07级《oracle数据库》A卷及其部分参考答案
  11. 今晚直播:WLS/WAS故障基本分析介绍
  12. SharePoint Framework 简介
  13. linux vim 粘贴 没有保持原来的格式,linux中的剪贴板用法,实现vim中原格式粘贴...
  14. 差分pid模块_基于数字PID切换控制的Buck变换器研究
  15. iOS-----用LLDB调试,让移动开发更简单(二)
  16. unity2d旋转专攻◤一◢ 角度计算
  17. RouterOS o*** client 连接爱快 Open*** 服务端
  18. 解决svchost.exe一直运行下载,占网速,关闭成功后再次重复开启,禁止不掉。亲测有效
  19. dataframe类型数据的遍历_pandas中遍历dataframe的每一个元素
  20. Krpano全景制作

热门文章

  1. ASP.NET中Response.Redirect()方法深度剖析
  2. rabbitMQ消息队列 – 面板介绍及简单demo
  3. 基于pygame的贪吃蛇游戏
  4. ntp服务器查看状态命令ntpstat及ntpq -p 说明及差别详解
  5. JS转字符 判断数字等
  6. jsp java语法_JSP基础语法
  7. android7.0wine乱码,Wine1.7+QQ6.4+处理中文乱码
  8. 数据结构树的基本操作_[数据结构]树的建立与基本操作 解题报告
  9. 命令行切换到conda环境_Anaconda命令行常用操作
  10. python写数据库校验_python 验证 sqlite数据库隔离级别