自编码器参数初始化方法-Xavier initialization

我们在自编码器中会使用到一种参数初始化方法 Xavier initialization. 下面我们就来介绍一下:

Xavier Glorot 和 Yoshua Bengio 在 2010年提出了 Xavier方法,这是一种很有效的

神经网络的初始化方法。
《Understanding the difficulty of training deep feedforward neural networks》

为什么需要参数初始化?

如果深度学习模型的权重初始化得太小,那么信号将在每层间传递时逐渐缩小而难以产生作用。
如果权重初始化得太大,那信号将在每层间传递时逐渐放大并导致发散和失效

Xavier初始化器得作用,就是在初始化深度学习网络得时候让权重不大不小。

下面给出公式推导:

考虑线性激活函数,且0处可导导数为1:




根据概率统计知识我们有下面的方差公式:



特别的,当我们假设输入和权重都是0均值时(目前有了BN之后,这一点也较容易满足),上式可以简化为:

进一步假设输入x和权重w独立同分布,则有:

于是,为了保证输入与输出方差一致,则应该有:



对于一个多层的网络,某一层的方差可以用累积的形式表达:

特别的,反向传播计算梯度时同样具有类似的形式:

综上,为了保证前向传播和反向传播时每一层的方差一致,应满足:

但是,实际当中输入与输出的个数往往不相等,于是为了均衡考量,最终我们的权重方差应满足:
自编码器参数初始化方法-Xavier initialization_第1张图片

学过概率统计的都知道 [a,b] 间的均匀分布的方差为:
自编码器参数初始化方法-Xavier initialization_第2张图片

均值为:


自编码器参数初始化方法-Xavier initialization_第3张图片

因此,Xavier初始化的实现就是下面的均匀分布:


自编码器参数初始化方法-Xavier initialization_第4张图片
python代码:

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创建一个
自编码器参数初始化方法-Xavier initialization_第5张图片

范围内的均匀分布。

你可能感兴趣的:(自编码器参数初始化方法-Xavier initialization)