过拟合现象
在深度学习中,经常会出现过拟合的现象,过拟合是指为了得到一致假设而使假设变得过度严格。过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低,也就是说算法模型存在高方差的问题。
如图所示,我们的训练集中有两类样本,分别为蓝色样本和红色样本,我们的任务是使用深度学习的方式来训练出一条决策边界来区别开这两类样本,这里我们训练出了两条决策边界,分别为黑色决策边界和绿色决策边界。
尽管我们看起来绿色的分类边界很好的区分开了蓝色的样本和红色的样本,但是它却不是一个很好的决策边界,因为这样的决策边界不能很好的泛化,这种情况称为过拟合现象,反之图中黑色的曲线虽然误分了部分蓝色样本和红色样本,但是它却能很好的泛化,我们需要找到的就是这样的模型。
解决过拟合问题的方式
那么当我们的神经网络是绿色边界的情况时候,我们如何才能将我们的深度神经网络的决策边界改变为黑色的呢?要想达到这个目的我们主要有两种方式:
方式一:我们可以尝试增加大量的数据给我们的深度神经网络,但是现实情况是我们可能无法获得足够多的相关数据,所以这种方式有时候不能使用。
方式二:正则化技术,使用正则化技术可以在不增加训练数据的情况下解决过拟合问题,常用的正则化技术有L1正则化、L2正则化、dropout正则化。
dropout正则化
在深度学习网络中,我们经常使用L2正则化技术和dropout正则化技术,我们以dropout正则化技术为例来讲解为什么它能帮助神经网络解决过拟合的问题。我们来看一下什么是dropout正则化技术:
dropout的原理很简单:在一次训练时的迭代中(一个样本或者一批样本),对每一层中的神经元,假设该层神经网络神经元个数为N个,将其以概率P随机剔除,用余下的(1-P)×N个神经元所构成的网络来训练本次迭代中的样本。
假如我们现在有一个如上图所示的全连接神经网络,然后下面我们使用dropout正则化的方式来处理神经网络,这样神经网络中的一些神经元就会被暂时消除,我们的神经网络就会变得很简单,然后我们就用这样简单的神经网络来训练我们当前的样本。
因为我们知道过拟合的关键原因是神经网络参数过多导致数据无法满足训练要求,而正则化之后很多神经元被暂时消去,这样过拟合问题就可以得到了缓解,这就是dropout正则化技术的解决过拟合问题的关键所在。
dropout具体工作流程
首先我们为每一层设定一个阈值p(每层可以根据参数矩阵的复杂程度设置不一样),这个p表示有多大的概率该层的神经元得以保存,那么1-p就是该层神经元被消掉的概率。
按照这个概率p,首先随机删掉网络中的隐藏神经元,输入输出神经元不受概率影响,然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本(也可以一个样本对应一个删减后的神经元)执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数。
这只是完成了一个批量样本的前向传播和反向传播,然后其它批量的样本还要继续重复执行这个过程,在执行这个过程之前,恢复刚刚被删掉的神经元,此时被删除的神经元保持原样,而没有被删除的神经元的权重参数已经更新过了。
然后我们在按照每一层设置的p概率随机删掉神经网络中的结点,需要注意的是有些神经元已经有了权重参数的更新,我们要备份被删除神经元的参数。
然后对一小批新的训练样本,先前向传播然后反向传播,并根据随机梯度下降法更新参数,没有被删除的那一部分在这一过程中参数得到更新,而删除的神经元参数因为我们进行了备份操作,所以恢复被删除前的结果(有的神经元被训练过,有的神经元没有被训练过)。
重复进行这个过程,直到所有的批量的样本得到训练。
Dropout在神经网络中的使用
我们已经了解了Dropout具体工作流程,我们再来看一下它在神经网络中的使用,在训练阶段如果没有dropout正则化的话,我们的前向传播算法为:
如果使用dropout正则化,那么此时神经网络的前向传播算法为:
其中bernoulli§就表示神经网络第l层中神经元以概率p停止工作,具体实现让其乘以前一层的输入y,这样输入y中就会有p比例的神经元为0,就从数学的层面上实现了神经元的暂时消除,然后再进行前向传播,此时的l层神经元可不是全部的神经元,而是1-p比例的神经元。
我们对神经元进行暂时的消除之后,神经元的y(l+1)的期望值相等于被消除为p比例,为了不影响y(l+1)的期望值,我们需要用y(l)/p,它将会修正或弥补我们神经网络消除的那部分p,如果我们不用y(l)/p,那么在测试的时候,就需要对权重进行缩放,操作如下。
Dropout的代码表示
以神经网络的第三层为例,其中keep-prop表示概率p,1-p表示被该层神经元被消亡的概率,d3就相当的于前面的bernoulli§
d3 = np.random.rand(a3.shape[0],a3.shape[1])<keep-proba3 =np.multiply(a3,d3)a3/=keep-prop4= 43 + 4da
我们对a3进行了除以p(keep-prop)操作,这样再测试的时候,就不用对权重参数进行缩放了。