BN
在使用神经网络训练数据,常常使用批梯度下降的优化方法。这种优化方法相比起全梯度下降方法有一个问题,就是收敛速度慢,因为每一批数据的分布与全部数据的分布存在着不一致,且每一批数据的分布是变化的,这使得神经网络需要不断根据输入分布的不同调整权重去适应不同的输入分布。然后,神经网络层与层之间的联系是复杂的,前面层输入分布的变化会影响输出分布,而输出分布又会影响后面层的输入分布进而影响后面层的输出分布,最终作用到最后一层影响网络的输出。前面层的变动如同蝴蝶效应般对网络的输出影响巨大。在使用梯度下降调整网络参数时,可以理解成是通过调整网络参数来间接调整网络每一层的分布,这种间接调整需要不断适应网络每层分布的变化,使得网络参数训练效果不好,收敛速度慢。比如我们希望将第$i$层的分布调整成均值为$\mu_i$,方差为$\sigma_i$,这并不是由第$i$层的参数决定的,而是由第$1,2,…,i$层的参数决定的,这种需要调整众多参数拟合分布的训练方式导致训练速度慢。
而网络训练速度慢还有一个原因就是梯度消失,以$sigmoid$激活函数为例,如果某一层的分布处于$sigmoid$函数的饱和区时,此时若梯度的趋势是将分布调整到$sigmoid$函数的非饱和区,显然速度是非常慢的,因为梯度值非常小。
基于以上两个原因,深度神经网络往往会出现训练速度慢的问题,而BN的出现正是为了解决这个问题。这里先介绍BN的做法,首先对每个神经元,都有$N$个输入样本,计算这$N$个样本的均值和方差:
然后对每个样本标准化,调整输入分布为均值等于0,方差等于1:
将输入分布调整为均值为$\beta$,方差为$\gamma^2$:
综上,这个神经元的输入样本为:
其中$a$是激活函数。可以看到,BN是将每一层每一个神经元的分布都调整为均值等于$\beta$,方差等于$\gamma^2$,这里$\beta$和$\gamma$是参数,是可以通过数据样本学习调整的,每个神经元都有属于自己的$\gamma$和$\beta$。那么为什么BN可以加速网络的学习速度呢。前面提到,影响网络学习速度的有两个主要原因:第一是网络层与层之间联系紧密,通过调整网络参数间接调整分布,参数的紧密联系导致这个过程很慢;第二是梯度在非线性激活函数的饱和区值很小,调整速度慢。BN可以很好地应对这两个问题,首先BN使得网络每一个神经元可以直接通过参数调整分布不再通过参数间接调整分布。因为BN的每一个神经元都会学习两个参数$\gamma$和$\beta$,这两个参数直接决定神经元的输入分布,关于该神经元的输入分布不再受到前面若干层参数的影响,解除了这种复杂的联系。其次,BN层可以通过快速调整分布来快速将输入分布调整至激活函数的非饱和区,提高学习速度。没有BN层时,若要将调整参数使分布从饱和区移向非饱和区,因为梯度很小的缘故,需要调整很长时间才可以将分布移到非饱和区。现在有了BN层,就可以直接通过调整$\gamma$和$\beta$快速将分布从饱和区移向非饱和区。以上就是BN层的原理。BN层在训练时,每个神经元会记录每一批数据的输入分布,通过每一批的输入分布估计总体的输入分布,在预测时使用估计的整体分布对输入标准化。预测时的过程如下,首先通过每一批数据估计总体的均值和方差:
其中$m$是训练时一批数据的大小,对输入进行标准化:
将输入移向该神经元的分布:
以上就是BN的预测过程,除了BN,其实还有LN,IN,GN,不过应用最广泛当属BN,LN也有一定的应用。
Dropout
Dropout是根据一定的概率将神经网络某一层的神经元关闭,假设这个概率为0.5,这意味着该层的神经元有50%的概率处于关闭状态。更一般的,假设Dropout关闭神经元的概率为$p$,则打开神经元的概率为$q=1-p$。在训练时,Dropout会依据概率$p$关闭神经元,而在预测时,为了还原神经元的期望输出,会将权重乘上$q=1-p$。更常见的做法是在训练时将权重除以$q$,在预测时权重不用做改变。Dropout能起到正则化的作用,因为Dropout本质上可以看作是训练多个共享权重的模型,一些模型使用一部分权重,另一些模型使用另一部分权重,模型与模型之间有共用的权重也有不共用的权重,在预测时使用这些模型的期望作为预测结果,这类似于bagging,可以起到减小方差,防止过拟合的正则化效果。Dropout的另一种解释是运用了奥卡姆剃刀原理,通过关闭一些神经元,降低深度神经网络参数之间联系的复杂程度,找到更简单的特征联系,从而起到正则化的效果。