tensorflow.contrib.layers.python.layers.initializers.xavier_initializer()

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)

转载地址:

https://www.jianshu.com/p/4e53d3c604f6

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值