点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达

01. Dropout

dropout作为目前神经网络训练的一项必备技术,自从被Hinton提出以来,几乎是进行深度学习训练时的标配。就像做菜时必须加料酒一样,无论何时,大家在使用全连接层的时候都会习惯性的在后面加上一个dropout层。通常情况下,dropout被作为一种防止神经网络过拟合的正则化方法,对神经网络的泛化性能有很大的帮助。每个人都会用dropout,但你真的理解它吗?本节我们就来看看dropout里的一些关键细节问题。

dropout的概念相信大家都已熟稔在心了,是指在神经网络训练中,以一定的概率随机地丢弃一部分神经元来简化网络的一项操作。本质上来说,dropout就是在正常的神经网络基础上给每一层的每一个神经元加了一道概率流程来随机丢弃某些神经元以达到防止过拟合的目的。

在keras中,dropout的实现只需要一行代码:

from keras.layers import Dropout
x = Dropout(0.5)(x)

但作为深度学习从业人员的你,在使用keras敲下这样一行代码时,你需要心里对其实现细节无比清晰才对。我们先来看一下包含dropout的神经网络训练过程,主要是前向传播和反向传播。先来看包含dropout的前向传播过程。假设标准神经网络前向传播过程的数学描述为:

使用一个参数为p的服从Bernoulli二项分布的随机变量r,将这个随机变量加入到标准神经网络输入中,那么带有dropout的神经网络可以描述为:

这样的数学描述简洁明了,好像也没什么特别注意的细节。我们以一层全连接网络为例来看dropout的具体实现过程。

D1 = np.random.rand(A1.shape[0], A1.shape[1])
D1 = D1 < prob
A1 = np.multiply(D1, A1)
A1 = A1 / prob

其中A1为上一层的输出,D1为用随机数生成的一组dropout向量,然后将其与保留概率prob做比较得到一个布尔向量,再将其与A1做乘积即可得到失活后的A1,按理说dropout到这里应该也就完成了,但最后还有一个将A1除以保留概率的操作。所以这里有个疑问,为什么在dropout之后还要做个rescale的除法?

其实,这种实现dropout的方法也叫Inverted Dropout,是一种经典的dropout实现方法。先不说Inverted Dropout,我们来看正常dropout应该是怎样的:当我们使用了dropout后,在模型训练阶段只有占比为p部分的神经元参与了训练,那么在预测阶段得到的结果会比实际平均要大1/p,所以在测试阶段我们需要将输出结果乘以p来保持输出规模不变。这种原始的dropout实现方式也叫Vanilla Dropout。Vanilla操作有一个重大缺陷,那就是预测过程需要根据训练阶段所使用的dropout策略做调整,比较麻烦,所以一般情况下都不会使用这种方法。

既如此,相必大家也知道了,我们目前用的都是Inverted Dropout方法,为了能够在神经网络训练完成后安安心心的做预测,我们可以把全部心思都放在训练阶段,所有的设置都在训练阶段完成。所以为了保证神经网络在丢弃掉一些神经元之后总体信号强度不变和预测结果稳定,也有一种说法叫保证Bernoulli二项分布的数学期望不变,我们在Inverted Dropout方法中对dropout之后的做了除以p的rescale操作。

反向传播时同理,梯度计算时需要除以保留概率:

dA1 = np.multiply(dA1, D1)
dA1 = dA1 / prob

这就是dropout最关键的一个细节问题,一般在深度学习岗位面试时面试官喜欢追着问其中的细节。值得注意一下。

另一个细节问题在于dropout有一种类似集成学习的boosting思想在里面。神经网络以1-p的概率丢弃某些神经元,当进行多次训练时,因为随机性每次训练的都是不同的网络,dropout使得神经网络不依赖于某些独立的特征,最后的结果也就是几次训练之后的平均结果,这些都使得神经网络具备更好的泛化性能,也正是dropout能够防止过拟合的主要原因。

dropout作为一项主流的神经网络训练trick,大家在使用时要知其然,更要知其所以然。

02. BatchNormalization

深度神经网络一直以来就有一个特点:随着网络加深,模型会越来越难以训练。所以深度学习有一个非常本质性的问题:为什么随着网络加深,训练会越来越困难?为了解决这个问题,学界业界也一直在尝试各种方法。

sigmoid作为激活函数一个最大的问题会引起梯度消失现象,这使得神经网络难以更新权重。使用ReLu激活函数可以有效的缓解这一问题。

对神经网络使用正则化方法也能对这个问题有所帮助,使用dropout来对神经网络进行简化,可以有效缓解神经网络的过拟合问题,对于深度网络的训练也有一定的帮助。ResNet使用残差块和skip connection来解决这个问题,使得深度加深时网络仍有较好的表现力。

BN本质上也是一种解决深度神经网络难以训练问题的方法。

机器学习的一个重要假设就是IID(Independent Identically Distributed)假设,即独立同分布假设。所谓独立同分布,就是指训练数据和测试数据是近似于同分布的,如若不然,机器学习模型就会很难有较好的泛化性能。

一个重要的观点就是深度神经网络在训练过程中每一层的输入并不满足独立同分布假设,当叠加的网络层每一层的输入分布都发生变化时,这使得神经网络训练难以收敛。这种神经网络隐藏层输入分布的不断变化的现象就叫Internal Covariate Shift(ICS)。ICS问题正是导致深度神经网络难以训练的重要原因之一。

一直在做铺垫,还没说到底什么是BN。Batch Normalization,简称BN,翻译过来就是批标准化,因为这个Normalization是建立在Mini-Batch SGD的基础之上的。BN是针对ICS问题而提出的一种解决方案。一句话来说,BN就是使得深度神经网络训练过程中每一层网络输入都保持相同分布。

既然ICS问题表明神经网络隐藏层输入分布老是不断变化,我们能否让每个隐藏层输入分布稳定下来?通常来说,数据标准化是将数据喂给机器学习模型之前一项重要的数据预处理技术,数据标准化也即将数据分布变换成均值为0,方差为1的标准正态分布,所以也叫0-1标准化。图像处理领域的数据标准化也叫白化(whiten),当然,白化方法除了0-1标准化之外,还包括极大极小标准化方法。

所以一个很关键的联想就是能否将这种白化操作推广到神经网络的每一个隐藏层?答案当然是可以的。

ICS问题导致深度神经网络训练难以收敛,隐藏层输入分布逐渐向非线性激活函数取值区间的两端靠近,比如说sigmoid函数的两端就是最大正值或者最小负值。这里说一下梯度饱和和梯度敏感的概念。当取值位于sigmoid函数的两端时,即sigmoid取值接近0或1时,梯度接近于0,这时候就位于梯度饱和区,也就是容易产生梯度消失的区域,相应的梯度敏感就是梯度计算远大于0,神经网络反向传播时每次都能使权重得到很好的更新。

当梯度逐渐向这两个区域靠近时,就会产生梯度爆炸或者梯度消失问题,这也是深度神经网络难以训练的根本原因。BN将白化操作应用到每一个隐藏层,对每个隐藏层输入分布进行标准化变换,把每层的输入分布都强行拉回到均值为0方差为1的标准正态分布。这样一来,上一层的激活输出值(即当前层的激活输入值)就会落在非线性函数对输入的梯度敏感区,远离了原先的梯度饱和区,神经网络权重易于更新,训练速度相应加快。

那么具体到实际应用时,BN操作应该放在哪里?以一个全连接网络为例:

可以看到,BN操作是对每一个隐藏层的激活输出做标准化,即BN层位于隐藏层之后。对于Mini-Batch SGD来说,一次训练包含了m个样本,具体的BN变换就是执行以下公式的过程:

这里有个问题,就是在标准化之后为什么又做了个scale and shift的变换。从作者在论文中的表述看,认为每一层都做BN之后可能会导致网络的表征能力下降,所以这里增加两个调节参数(scale和shift),对变换之后的结果进行反变换,弥补网络的表征能力。

BN不仅原理上说的通,但关键还是效果好。BN大大缓解了梯度消失问题,提升了训练速度,模型准确率也得到提升,另外BN还有轻微的正则化效果。

参考资料:

Nitish Srivastava, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever, Ruslan Salakhutdinov; 15(Jun):1929−1958, 2014.

Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.

https://www.cnblogs.com/guoyaohua/p/8724433.html

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

深度学习两大基础Tricks:Dropout和BN详解相关推荐

  1. dropout层_深度学习两大基础Tricks:Dropout和BN详解

    深度学习 Author:louwill Machine Learning Lab Dropout dropout作为目前神经网络训练的一项必备技术,自从被Hinton提出以来,几乎是进行深度学习训练时 ...

  2. 【深度学习】深度学习两大基础Tricks:Dropout和BN详解

    深度学习 Author:louwill Machine Learning Lab Dropout dropout作为目前神经网络训练的一项必备技术,自从被Hinton提出以来,几乎是进行深度学习训练时 ...

  3. 深度学习网络大杀器之Dropout(II)——将丢弃学习视为集成学习之我见

    原帖:阿里云云栖社区: https://yq.aliyun.com/articles/110002 关于dropout的分析,可以见博主的另外一篇文章: <深度学习网络大杀器之Dropout-- ...

  4. 笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解

    笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解 针对特定场景任务从模型选择.模型训练.超参优化.效果展示这四个方面进行模型开发. 一.模型选择 从任务类型出发,选择最合适的模型. ...

  5. 深度学习模型训练和关键参数调优详解

    深度学习模型训练和关键参数调优详解 一.模型选择 1.回归任务 人脸关键点检测 2.分类任务 图像分类 3.场景任务 目标检测 人像分割 文字识别 二.模型训练 1.基于高层API训练模型 加载数据集 ...

  6. 深度学习之目标检测(十一)--DETR详解

    深度学习之目标检测(十一)-- DETR详解 目录 深度学习之目标检测(十一)-- DETR详解 1. 前言 2. DETR 框架 2.1 CNN Backbone 2.2 Transformer E ...

  7. 【深度学习】扩散模型(Diffusion Model)详解

    [深度学习]扩散模型(Diffusion Model)详解 文章目录 [深度学习]扩散模型(Diffusion Model)详解 1. 介绍 2. 具体方法 2.1 扩散过程 2.2 逆扩散过程 2. ...

  8. Keras深度学习实战(22)——生成对抗网络详解与实现

    Keras深度学习实战(22)--生成对抗网络详解与实现 0. 前言 1. 生成对抗网络原理 2. 模型分析 3. 利用生成对抗网络生成手写数字图像 小结 系列链接 0. 前言 生成对抗网络 (Gen ...

  9. Keras深度学习实战(21)——神经风格迁移详解

    Keras深度学习实战(21)--神经风格迁移详解 0. 前言 1. 神经风格迁移原理 2. 模型分析 3. 使用 Keras 实现神经风格迁移 小结 系列链接 0. 前言 在 DeepDream 图 ...

最新文章

  1. redis 3.0 cluster 集群 学习之路篇 [3]
  2. 函数组:SPO1/2/3/4/5/6/8
  3. Navicat Premium 12.0.24破解
  4. 浅谈APP的分享功能,有时候社交裂变形式比内容更“重要”
  5. Docker 实战教程之从入门到提高(二)
  6. switch注意事项
  7. 如何修改ant-input的高度_如何利用好Solidworks零件及装配体的多种配置方法?
  8. 2013应届毕业生“百度”校招应聘总结
  9. 使用异步任务加载网络上的图片
  10. phpcms根据二级栏目列表写的三级栏目列表
  11. clickhouse 同步mysql_ClickHouse 常用管理命令
  12. ipv6的127位掩码如何表示_如何判断两个IP地址是否在同一个网段?什么是子网掩码?...
  13. 骑士CMSgetshell复现
  14. 循序渐进学Docker pdf
  15. 资源教程[外贸人zencart自助建站视频教程]:第四课(5)zencart更换模板
  16. 编程语言与冯诺伊曼体系结构
  17. 论文投稿指南——中国(中文EI)期刊推荐(第5期)
  18. POJ 2210 Metric Time【日期】
  19. 9*9数独问题——深度搜索算法
  20. python报考软考哪个比较好_软考考什么比较好?

热门文章

  1. 确认!语音识别大牛Daniel Povey将入职小米,曾遭霍普金斯大学解雇,怒拒Facebook
  2. 清华大学提出APDrawingGAN,人脸照片秒变艺术肖像画
  3. 开源如何占领软件世界?
  4. 打工人,从 JMM 透析 volatile 与 synchronized 原理
  5. 学 Redis ,至少要看看这篇!7000 字小结
  6. 微服务架构如何影响软件开发文化?
  7. 工作之余如何提高个人技术水平
  8. 计算机科学和PYTHON编程导论_15_概率与分布
  9. 【廖雪峰python入门笔记】list_倒序访问
  10. 拼手速抢红包!送大家现金红包!