神经网络中的归一化
文章目录
概述
由于样本不同特征的量纲或量纲单位不同,变化区间也处于不同数量级, 使用原始样本训练机器学习或深度学习模型,不同特征对模型的影响会不同,这也导致训练所得的模型缺乏鲁棒性。
归一化(Normalization)是一种常见的数据预处理方法,它将数据映射成 [0, 1]或者[-1, 1]之间的小数,是的模型更容易收敛到最优解。 因此,在构造机器学习或深度学习模型之前,需要将数据做归一化处理, 这不仅会加快求解的速度,还有可能提高模型的精度。
最大最小归一化
给定样本集合 X = { x i } , i = 1 , . . . , n , x m i n X=\{x_i\},i=1,...,n,x^{min} X={xi},i=1,...,n,xmin为样本的最小值, x m a x x^{max} xmax为样本的最大值。
最大最小归一化 (Max-min Normalization)将数据归一化到[0,1]之间,
计算公式如下:
x i m i n m a x = x i − x m i n x m a x − x m i n x_i^{minmax}=\frac{x_i-x^{min}}{x^{max}-x^{min}} ximinmax=xmax−xminxi−xmin
最大最小归一化可以很好地将数据归一化到[0, 1]之间,使数据具有相同的度量尺度。但是这种归一化方法容易受到离群点数据的影响,如果存在一个离群点数据的值过大或者过小,都会导致分母很大,这使得归一化后的数据失去意义。 另外,最大最小归一化后的数据值都为正数,这导致机器学习模型的参数只能同时增大或同时减小,参数的更新路线可能不是最优路线。
标准归一化
标准归一化(Standard Normalization)考虑所有样本数据,因此受离群点数据的影响要小一些,尤其在样本足够多的情况下表现比较稳定。
给定样本集合 X = { x i } , i = 1 , . . . , n , E ( X ) X=\{x_i\},i=1,...,n,E(X) X={xi},i=1,...,n,E(X)为样本均值, V a r ( X ) Var(X) Var(X)为样本方差,
标准归一化的计算公式如下:
x i s t a n d = x i − E ( X ) V a r ( X ) x_i^{stand}=\frac{x_i-E(X)}{\sqrt{Var(X)}} xistand=Var(X) xi−E(X)
其中:
E ( X ) = 1 n ∑ i = 1 n x i V a r ( X ) = 1 n ∑ i = 1 n ( x i − E ( X ) ) 2 \begin{aligned} E(X)&=\frac1n\sum_{i=1}^nx_i\\ Var(X)&=\frac1n\sum_{i=1}^n(x_i-E(X))^2 \end{aligned} E(X)Var(X)=n1i=1∑nxi=n1i=1∑n(xi−E(X))2
标准归一化的分子得到的值有正有负,可以让不同的参数朝着不同方向调 整直至到达最优解,减少迭代次数,使得更新尽可能沿着最优路径进行。 标准归一化的分母用到了方差,方差衡量的是数据的离散程度,因此可以减小离群点数据的影响。
批归一化
在神经网络装载数据时,通常将按批(Batch)输入,由于每批数据的分布并不相同,使模型训练起来比较困难。 并且在训练深层神经网络时,激活函数会改变各层数据的分布和量级,随着神经网络的加深,这种改变会越来越大,从而导致模型不够稳定、不容易收敛,甚至可能出现梯度消失的问题。 这些存在的问题可以通过批归一化(Batch Normalization,BN)来解决。
神经网络中传递的张量数据一般有四个维度,记为(𝑁, 𝐻, 𝑊, 𝐶),其中𝑁表示批大小,𝑊、𝐻分别表示特征图的宽和高,𝐶表示通道数量,𝑁, 𝐻, 𝑊, 𝐶 ∈ ℕ。 批归一化是让一个批次内的所有数据在某个通道维度上的均值为0,方差为1,即在𝑁、𝐻、𝑊维度上做归一化。这样不仅可以使数据分布一致,而且可以避免梯度消失的发生。
给定一个批大小为 N N N的样本集合 X ∈ R N × H × W × C X\in\mathbb{R}^N\times H\times W\times C X∈RN×H×W×C作为输入, E C [ X ] E_C[X] EC[X]为样本沿着通道方向计算得到的均值, V a r C [ X ] Var_C[X] VarC[X]为样本沿着通道方向计算得到的方差, ϵ \epsilon ϵ是一个很小的数,防止分母为零, γ ∈ R C \boldsymbol{\gamma}\in\mathbb{R}^C γ∈RC为可学习放缩(Scale)向量,向量元素的初始值通常设置为1, β ∈ R C \boldsymbol{\beta}\in\mathbb{R}^C β∈RC为可学习平移(Shift)向量,向量元素的初始值通常设置为0。批归一化的计算公式:
E C [ X ] = 1 N × H × W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W X n , h , w , ⋅ V a r C [ X ] = 1 N × H × W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W ( X n , h , w , ⋅ − E c [ X ] ) 2 Y n , h , w , ⋅ = X n , h , w , ⋅ − E C [ X ] V a r C [ X ] + ϵ × γ + β \begin{aligned} E_C[X]&=\frac1{N\times H\times W}\sum_{n=1}^N\sum_{h=1}^H\sum_{w=1}^W\boldsymbol{X}{n,h,w,\cdot}\\ Var_C[X]&=\frac1{N\times H\times W}\sum{n=1}^N\sum_{h=1}^H\sum_{w=1}^W(X_{n,h,w,\cdot}-E_c[X])^2\\ Y_{n,h,w,\cdot}&=\frac{X_{n,h,w,\cdot}-E_C[X]}{\sqrt{Var_C[X]+\epsilon}}\times\gamma+\beta\\ \end{aligned} EC[X]VarC[X]Yn,h,w,⋅=N×H×W1n=1∑Nh=1∑Hw=1∑WXn,h,w,⋅=N×H×W1n=1∑Nh=1∑Hw=1∑W(Xn,h,w,⋅−Ec[X])2=VarC[X]+ϵ Xn,h,w,⋅−EC[X]×γ+β
批归一化使网络中每层输入数据的分布相对稳定,减少梯度消失和梯度爆炸问题,提高模型的稳定性,也使得神经网络更快地收敛到最优解。 同时,它使模型对输入数据中的一些变化和扰动具有更好的鲁棒性,提高了模型的泛化能力。 但是批归一化受到批大小影响较大。如果批大小过小,计算的均值和方差 不足以代表整个样本数据的分布,批归一化的效果可能会下降;如果批大小过大,会超过内存容量,无法处理。 此外,批归一化并不适合所有神经网络,如循环神经网络等动态网络,使用批归一化的效果并不好。
层归一化
在自然语言处理等任务中,不同样本的长度往往是不同的,而批归一化很难满足 需求。为了解决这一问题 , 通常使用层归一化 ( Layer Normalization,LN)方法。 层归一化是指让一个数据样本在所有通道上的均值为0,方差为1,即在 𝐻、𝑊、𝐶维度上做归一化。
给定一个批大小为𝑁的样本集合 x ∈ R N × H × W × C x ∈ \mathbb{R}^{N×H×W×C} x∈RN×H×W×C作为输入, E n [ X ] E_n[X] En[X] 是沿着批方向计算得到的均值, V a r n [ X ] Var_n [X] Varn[X] 是沿着批方向计算得到的方差,ϵ是一个很小的数,防止分母为零, γ ∈ R c \gamma ∈ \mathbb R^c γ∈Rc为可学习放缩向量,向量元素的初始值通常设置为1, β ∈ R c \beta \in \mathbb R^c β∈Rc为可学习平移向量,向量元素的初始值通常设置为0。层归 一化的计算公式:
E n [ X ] = 1 H × W × C ∑ h = 1 H ∑ w = 1 W ∑ c = 1 C X ⋅ , h , w , c V a r n [ X ] = 1 H × W × C ∑ h = 1 H ∑ w = 1 W ∑ c = 1 C ( X ⋅ , h , w , c − E n [ X ] ) 2 Y ⋅ , h , w , c = X ⋅ , h , w , c − E n [ X ] V a r n [ X ] + ϵ Z ⋅ , h , w , c = Y ⋅ , h , w , c × γ + β \begin{aligned} E_{n}[\boldsymbol{X}]&=\frac{1}{H\times W\times C}\sum_{h=1}^{H}\sum_{w=1}^{W}\sum_{c=1}^{C}\boldsymbol{X}{\cdot,h,w,c}\\ Var{n}[\boldsymbol{X}]&=\frac{1}{H\times W\times C}\sum_{h=1}^{H}\sum_{w=1}^{W}\sum_{c=1}^{C}(\boldsymbol{X}{\cdot,h,w,c}-E{n}[\boldsymbol{X}])^{2}\\ \boldsymbol{Y}{\cdot,h,w,c}&=\frac{\boldsymbol{X}{\cdot,h,w,c}-E_{n}[\boldsymbol{X}]}{\sqrt{Var_{n}[X]+\epsilon}}\\ \boldsymbol{Z}{\cdot,h,w,c}&=\boldsymbol{Y}{\cdot,h,w,c}\times\boldsymbol{\gamma}+\boldsymbol{\beta} \end{aligned} En[X]Varn[X]Y⋅,h,w,cZ⋅,h,w,c=H×W×C1h=1∑Hw=1∑Wc=1∑CX⋅,h,w,c=H×W×C1h=1∑Hw=1∑Wc=1∑C(X⋅,h,w,c−En[X])2=Varn[X]+ϵ X⋅,h,w,c−En[X]=Y⋅,h,w,c×γ+β
层归一化的最大优点是不依赖于批量数据的大小,甚至可以在单个样本上应用,另外它也不需要保存批的均值和方差,节省了存储空间。此外,层归一化适用于循环神经网络。 但是,层归一化在批大小比较大时没有批归一化效果好
实例归一化
在图像风格变换任务中,生成图像的风格主要依赖于某个图像实例,因而实例归一化(Instance Normalization)提出只对H、W维度进行归一化, 即只让一个单独数据在H和W维度上求均值和方差。
给定一个批大小为 N N N的样本集合 X ∈ R N × H × W × C X\in\mathbb{R}^{N\times H\times W\times C} X∈RN×H×W×C作为输入, E n c [ X ] E_{nc}[X] Enc[X]是沿着批方向和通道方向计算得到的均值, V a r n c [ X ] Var_{nc}[X] Varnc[X]是沿着批方向和通道方向计算得到的方差, ϵ \epsilon ϵ是一个很小的数,防止分母为零, γ ∈ R C \boldsymbol{\gamma}\in\mathbb{R}^C γ∈RC为可学习放缩向量, 向量的元素初始值通常设置为1, β ∈ R C \boldsymbol{\beta}\in\mathbb{R}^C β∈RC为可学习平移向量,向量元素的初始值通常设置为0。实例归一化的计算公式:
E n c [ X ] = 1 H × W ∑ h = 1 H ∑ w = 1 W X ⋅ , h , w , ⋅ V a r n c [ X ] = 1 H × W ∑ h = 1 H ∑ w = 1 W ( X ⋅ , h , w , ⋅ − E n c [ X ] ) 2 Y ⋅ , h , w , ⋅ = X ⋅ , h , w , ⋅ − E n c [ X ] V a r n c [ X ] + ϵ Z ⋅ , h , w , ⋅ = Y ⋅ , h , w , ⋅ × γ + β \begin{aligned} E_{nc}[X]&=\frac1{H\times W}\sum_{h=1}^H\sum_{w=1}^WX_{\cdot,h,w,\cdot}\\ Var_{nc}[X]&=\frac1{H\times W}\sum_{h=1}^H\sum_{w=1}^W(X_{\cdot,h,w,\cdot}-E_{nc}[X])^2\\ Y_{\cdot,h,w,\cdot}&=\frac{X_{\cdot,h,w,\cdot}-E_{nc}[X]}{\sqrt{Var_{nc}[X]+\epsilon}}\\ Z_{\cdot,h,w,\cdot}&=Y_{\cdot,h,w,\cdot}\times\gamma+\beta \end{aligned} Enc[X]Varnc[X]Y⋅,h,w,⋅Z⋅,h,w,⋅=H×W1h=1∑Hw=1∑WX⋅,h,w,⋅=H×W1h=1∑Hw=1∑W(X⋅,h,w,⋅−Enc[X])2=Varnc[X]+ϵ X⋅,h,w,⋅−Enc[X]=Y⋅,h,w,⋅×γ+β
组归一化
组归一化(Group Normalization)用来解决当批大小较小时批归一化效果较差的问题。层归一化虽然不依赖批大小,但是在卷积神经网络中直接对当前层所有通道数据进行规一化也并不理想。 组归一化将通道方向分组,然后在每个组内做归一化,使得一个数据样本在同一组内的所有通道的均值为0,方差为1。计算步骤与批归一化一样, 但是不考虑批大小,即与批大小无关。
给定一个批大小为 N N N的样本集合 X ∈ R N × H × W × C X\in\mathbb{R}^{N\times H\times W\times C} X∈RN×H×W×C作为输入, E n g [ X ] E_{ng}[X] Eng[X]是沿着批方向在每个通道组内计算得到的均值, V a r n g [ X ] Var_{ng}[X] Varng[X]是沿着批方向在每个通道组内计算得到的方差, ϵ \epsilon ϵ是一个很小的数,防止分母为零, γ ∈ R C \boldsymbol{\gamma}\in\mathbb{R}^C γ∈RC为可学习放缩向量,向量元素的初始值通常设置为1, β ∈ R C \boldsymbol{\beta}\in\mathbb{R}^C β∈RC为可学习平移向量,向量元素的初始值通常设置为0,其中 G G G为分组数。组归一化的计算公式:
E n g [ X ] = 1 ( C / G ) H W ∑ c = g C / G + 1 ( g + 1 ) C / G ∑ h = 1 H ∑ w = 1 W X ⋅ , h , w , c V a r n g [ X ] = 1 ( C / G ) H W ∑ c = g C / G + 1 ( g + 1 ) C / G ∑ h = 1 H ∑ w = 1 W ( X ⋅ , h , w , c − E n g [ X ] ) 2 Y ⋅ , h , w , ( g C / G + 1 ) : ( g + 1 ) C / G = X ⋅ , h , w , ( g C / G + 1 ) : ( g + 1 ) C / G − E n g [ X ] V a r n g [ X ] + ϵ Z ⋅ , h , w , ( g C / G + 1 ) : ( g + 1 ) C / G = Y ⋅ , h , w , ( g C / G + 1 ) : ( g + 1 ) C / G × γ + β \begin{aligned} E_{ng}[X]&=\frac1{(C/G)HW}\sum_{c=gC/G+1}^{(g+1)C/G}\sum_{h=1}^H\sum_{w=1}^WX_{\cdot,h,w,c}\\ Var_{ng}[X]&=\frac1{(C/G)HW}\sum_{c=gC/G+1}^{(g+1)C/G}\sum_{h=1}^H\sum_{w=1}^W(X_{\cdot,h,w,c}-E_{ng}[X])^2\\ \boldsymbol{Y}{\cdot,h,w,(gC/G+1):(g+1)C/G}&=\frac{X{\cdot,h,w,(gC/G+1):(g+1)C/G}-E_{ng}[X]}{\sqrt{Var_{ng}[X]+\epsilon}}\\ Z_{\cdot,h,w,(gC/G+1):(g+1)C/G}&=Y_{\cdot,h,w,(gC/G+1):(g+1)C/G}\times\gamma+\beta \end{aligned} Eng[X]Varng[X]Y⋅,h,w,(gC/G+1):(g+1)C/GZ⋅,h,w,(gC/G+1):(g+1)C/G=(C/G)HW1c=gC/G+1∑(g+1)C/Gh=1∑Hw=1∑WX⋅,h,w,c=(C/G)HW1c=gC/G+1∑(g+1)C/Gh=1∑Hw=1∑W(X⋅,h,w,c−Eng[X])2=Varng[X]+ϵ X⋅,h,w,(gC/G+1):(g+1)C/G−Eng[X]=Y⋅,h,w,(gC/G+1):(g+1)C/G×γ+β
其中, g ∈ N , g = 0 , . . . , G − 1 g\in\mathbb{N},g=0,...,G-1 g∈N,g=0,...,G−1。可以发现,当 G G G等于1时,其等价于层归一化;当 G = C G=C G=C时,其等价于实例归一化。
权重归一化
权重归一化 (Weight Normalization) 将权值 w w w分为一个方向分量 v v v和一个范数分量 g g g,使用优化器分别优化这两个参数,如下所示:
w = g ∣ ∣ v ∣ ∣ v w=\frac g{||v||}\boldsymbol{v} w=∣∣v∣∣gv
其中 v v v是与 w w w同维度的向量, ∥ v ∥ \|v\| ∥v∥是欧式范数,因此 v v v决定了 w w w的方向。 g g g是标量,决定了 w w w的长度。由于 ∥ w ∥ = ∣ g ∣ \|w\|=|g| ∥w∥=∣g∣,因此这一权重分解的方式将权重向量的欧氏范数进行了固定,从而实现了正则化的效果。
优化方向分量:
∇ g L = ∇ w L ⋅ v ∣ ∣ v ∣ ∣ \nabla_gL=\frac{\nabla_wL\cdot v}{||v||} ∇gL=∣∣v∣∣∇wL⋅v
优化范数分量:
∇ v L = g ∣ ∣ v ∣ ∣ ∇ w L − g ∇ g L ∣ ∣ v ∣ ∣ 2 v \nabla_vL=\frac g{||v||}\nabla_wL-\frac{g\nabla_gL}{||v||^2}v ∇vL=∣∣v∣∣g∇wL−∣∣v∣∣2g∇gLv
权重归一化的归一化操作作用在了权值矩阵上,它可以带来更快的收敛速度,更强的学习率鲁棒性,能应用在循环神经网络等动态网络中。并且它与样本量无关,所以可以使用较小的批大小。但是权重归一化并没有对得到的特征范围进行约束的功能,所以对参数的初始值非常敏感。