《理解dropout》分享

引言:相信有接触过深度学习的同学应该知道dropout可以用来解决过拟合问题,但为什么dropout能解决过拟合,它的的原理具体是什么?它有什么经验值或者它可能有什么缺点?这次分享也希望能回答这些问题。

什么是Dropout?

为了应对神经网络很容易过拟合的问题,2014年 Hinton 提出了一个神器:

Dropout: A Simple Way to Prevent Neural Networks from Overfitting.(防止神经网络过拟合的一种简单方法。) 原始论文:http://jmlr.org/papers/v15/srivastava14a.html

定义就是这么简单,就是用来防止神经网络过拟合问题。

那么这里引出一个更重要的问题是,什么是过拟合

什么是过拟合?

定义:过拟合就是训练出来的模型在训练集上表现很好,但是在测试集上表现较差的一种现象。

这里先普及下训练模型关于数据集的划分,一般情况我们都会将数据集划分为以下:

  • 训练集(顾名思义,用来训练的)
  • 验证集(训练过程中去验证模型效果的)
  • 测试集(用来评测模型最终效果的数据集)

这样我们比较清楚过拟合在不同数据集会有什么样的表现。说白了,就是模型在训练集学习到的东西,不能很好的泛化到测试集,造成这样的原因有很多,稍后继续讲。

可能上面的定义对没有怎么接触过深度学习的同学可能还不够直观,我举个通俗一点的例子:

训练的情况:比如你去学车,在训练场上你熟练记得倒车入库还有侧方位停车的口诀,每次都能倒进去,因为你已经很熟悉这个环境了,这个是训练的时候的情况,自我感觉良好 测试的情况:但真正上考场的时候,妈蛋,发现情况跟自己想得完全不一样,换了车和场地之后就不知道怎么开了,起步直接挂掉,这个就是考试的情况,完全不符合预期,这就是过拟合

或者看图更好理解:

左边:欠拟合,完全没有学会东西。 中间:刚刚好拟合,更符合我们对模型的预期。 右边:过拟合,过度拟合训练集的数据了。

ok,关于模型过拟合的定义,我们应该比较清楚了。

那么产出过拟合的原因有哪些?

  1. 数据有噪声
  2. 训练数据不足,有限的训练数据
  3. 训练模型过度导致模型非常复杂

总的一句话:模型开始胡思乱想了

那问题来了:怎么避免过拟合?

如何避免过拟合?

直接上结论:

  1. early stopping
  2. 扩增数据集
  3. 控制模型参数大小(正则化:L1、L2)
  4. dropout正则化

early stopping

大致意思就是在模型对训练数据集迭代收敛之前停止迭代防止过拟合。

上图更好解释:

可以看到模型的error是随着训练时间是呈曲线下降的,也就是说,这里包括train error和cross validation error,如果它在训练过程中在某个最低点之后cross validation error开始上升,说明模型可能存在过拟合了。

一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。

扩增数据集

有时候往往拥有更多的数据胜过一个好的模型。

  1. 从数据源头采集更多数据
  2. 复制原有的数据并加上随机噪声
  3. 重采样
  4. 根据当前数据集估计数据分布参数,使用该分布产生更多的数据等

正则化

即在对模型的目标函数或者代价函数加上正则项。

一般我们会采用L1、L2正则项,引用莫凡python的一张图:

其中L1范数是指向量中各个元素绝对值之和。L2范数是指向量各平方和然后求平方根。

关于更多L1、L2的详细介绍可以参考:L1、L2正则化

dropout

dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。

ok,以上就是避免过拟合的一些方法,下面我们正式讲下dropout是如何防止过拟合问题的。

Dropout是如何防止过拟合的?

在理解为什么Dropout对过拟合为什么有效之前,我们先看下Hinton大神发明Dropout这个利器的灵感和动机是什么。

Dropout的灵感:遗传和突变

我们来看一张图

左边这张是没有用dropout的神经网络,右边这张是使用了dropout的神经网络。大家一眼应该就能看出它们之间的区别,明显左边的网络是比较复杂的,右边它似乎删除了一些神经元,让整个网络变得更小。

无性繁殖vs有性繁殖

在Hinton大神论文中做了这样的类比,无dropout的网络和经过dropout的网络可以类比成无性繁殖有性繁殖,为什么它们可以做这样的类比,我们就要从这两者之间的特点来看。

无性繁殖有以下特点:

  • 遗传单亲基因
  • 继承优秀基因,轻微突变(不变坏)

有性繁殖则是:

  • 遗传双亲独特基因
  • 组合之后,加上随机的突变(可好,可坏)

从这两者的特点来看,似乎无性繁殖会更有优势才对,因为无性生殖的物种可以基本把父辈的基因内容都保留下来,而这些基因是父辈优化好的结果,如果一直这样下去的话,应该会越来越优才对。但实际上并非如此,从进化的角度来看,有性繁殖是比无性繁殖要更高级的。因为有性繁殖它通过基因的随机组合,打破了基因组之间的co-adaptation(联合适应性),意思减少了基因组之间的依赖,这样能让它们在突变的环境下产生更好的适应性。

无dropout的网络就像无性繁殖一样,它虽然能够学习到一些东西,但它更多适用于数据固定的情况,特征也比较固定的情况,它确实是能很有效的拟合数据。但一旦出现不可预见的数据的时候,它就会变得手无足措了。 而使用dropout的网络更能符合我们的实际的场景,网络需要去突变,去进化去适应环境,这样才能更好的去适应非特定场景的情况,具有更好的泛化能力。

Dropout带来的模型变化

左边:在训练时,每个神经单元都可能以概率p去除。 右边:在测试阶段,每个神经元都是存在的,权重参数w要乘以p,成为pw。

左边我们应该比较好理解,每个神经元都有概率p参与单次神经网络的训练。而测试的时候,神经元是不会去除的,每个神经元都是存在的,权重参数w要乘以p。那么这里就产生一个问题,为什么参数w要乘以概率p

问题:怎么理解测试时权重参数w要乘以概率p?

假设总共有100个神经元,训练的时候我们加上dropout,p=0.5,那么我们就有50个神经元参与训练,那么我们每次50个神经元训练出来的模型参数w是要比直接100个神经元要小的,因为它更新的次数会更少。我们测试的时候100个神经元是都会参与计算的,这就跟训练的时候我们使用50个神经元产生差异了,如果要保证测试的时候每个神经元的关联计算不能少,只能从通过改变w来达到跟训练时一样输出,所以才会有权重参数w乘以p。

标准网络和dropout网络有什么不一样

左边是简单的模型,右边是含有dropout的模型。

l: hidden layer index (隐藏层索引) z: denote the vector of inputs into layer l(表示l层的向量输入) y: output of each layer(每一层的输出) y0: input layer(输入层) f: activation function(激活函数)

这是简单模型的输入输出的计算。

含有dropout的模型,它在input layer 乘以伯努利随机概率,如果p =0.5,那么y就有50%的概率会变成0,这样它就不会参与运算。

Dropout的效果怎么样?

这个图表示的是不同的分类架构没有使用dropout和使用dropout有分类错误有显著的下降。

tensorflow中使用dropout

RNN中使用dropout

从时刻t-1传递到时刻t,循环神经网络不会进行状态的dropout;而在同一时刻t中,不同层循环体之间会使用dropout.

这里的实线表示不使用dropout,虚线表示使用dropout。

代码片段

Dropout率该怎么选择?

  • input 的dropout概率推荐是0.8(添加噪声)
  • hidden layer 推荐是0.5(随机生成的网络结构最多)

Dropout有什么缺点?

缺点就是会明显增加训练时间,因为引入dropout之后相当于每次只是训练的原先网络的一个子网络,为了达到同样的精度需要的训练次数会增多。 dropout的缺点就在于训练时间是没有dropout网络的2-3倍

参考文献

  • https://blog.csdn.net/stdcoutzyx/article/details/49022443
  • https://www.bilibili.com/video/av20628794/?p=9
  • https://blog.csdn.net/heyongluoyao8/article/details/49429629
  • https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-02-dropout/
  • https://blog.csdn.net/heyongluoyao8/article/details/49429629

原文发布于微信公众号 - 小巫技术博客(wwjblog)

原文发表时间:2018-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏计算机视觉战队

什么促使了候选目标的有效检测?

首先,把之前推送的关于大数据问题与解决办法的内容上传给大家,供大家去学习去挖掘有用的知识。 网址:http://pan.baidu.com/s/1nvwoQ0p...

2959
来自专栏人工智能头条

机器学习的“小无相功”:高斯过程回归的深度科普

1833
来自专栏AI研习社

计算机视觉中,有哪些比较好的目标跟踪算法?(下)

相信很多来这里的人和我第一次到这里一样,都是想找一种比较好的目标跟踪算法,或者想对目标跟踪这个领域有比较深入的了解,虽然这个问题是经典目标跟踪算法,但事实上,可...

8286
来自专栏专知

【干货】不止准确率:为分类任务选择正确的机器学习度量指标(附代码实现)

【导读】本文是数据科学研究者William Koehrsen撰写的技术博文,介绍了在分类模型中需要用到的度量标准。我们知道,准确率是我们在分类任务中最常用到的度...

4127
来自专栏媒矿工厂

HDR关键技术:色调映射(二)

HDR技术近年来发展迅猛,在未来将会成为图像与视频领域的主流。如何让HDR图像与视频也能够同时兼容地在现有的SDR显示设备上显示,是非常重要的技术挑战。色调映射...

2.1K4
来自专栏Small Code

使用集成学习提升机器学习算法性能

译者注:这篇文章是对 PythonWeekly 推荐的一篇讲集成模型的文章的翻译,原文为 Ensemble Learning to Improve Machi...

3487
来自专栏专知

【明星自动大变脸,嬉笑怒骂加变性】最新StarGAN对抗生成网络实现多领域图像变换(附代码)

【导读】图像之间的风格迁移和翻译是近年来最受关注的人工智能研究方向之一,这个任务在具有趣味性的同时也是很有挑战的。相关的研究成果也层出不穷,有的甚至引起了全世界...

4749
来自专栏人工智能LeadAI

TensorFlow从0到1丨第十六篇 L2正则化对抗“过拟合”

前面的第十四篇 交叉熵损失函数——防止学习缓慢和第十五篇 重新思考神经网络初始化从学习缓慢问题入手,尝试改进神经网络的学习。本篇讨论过拟合问题,并引入与之相对的...

36412
来自专栏AI科技大本营的专栏

详解 | Dropout为何能防止过拟合?

开篇明义,dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,...

3233
来自专栏IT派

无人驾驶汽车系统入门:深度前馈网络,深度学习的正则化,交通信号识别

在前几十年,神经网络并没有受到人们的重视,直到深度学习的出现,人们利用深度学习解决了不少实际问题(即一些落地性质的商业应用),神经网络才成为学界和工业界关注的一...

762

扫码关注云+社区

领取腾讯云代金券