深度学习标准化
引言
何凯明在他的论文《Rethinking ImageNet Pre-training》中不使用ImageNet预训练,直接使用参数随机初始化方式(scratch),成功地训练出目标检测任务的神经网络模型。
为什么使用Batch Normalization不能从scratch训练目标检测任务的模型?
为什么何凯明使用Group Normalization和Synchronized Batch Normalization就能训练出来?
深度网络训练的问题
总所周知,深度网络训练会遇到两个大问题:梯度消失和梯度爆炸。
假设网络没有使用非线性函数,不考虑偏置b,设每层网络层输入为x(k−1)∈Rnk−1×1x^{(k-1)} \in \mathbb{R}^{n_{k-1} \times 1}x(k−1)∈Rnk−1×1,参数是W(k)∈Rnk×nk−1W^{(k)} \in \mathbb{R}^{n_{k} \times n_{k-1}}W(k)∈Rnk×nk−1,输出为x(k)∈Rnk×1x^{(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.5000.5)W = \begin{pmatrix} 0.5 & 0 \\ 0 & 0.5 \end{pmatrix}W=(0.5000.5),即
x(k)=Wkx(0)=(0.5k000.5k)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.5001.5)W = \begin{pmatrix} 1.5 & 0 \\ 0 & 1.5 \end{pmatrix}W=(1.5001.5),即
x(k)=Wkx(0)=(1.5k001.5k)x(0) x^{(k)} = W^k x^{(0)} = \begin{pmatrix} 1.5^k & 0 \\ 0 & 1.5^k \end{pmatrix} x^{(0)} x(k)