参考资料:
1.Batch Normalization原理与实战
2.Internal Covariate Shift以及Batch Normalization
-
Internal Covariate Shift(ICS):
Batch Normalization 原作者对Internal Covariate Shift的定义是: 在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化.
我的理解是: 层与层之间的耦合度很高, 底层的参数微弱变化在上层被放大, 导致上层的输入数据 X ( i ) X^{(i)} X(i)的分布变化很大. -
ICS导致的问题是:
a) 上层网络需要不断适应这种分布的变化, 从而降低了学习速率
b) W和b在训练过程中逐渐变大, 从而使每一层的W*x+b较大, 陷入激活函数(如sigmoid)的梯度饱和区, 导致反向传播中底层的更新梯度(导数连乘得到)非常小, 梯度消失, 收敛速度减慢. 解决办法: 使用非饱和性激活函数, 或者让激活函数的输入分布保持在一个稳定状态来尽可能避免它们陷入梯度饱和区(Batch Normalization). -
解决方案:
a) 白化(PCA+标准化): PCA白化/ZCA白化
关于PCA和白化的解释, 参考:
1. CS231n Convolutional Neural Networks for Visual Recognition
2. 机器学习(七)白化whitening
PCA本质上就是做一个坐标变换(旋转)去除特征之间的相关性, 白化是在PCA基础上做坐标缩放得到各向同性的坐标点.
优 点 : ( 1 ) 使 得 输 入 特 征 分 布 具 有 相 同 的 均 值 与 方 差 ; ( 2 ) 去 除 了 特 征 之 间 的 相 关 性 缺 点 : ( 1 ) 白 化 过 程 计 算 成 本 太 高 ; ( 2 ) 白 化 过 程 由 于 改 变 了 网 络 每 一 层 的 分 布 , 因 而 改 变 了 网 络 层 中 本 身 数 据 的 表 达 能 力 , 造 成 底 层 信 息 丢 失 \begin{aligned} 优点: &(1) 使得输入特征分布具有相同的均值与方差;\\ &(2) 去除了特征之间的相关性\\ 缺点: &(1) 白化过程计算成本太高;\\ &(2) 白化过程由于改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力,造成底层信息丢失 \end{aligned} 优点:缺点:(1)使得输入特征分布具有相同的均值与方差;(2)去除了特征之间的相关性(1)白化过程计算成本太高;(2)白化过程由于改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力,造成底层信息丢失 b) Batch Normalization原理Z [ l ] = W [ l ] A [ l − 1 ] + b [ l ] 注 意 : 偏 置 项 b 可 以 不 添 加 或 设 为 0 , 因 为 规 范 化 会 减 去 均 值 μ = 1 m ∑ i = 1 m Z [ l ] ( i ) σ 2 = 1 m ∑ i = 1 m ( Z [ l ] ( i ) − μ ) 2 Z ~ [ l ] = γ ⋅ Z [ l ] − μ σ 2 + ϵ + β A [ l ] = g [ l ] ( Z ~ [ l ] ) \begin{aligned} &Z^{[l]} = W^{[l]}A^{[l-1]} + b^{[l]} \qquad 注意:偏置项b可以不添加或设为0, 因为规范化会减去均值\\ &\mu = \frac{1}{m} \sum_{i=1}^mZ^{[l](i)}\\ &\sigma^{2} = \frac{1}{m}\sum_{i=1}^{m}(Z^{[l](i)}-\mu)^2\\ &\tilde{Z}^{[l]} = \gamma \cdot \frac{Z^{[l]}-\mu}{\sqrt{\sigma^2 + \epsilon}} + \beta\\ &A^{[l]} = g^{[l]} (\tilde{Z}^{[l]}) \end{aligned} Z[l]=W[l]A[l−1]+b[l]注意:偏置项b可以不添加或设为0,因为规范化会减去均值μ=m1i=1∑mZ[l](i)σ2=m1i=1∑m(Z[l](i)−μ)2Z~[l]=γ⋅σ2+ϵZ[l]−μ+βA[l]=g[l](Z~[l])
BN解决了白化遇到的问题, 即用更加简化的方式来对数据进行规范化, 同时在一定程度上保证了输入数据的表达能力.C) 测试阶段如何使用BN
保留每组minibatch的 μ 和 σ \mu 和 \sigma μ和σ
μ t e s t = E μ b a t c h = m e a n ( μ b a t c h ) B N ( X t e s t ) = γ ⋅ X t e s t − μ t e s t σ t e s t 2 + ϵ + β \begin{aligned} &\mu_{test} = E_{\mu_{batch}} = mean(\mu_{batch})\\ &BN(X_{test}) = \gamma \cdot \frac{X_{test}-\mu_{test}}{\sqrt{\sigma_{test}^2 + \epsilon}} + \beta \end{aligned} μtest=Eμbatch=mean(μbatch)BN(Xtest)=γ⋅σtest2+ϵXtest−μtest+βd) Batch Normalization 的优点
(1) 调节每一层 X X X的 μ 和 σ \mu和\sigma μ和σ, 做到层之间的解耦和, 使每一层能够独立学习, 从而加速训练
(2) 经过BN操作以后,权重的缩放值会被“抹去”, 因此可以使用较大的初始权重. 网络也不再对参数微小变化敏感,因此也可以设置较大的学习率. 这能加快收敛速度
(3) 通过学习 γ 和 β \gamma和\beta γ和β, 数据分布能够在保留原始信息的基础上尽量落在激活函数非饱和区, 从而缓解梯度消失问题
(4) 每个minibatch的 μ 和 σ \mu和\sigma μ和σ 都有些微差别, 相当于引入随机噪声, 类似Dropout的原理, 起了一定程度的正则化作用.