Xavier Glorot 和 Yoshua Bengio 在 2010年提出了一种很有效的神经网络的初始化方法:Xavier
- 1.为什么需要参数初始化?
深度学习模型的权重初始化得太小,容易产生梯度消失。
权重初始化得太大,容易产生梯度爆炸
Xavier初始化器得作用,就是在初始化深度学习网络得时候让权重不大不小。
- 2.w分布:
- 3.下面给出公式推导:
考虑线性激活函数,且0处可导导数为1:
根据概率统计知识我们有下面的方差公式:
特别的,当我们假设输入和权重都是0均值时(目前有了BN之后,这一点也较容易满足),上式可以简化为:
进一步假设输入x和权重w独立同分布,则有:
于是,为了保证输入与输出方差一致,则应该有:
对于一个多层的网络,某一层的方差可以用累积的形式表达:
特别的,反向传播计算梯度时同样具有类似的形式:
综上,为了保证前向传播和反向传播时每一层的方差一致,应满足:
但是,实际当中输入与输出的个数往往不相等,于是为了均衡考量,最终我们的权重方差应满足:
学过概率统计的都知道 [a,b] 间的均匀分布的方差为:
均值为:
因此,Xavier初始化的实现就是下面的均匀分布:
- 4. tensorflow实现:
#tensorflow 1.10
from tensorflow.contrib.layers.python.layers import initializers
initializers=initializers.xavier_initializer()
或:
<python3>
import numpy as np
import sklearn.preprocessing as prep
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
def xavier_init(fan_in, fan_out, constant = 1):
low = -constant * np.sqrt(6.0 / (fan_in + fan_out))
high = constant * np.sqrt(6.0 / (fan_in + fan_out))
return tf.random_uniform((fan_in, fan_out),
minval=low, maxval=high, dtype=tf.float32)
转载地址: