为什么需要进行归一化?
如果将输入序列的每一维数值进行归一化,使其在一定范围之内,比如 0 0 0和 1 1 1之间,可以加快基于梯度下降的学习的收敛速度
原因:梯度下降以相同的学习率对每一维进行最小化,如果取值范围差异很大,学习就很难在各个维度上同时收敛;如果将学习率取得很小,可以避免这个问题,但是学习效率会降低。
基本思想:对前馈神经网络的每一层(除输出层外)的净输入或输入在每个批量的样本上进行归一化
作用:防止内部协变量推移,加快学习收敛速度,在一定程度上防止梯度消失或梯度爆炸
内部协变量偏移:神经网络的学习过程中,对于神经网络中间的每一层,其前面层的参数在学习中会不断改变,导致其输出也在不断改变,不利于这一层及后面层的学习,学习收敛速度会变慢。这种现象在网络的各层都会发生
如果要学习第 t t t层的参数,输入 h ( t − 1 ) h^{(t-1)} h(t−1)相对比较固定较好,但是 h ( t − 1 ) h^{(t-1)} h(t−1)依赖于 t − 1 t-1 t−1层及其前面层的参数,在学习中会动态变化,导致第 t t t层及其后面层的学习不容易收敛。
假设批量数据在当前层的净输入是 { z 1 , z 2 , ⋯ , z n } \{z_{1},z_{2},\cdots,z_{n}\} {z1,z2,⋯,zn},其中 z j z_{j} zj是第 j j j个样本的净输入, n n n为批量大小。首先计算当前层的净输入的均值和反差(无偏估计):
u = 1 n ∑ j = 1 n z j σ 2 = 1 n − 1 ∑ j = 1 n ( z j − u ) 2 u=\frac{1}{n}\sum_{j=1}^{n}z_{j}\\ \sigma^{2}=\frac{1}{n-1}\sum_{j=1}^{n}(z_{j}-u)^{2} u=n1j=1∑nzjσ2=n−11j=1∑n(zj−u)2
其中 u , σ 2 u,\sigma^{2} u,σ2分别表示均值向量和反差向量。然后对每个样本的净输入进行归一化,得到向量:
z ˉ j = z j − u σ 2 + ϵ , j = 0 , 1 , ⋯ , n \bar{z}_{j}=\frac{z_{j}-u}{\sqrt{\sigma^{2}+\epsilon}},j=0,1,\cdots,n zˉj=σ2+ϵzj−u,j=0,1,⋯,n
其中, ϵ \epsilon ϵ保证分母不为0,然后再进行仿射变换,得到向量
z ~ j = γ ⊙ z ˉ j + β \tilde{z}_{j}=\gamma \odot \bar{z}_{j}+\beta z~j=γ⊙zˉj+β
其中 γ , β \gamma,\beta γ,β是参数向量, ⊙ \odot ⊙为向量的逐元素积。 z ~ j \tilde{z}_{j} z~j为当前层的输出
假设当前层的神经元的净输入时 z = ( z 1 , z 2 , ⋯ , z m ) T z=(z_{1},z_{2},\cdots,z_{m})^{T} z=(z1,z2,⋯,zm)T,其中 z j z_{j} zj是第 j j j个神经元的净输入, m m m为神经元个数。训练时,首先计算这一层净输入的均值与反差(无偏估计):
u = 1 m ∑ j = 1 n z j σ 2 = 1 m − 1 ∑ j = 1 n ( z j − u ) 2 u=\frac{1}{m}\sum_{j=1}^{n}z_{j}\\ \sigma^{2}=\frac{1}{m-1}\sum_{j=1}^{n}(z_{j}-u)^{2} u=m1j=1∑nzjσ2=m−11j=1∑n(zj−u)2
然后对每个神经元的净输入进行归一化,得到向量:
z ˉ j = z j − u σ 2 + ϵ , j = 0 , 1 , ⋯ , n \bar{z}_{j}=\frac{z_{j}-u}{\sqrt{\sigma^{2}+\epsilon}},j=0,1,\cdots,n zˉj=σ2+ϵzj−u,j=0,1,⋯,n
其中, ϵ \epsilon ϵ保证分母不为0,然后再进行仿射变换,得到向量
z ~ j = γ ⋅ z ˉ j + β \tilde{z}_{j}=\gamma \cdot \bar{z}_{j}+\beta z~j=γ⋅zˉj+β
其中 γ , β \gamma,\beta γ,β是参数向量,在每一层都做相同的处理(每一层均有两个参数 γ , β ) \gamma,\beta) γ,β)
假设当前层的净输入矩阵如下:
X = [ x 11 x 12 ⋯ x 1 m x 21 x 22 ⋯ x 2 m ⋮ ⋮ ⋯ ⋮ x n 1 x n 2 ⋯ x n m ] = ( x 1 , x 2 , ⋯ , x n ) T X=\begin{bmatrix} x_{11} & x_{12} & \cdots&x_{1m} \\ x_{21} & x_{22} & \cdots&x_{2m}\\ \vdots & \vdots & \cdots & \vdots\\ x_{n1} & x_{n2} & \cdots&x_{nm} \end{bmatrix}=(x_{1},x_{2},\cdots,x_{n})^{T} X= x11x21⋮xn1x12x22⋮xn2⋯⋯⋯⋯x1mx2m⋮xnm =(x1,x2,⋯,xn)T
其中, x i = ( x i 1 , x i 2 , ⋯ , x i m ) T x_{i}=(x_{i1},x_{i2},\cdots,x_{im})^{T} xi=(xi1,xi2,⋯,xim)T 表示第 i i i个样本, x i j x_{ij} xij表示第 i i i个样本在第 j j j个神经网络的输入,一共含有m个神经元。