前言:
有时由于数据的稳定性不高,会带来梯度爆炸和梯度消失的问题。解决这样的问题有很多方式,例如让乘法变加(ResNet和LSTM的方式),归一化(比如梯度归一化),再者就是合理地初始化权重和选择激活函数。今天学了一下Xavier初始化,记录一下.
1.缘起
我们将梯度和每一层的输出都看做随机变量。
为了让模型稳定,假如我们期望的事情是让每一层的输出的期望和方差一直保持一致,也就是:
∀i,t:正向时:E[hit]=0,Var[hit]=a反向时:E[∂l∂hit]=0,Var[∂l∂hit]=b\forall i,t:\\正向时:E[h_i^t]=0,Var[h_i^t]=a\\
反向时:E[\frac{\partial l}{\partial h_i^t}]=0,Var[\frac{\partial l}{\partial h_i^t}]=b\\
∀i,t:正向时:E[hit]=0,Var[hit]=a反向时:E[∂hit∂l]=0,Var[∂hit∂l]=b
其中iii是当前层第iii个元素,ttt是层数。
感觉Batch Norm干的就是这件事情。
这样的意义是,不管网络有多深,每一层的输出和梯度统计上来看都差不多,就会比较好。
假设,我们的模型是MLP, 我们想满足上面的条件,还假设:
- wi,jt是i.i.d.w^t_{i,j}是i.i.d.wi,jt是i.i.d.,则E[wi,jt]=0,Var[wi,jt]=γtE[w^t_{i,j}]=0,Var[w^t_{i,j}]=\gamma_tE[wi,jt]=0,Var[wi,jt]=γt
- hit−1h_i^{t-1}hit−1和wi,jtw^t_{i,j}wi,jt独立,也就是第ttt层的输入和权重独立
- 假设没有activation function,没有bias.
则在第ttt层:
ht=Wtht−1,Wt∈Rnt×nt−1\bm h^t=\bm W^t \bm h^{t-1},\quad \bm W^t\in \textbf{R}^{n^t\times n^{t-1}}ht=Wtht−1,Wt∈Rnt×nt−1
其中nt,nt−1n^t,n^{t-1}nt,nt−1是本层输出和输入的维数。
考察第iii个输出:
E[hit]=E[∑jwi,jthjt−1]=(均值的线性性,w和h独立)∑jE[wi,jt]E[hjt−1]=0E[h_i^t]=E[\sum_j w^t_{i,j}h^{t-1}_j]\\
=(均值的线性性,w和h独立)\sum_jE[w^t_{i,j}]E[h^{t-1}_j]=0E[hit]=E[j∑wi,jthjt−1]=(均值的线性性,w和h独立)j∑E[wi,jt]E[hjt−1]=0
Var[hit]=E[(hit)2]−E2[hit]=E[(hit)2]=E[(∑jwi,jthjt−1)2]=E[∑j(wi,jthjt−1)2+∑j≠kwi,jtwi,kthjt−1hkt−1]=(wi,j是iid,协方差为0,w和h独立)∑jE[(wi,jt)2]E[(hjt−1)2]=(均值为0)∑jVar[wi,j]Var[hjt−1]=(w方差是γt,t−1层维数为nt−1)nt−1γtVar[hjt−1]Var[h_i^t]=E[(h_i^t)^2]-E^2[h_i^t]=E[(h_i^t)^2]\\ =E[(\sum_j w^t_{i,j}h^{t-1}_j)^2]\\ =E[\sum_j( w^t_{i,j}h^{t-1}_j)^2+\sum_{j\ne k}w^t_{i,j}w^t_{i,k}h^{t-1}_jh^{t-1}_k]\\ =(w_{i,j}是iid,协方差为0,w和h独立)\sum_j E[(w^t_{i,j})^2]E[(h^{t-1}_j)^2]\\ =(均值为0)\sum_j Var[w_{i,j}]Var[h^{t-1}_j]\\ =(w方差是\gamma_t,t-1层维数为n^{t-1})n^{t-1}\gamma_tVar[h^{t-1}_j]Var[hit]=E[(hit)2]−E2[hit]=E[(hit)2]=E[(j∑wi,jthjt−1)2]=E[j∑(wi,jthjt−1)2+j=k∑wi,jtwi,kthjt−1hkt−1]=(wi,j是iid,协方差为0,w和h独立)j∑E[(wi,jt)2]E[(hjt−1)2]=(均值为0)j∑Var[wi,j]Var[hjt−1]=(w方差是γt,t−1层维数为nt−1)nt−1γtVar[hjt−1]
如果我们要求两层之间方差相等,就要满足:
nt−1γt=1n^{t-1}\gamma_t=1nt−1γt=1
反向同理:
∂l∂ht−1=∂l∂ht∂ht∂ht−1=∂l∂htWt\frac{\partial l}{\partial \bm h^{t-1}}=\frac{\partial l}{\partial \bm h^{t}}\frac{\partial \bm h^{t}}{\partial \bm h^{t-1}}=\frac{\partial l}{\partial \bm h^{t}}\bm W^t∂ht−1∂l=∂ht∂l∂ht−1∂ht=∂ht∂lWt
具体到第iii个元素,有如下关系:
∂l∂hit−1=∑j∂l∂hitwi,j\frac{\partial l}{\partial h_i^{t-1}}=\sum_j\frac{\partial l}{\partial h_i^t}w_{i,j}∂hit−1∂l=j∑∂hit∂lwi,j
将其记为:
ait−1=∑jaitwi,ja_i^{t-1}=\sum_j a_i^t w_{i,j}ait−1=j∑aitwi,j
所以,和正向传播具有完全相同的形式,只是前面的层数标号是t−1t-1t−1,后面是ttt,和正向传播的对调了。完全一样的过程,得到:
Var[ait−1]=ntγtVar[ai]Var[a_i^{t-1}]=n^t\gamma_tVar[a_i]Var[ait−1]=ntγtVar[ai]
所以反向传播得到的结论是:
ntγt=1n^{t}\gamma_t=1ntγt=1
\space
2.Xavier初始化
但是nt−1γt=1且ntγt=1n^{t-1}\gamma_t=1且n^{t}\gamma_t=1nt−1γt=1且ntγt=1这个条件太强,我们不可能让每一层的特征维数都相同。因此采取一种折中的方式:
γt(nt−1+nt)2=1也即γt=2(nt−1+nt)\frac{\gamma_t(n^{t-1}+n^{t})}{2}=1\\
也即\gamma_t=\frac{2}{(n^{t-1}+n^{t})}2γt(nt−1+nt)=1也即γt=(nt−1+nt)2
我们可以找到两种分布来满足这种方差:
- 正态分布N(0,2(nt−1+nt))N(0,\frac{2}{(n^{t-1}+n^{t})})N(0,(nt−1+nt)2)
- 均匀分布U(−6(nt−1+nt),6(nt−1+nt))U(-\sqrt{\frac{6}{(n^{t-1}+n^{t})}},\sqrt{\frac{6}{(n^{t-1}+n^{t})}})U(−(nt−1+nt)6,(nt−1+nt)6)
这种方式就是Xavier初始化。
\space
\space
多记一句:对于激活函数,可以采用相似的论证方式,结论是若要保持均值为0方差常数,越接近y=xy=xy=x的激活函数越好。因此这也解释了为什么ReLU和Tanh的表现略微好于Sigmoid。