如何改善深层神经网络

1. 概述

对于深度学习,模型训练过程中可能会遇到一些问题,按照模型的构建流程,这些问题可能出自训练阶段,也可能出自测试阶段。

  • 训练阶段的问题主要是模型可能根本就train不出来
  • 测试阶段的问题主要是过拟合的问题

对于不同的问题,我们采用不同的方法解决,这里,我们分别就训练阶段和测试阶段来看一下具体问题,及其解决方法:

(1)训练阶段:

如果训练阶段发现模型根本就train不出来,常见的问题就是梯度消失或梯度爆炸、以及模型学习过程缓慢和学习率调节的问题。对于梯度的问题,通常是使用新的激活函数来解决;对于模型学习过程缓慢和学习率调节的问题,主要考虑采用自适应学习率算法

所以,对于训练过程中遇到的问题,主要涉及以下两部分:

  • 梯度消失和梯度爆炸的原因及解决方案
  • 自适应学习率算法

本文主要介绍梯度消失和梯度爆炸的原因及解决方案,自适应学习率算法可以参考文章深度学习中的优化方法

(2)测试阶段:

测试阶段遇到的问题主要就是过拟合,本文将会介绍深度学习中解决过拟合最常用的方法:

  • 早停
  • 正则化
  • Dropout

2. 训练阶段的问题改进

深度学习训练阶段最容易出现的问题就是梯度消失和梯度爆炸,其中梯度消失出现的更多一些,而这个问题的源头就在于深度神经网络反向传播,也就是说只要模型迭代过程中使用反向传播,梯度消失和梯度爆炸就会存在。目前来说,深度学习的训练还摆脱不了反向传播算法,所以当下的解决方案都是采取一些措施改善反向传播过程中的梯度消失问题。

下面,首先介绍梯度消失和梯度爆炸发生的原因,接下来介绍这个问题的解决方案,包括以下几个部分:

  • 预训练加微调
  • 梯度剪切、权重正则(针对梯度爆炸)
  • 使用不同的激活函数
  • 使用batch norm
  • 使用残差结构

2.1 关于反向传播

首先说明一点,梯度消失和梯度爆炸的根源—–深度神经网络和反向传播

研究表明,在处理复杂任务上,深度网络比浅层网络具有更好的效果,并且深度网络的表达能力更强。因此,当下我们构建更深层的网络来处理更复杂的任务,比如CNN,RNN、LSTM等。

但是,目前训练神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,实现深度网络权值的更新优化。

采用反向传播是有一定原因的,首先,深层网络是由许多线性单元+非线性单元(激活函数)堆叠而来,单个节点的示意图如下:
如何改善深层神经网络_第1张图片
每一层的非线性单元都可以视为是一个非线性函数 g ( z ) g(z) g(z)(非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数:
y ^ = g n ( . . . ( g 3 ( g 2 ( g 1 ( x ∗ w + b ) ∗ w + b ) ∗ w + b ) ∗ w + b ) . . . ) \hat y = g_n(...(g_3(g_2(g_1(x * w + b) * w + b) * w + b) * w + b)...) y^=gn(...(g3(g2(g1(xw+b)w+b)w+b)w+b)...)
我们最终的目的是希望这个多元函数可以很好地完成输入到输出之间的映射。假设不同的输入,输出为 y ^ \hat y y^,那么,优化深度网络就是为了寻找到合适的权值,使 L o s s = L ( y ^ , y ) Loss = L(\hat y,y) Loss=L(y^,y)取得极小值点,比如最简单的损失函数:
L ( y ^ , y ) = ∣ ∣ y ^ − y ∣ ∣ 2 2 L(\hat y,y) = ||\hat y - y||^2_2 L(y^,y)=y^y22
假设损失函数的数据空间如下图所示,最优的权值就是找到下图中的最小值点。对于这种寻找最小值的问题,采用梯度下降的方法再合适不过了。
如何改善深层神经网络_第2张图片


2.2 梯度消失和梯度爆炸的原因

实际上梯度消失和梯度爆炸说的是一件事情,其中梯度消失经常出现。发生这种情况的一个原因是使用深层网络,另一个原因是使用不合适的激活函数,比如sigmoid函数。梯度爆炸一般出现在深层网络权值初始化太大的情况下。下面分析其原因:

首先,给定一个简单的深层网络如下图所示:
如何改善深层神经网络_第3张图片
图中是一个包含三个隐含层的全连接网络,假设每一层网络激活后的输出为 a i = g ( a i ) a_i = g(a_i) ai=g(ai),其中 i i i表示第 i i i层, a i a_i ai是第 i i i层的输入,也是第 i − 1 i−1 i1层的输出, g g g是激活函数,那么:
a i + 1 = g ( a i ∗ w i + 1 + b i + 1 ) a_{i+1} = g(a_i * w_{i+1} + b_{i+1}) ai+1=g(aiwi+1+bi+1)不考虑 b b b,将其记为:
a i + 1 = g ( a i ∗ w i + 1 ) (1) a_{i+1} = g(a_i * w_{i+1} ) \tag 1 ai+1=g(aiwi+1)(1)

BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,参数的更新为 w ← w + Δ w w \leftarrow w+\Delta w ww+Δw,给定学习率 α \alpha α Δ w = − α ∂ L ∂ w \Delta w=-\alpha \frac{\partial L}{\partial w} Δw=αwL

如果要更新第二个隐藏层的权值信息,根据链式求导法则,更新梯度信息:
Δ w 2 = ∂ L ∂ w 2 = ∂ L ∂ a 4 ⋅ ∂ a 4 ∂ a 3 ⋅ ∂ a 3 ∂ a 2 ⋅ ∂ a 2 ∂ w 2 (2) \Delta w_2=\frac{\partial L}{\partial w_2}=\frac{\partial L}{\partial a_4}·\frac{\partial a_4}{\partial a_3}·\frac{\partial a_3}{\partial a_2}·\frac{\partial a_2}{\partial w_2} \tag 2 Δw2=w2L=a4La3a4a2a3w2a2(2) 对(1)求导,很容易可以得出:
∂ a 2 ∂ w 2 = ∂ g ( a 1 ∗ w 2 ) ∂ ( a 1 ∗ w 2 ) ⋅ a 1 (3) \frac{\partial a_2}{\partial w_2}= \frac{\partial g(a_1*w_2)}{\partial (a_1*w_2)}·a_1 \tag 3 w2a2=(a1w2)g(a1w2)a1(3)其中 a 1 a_1 a1就是第二个隐藏层的输入;
∂ a i + 1 ∂ a i = ∂ g ∂ ( a i ∗ w i + 1 ) ⋅ w i + 1 (4) \frac{\partial a_{i+1}}{\partial a_i} = \frac{\partial g}{\partial (a_i*w_{i+1})}·w_{i+1} \tag 4 aiai+1=(aiwi+1)gwi+1(4)其中 w i + 1 w_{i+1} wi+1是第 i + 1 i+1 i+1层的权重;

所以说,将(3)式和(4)式带入(2)中,最终得到的 Δ w \Delta w Δw包括连续对激活函数进行求导

  • 如果此部分大于1,那么随着层数增多,最终求出的梯度更新将以指数形式增加,即发生梯度爆炸
  • 如果此部分小于1,那么随着层数增多,最终求出的梯度更新将以指数形式衰减,即发生了梯度消失

同时,也可以发现,最终得到的 Δ w \Delta w Δw中包括连续的 w i w_i wi。如果 w i w_i wi给定初值过大,很容易发生梯度爆炸,为了得到较小的 w i w_i wi,设置 V a r ( w i ) = 1 n Var(w_{i})=\dfrac{1}{n} Var(wi)=n1,这里称为Xavier initialization

前面说到,计算权值更新需要计算前层偏导,因此,如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了。如下图所示,左图是sigmoid函数,右边是其导数的图像:
如何改善深层神经网络_第4张图片
如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。

同理,tanh作为激活函数,如下左图所示。其数学表达式为:
t a n h ( x ) = e x − e − x e x + e − x tanh(x) = {e^x - e^{-x} \over e^x + e^{-x}} tanh(x)=ex+exexex
如何改善深层神经网络_第5张图片
tanh的导数如右图所示。可以看出,tanh比sigmoid要好一些,但是它的导数仍然是小于1的。

总的来说:从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失和梯度爆炸,其根本原因在于反向传播训练法则,属于先天不足。


下面的部分介绍梯度消失和梯度爆炸的解决方案:

2.3 预训练加微调

既然梯度问题源自深度网络和反向传播,那么一个直观的解决办法就是对深层网络逐层训练。其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。

Hinton在训练深度信念网络(Deep Belief Networks)中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。


2.4 梯度剪切、正则化(针对梯度爆炸)

梯度剪切主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这样可以防止梯度爆炸。

另外一种解决梯度爆炸的手段是采用正则化,同其他机器学习方法一样,正则化可以限制权重变得很大,增加正则化项的系数,可以一定程度上限制梯度爆炸,比较常见的是 l 1 l1 l1正则化,和 l 2 l2 l2正则化。

下面左图为 l 1 l1 l1正则化的等高线,右图为 l 2 l2 l2正则化的等高线,可以看出 l 1 l1 l1正则化更容易得到稀疏解。
如何改善深层神经网络_第6张图片


2.5 使用不同的激活函数

前面已经说明,激活函数使用sigmoid函数容易导致梯度消失。于是,我们需要对激活函数做修改,深度学习中使用最广泛的激活函数是ReLU

ReLU:

ReLU的思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失和爆炸的问题了,每层的网络都可以得到相同的更新速度,于是ReLU就这样应运而生。先看一下ReLU的数学表达式:
R e L U = m a x ( 0 , x ) ReLU = max(0, x) ReLU=max(0,x)其函数图像为:
如何改善深层神经网络_第7张图片
从上图我们可以很容易看出,ReLU函数的导数在正数部分是恒等于1的,因此在深层网络中使用ReLU激活函数就不会导致梯度消失和爆炸的问题。

对于下图所示的神经网络模型,经前向传播,对应节点的值如下图所示:
如何改善深层神经网络_第8张图片
上图中输入值为0的节点不再向下传播,去掉这些节点,得到如下更窄的线性网络,而且不会出现梯度消失。
如何改善深层神经网络_第9张图片
ReLU函数具有很多优点:

  • 解决了梯度消失和梯度爆炸的问题;
  • 计算方便,计算速度快;
  • 加速了网络的训练;

同时,ReLU函数仍旧具有一些缺点:

  • 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决);
  • 输出不是以0为中心的;

尽管relu也有缺点,但仍然是目前使用最多的激活函数。

leak ReLU:

leak ReLU就是为了解决ReLU的0区间带来的影响,其数学表达式为:
l e a k r e l u = m a x ( α ∗ x , x ) leakrelu=max(\alpha*x,x) leakrelu=max(αx,x)
其中 α \alpha α是leak系数,一般选择0.01或者0.02,或者通过学习而来。
如何改善深层神经网络_第10张图片
leakrelu解决了0区间带来的影响,而且包含了relu的所有优点。

eLU:

eLU激活函数也是为了解决ReLU的0区间带来的影响,其数学表达式为:
l e a k r e l u = m a x ( α ∗ ( e x + 1 ) , x ) leakrelu=max(\alpha*(e^x + 1),x) leakrelu=max(α(ex+1),x)

其函数及其导数的数学形式为:
如何改善深层神经网络_第11张图片
虽然eLU可以解决0区间的问题,但是,相对于leak ReLU来说,计算要更耗时间一些。

Maxout:
Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样,我们可以把maxout 看成是网络的激活函数层。

首先,我们要先知道什么是maxout。假设网络某一层的输入特征向量为: X = ( x 1 , x 2 , … … x d ) X=(x1,x2,……xd) X=x1,x2,xd,也就是说我们的输入有d个神经元。Maxout隐藏层每个神经元的计算公式如下:
h i ( x ) = max ⁡ j ∈ [ 1 , k ] z i j h_i(x) = \max_{j \in [1, k]}z_{ij} hi(x)=j[1,k]maxzij
上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:
z i j = x T W i j + b i j z_{ij} = x^TW_{ij} + b_{ij} zij=xTWij+bij
权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,那么这个时候,网络就类似于普通的MLP网络。

我们可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们不怎么干了,我们在这一层同时训练n组参数,然后选择激活值最大的作为下一层神经元的激活值。下面还是用一个例子进行讲解,比较容易搞懂。

为了简单起见,假设我们网络第i层有2个神经元x1、x2,第i+1层的神经元个数为1个,如下图所示:
在这里插入图片描述
(1) MLP方法

我们要计算第i+1层,那个神经元的激活值的时候,传统的MLP计算公式就是:

z = W ∗ X + b z=W*X+b z=WX+b

o u t = f ( z ) out=f(z) out=f(z)

其中f就是我们所谓的激活函数,比如Sigmod、Relu、Tanh等。

(2) Maxout 方法

如果我们设置maxout的参数k=5,maxout层就如下所示:
在这里插入图片描述
相当于在每个输出神经元前面又多了一层。这一层有5个神经元,这5个神经元组成一个group,此时maxout网络的输出计算公式为:

z 1 = w 1 ∗ x + b 1 z1=w1*x+b1 z1=w1x+b1

z 2 = w 2 ∗ x + b 2 z2=w2*x+b2 z2=w2x+b2

z 3 = w 3 ∗ x + b 3 z3=w3*x+b3 z3=w3x+b3

z 4 = w 4 ∗ x + b 4 z4=w4*x+b4 z4=w4x+b4

z 5 = w 5 ∗ x + b 5 z5=w5*x+b5 z5=w5x+b5

o u t = m a x ( z 1 , z 2 , z 3 , z 4 , z 5 ) out=max(z1,z2,z3,z4,z5) out=max(z1,z2,z3,z4,z5)

所以这就是为什么采用maxout的时候,参数个数成k倍增加的原因。本来我们只需要一组参数就够了,采用maxout后,就需要有k组参数。

下面看一个完整的深度网络,如果k=2,Maxout的结构如下图所示:
如何改善深层神经网络_第12张图片

虽然Maxout的参数比较多,但是它是可学习的激活函数,表达能力更强,其中ReLU是Maxout的特殊情况。

  • Maxout网络中的激活函数可以产生任何分段线性凸函数;
  • 分段个数取决于一个group中包括多少节点。
    如何改善深层神经网络_第13张图片

2.6 使用batch norm

Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。

在反向传播中,经过每一层的梯度会乘以该层的权重,举个简单例子:

正向传播中 a i + 1 = g ( a i ∗ w i + 1 + b i + 1 ) a_{i+1} = g(a_i * w_{i+1} + b_{i+1}) ai+1=g(aiwi+1+bi+1),那么反向传播中, ∂ a i + 1 ∂ a i = ∂ g ∂ ( a i ∗ w i + 1 ) ⋅ w i + 1 \frac{\partial a_{i+1}}{\partial a_i} = \frac{\partial g}{\partial (a_i*w_{i+1})}·w_{i+1} aiai+1=(aiwi+1)gwi+1,反向传播式子中有 w w w的存在,所以 w w w的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了 w w w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。


2.7 使用残差结构

对于深度学习的网络结构,理论上网络越深,模型拟合的效果应该越好,但是实验发现深度网络会出现退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。而且这并不是过拟合问题,因为网络的训练误差比较高。

残差网络的提出,相较于之前的几层,几十层的深度网络,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分。

残差网络:

对于一个堆积层结构(几层堆积而成)当输入为 x 时其学习到的特征记为 H ( x ) H(x) H(x),现在我们希望其可以学习到残差 F ( x ) = H ( x ) − x F(x)=H(x)-x F(x)=H(x)x,这样其实原始的学习特征是 F ( x ) + x F(x)+x F(x)+x。之所以这样是因为残差学习相比原始特征直接学习更容易。当残差为0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。残差学习的结构如下图所示。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。
如何改善深层神经网络_第14张图片
为什么残差学习相对更容易,从直观上看残差学习需要学习的内容少,因为残差一般会比较小,学习难度小点。不过我们可以从数学的角度来分析这个问题,首先残差单元可以表示为:
y l = h ( x l ) + F ( x l , W l ) x l + 1 = f ( y l ) \begin{aligned} & {{y}_{l}}=h({{x}_{l}})+F({{x}_{l}},{{W}_{l}}) \\ & {{x}_{l+1}}=f({{y}_{l}}) \end{aligned} yl=h(xl)+F(xl,Wl)xl+1=f(yl)
其中 x_{l} 和 x_{l+1} 分别表示的是第 l 个残差单元的输入和输出,注意每个残差单元一般包含多层结构。 F 是残差函数,表示学习到的残差,而 h(x_{l})=x_{l} 表示恒等映射, f 是ReLU激活函数。基于上式,我们求得从浅层 l 到深层 L 的学习特征为:
x L = x l + ∑ i = l L − 1 F ( x i , W i ) {{x}_{L}}={{x}_{l}}+\sum\limits_{i=l}^{L-1}{F({{x}_{i}}},{{W}_{i}}) xL=xl+i=lL1F(xi,Wi)
利用链式规则,可以求得反向过程的梯度:
∂ l o s s ∂ x l = ∂ l o s s ∂ x L ⋅ ∂ x L ∂ x l = ∂ l o s s ∂ x L ⋅ ( 1 + ∂ ∂ x l ∑ i = l L − 1 F ( x i , W i ) ) \frac{\partial loss}{\partial {{x}_{l}}}=\frac{\partial loss}{\partial {{x}_{L}}}\cdot \frac{\partial {{x}_{L}}}{\partial {{x}_{l}}}=\frac{\partial loss}{\partial {{x}_{L}}}\cdot \left( 1+\frac{\partial }{\partial {{x}_{l}}}\sum\limits_{i=l}^{L-1}{F({{x}_{i}},{{W}_{i}})} \right) xlloss=xLlossxlxL=xLloss(1+xli=lL1F(xi,Wi))
式子的第一个因子 ∂ l o s s ∂ x L \frac{\partial loss}{\partial {{x}_{L}}} xLloss表示的损失函数到达 L 的梯度,小括号中的1表明短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。要注意上面的推导并不是严格的证明。


3. 测试阶段的问题改进

测试阶段遇到的问题主要就是过拟合,其中机器学习中经常用来处理过拟合的方法就是早停和正则化(L1、L2),这里制作简要说明,不再赘述,主要介绍一下Dropout。

3.1 早停

当验证集上效果变差的时候提前终止训练。
如何改善深层神经网络_第15张图片

3.2 正则化

正则化是机器学习中显式的控制模型复杂度来避免模型过拟合、确保泛化能力的一种有效方式,包括L1正则化和L2正则化。

L1正则化和L2正则化 和【通俗易懂】机器学习中 L1 和 L2 正则化的直观解释这两篇文章分别从实际意义和数学推导两个角度做了讲解,感兴趣可以看一下。

3.3 Dropout

下面从ensemble的观点来解释Dropout:

深度网络的学习存在两个缺点:

  • 费时
  • 容易过拟合

过拟合是很多机器学习的通病,过拟合了,得到的模型基本就废了。而为了解决过拟合问题,一般会采用ensemble方法,即训练多个模型做组合,此时,费时就成为一个大问题,不仅训练起来费时,测试起来多个模型也很费时。总之,几乎形成了一个死锁。

Dropout的出现很好的可以解决这个问题,每次做完dropout,相当于从原始的网络中找到一个更瘦的网络,如下图所示:

如何改善深层神经网络_第16张图片
因而,对于一个有N个节点的神经网络,有了dropout后,就可以看做是 2 n 2^n 2n个模型的集合了,但此时要训练的参数数目却是不变的,这就解脱了费时的问题。如下所示是Ensemble的例子:
如何改善深层神经网络_第17张图片

注:

  • 每一次mini-batch都训练了一个网络;
  • 网络中的参数是共享的;

虽然直观上看dropout是ensemble在分类性能上的一个近似,然而实际中,dropout毕竟还是在一个神经网络上进行的,只训练出了一套模型参数。那么他到底是因何而有效呢?这就要从动机上进行分析了。下面是参考文献[4]中所做的类比:

在自然界中,在中大型动物中,一般是有性繁殖,有性繁殖是指后代的基因从父母两方各继承一半。但是从直观上看,似乎无性繁殖更加合理,因为无性繁殖可以保留大段大段的优秀基因。而有性繁殖则将基因随机拆了又拆,破坏了大段基因的联合适应性。
   \;
但是自然选择中毕竟没有选择无性繁殖,而选择了有性繁殖,须知物竞天择,适者生存。我们先做一个假设,那就是基因的力量在于混合的能力而非单个基因的能力。不管是有性繁殖还是无性繁殖都得遵循这个假设。为了证明有性繁殖的强大,我们先看一个概率学小知识。
   \;
比如要搞一次恐怖袭击,两种方式:

  • 集中50人,让这50个人密切精准分工,搞一次大爆破。
  • 将50人分成10组,每组5人,分头行事,去随便什么地方搞点动作,成功一次就算。

   \;
哪一个成功的概率比较大? 显然是后者。因为将一个大团队作战变成了游击战。
   \;
那么,类比过来,有性繁殖的方式不仅仅可以将优秀的基因传下来,还可以降低基因之间的联合适应性,使得复杂的大段大段基因联合适应性变成比较小的一个一个小段基因的联合适应性。
   \;
dropout也能达到同样的效果,它强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,达到好的效果。消除减弱了神经元节点间的联合适应性,增强了泛化能力。
   \;
个人补充一点:那就是植物和微生物大多采用无性繁殖,因为他们的生存环境的变化很小,因而不需要太强的适应新环境的能力,所以保留大段大段优秀的基因适应当前环境就足够了。而高等动物却不一样,要准备随时适应新的环境,因而将基因之间的联合适应性变成一个一个小的,更能提高生存的概率。

为了达到ensemble的特性,有了dropout后,神经网络的训练和预测就会发生一些变化。

  • 训练层面

无可避免的,训练网络的每个单元要添加一道概率流程。
如何改善深层神经网络_第18张图片
对应的公式变化如下如下:

  • 没有dropout的神经网络
    在这里插入图片描述
  • 有dropout的神经网络
    如何改善深层神经网络_第19张图片
  • 测试层面

预测的时候,每一个单元的参数都要预乘以p。
如何改善深层神经网络_第20张图片

注:神经网络Dropout层中,为什么dropout后还需要进行rescale ?
   \;
这被称为inverted dropout。当模型使用了dropout layer,训练的时候只有占比为 p p p 的隐藏层单元参与训练,那么在预测的时候,如果所有的隐藏层单元都需要参与进来,则得到的结果相比训练时平均要大 1 p 1 \over p p1,为了避免这种情况,就需要测试的时候将输出结果乘以 p p p 使下一层的输入规模保持不变。
   \;
而利用inverted dropout,我们可以在训练的时候直接将dropout后留下的权重扩大 p p p 倍,这样就可以使结果的scale保持不变,而在预测的时候也不用做额外的操作了,更方便一些。


参考文献:
[1] 详解机器学习中的梯度消失、爆炸原因及其解决方法
[2] 深度学习(二十三)Maxout网络学习
[3] 你必须要知道CNN模型:ResNet
[4] 理解dropout
[5] 神经网络Dropout层中为什么dropout后还需要进行rescale?

你可能感兴趣的:(深度学习)