自编码器参数初始化方法-Xavier initializatio
2017-03-19 本文已影响5362人
d46138a62446
我们在自编码器中会使用到一种参数初始化方法 Xavier initialization. 下面我们就来介绍一下:
Xavier Glorot 和 Yoshua Bengio 在 2010年提出了 Xavier方法,这是一种很有效的
神经网络的初始化方法。
《Understanding the difficulty of training deep feedforward neural networks》
为什么需要参数初始化?
如果深度学习模型的权重初始化得太小,那么信号将在每层间传递时逐渐缩小而难以产生作用。
如果权重初始化得太大,那信号将在每层间传递时逐渐放大并导致发散和失效
Xavier初始化器得作用,就是在初始化深度学习网络得时候让权重不大不小。
下面给出公式推导:
考虑线性激活函数,且0处可导导数为1:
根据概率统计知识我们有下面的方差公式:
特别的,当我们假设输入和权重都是0均值时(目前有了BN之后,这一点也较容易满足),上式可以简化为:
进一步假设输入x和权重w独立同分布,则有:
于是,为了保证输入与输出方差一致,则应该有:
对于一个多层的网络,某一层的方差可以用累积的形式表达:
特别的,反向传播计算梯度时同样具有类似的形式:
综上,为了保证前向传播和反向传播时每一层的方差一致,应满足:
但是,实际当中输入与输出的个数往往不相等,于是为了均衡考量,最终我们的权重方差应满足:
学过概率统计的都知道 [a,b] 间的均匀分布的方差为:
均值为:
因此,Xavier初始化的实现就是下面的均匀分布:
python代码:
<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)
*这里通过tf.random_uniform创建一个
范围内的均匀分布。