Dropout
Dropout是一种防止神经网络过拟合的技术,它是指神经网络在训练的过程中,里面的节点会以概率p失活。所以Dropout相当于同时训练了很多个子网络,最后的结果是多个模型平均的结果,增强了模型的泛化能力,因此能够解决过拟合问题。
对于Dropout层,假设其中的神经元被保留的概率是p,比较直观的实现是:对于训练过程,根据概率p生成一个与输入向量X大小相同的符合伯努利分布的向量mask(里面都是0和1),然后将X与mask相乘;对于测试过程,因为测试过程没有神经元失活,所以对于某一层,其在测试过程的输出会比在训练过程大很多,所以需要进行rescale,常见的做法就是将这一层的输出再乘以p。
为什么测试过程要把输出乘以p?
假设当前Dropout层某个神经元的输出是x,则训练过程中,此神经元的期望输出是$px + (1 - p)0$,如果要测试过程时保持与训练过程一致,那么就需要把此神经元的输出x变为px。
上述直观实现的问题在于,增大了模型测试阶段的计算时间。比较常用的实现是inverted dropout,即在训练过程中进行scale,对神经元的输出除以p,来使得训练过程和测试过程神经元的输出保持一致。
Batch Normalization
深度学习模型训练时,往往需要尝试不同的参数初始化方法、学习率等来使得模型加速收敛。模型参数变化会导致每一层的输入分布发生改变,并且随着网络层数的增加,这种变化会加剧,因此会导致模型训练变得困难。
由于网络中参数变化而引起数据分布发生变化的这一过程被称作Internal Covariate Shift。
Internal Covariate Shift带来问题主要有:上层网络需要不断调整来适应数据分布的变化,导致网络学习速率降低,同时网络的训练容易陷入梯度饱和区,减缓网络收敛速度。
白化(Whiten)是机器学习中常用的一种规范化数据分布的方法,白化能够降低特征之间的相关性,并且使得特征具有相同的方差。但是在网络的每一层都进行白化操作,计算量太大,并且由于改变了网络每一层数据的分布,因此也降低了网络每层数据的表达能力。批量归一化就是为了解决普通白化的计算量大、改变数据分布的两个问题而提出来的。
深度学习模型训练往往采取mini batch的形式,批量归一化也是基于mini batch实现的。对每个batch的数据,会进行如下变换:
反向传播的时候,梯度根据链式法则计算:
一般来说,批量归一化应用在激活函数之前;对于卷积层,如果卷积计算输出多个通道,需要分别对这些通道分别做批量归一化,且每个通道都拥有独立的参数。
批量归一化的优点:
- 使得网络中每层输入数据的分布相对稳定,加快模型训练速度;
- 使得模型对网络中的参数不再那么敏感,可以使用更大的学习率,简化调参过程,是网络学习更稳定;
- 具有一定的正则化效果,不同batch的均值与方差不同,相当于加入了一定的随机噪声。