深度学习标准化
引言
何凯明在他的论文《Rethinking ImageNet Pre-training》中不使用ImageNet预训练,直接使用参数随机初始化方式(scratch),成功地训练出目标检测任务的神经网络模型。
为什么使用Batch Normalization不能从scratch训练目标检测任务的模型?
为什么何凯明使用Group Normalization和Synchronized Batch Normalization就能训练出来?
深度网络训练的问题
总所周知,深度网络训练会遇到两个大问题:梯度消失和梯度爆炸。
假设网络没有使用非线性函数,不考虑偏置b,设每层网络层输入为 x ( k − 1 ) ∈ R n k − 1 × 1 x^{(k-1)} \in \mathbb{R}^{n_{k-1} \times 1} x(k−1)∈Rnk−1×1,参数是 W ( k ) ∈ R n k × n k − 1 W^{(k)} \in \mathbb{R}^{n_{k} \times n_{k-1}} W(k)∈Rnk×nk−1,输出为 x ( k ) ∈ R n k × 1 x^{(k)} \in \mathbb{R}^{n_{k} \times 1} x(k)∈Rnk×1,每一层网络层的操作是
x ( k ) = W ( k ) x ( k − 1 ) = W ( k ) W ( k − 1 ) x ( k − 2 ) = W ( k ) W ( k − 1 ) ⋯ W ( 1 ) x ( 0 ) \begin{aligned} x^{(k)} & = W^{(k)} x^{(k-1)} \\ & = W^{(k)} W^{(k-1)} x^{(k-2)} \\ & = W^{(k)} W^{(k-1)} \cdots W^{(1)} x^{(0)} \end{aligned} x(k)=W(k)x(k−1)=W(k)W(k−1)x(k−2)=W(k)W(k−1)⋯W(1)x(0)
梯度消失
假设 W = ( 0.5 0 0 0.5 ) W = \begin{pmatrix} 0.5 & 0 \\ 0 & 0.5 \end{pmatrix} W=(0.5000.5),即
x ( k ) = W k x ( 0 ) = ( 0. 5 k 0 0 0. 5 k ) x ( 0 ) x^{(k)} = W^k x^{(0)} = \begin{pmatrix} 0.5^k & 0 \\ 0 & 0.5^k \end{pmatrix} x^{(0)} x(k)=Wkx(0)=(0.5k000.5k)x(0)
随着k的增大,x的值越来越小,从而梯度呈指数级别下降,接近于0,这会导致梯度下降参数更新的非常缓慢,降低收敛速度。
梯度爆炸
假设 W = ( 1.5 0 0 1.5 ) W = \begin{pmatrix} 1.5 & 0 \\ 0 & 1.5 \end{pmatrix} W=(