Dropout 是一类用于神经网络训练或推理的随机化技术,这类技术已经引起了研究者们的广泛兴趣,并且被广泛地应用于神经网络正则化、模型压缩等任务。虽然 Dropout 最初是为密集的神经网络层量身定制的,但是最近的一些进展使得 Dropout 也适用于卷积和循环神经网络层。本文总结了 Dropout 方法的发展历史、应用以及当下的研究热点,还详细介绍了研究者们提出的重要方法。

图 1:一些目前提出的 Dropout方法,以及 2012 到 2019 年间 Dropout 方法的理论进展。

标准的 Dropout

2012 年提出的原始  方法为避免前馈神经网络中出现的过拟合现象提供了一种简单的技术[1]。在每轮迭代中,网络中的每个神经元以 p 的概率被丢弃。当训练完成后,尽管神经元的输出要乘以该神经元被丢弃的概率 p,整体的网络架构还是会被使用。这样做抵消了没有神经元被丢弃的神经网络尺寸过大的影响,并且可以被解释为在训练时可能出现的网络上取平均。每一层的 dropout 概率可能不尽相同,原始的 Dropout 论文建议输入层的 p=0.2,而隐藏层的 p=0.5。输出层中的神经元不会被丢弃。这种技术通常被简称为 Dropout,但是处于本文论述的需要,我们将其称之为标准 Dropout,从而将其与其它的 Dropout 方法区分开来。该方法如图 2 所示。

图 2:标准 Dropout 的示例。左侧为全连接网络,右侧的网络以 0.5 的概率丢弃神经元。输出层并没有应用 Dropout。

从数学上来说,神经网络层训练过程中使用的标准 Dropout 的行为可以被写作:

其中 f(·)为,x 是该层的输入,W 是该层的权值矩阵,y为该层的输出,而 m 则为该层的 Dropout 掩膜(mask),mask 中每个元素为 1 的概率为 p。在测试阶段,该层的输出可以被写作:

用于训练的 Drpout 方法

本节介绍了重要的 Dropout 方法。和标准的 Dropout 一样,他们通常被用来在训练时正则化密集的前馈神经网络层。这些方法中的大多数都直接受到了标准 Dropout 的启发,并寻求提高其速度或的有效程度。

基于标准 Dropout 最早提出的变体之一便是由 Wan 等人[3]于 2013 年提出的 dropconnect。该方法是对 Dropout 的一种泛化,其中每个神经元的权重或偏置以一定的概率被设置为 0,而不是将神经元的输出设置为 0。因此,在训练时,某个网络层的输出可以被写作:

其中各变量的定义与公式(1)中相同,但是这里使用了一个 Dropout mask 矩阵,而不是 mask 向量。Dropoutconnect 如图 3 所示。

图 3:Dropconnect 的示例。右侧的网络以 0.5 的概率将权值设置为 0。

Standout[4]是一种试图通过自适应地选择待丢弃的神经元(而不是随机丢弃)来改进标准 Dropout的 Dropout 方法。这个过程是通过在神经网络上叠加一个控制神经网架构的二值信念网络实现的。针对原始神经网络中的每一个权值,Standout 都会在二值信念网络中为其添加一个相应的权值参数。在训练时,某一层的输出可以被写作:

其中各变量的定义与公式(1)相同,但是W 代表作用于该层的信念网络的权值,而 g(·)代表的激活函数。

Fast Dropout[5]通过从贝叶斯的角度解释 Dropout 方法,提供了一种更快速地进行类似于 Dropout 的正则化的方式。Fast Dropout 的作者表明,带有 Dropout 的网络层的输出可以被看做是从一个潜在的分布(可以近似为高斯分布)中进行采样。然后可以直接从这个分布中采样,或者使用它的参数来传播关于整个 Dropout 集合的信息。该技术可以比标准 Dropout 更快地进行训练(在标准 Dropout 中,一次只采样可能的网络集合中的一个元素)。

受贝叶斯式dropout理解方法启发的另一种方法是 Kingma 等人[6]提出的变分Dropout(不要与 Gal 和 Ghahramani 的工作[13]弄混)。作者指出,使用高斯乘性噪声的 Dropout 变体(由 Srivastava 等人提出的[8])可以被解释为给定一个网络权值上的特定先验和特定变分目标的变分方法。然后,它们会推导出一个自适应的 Dropout 方案,该方案可以自动确定一个完整的网络或单个层或神经元的有效的Dropout 概率。相对于现有的使用确定的 Dropout 率的方法(如使用固定的概率或网格搜索)来说,这可能是一种改进。Concrete Dropout[20]是另外一种自动调整 Dropout 概率的方法。

卷积层

用于卷积神经网络(CNN)的朴素Dropout 的定义为:在特征图或输入图像中随机地丢弃像素。这并没有显著地减少过拟合,主要是因为被丢弃的像素与其邻接像素是高度相关的[21]。然而,最近研究人员取得了许多有发展前景的、使用 Dropout 作为正则化方法训练 CNN 的研究进展。

最大池化 Dropout[12]是一种保留了最大池化层的行为的方法,它同时也以一定概率让其它的特征值可以影响池化层的输出。在执行最大池化操作前,算子对特征值的某个子集进行 mask 运算。

图 4:卷积神经网络中的最大池化Dropout[12]。

在论文「Analysis on the dropout effect inconvolutional neural networks」[23]中,作者提出了一种基于训练的迭代过程改变 Dropout 概率的 Dropout 方法。丢弃神经元的概率是从均匀分布或正态分布采样得到的。该方法等价于向每一层的输出特征图添加噪声。该方法提高了网络对带有噪声的图像变化的鲁棒性[23]。作者也提出了「max-drop」,在这种方法中高激活值被有选择性地丢弃。这些高激活值是在特征图或通道上选择出来的[23]。论文[23]中的实验结果表明,文中所提出的方法的性能与「spatial dropout」相当。

Cutout 是另一种基于Dropout 的用于训练 CNN 的正则化和数据增强方法[24],它在每一张输入图像的某个区域上应用一个随机的正方形掩膜。与其它常见的在特征图级别上应用 Dropout 的方法不同,该方法直接将 Dropout 应用在输入图像上。Cutout 背后主要的动机是删除 CNN 的后续层中带有高激活值的视觉特征[24]。然而,令人惊讶的是,这种在输入图像上应用掩膜的方法在执行成本更低的情况下可以取得相同的性能。

 

循环层

通常而言,上述前馈 Dropout 方法可以被应用到带有循环层的网络的前馈连接中。因此,一些研究着眼于将 Dropout 方法应用于循环连接。因为在每一个时间步上由 Dropout 引起的噪声让网络难以保留长期的记忆,将标准 Dropout 应用于循环连接的效果很差[28]。然而,专门为循环层设计的 Dropout 方法也取得了成功,并且在实践中被广泛应用。一般来说,它们通过一种仍然能够保存长期记忆的方式将 Dropout 应用于循环连接上。

2015 年提出的RNNDrop[30]提供了一种简单的解决方案,能够在应用 Dropout 时更好地保留记忆。

图 5:在一个展开的循环神经网络(RNN)上,对于每一个时间步(左图)和每一个序列(右图)进行 Dropout 掩膜采样的对比。水平连接是循环的,而垂直连接是前馈的。不同的颜色代表应用于相应连接的不同 Dropout 掩膜。

2016 年,Gal 和 Ghahramani 提出了一种RNN Dropout 变体,该变体基于一种对 Dropout 方法的贝叶斯化的解释。作者指出,如果 Dropout 被看做一个贝叶斯后验的变分蒙特卡罗逼近,那么将其应用于循环层的自然方法就是生成一个同时将每个训练序列的前馈连接和循环连接置零的 Dropout 掩膜,但是为序列中的每个时间步保持相同的掩膜。这与 RNNDrop 类似的地方在于,掩膜是基于每个序列生成的,但是求导过程导致在 LSTM 单元的不同位置应用 Dropout。

循环 Dropout[14]是另一种可以在一个 LSTM 中保存记忆,同时也能像在标准 Dropout 中一样为每个输入样本生成不一样的 Dropout 掩膜的方法。这只需将 Dropout 应用于 RNN 中更新隐藏状态的部分,而不是状态本身。因此,如果一个元素被删除,那么它就不会对网络的记忆产生影响,而不是消除隐藏状态。

用于模型压缩的 Dropout 方法

标准 Dropout 加大了神经网络权值[8]的稀疏性。这一特性意味着 Dropout 方法可以通过减少有效执行所需的参数数量来压缩神经网络模型。自 2017 年以来,研究人员提出了几种基于 Dropout 压缩实际模型的方法。

2017 年,Molchanov 等人[9]提出使用变分 Dropout[6](本文第三节介绍过)同时对全连接层和卷积层进行稀疏化。结果表明,该方法在对性能影响最小的同时,大大减少了标准卷积网络的参数。然后可以将这种稀疏表征传递到现有方法中,从而将稀疏网络转换为压缩模型(如[31]中的工作)。Neklyudov 等人[10]也提出了类似的方法,他们使用了改进的变分 Dropout 方案,提高了稀疏性,但最终得到的网络结构特别易于压缩。

最近,进一步开发用于模型压缩的 Dropout 方法是一个十分活跃的研究领域。最近提出的方法包括 Targeted Dropout[32],其中神经元被自适应地选择,并以使网络适应神经剪枝的方式被丢弃,在不过多损失准确率的情况下大幅度缩小网络规模。另一种最近提出的方法是 Ising-dropout[11],它在一个神经网络的顶部覆盖了一个图形化的「Ising」模型,以识别不太有用的神经元,并在训练和推理中把它们丢弃掉。

蒙特卡罗 Dropout

2016 年,Gal 和 Ghahramani[7]提出了一种从贝叶斯理论出发的Dropout理解方式,并且被广泛接受。他们将Dropout 解释为深度高斯过程的贝叶斯近似。

除了常见的点估计输出,该方法还提供了一种估计神经网络输出置信度的简单方法。蒙特卡罗Dropout 在模型的不确定性估计中得到了广泛的应用。

论文链接:https://arxiv.org/abs/1904.13310

Dropout的前世与今生的更多相关文章

  1. GC的前世与今生

    GC的前世与今生 虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...

  2. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  3. AOP前世与今生,aspect

    AOP前世与今生 -------------------------------- 1.代码编写重复,(简单重构) 2.改善 3.静态代理(不改变原代码,继乘原来接口),代理类, aop 最原始出发点 ...

  4. DDR的前世与今生(一)

    作者:一博科技 DDR SDRAM全称为Double Data Rate SDRAM,中文名为"双倍数据率SDRAM".DDR是在原有的SDRAM的基础上改进而来,严格的说DDR应 ...

  5. Linux下1号进程的前世(kernel_init)今生(init进程)----Linux进程的管理与调度(六)

    前面我们了解到了0号进程是系统所有进程的先祖, 它的进程描述符init_task是内核静态创建的, 而它在进行初始化的时候, 通过kernel_thread的方式创建了两个内核线程,分别是kernel ...

  6. KepServerEX读写三菱PLC,车间现场测试记录,带你了解【数据采集的困境】的前世与今生

    1.不了解KepServerEX 的鞋童,可以先了解一下OPC UA,OPC UA服务端.我们当前项目读写三菱PLC是自己写的类库,但我感觉调用不够方便灵活,工作之余用OPC UA方式尝试一下 2.数 ...

  7. 一文讲透Cluster API的前世、今生与未来

    作者:Luke Addison 原文链接:https://blog.jetstack.io/blog/cluster-api-past-present-and-future/ Cluster API是 ...

  8. Monte-Carlo Dropout

    Monte-Carlo Dropout Monte-Carlo Dropout(蒙特卡罗 dropout),简称 MC dropout. 一种从贝叶斯理论出发的 Dropout 理解方式,将 Drop ...

  9. Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】

    前言 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程由系统自动创建, 运行在内核态 idle进程其pi ...

随机推荐

  1. IDEA打包web项目为war,通过本地Tomcat启动war

    1.打包 ①idea的打包很简单,网上教程也很多,简单说下:project struct-->artifact-->+-->Web Application:Archive--> ...

  2. 1,Java知识储备

    1,关于 . java文件 规定:第一行为 package name; 表示该.java文件属于哪一个包. 一个.java文件中可以有多个类,但是只能有一个public类,并且这个public类必须与 ...

  3. MVC07

    1. 讲解ASP.net MVC的I/O操作 新建一个控制台程序,输入代码如下 using System; using System.IO; namespace IO { class Program ...

  4. 原型模式故事链(3)--JS的数据类型、以及区别、区分、转化

    上一章--原型链讲解:传送门:https://segmentfault.com/a/11... 在上一章讲解原型链时提到了:所有的引用类型都有一个_proto_属性,称之为隐式原型.那么引用类型是什么 ...

  5. Could not find a valid gem 'redis' (= 0)

    Could not find a valid gem 'redis' (= 0) 报错详情如下: ERROR: Could not find a valid gem 'redis' (>= 0) ...

  6. 一份简明的 Base64 原理解析

    书接上回,在 记一个 Base64 有关的 Bug 一文里,我们说到了 Base64 的编解码器有不同实现,交叉使用它们可能引发的问题等等. 这一回,我们来对 Base64 这一常用编解码技术的原理一 ...

  7. 微信小程序注册和简单配置

    微信小程序注册 1.直接搜索微信小程序,按照流程进行注册 2.如果有微信公众号,可以在公众号内部点小程序,进入注册流程 小程序中的概念 开发设置 在开发设置中获取AppID和AppSecret App ...

  8. 手机app抓包工具,安卓手机adb无线连接

    默认手机已经usb调试配置完成 网络必须在同一网络中,每次断开wifi连接,都必须重新重做一次 使用数据线连接电脑 cmd 打开一个命令行 输入 # abd如果没有配置环境变量,请配置或者进入adb文 ...

  9. Java中的IO与NIO

    前文开了高并发学习的头,文末说了将会选择NIO.RPC相关资料做进一步学习,所以本文开始学习NIO知识. IO知识回顾 在学习NIO前,有必要先回顾一下IO的一些知识. IO中的流 Java程序通过流 ...

  10. RStudio终端操作

    转于:https://support.rstudio.com/hc/en-us/articles/115010737148-Using-the-RStudio-Terminal#send 原文是英文版 ...