在Batch Normalization提出之后的很多流行网络结构里, 之前常用的Dropout结构被抛弃. 如果将两种结构在同一个网络中使用, 得到的结果基本是性能的下降. Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift这篇论文从variance shift解释了这个问题的原因.
作者就按两种情况进行分析:
第二种是常见的Dropout和Batch Normalization结构使用方法, Dropout结构放在每一层的输出之后, BN结构放在激活函数之前. 上一层的输出在Dropout之后, 经过卷积层或全连接层之后, 经过BN结构调整分布后, 作为输入进入激活函数, 产生这一层的输出. 第一种结构是Dropout之后紧跟BN, 是为了更直观的说明这种现象.
原因
出现Dropout和Batch Normalization不能共存的原因是因为在训练阶段和预测阶段出现了variance shift.
Dropout由于随机地对神经元输出进行mask, 所以相对于输入, Dropout改变了输出的分布, 包括均值和方差. 其中均值可以通过缩放进行调整, 一般在根据其keep ratio
p, 在训练阶段对输出进行p1的放大, 或在预测阶段进行p的缩小. 但在方差上带来的变化, 是难以明确表示的. 但是分析BN的输入的方差能够解释这种现象产生的原因.
作者通过两种Dropout和BN的连接方式, 来说明在BN之前增加一层Dropout, 会对网络产生影响. 两种连接方式如上图.
以第一种连接方式切入, 假设上一层的输出维度为d, 在训练时, 上一层的第k个神经元在经过Dropout之后的值为:
X=akp1xk,k=1…d
其中ak∼P, 而P(ak)={1−p,p,ak=0ak=1是Dropout的mask结果, 而乘以p1是常用的为了保持在训练和预测不同阶段经过Dropout后的输出均值一致的手段.
在预测时, 输出为简单的X=xk.
训练时, 上一层的输出, 在进入到Batch Normalization之前, 只经过了Dropout, 对应BN的输入的方差为:
VarTrain(X)=Var(akp1xk)=E((akp1xk)2)−E2(akp1xk)=p21E(ak2)E(xk2)−p21(E(ak)E(xk))2=p1(c2+v)−c2 而预测阶段对应的方差为:
VarTest(X)=Var(xk)=v 所以, 训练阶段BN学习到的输入的方差应当接近EB′(p1(c2+v)−c2)), 但预测阶段BN的输入与之不匹配, 因此预测阶段输入到BN中的信息产生了variance shift, 可以用一下公式衡量:
△(p)=VarTrain(X)VarTest(X)=p1(c2+v)−c2v≤1
因此, 在预测阶段, 每一层都会出现这样的variance shift, 影响下一层的表现, 随着前向传播的加深, variance shift的现象被放大. 最后的输出因此发生变化, 导致网络的性能下降.
对于第二种连接方式, 作为现在网络中常见的结构, Dropout和BN之间连接着卷基层或全连接层. 假设上一层的输出是一个d维的向量x=(x1…xd), 某个神经元的参数为w=(w1…wd), 那么在训练时, 这个神经元的输出为X=∑i=1dwiaip1xi, 预测时的输出为X=∑i=1dwixi.
则训练阶段BN输入的方差为:
VarTrain(X)=Cov(∑i=1dwiaip1xi,∑i=1dwiaip1xi)=p21∑i=1d(wi)2Var(aixi)+p21∑i=1d∑j=idρi,jaxwiwjVar(aixi)Var(ajxj)=(p1(c2+v)−c2)(∑i=1dwi2+ρax∑i=1d∑j=idwiwj) 预测阶段BN输入的方差为:
VarTest(X)=Var(∑i=1dwixi)=Cov(∑i=1dwixi,∑i=1dwixi)=∑i=1dwi2v+∑i=1d∑j=idρi,jxwiwjvv=v(∑i=1dwi2+ρx∑i=1d∑j=idwiwj) 经过一系列复杂的推导, variance shift可以表示为:
VarTrain(X)VarTest(X)=(p1(c2+v)−c2)(∑i=1dwi2+ρax∑i=1d∑j=idwiwj)v(∑i=1dwi2+ρx∑i=1d∑j=idwiwj)=(p1(c2+v)−c2)∑i=1dwi2+vρx∑i=1d∑j=idwiwjv∑i=1dwi2+vρx∑i=1d∑j=idwiwj=p1(c2+v)−c2+vρx((∑i=1dwi)2−∑i=1dwi2)/∑i=1dwi2v+vρx((∑i=1dwi)2−∑i=1dwi2)/∑i=1dwi2=p1(c2+v)−c2+vρx(d(cosθ)2−1)v+vρx(d(cosθ)2−1) 其中θ是参数向量w与d维1向量的夹角. 作者通过实验说明d(cosθ)2这一项大概是与d是线性关系(事实上在高维空间中, 任意两条超直线大概率成垂直关系. 可以参考n维空间下两个随机向量的夹角分布). variance shift最终可以记为:
而如果要使variance shift不出现, 要求△(p,d)→1. 有两种方法可以做到:
p→1, 即不使用Dropout
d→∞, 即网络的宽度尽可能宽
而在Wide ResNet
网络中, 网络的每一层更宽, 使用Dropout与BN是可以提升整体效果的, 也印证了这一观点.
解决方案
如果一定要同时使用Dropout和Batch Normalization结构, 可以尝试:
仅在输出层之前使用, 即将Dropout放到所有的BN层之后, 因此也就不会出现训练阶段和预测阶段variance shift的问题. 一般的输出层是softmax(分类), 且没有BN结构
对Dropout进行改造, 使用variance-stable的新Dropout. 例如Gaussian Dropout, 以及Uout(一种均匀分布Dropout).
Uout的形式为X=xi+xiri,ri∼U(−β,β),0≤β≤1. β是超参数. 使用Uout对应的variance shift为:
VarTrain(X)VarTest(X)=Var(xi+xiri)Var(xi)=E((xi+xiri)2)v=E(xi2)+2E(xi2)E(ri)+E(xi2)E(ri2)v=3+β23 取β的值为0.01, 对应的variance shift为300/301=0.9966777.