深度学习中Xavier初始化

“Xavier”初始化方法是一种颇有效的神经网络初始化方法,方法来源于2010年的一篇论文《Understanding the difficulty of training deep feedforward neural networks》。网络

文章主要的目标就是使得每一层输出的方差应该尽可能相等。下面进行推导:每一层的权重应该知足哪一种条件才能实现这个目标。函数

和方差相关的定理

假设有随机变量x和w,它们都服从均值为0,方差为σ的分布,且独立同分布,那么:spa

  • wx就会服从均值为0,方差为σσ的分布
  • wx+wx就会服从均值为0,方差为2σσ的分布

文章实验用的激活函数是tanh激活函数,函数形状以下左图,右图是其导数的函数形状。orm

激活函数

从上图能够看出,当x处于0附近时,其导数/斜率接近与1,能够近似将其当作一个线性函数,即f(x)=x。blog

假设输入数据的均值为o,方差为\(\delta_x\),若是第一层是卷基层,卷基层共n个参数,\(n=C*k_h*k_w\),因而有:form

\[z_j= \sum_{i}^{n}{w_i*x_i}\]class

其中,忽略偏置b变量

假设x和w是独立同分布,则\(Var(z)=n*\delta_x*\delta_w\),为了更好地表达,将层号放在变量上标处:
\[\delta_x^2=n^1*\delta_x^1*\delta_w^1\]神经网络

全链接和卷积层均可以看作是n个参数的线性变换,进而有:\(\delta_x^3=n^2*\delta_x^2*\delta_w^2\),若是k层的网络,有:
\[\delta_x^k=n^{k-1}*\delta_x^{k-1}*\delta_w^{k-1} =n^{k-1}*n^{k-2}*\delta_x^{k-2}*\delta_w^{k-2}*\delta_w^{k-1} =\delta_x^1*\prod_{i=1}^{k-1}{(n^i*\delta_w^i)}\]network

从上式中能够看出,后面的连乘是很危险的,若是\(n^i*\delta_w^i\)老是大于1,最后的方差为愈来愈大;若是伺机小于1,最后的方差就愈来愈小。因此咱们回头再看第一个公式:
\[\delta_x^2=n^1*\delta_x^1*\delta_w^1\]
若是知足\(\delta_x^2=\delta_x^1\),即保证输出方差和输出方差一直即可以免上述问题,获得:
\[\delta_w^1=\frac{1}{n^1}\]

对于任意一层i,应该知足:
\[\delta_w^i=\frac{1}{n^i}\]
\(n^i\)是w参数的输入层。

反向传播的状况

假设第k层的梯度为\(\frac{\partial{Loss}}{\partial{x_j^k}}\),对于第k-1层,有:
\[\frac{\partial{Loss}}{\partial{x_j^{k-1}}} = \sum_{i=1}^{n}{\frac{\partial{Loss}}{\partial{x_i^k}}*w_j^{ki}}\]

这里的参数n表示的是输出端的数目。

若是每层的方差服从均值为o,方差为某值的分布,有:
\[Var(\frac{\partial{Loss}}{\partial{x_j^{k-1}}})= n^k*Var(\frac{\partial{Loss}}{\partial{x_i^k}})*\delta_w^k\]
对于k层的网络,能够推导获得:
\[Var(\frac{\partial{Loss}}{\partial{x_j^{1}}} =Var(\frac{\partial{Loss}}{\partial{x_i^k}})* \prod_{2}^{k}{(n^i*\delta_w^i)} \]
上式的连乘一样危险,因此咱们取\(Var(\frac{\partial{Loss}}{\partial{x_j^{k-1}}}) = Var(\frac{\partial{Loss}}{\partial{x_i^k}})\)
故:
\[\delta_w^k = \frac{1}{n^k}\]
这里的n表示输出的维度

为了均衡考虑,咱们设置方差应该知足
\[\delta_w^k=\frac{2}{n^k+n^{k+1}}\]

实际应用

论文提出使用均匀分布进行初始化,咱们设定权重要初始化的范围是[-a,a]。而均匀分布的方差为:

\[Var(uniform)=\frac{(a-(-a))^2}{12}=\frac{a^2}{3}=\delta_w^k\]

因此:
\[a=\sqrt{\frac{6}{n^k+n^{k+1}}}\]
这就是xavier初始化方法,即把参数初始化成下面范围内的均匀分布:
\[[-\sqrt{\frac{6}{n^k+n^{k+1}}}, \sqrt{\frac{6}{n^k+n^{k+1}}}]\]

相关文章
相关标签/搜索