最后更新于
最后更新于
在Batch Normalization提出之后的很多流行网络结构里, 之前常用的Dropout结构被抛弃. 如果将两种结构在同一个网络中使用, 得到的结果基本是性能的下降. 这篇论文从variance shift解释了这个问题的原因.
作者就按两种情况进行分析:
第二种是常见的Dropout和Batch Normalization结构使用方法, Dropout结构放在每一层的输出之后, BN结构放在激活函数之前. 上一层的输出在Dropout之后, 经过卷积层或全连接层之后, 经过BN结构调整分布后, 作为输入进入激活函数, 产生这一层的输出. 第一种结构是Dropout之后紧跟BN, 是为了更直观的说明这种现象.
出现Dropout和Batch Normalization不能共存的原因是因为在训练阶段和预测阶段出现了variance shift.
作者通过两种Dropout和BN的连接方式, 来说明在BN之前增加一层Dropout, 会对网络产生影响. 两种连接方式如上图.
训练时, 上一层的输出, 在进入到Batch Normalization之前, 只经过了Dropout, 对应BN的输入的方差为:
而预测阶段对应的方差为:
因此, 在预测阶段, 每一层都会出现这样的variance shift, 影响下一层的表现, 随着前向传播的加深, variance shift的现象被放大. 最后的输出因此发生变化, 导致网络的性能下降.
则训练阶段BN输入的方差为:
预测阶段BN输入的方差为:
经过一系列复杂的推导, variance shift可以表示为:
而在Wide ResNet
网络中, 网络的每一层更宽, 使用Dropout与BN是可以提升整体效果的, 也印证了这一观点.
如果一定要同时使用Dropout和Batch Normalization结构, 可以尝试:
仅在输出层之前使用, 即将Dropout放到所有的BN层之后, 因此也就不会出现训练阶段和预测阶段variance shift的问题. 一般的输出层是softmax(分类), 且没有BN结构
对Dropout进行改造, 使用variance-stable的新Dropout. 例如Gaussian Dropout, 以及Uout(一种均匀分布Dropout).
Dropout由于随机地对神经元输出进行mask, 所以相对于输入, Dropout改变了输出的分布, 包括均值和方差. 其中均值可以通过缩放进行调整, 一般在根据其keep ratio
, 在训练阶段对输出进行的放大, 或在预测阶段进行的缩小. 但在方差上带来的变化, 是难以明确表示的. 但是分析BN的输入的方差能够解释这种现象产生的原因.
以第一种连接方式切入, 假设上一层的输出维度为, 在训练时, 上一层的第个神经元在经过Dropout之后的值为:
其中, 而是Dropout的mask结果, 而乘以是常用的为了保持在训练和预测不同阶段经过Dropout后的输出均值一致的手段.
在预测时, 输出为简单的.
所以, 训练阶段BN学习到的输入的方差应当接近, 但预测阶段BN的输入与之不匹配, 因此预测阶段输入到BN中的信息产生了variance shift, 可以用一下公式衡量:
对于第二种连接方式, 作为现在网络中常见的结构, Dropout和BN之间连接着卷基层或全连接层. 假设上一层的输出是一个维的向量, 某个神经元的参数为, 那么在训练时, 这个神经元的输出为, 预测时的输出为.
其中是参数向量与维向量的夹角. 作者通过实验说明这一项大概是与是线性关系(事实上在高维空间中, 任意两条超直线大概率成垂直关系. 可以参考). variance shift最终可以记为:
而如果要使variance shift不出现, 要求. 有两种方法可以做到:
, 即不使用Dropout
, 即网络的宽度尽可能宽
Uout的形式为. 是超参数. 使用Uout对应的variance shift为:
取的值为0.01, 对应的variance shift为300/301=0.9966777.