引言:相信有接触过深度学习的同学应该知道dropout可以用来解决过拟合问题,但为什么dropout能解决过拟合,它的的原理具体是什么?它有什么经验值或者它可能有什么缺点?这次分享也希望能回答这些问题。
什么是Dropout?
为了应对神经网络很容易过拟合的问题,2014年 提出了一个神器:
Dropout: A Simple Way to Prevent Neural Networks from Overfitting.(防止神经网络过拟合的一种简单方法。)
原始论文:http://jmlr.org/papers/v15/srivastava14a.html
定义就是这么简单,就是用来防止神经网络过拟合问题。
那么这里引出一个更重要的问题是,什么是过拟合?
什么是过拟合?
定义:过拟合就是训练出来的模型在训练集上表现很好,但是在测试集上表现较差的一种现象。
这里先普及下训练模型关于数据集的划分,一般情况我们都会将数据集划分为以下:
训练集(顾名思义,用来训练的)
验证集(训练过程中去验证模型效果的)
测试集(用来评测模型最终效果的数据集)
这样我们比较清楚过拟合在不同数据集会有什么样的表现。说白了,就是模型在训练集学习到的东西,不能很好的泛化到测试集,造成这样的原因有很多,稍后继续讲。
可能上面的定义对没有怎么接触过深度学习的同学可能还不够直观,我举个通俗一点的例子:
训练的情况:比如你去学车,在训练场上你熟练记得倒车入库还有侧方位停车的口诀,每次都能倒进去,因为你已经很熟悉这个环境了,这个是训练的时候的情况,自我感觉良好
测试的情况:但真正上考场的时候,妈蛋,发现情况跟自己想得完全不一样,换了车和场地之后就不知道怎么开了,起步直接挂掉,这个就是考试的情况,完全不符合预期,这就是过拟合。
或者看图更好理解:
左边:欠拟合,完全没有学会东西。
中间:刚刚好拟合,更符合我们对模型的预期。
右边:过拟合,过度拟合训练集的数据了。
ok,关于模型过拟合的定义,我们应该比较清楚了。
那么产出过拟合的原因有哪些?
数据有噪声
训练数据不足,有限的训练数据
训练模型过度导致模型非常复杂
总的一句话:模型开始胡思乱想了。
那问题来了:怎么避免过拟合?
如何避免过拟合?
直接上结论:
early stopping
扩增数据集
控制模型参数大小(正则化:L1、L2)
dropout正则化
early stopping
大致意思就是在模型对训练数据集迭代收敛之前停止迭代防止过拟合。
上图更好解释:
可以看到模型的error是随着训练时间是呈曲线下降的,也就是说,这里包括train error和cross validation error,如果它在训练过程中在某个最低点之后cross validation error开始上升,说明模型可能存在过拟合了。
一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。
扩增数据集
有时候往往拥有更多的数据胜过一个好的模型。
从数据源头采集更多数据
复制原有的数据并加上随机噪声
重采样
根据当前数据集估计数据分布参数,使用该分布产生更多的数据等
正则化
即在对模型的目标函数或者代价函数加上正则项。
一般我们会采用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
领取专属 10元无门槛券
私享最新 技术干货