平时训练模型的时候知道一些常见的防止过拟合的tricks,但是也只是拿来用一下,比如dropout和BN等等,基本没有了解过why层面的东西。最近看了一下dropout,batch-normalization的论文,以及DeepLearning Book里面正则化那一章,做一下小结。
Dropout
Dropout的提出者(Srivastava etc.)认为使用多个模型的平均结果是十分有效的一种正则化方法,即从不同的模型获取结果进行加权平均。但是它的缺点显而易见,一个是需要大量模型的训练(要么网络架构不同,要么数据集不同),另一个就是较高的计算复杂度(获取输出+平均操作)。Dropout的巧妙之处在于通过它可以在同一个模型上实现类似模型平均的效果。
Dropout是指训练阶段对网络的隐藏节点以一定的概率独立的在网络中丢弃的操作(见下图)。某个节点被丢弃,意味着它的输出输出一并不再存在。丢弃节点之后的网络称为瘦身网络(减少了节点数)。排列组合一下,对于节点数为$N$的网络,其可能存在的瘦身网络为$2^N$个。对于每一批输入数据,反向传播阶段仅仅是对当前采样生成的瘦身网络进行训练,因此从整个网络的训练过程来看,可以认为成是对指数级个子网络的同时训练,而这些网络是共享权值的。
如果要等效模型平均,Dropout网络的前向过程(推断)必须具有average的功能。一般的隐层节点的dropout/采样概率$\mathbf{r}_l^i$服从伯努利分布,推断过程进行如下:
在DeepLearning Book里面提到了正则化的Bagging方法(多模型结果的加权平均),Dropout可以理解为指数级别集成网络的Bagging方法。
参数正则
参数正则这里包括$L^1$(promote sparsity)和$L^2$(weight decay)正则,虽然这两个概念经常见到,但是我却在相当长的一段时间内没有去理解其背后的原理。看到DeepLearning Book就顺便和Dropout在一起总结一下了。
参数正则是指对原目标函数$J$加上一个参数相关的惩罚项$\ell$:
梯度更新变化为:
一般的正则项只针对网络中的权值(和偏置无关),系数$\alpha$控制惩罚项作用大小。$L^1$和$L^2$正则的$\ell$定义如下:
带入$\mathbf{w}’$:
根据DeepLearning Book中的表述,$L^1$正则会产生更加稀疏的解,即权值矩阵中零元素增加,而$L^2$正则不具有这种效果,它会使权重的分布更加接近于原点。
Batch Normalization
Batch-Normalization(简称BN)的提出是要解决一个叫Internal Covariate Shift的问题,如果将DNN简单理解成为若干个层级子网络的堆叠,那么网络训练的收敛可以认为是后继网络不断学习其前置网络的数据分布的过程。但是由于学习过程中参数不断变化,各个子网络的分布也会随之变化,由此带来了所谓的Internal Covariate Shift问题。BN的解决思路也比较简单,就是normalize上述层级子网络输入的均值和方差,BN的论文中认为其优势在于:
- 加速网络的收敛,即可以在较小的steps下达到相同的收敛程度(相对于没有BN层)
- 允许使用较大的学习率
- 减少对参数初始化的敏感度
- 减少Dropout的需要
之前往往只是对训练数据的分布进行归一化操作,BN相当于是将这种normalize引入了网络中成为独立的BN层,随之而来的问题就是BN层如何设计以及如何训练的问题了。
对于特征$
\mathbf{x} \in \mathbf{R}^D$,将输入网络前的归一化操作 $\widehat{\mathbf{x}} = \text{Norm}(\mathbf{x})$:
引入网络层间,$\mathbf{x}$即为每个子网络对应的输入。根据论文中的表述,$\widehat{\mathbf{x}}$和$\mathbf{x}$的表征能力并不完全相同,因而引入一个逆操作Scale and Shift,对normalized的特征进行重新表示:
其中$\gamma_d, \beta_d$是需要学习的参数。
在SGD框架中,使用一个mini-batch内的数据来预估$E[\mathbf{x}_d]$和$V[\mathbf{x}_d]$,定义batch-size为$m$,那么BN层的变换可以表示为$\text{BN}_{\gamma, \beta}(\mathbf{x}, \mathbf{y})$:
训练阶段,已知$\frac{\partial \ell}{\partial \mathbf{y}_i}$,需要计算出$\frac{\partial \ell}{\partial \gamma}, \frac{\partial \ell}{\partial \beta}, \frac{\partial \ell}{\partial \mathbf{x}_i}$(用于BP传递梯度到前一层):
在训练阶段,参数的更新是依赖当前的batch的,但是单纯的使用模型的时候,必须使得当前输入的结果仅仅依赖当前输入,因此需要解决BN变换中的均值方差估计问题。
BN层的均值方差可以通过对若干个mini-batch处理结果的平均得到:
对于输入$\mathbf{x}$,使用训练好的参数$\gamma, \beta$和估计好的均值方差,BN层的整体变换可以表示为:
参考文献
- Dropout: A Simple Way to Prevent Neural Networks from Overfitting
- Batch normalization-accelerating deep network training by reducing internal covariate shift
- DeepLearning Book