“Xavier”初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文《Understanding the difficulty of training deep feedforward neural networks》

文章主要的目标就是使得每一层输出的方差应该尽量相等。下面进行推导:每一层的权重应该满足哪种条件才能实现这个目标。

  我们将用到以下和方差相关的定理:

假设有随机变量x和w,它们都服从均值为0,方差为σ的分布,且独立同分布,那么:

•      w*x就会服从均值为0,方差为σ*σ的分布

•      w*x+w*x就会服从均值为0,方差为2*σ*σ的分布

  文章实验用的激活函数是tanh激活函数,函数形状如下左图,右图是其导数的函数形状。

从上图可以看出,当x处于0附近时,其导数/斜率接近与1,可以近似将其看成一个线性函数,即f(x)=x。

  我们假设所有的输入数据x满足均值为0,方差为的分布,我们再将参数w以均值为0,方差为的方式进行初始化。我们假设第一层是卷积层,卷积层共有n个参数(n=channel*kernel_h*kernel_w),于是为了计算出一个线性部分的结果,我们有:

其中,忽略偏置b。

假设输入x和权重w独立同分布,我们可以得出z服从均值为0,方差为的分布,即

  为了更好地表达,我们将层号写在变量的上标处,

  我们将卷积层和全连接层统一考虑成n个参数的一层,于是接着就有:

  

  如果我们是一个k层的网络(这里主要值卷积层+全连接层的总和数),我们就有

  继续展开,最终可以得到

从上式可以看出,后面的连乘是非常危险的,假如说总是大于1,那么随着层数越深,数值的方差会越来越大;如果乘积小于1,那么随着层数越深,数值的方差会越来越小。

我们再回头看看这个公式,

  如果,那么我们就能保证每层输入与输出的方差保持一致,那么应该满足:

  即对应任意第i层,要想保证输入与输出的方差保持一致,需要满足:

------------------------------------------------------------------------------------------------

上面介绍的是前向传播的情况,那么对于反向传播,道理是一样的。

假设我们还是一个k层的网络,现在我们得到了第k层的梯度,那么对于第k-1层输入的梯度,有

  从上式可以看出K-1层一个数值的梯度,相当于上一层的n个参数的乘加。这个n个参数的计算方式和之前方式一样,只是表示了输出端的数据维度,在此先不去赘述了。

  于是我们假设每一层的参数服从均值为0,方差为某值的分布,那么有如下公式:

对于这个k层网络,我们又可以推导出一个的公式:

上式中连乘是非常危险的,前面说过,在此不在赘述(这就会造成梯度爆炸与梯度消失的问题,梯度爆炸与梯度消失可以参考这两篇文章)。我们想要做到数值稳定,使得反向传播前后的数值服从一个稳定的分布,即

那么需要满足如下条件:

-----------------------------------------------------------------

  如果仔细看一下前向传播与反向传播的两个公式,我们就会发现两个n实际上不是同一个n。对于全连接来说,前向操作时,n表示了输入的维度,而后向操作时,n表示了输出的维度。而输出的维度也可以等于下一层的输入维度。所以两个公式实际上可以写作:

于是为了均衡考量,最终我们的权重方差应满足:

  

  下面就是对这个方差的具体使用了。论文提出使用均匀分布进行初始化,我们设定权重要初始化的范围是[-a,a]。而均匀分布的方差为:

由此可以求得

上面就是xavier初始化方法,即把参数初始化成下面范围内的均匀分布。

转载自:

CNN数值——xavier(上):https://zhuanlan.zhihu.com/p/22028079

CNN数值——xavier(下): https://zhuanlan.zhihu.com/p/22044472

深度学习——Xavier初始化方法:https://blog.csdn.net/shuzfan/article/details/51338178

深度学习中Xavier初始化的更多相关文章

  1. 深度学习的Xavier初始化方法

    在tensorflow中,有一个初始化函数:tf.contrib.layers.variance_scaling_initializer.Tensorflow 官网的介绍为: variance_sca ...

  2. 深度学习中常见的 Normlization 及权重初始化相关知识(原理及公式推导)

    Batch Normlization(BN) 为什么要进行 BN 防止深度神经网络,每一层得参数更新会导致上层的输入数据发生变化,通过层层叠加,高层的输入分布变化会十分剧烈,这就使得高层需要不断去重新 ...

  3. 深度学习中优化【Normalization】

    深度学习中优化操作: dropout l1, l2正则化 momentum normalization 1.为什么Normalization?     深度神经网络模型的训练为什么会很困难?其中一个重 ...

  4. 深度学习中dropout策略的理解

    现在有空整理一下关于深度学习中怎么加入dropout方法来防止测试过程的过拟合现象. 首先了解一下dropout的实现原理: 这些理论的解释在百度上有很多.... 这里重点记录一下怎么实现这一技术 参 ...

  5. 深度学习中的Normalization模型

    Batch Normalization(简称 BN)自从提出之后,因为效果特别好,很快被作为深度学习的标准工具应用在了各种场合.BN 大法虽然好,但是也存在一些局限和问题,诸如当 BatchSize ...

  6. [优化]深度学习中的 Normalization 模型

    来源:https://www.chainnews.com/articles/504060702149.htm 机器之心专栏 作者:张俊林 Batch Normalization (简称 BN)自从提出 ...

  7. zz详解深度学习中的Normalization,BN/LN/WN

    详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ...

  8. 模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用

    模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理.分类及应用 lqfarmer 深度学习研究员.欢迎扫描头像二维码,获取更多精彩内容. 946 人赞同了该文章 Atte ...

  9. 深度学习中的Data Augmentation方法(转)基于keras

    在深度学习中,当数据量不够大时候,常常采用下面4中方法: 1. 人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data Augm ...

随机推荐

  1. windows 设置/修改全局快捷键

    打开控制面板,小图表显示下 点击 管理工具项, 将自己想要谁知快捷键的程序的快捷方式放进去,(需要确认管理员权限) 如图,第一个即为 lz添加的 右击选择属性 在快捷键处同时按下你想要的组合键即可(不 ...

  2. scanf()中的%c 不能正常输入的问题

    #include <stdio.h> int main() { char a; int b; scanf("%d",&b); scanf("%c&qu ...

  3. 笔记:Spring Cloud Feign Ribbon 配置

    由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...

  4. 【Python】 Selenium 模拟浏览器 寻路

    selenium 最开始我碰到SE,是上学期期末,我们那个商务小组做田野调查时发的问卷的事情.当时在问卷星上发了个问卷,但是当时我对另外几个组员的做法颇有微词,又恰好开始学一些软件知识了,就想恶作剧( ...

  5. centos安装postgis

      step 1   yum localinstall https://download.postgresql.org/pub/repos/yum/9.2/redhat/rhel-7-x86_64/p ...

  6. YCSB测试HBase远程完全分布式集群

    写在前面 本文只讲一个很简单的问题,YCSB对HBase集群的测试.虽然网上有很多介绍YCSB测试HBase的文章,但都是针对本地HBase伪分布式集群的.大家都知道,稍微正式一些的压测都会要求测试客 ...

  7. javaAPI中的常用 类 以及接口

    java.lang包中的常用类以及接口 类 1. Integer :Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 2. Math ...

  8. java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息

    本文直接附上源代码,如下是自己写的一个例子 面试题需求: 使用Condition来实现 三个线程 线程1 线程2 线程3 三个交替输出 [按照 线程1(main)-->线程2-->线程3] ...

  9. java多线程(二)-线程的生命周期及线程间通信

    一.摘要    当我们将线程创建并start时候,它不会一直占据着cpu执行,而是多个线程间会去执行着这个cpu,此时这些线程就会在多个状态之间进行着切换. 在线程的生命周期中,它会有5种状态,分别为 ...

  10. 听翁恺老师mooc笔记(4)--指针的应用场景

    指针应用场景一:交换两个变量的值 在学习函数时,交换两个数的值,做一个swap函数,传递值进去,也可以将两个值交换过来,没问题,可是离开swap就没有用了,为什么?因为传进去的是两个值. #inclu ...