工作流程

dropout用于解决过拟合,通过在每个batch中删除某些节点(cell)进行训练,从而提高模型训练的效果。

通过随机化一个伯努利分布,然后于输入y进行乘法,将对应位置的cell置零。然后y再去做下一层的前向传播。

\[\begin{aligned}
r_{j}^{(l)} & \sim \operatorname{Bernoulli}(p) \\
\widetilde{\mathbf{y}}^{(l)} &=\mathbf{r}^{(l)} * \mathbf{y}^{(l)} \\
z_{i}^{(l+1)} &=\mathbf{w}_{i}^{(l+1)} \widetilde{\mathbf{y}}^{l}+b_{i}^{(l+1)} \\
y_{i}^{(l+1)} &=f\left(z_{i}^{(l+1)}\right)
\end{aligned}
\]

这里由于部分cell的缺失,会导致下一层的cell的值偏小,假设一个cell有p的概率被抹除,那么他在网络中发生作用的数学期望是:

\[E = (1 - p) * x + p * 0 \\
E = (1 - p) * x
\]

所以真正用于网络计算的x的大小只有(1-p)x,而在训练时,dropout会被关闭,所有的cell都会被用于计算(为了避免预测结果的随机性,所以不能有dropout这种随机结构参与运算),相对来说,由于所有的cell都参与了运算,那么下一层的值会更大。为了抵消这种差距,在测试时用 \((1-p)x\) 进行计算。这样cell传递到下一层时,可以使下一层和train时保持在同一个量级上。

如果不想在预测时把x乘上(1-p),我们可以在训练时把x进行缩放。即 \(\frac{x}{(1-p)}\),这样在预测时就可以直接用x进行运算,而不用改变x的值。这种方式也被称为 iverse dropout。

实现:

#dropout函数的实现
def dropout(x, level):
import numpy as np
if level < 0. or level >= 1: #level是概率值,必须在0~1之间
raise Exception('Dropout level must be in interval [0, 1[.')
retain_prob = 1. - level
#我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
#硬币 正面的概率为p,n表示每个神经元试验的次数
#因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
sample=np.random.binomial(n=1,p=retain_prob,size=x.shape)#即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
print(sample)
x *=sample#0、1与x相乘,我们就可以屏蔽某些神经元,让它们的值变为0
x /= retain_prob return x #对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果
x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
dropout(x,0.4)

为什么可以解决过拟合

  1. dropout通过随机去除cell,使得网络的结果在不断的变化当中。可以认为,最后的模型是在多个模型的基础上综合起来的模型。在处理过拟合问题的时候,常常使用多个模型训练一份数据,最后通过“投票”或者取平均的方式来预测,可以降低过拟合的影响。而dropout的这种“综合”的结果就类似多个模型共同来预测。

  2. 减少神经元之间的依赖关系。在神经网络中可能两个神经元相互依赖才能产生比较好的效果。比如一个cell很大而另一个很小,它们的组合却不影响最终的结果,但是这些cell学到的并不是正确的知识。

问题

在学习dropout的算法中关于drop的反向传播还有一些细节值得推敲。理论上来说,dropout是的效果是让一个cell在神经网络中消失,不管是前向传播还是反向传播,都要忽略这个cell的存在。但是关于dropout反向传播的具体操作众说纷纭。很难找到一个明确的说法。

  1. 由于cell已经被置零,所以在对下一层网络求导时,与之相连的权重的梯度都是零,所以下一层与之相连的权重都不会被更新。
  2. cell连接前后两个权重,虽然cell之后的权重可以自动根据cell的值来判断梯度。但是与cell相连的前面的权重就不可以这么做了,所以这些权重需要做一个判断,如果是与cell相连的权重,那么就抹除他的误差。

参考资料:

http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf

https://blog.csdn.net/program_developer/article/details/80737724

https://blog.csdn.net/oBrightLamp/article/details/84105097

Dropout原理分析的更多相关文章

  1. 深度学习中Dropout原理解析

    1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象. 在训练神经网络的时候经常会遇到过拟合的问题 ...

  2. Dropout原理解析

    1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象.在训练神经网络的时候经常会遇到过拟合的问题, ...

  3. Hebye 深度学习中Dropout原理解析

    1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象. 在训练神经网络的时候经常会遇到过拟合的问题 ...

  4. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  5. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

  6. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  7. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  8. 转载:AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  9. Camel运行原理分析

    Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...

随机推荐

  1. 基于 Apache Hudi 和DBT 构建开放的Lakehouse

    本博客的重点展示如何利用增量数据处理和执行字段级更新来构建一个开放式 Lakehouse. 我们很高兴地宣布,用户现在可以使用 Apache Hudi + dbt 来构建开放Lakehouse. 在深 ...

  2. CAD二次开发(.net)优秀网站分享

    Autodesk官方网站 官方帮助文档:AutoCAD 2016 帮助: Managed .NET Developer's Guide (.NET) (autodesk.com) DXF帮助手册:DX ...

  3. 系统CPU飙高,怎么排查?

    cpu是整个电脑的核心计算资源,对于一个应用进程来说,cpu的最小执行单元是线程. 导致cpu飙高的原因有几个方面: cpu上下文切换过多,对于cpu来说,同一时刻下每个cpu核心只能运行一个线程,如 ...

  4. Halcon C#开发OpenFramegrabber卡死问题

    之前用Halcon12开发的时候,Hdevelop打开相机正常,但是用C#开发的时候,就出现了问题. 1.换库,甚至将x64中dll全部拷贝到debug中,始终不行 2.看到有说卸载360的,更是离谱 ...

  5. 7个自定义定时任务并发送消息至邮箱或企业微信案例(crontab和at)

    前言 更好熟悉掌握at.crontab定时自定义任务用法. 实验at.crontab定时自定义任务运用场景案例. 作业.笔记需要. 定时计划任务相关命令及配置文件简要说明 at 工具 由包 at 提供 ...

  6. 什么?MySQL 8.0 会同时修改两个ib_logfilesN 文件?

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 作者介绍:孙黎,GreatDB 认证DBA 问题现象 ...

  7. Windows平台摄像头或屏幕RTMP推送介绍:OBS VS SmartPublisher

    好多开发者问道,既然有了OBS,你们为什么还要开发SmartPublisher? 的确,在我们进行Windows平台RTMP推送模块开发之前,市面上为数不多的Windows平台RTMP推流工具当属OB ...

  8. 第二章 Kubernetes快速入门

    一.四组基本概念 Pod/Pod控制器: Name/Namespace: Label/Label选择器: Service/Ingress. 二.Pod/Pod控制器 2.1 Pod Pod是K8S里能 ...

  9. 回溯剪枝,dfs,bfs

    dfs: 给定一个整数n,将数字1~n排成一排,将会有很多种排列方法. 现在,请你按照字典序将所有的排列方法输出. 输入格式 共一行,包含一个整数n. 输出格式 按字典序输出所有排列方案,每个方案占一 ...

  10. 中秋快乐!新鲜出炉一篇DjangoAdmin使用合集,DjangoAdmin的功能比你想象的强大!

    DjangoAdmin DjangoAdmin本身就是一套大而全的系统,官方文档中介绍了很多配置方法,但仍然有大量的骚操作是文档中没有的,所以遇到特殊需求的时候,求助文档不一定有用. 在我看来 Dja ...