感谢 @南方的仔 在评论中的灵魂提问,既然 rescale 是为了“保持期望不变”,那么为什么要“保持期望不变”呢?

我猜测是为了“在 infer 时不进行dropout”。dropout是带有随机性的,如果 infer 也做的话,网络的输出就不稳定。同样一个样本,整体预测结果每次都可能变化。在 infer 不做 dropout 的前提下,保证训练和预测过程的分布一致,而对 infer 进行 rescale。

--------------------------- | 更新分割线 | ---------------------------

dropout 有两种实现方式,Vanilla Dropout和 Inverted Dropout。前者是 原始论文 中的朴素版,后者在 Andrew Ng 的 cs231 课程中有介绍。

其实不仅仅是 rescale,这两个版本在训练(forward)、梯度(backward)和预测(predict)三个阶段都不尽相同。面试官往往喜欢揪着问,来考查细节知识。

输入序列为

,正常的回溯梯度序列为

,假设以丢弃概率 p=0.2 进行伯努利采样得到的 mask 序列

如果是 vanilla版本,在 forward 时直接对输入进行遮罩

,在 backward 时梯度和输入保持一致

,在 infer 时进行 1-p 倍的缩小

。你看,训练时候因为随机扔掉了一些节点,总期望变小,那么预测时候就全体缩小一点来保持一致。

这样处理的一个最大问题,就是预测过程需要跟着 dropout 策略做调整,哪些层取消了、加重了或者减轻了,都需要改。一不小心就会出错。

inverted版本顺势而生,把所有的修改都放在训练阶段,保持预测阶段不变。在 forward 时先遮罩再进行 1/(1-p) 的放大

,在 backward 时需要同步修改梯度

,在 infer 时不做额外的处理

。训练时虽然也随机扔掉了一些节点,但是做了 rescale 之后总期望被拉回了原来的水平,训练过程和预测过程仍然是一致的。

目前主流的训练框架,实现的都是 inverted 版本,所以在预测时不需要费心调整,把dropout当作是透明的就可以了。比如 Pytorch 的源码 torch.nn.Dropout(只保留核心部分),我加了注释:

class Dropout(InplaceFunction):

... ...

@classmethod

def forward(cls, ctx, input, p=0.5, train=False, inplace=False):

ctx.p = p

ctx.train = train

if ctx.p == 0 or not ctx.train: ## infer 阶段保持不变.

return input

output = input.clone()

ctx.noise = cls._make_noise(input) ## 即遮罩 mask.

if ctx.p == 1:

ctx.noise.fill_(0)

else:

ctx.noise.bernoulli_(1 - ctx.p).div_(1 - ctx.p) ## 对 mask 做 1/(1-p)倍的放大

ctx.noise = ctx.noise.expand_as(input)

output.mul_(ctx.noise)

return output

@staticmethod

def backward(ctx, grad_output): ## 梯度回溯

if ctx.p > 0 and ctx.train:

return grad_output * ctx.noise, None, None, None ## 梯度和输入做同样的遮罩和放大

else:

return grad_output, None, None, None

dropout层加在哪里_神经网络Dropout层中为什么dropout后还需要进行rescale?相关推荐

  1. dropout层加在哪里_系列解读Dropout

    本文主要介绍Dropout及延伸下来的一些方法,以便更深入的理解. 想要提高CNN的表达或分类能力,最直接的方法就是采用更深的网络和更多的神经元,即deeper and wider.但是,复杂的网络也 ...

  2. dropout层加在哪里_常用层 - Keras中文文档

    常用层 常用层对应于core模块,core内部定义了一系列常用的网络层,包括全连接.激活层等 Dense层 keras.layers.core.Dense(units, activation=None ...

  3. 神经网络测试集loss不变_神经网络训练过程中不收敛或者训练失败的原因

    在面对模型不收敛的时候,首先要保证训练的次数够多.在训练过程中,loss并不是一直在下降,准确率一直在提升的,会有一些震荡存在.只要总体趋势是在收敛就行.若训练次数够多(一般上千次,上万次,或者几十个 ...

  4. unity保存加载慢_掌握Unity 5中的保存和加载功能

    unity保存加载慢 Thanks to Vincent Quarles for kindly helping to peer review this article. 感谢Vincent Quarl ...

  5. vue 判断页面加载完成_在Vue+webpack中详细讲解基础配置

    这篇文章主要介绍了Vue+webpack项目基础配置教程,需要的朋友可以参考下. 最近在学习webpack,跟着课程一个单页面应用,在这里记录一下. 这个部分主要讲了如何配置webpack的环境,以及 ...

  6. outlook 加载配置项_如何在Outlook中启用加载项和连接器

    outlook 加载配置项 There are a lot of third-party add-ins and connectors available for Outlook. What's th ...

  7. layui 表格加载动画_移动UI设计中动画的3个主要用途

    点击  "蓝色字体" 即可关注嘉成  随着技术的飞速发展,动画已不再是视觉上的奢侈,而是用户期望的功能需求.动画解决了界面中的许多功能性问题,并使界面生动活泼并真正响应用户. 让我 ...

  8. python异步加载图片_如何在PyQt5中正确异步加载图像?

    我在尝试如何在pyqtqlistview中正确地完成异步映像加载.在 我的主小部件由一个Qlistview和一个QLineEdit文本框组成. 我有一个参与者数据库,我使用QAbstractListM ...

  9. python中__init__后面加特殊符号_详解Python中的__new__、__init__、__call__三个特殊方法...

    __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个参数是sel ...

  10. elementui 表格英文加数字排序_解决vue elementUI中table里数字、字母、中文混合排序问题...

    1.使用场景 使用elementUI中的table时,给包含数字字母中文的名称等字段排序 例如:数字(0->9)->大写字母(A->Z)->小写字母(a->z)-> ...

最新文章

  1. 太阳光是平行光吗_科普文系列活动 || 奇妙的光现象
  2. Spring boot返回JSON类型响应及Content-Type设置
  3. .NET中读取csv文件内容
  4. IBM Webpshere6(WAS6) bug发现一例
  5. HDU 3664 Permutation Counting(DP)
  6. (转载)Vim入门图解说明
  7. individual program总结2.0
  8. 【文末送书】在科研路上,大家有什么经验教训?
  9. 在线教育与计算机网络的融合发展,[浅谈线上教育和线下教育的融合]
  10. c语言线性规划建模及求解,C语言大作报告线性规划求解基科3字班.doc
  11. java爬虫实例教程_Java爬虫的实例分析
  12. 程序设计作业——系统管理
  13. Docker架设服务器系列
  14. 不是忽悠?国产16nm八核处理器来了
  15. 维修技术论坛万能预装系统 v5.0
  16. 如何启用计算机上的摄像头,电脑如何打开摄像头
  17. WeWork举步维艰,它的竞争对手们活的怎么样?
  18. 二分法求多项式单根 — c语言
  19. python爬虫m3u8#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:8 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:5.0000
  20. UPC——2020年春混合个人训练第二十五场(FG)

热门文章

  1. 会议 | 百度首席科学家吴华图灵大会演讲:NLP技术的演变与发展
  2. matlab小波变换函数总结,matlab小波变换函数的总结与程序
  3. android 高仿ios开关,Android 仿苹果IOS6开关按钮
  4. 前端原生开发解决方案
  5. 什么叫弹性计算云服务器,弹性云服务器
  6. imp命令导入指定表_oracle 导入imp 命令
  7. oracle imp指定表空间导入,imp导入其它表空间数据库
  8. 分享一个VS2010插件 GBackupSolution Add-in for Visual Studio 2008/2010
  9. 2016 linux发行版排行_2018年10大最漂亮的 Linux 发行版
  10. 光继电器一体化控制实训系统