归一化方法总结
前言
狭义的归一化指对输入特征进行归一化, 这在经典的机器学习中用的比较多,目的是为了消除不同特征量纲的差异。常用的归一化方法包括: Z-score, Min-Max scaler等等。
这里,我们主要总结深度学习中的一些归一化的技巧。深度学习中的归一化已经不仅仅局限于输入数据的归一化,而是网络各个层的归一化,因为每个层相当于一个非线性变换, 随着网络层数的加深,数据分布会发生较大变化(即internal covariate shift)。归一化实际上起到正则化的作用,能够大大促进网络的训练和收敛, 减轻了对参数处置的敏感性, 允许模型以更大的学习率进行训练。
批量归一化 BN
Batch Normalization顾名思义就是对每个min-batch samples进行归一化,
下图为一个BN变换的伪码, 其中 m m m为Batchsize的大小, x i x_{i} xi实际上就是就是第i个样本feed forward到某个层的某个神经元节点的input(也就是上一层的输出的加权和)
可以看到:
1.BN操作实在Batch维度上进行的,具体:每个Batch包含m个样本,基于这m个samples为每个feature独立计算均值和方差,然后进行类似于Z-Score的操作,最后通过trainable parameters进行伸缩和平移,目的是为了保证BN变换为恒等变换。
实际上BN操作可以看作一个独立的网络层。

下面是BN变换更加抽象的一种写法,增益参数 g i l g_{i}^{l} gil, 这里的 a i l a_{i}^{l} ail表示第l层的第i个节点的输入,它实际上就是由上一层输出 h l h_{l} hl经过Linear projection得到:


那么在网络训练和推断的过程中如何使用BN呢?
以前是每层的输入 x x x直接作为该层的Input,有了BN以后,x首先用于计算BN的输出 y y y,然后再把y作为该层Input, 这样以来,网络修改完毕 (见下图伪码2-5)。
网络修改完成后就可以再进行训练以同时优化原始模型参数和BN操作的参数( λ , β \lambda, \beta λ,β)了。
训练完成后,就可以将其用于推断了,这里的问题是: 推断时Batch=1, 如何来估计均值和方差呢?
这里使用所有mini-batches的samples来估计均值和方差,其在整个Inference的整个过程中是保持不变的,具体:
E [ x ] ← E B [ μ B ] E[x] \leftarrow E_{B}[\mu_{B}] E[x]←EB[μB]
V a r [ x ] ← m m − 1 E B [ σ B 2 ] Var[x]\leftarrow \frac{m}{m-1}E_{B}[\sigma_{B}^{2}] Var[x]←m−1mEB[σB2]
这样以来,对于测试样本 x x x, 它的normalized input可以估计为:
x ^ = x − E [ x ] V a r [ x ] + ϵ \hat{x}=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon }}


1295

被折叠的 条评论
为什么被折叠?



