深度学习中Xavier初始化
“Xavier”初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文《Understanding the difficulty of training deep feedforward neural networks》。
文章主要的目标就是使得每一层输出的方差应该尽量相等。下面进行推导:每一层的权重应该满足哪种条件才能实现这个目标。
和方差相关的定理
假设有随机变量x和w,它们都服从均值为0,方差为σ的分布,且独立同分布,那么:
- wx就会服从均值为0,方差为σσ的分布
- wx+wx就会服从均值为0,方差为2σσ的分布
文章实验用的激活函数是tanh激活函数,函数形状如下左图,右图是其导数的函数形状。
从上图可以看出,当x处于0附近时,其导数/斜率接近与1,可以近似将其看成一个线性函数,即f(x)=x。
假设输入数据的均值为o,方差为\(\delta_x\),如果第一层是卷基层,卷基层共n个参数,\(n=C*k_h*k_w\),于是有:
其中,忽略偏置b
假设x和w是独立同分布,则\(Var(z)=n*\delta_x*\delta_w\),为了更好地表达,将层号放在变量上标处:
全连接和卷积层都可以看做是n个参数的线性变换,进而有:\(\delta_x^3=n^2*\delta_x^2*\delta_w^2\),如果k层的网络,有:
从上式中可以看出,后面的连乘是很危险的,如果\(n^i*\delta_w^i\)总是大于1,最后的方差为越来越大;如果乘机小于1,最后的方差就越来越小。所以我们回头再看第一个公式:
如果满足\(\delta_x^2=\delta_x^1\),即保证输出方差和输出方差一直便可以避免上述问题,得到:
对于任意一层i,应该满足:
\(n^i\)是w参数的输入层。
反向传播的情况
假设第k层的梯度为\(\frac{\partial{Loss}}{\partial{x_j^k}}\),对于第k-1层,有:
这里的参数n表示的是输出端的数目。
如果每层的方差服从均值为o,方差为某值的分布,有:
对于k层的网络,可以推导得到:
上式的连乘同样危险,所以我们取\(Var(\frac{\partial{Loss}}{\partial{x_j^{k-1}}}) = Var(\frac{\partial{Loss}}{\partial{x_i^k}})\)
故:
这里的n表示输出的维度。
为了均衡考虑,我们设置方差应该满足
实际应用
论文提出使用均匀分布进行初始化,我们设定权重要初始化的范围是[-a,a]。而均匀分布的方差为:
所以:
这就是xavier初始化方法,即把参数初始化成下面范围内的均匀分布: