神经网络中的权值初始化方法

1,概述 

  神经网络中的权值初始化方法有很多,但是这些方法的设计也是遵循一些逻辑的,并且也有自己的适用场景。首先我们假定输入的每个特征是服从均值为0,方差为1的分布(一般输入到神经网络的数据都是要做归一化的,就是为了达到这个条件)。

  为了使网络中的信息更好的传递,每一层的特征的方差应该尽可能相等,如果保证这个特征的方差是相等的呢。我们可以从初始化的权重值入手。

  首先来做一个公式推导:

  $var(s) = var(\sum_i^n w_i x_i)$

  $var(s) = \sum_i^n var(w_i x_i)$

  $var(s) = \sum_i^n E(w_i^2) E(x_i^2) - (E(x_i))^2 (E(w_i))^2$

  $var(s) = \sum_i^n (E(w_i))^2 var(x_i) + (E(x_i))^2 var(w_i) + var(x_i) var(w_i)$

  在这里假定了x的均值为0,对于初始化的权重通常均值也是选择0,因此上面的式子可以转换成

  $var(s) = \sum_i^n var(x_i) var(w_i)$

  又因为x中每个特征我们都假定方差为1,因此上面的式子可以改写成

  $var(s) = n * var(w)$

  现在要使得$var(s) = 1$,则有

  $n * var(w) = 1$。

  $var(w) = \frac{1}{n}$。

  为了确保量纲和期望一致,我们将方差转换成标准差,因此要确保标准差为$\frac{1}{\sqrt{n}}$

2,初始化方法

  现在我们来看看每种方法初始化时我们该如何设置方差能保证输入的分布状态不变。

  1)均匀分布

  对于均匀分布$U (a, b)$,其期望和方差分别为$E(x) = \frac{(a+b)}{2},  D(x) = \frac{(b-a)^2}{12}$。

  假定均匀分布为$(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}})$,在这里$d$为神经元的个数,则有期望和方差为:

  $E(x) = 0,  D(x) = \frac{1}{3d}$

  代入到$var(s) = n * var(w)$中,可以得到:

  $var(s) = \frac{1}{3}$,因此为了保证最终的方差为1,因此方差需要乘以3,标准差则需要乘以$\sqrt{3}$。因此一般均匀分布的初始化值可以选择$(-\sqrt{\frac{3}{d}},\sqrt{\frac{3}{d}})$。

  在xavier uniform init(glorot uniform),也就是 tf.glorot_uniform_initializer()方法中初始化值为$(-\sqrt{\frac{6}{(d_{in}+d_{out})}},\sqrt{\frac{6}{d_{in}+d_{out}}})$。在一个二维矩阵中$d_{in}, d_{out}$分别表示矩阵的第一个维度和第二个维度。

  见下面一个例子,对于tf.glorot_uniform_initializer()方法:

    

  可以看到经过一层神经网络之后,x的期望和方差基本不变。对于均匀分布tf.random_uniform_initializer(),当我们将参数初始化为$(-\sqrt{\frac{3}{d}},\sqrt{\frac{3}{d}})$。其结果如下:

    

  2)正态分布

  正态分布会直接给出期望和标准差,所以这个不用多说。为了保证$var(s) = 1$,我们需要让$var(w) = \frac{1}{d}$,则标准差为$\sqrt{\frac{1}{d}}$。

  tf.random_normal_initializer(),我们将其标准差设置为$\sqrt{\frac{1}{d}}$。结果如下:

    

  xavier normal init(glorot normal),也就是tf.glorot_normal_initializer(),其标准差为$\sqrt{\frac{2}{(d_{in} + d_{out})}}$,其结果如下:

    

  3)常数初始化

    常数初始化时期望为常数值n,方差为0。

    tf.zeros_initializer(),以0初始化会导致输出x为0。

      

    tf.ones_initializer(),以1初始化方差会很大

      

    tf.constant_initializer(),同上

      

3,引入激活函数

  上面都是在线性运算的情况下的结果,但实际应用中都是要引入激活函数的,这样神经网络才具有更强的表达能力。如果引入激活函数会怎么样?

  为了观看效果,我们将网络层数设置为100层,权重初始化采用tf.glorot_normal_initializer()

  不加激活函数时:

    

  可以看到不加激活函数,方差即使在100层时也基本保持不变。

  引入tanh函数,

    

  结果如上,方差会减小到0.005,因此在深层网络中引入归一化层确实是很重要的。

  引入relu函数:

    

  上面的结果很显然relu函数并不适用tf.glorot_normal_initializer()。对于relu激活函数时,正态分布的标准差通常为$\sqrt{\frac{2}{d}}$,均匀分布通常为$(-\sqrt{\frac{6}{d}},\sqrt{\frac{6}{d}})$。因此更换下初始化参数,结果如下

    

  上面看结果就好很多了,方差在100层的输出为0.1,结果是比tanh要好的,此外这里的期望不再接近0,因为relu函数就是不像tanh那样关于0对称的。

  另外我还发现一个奇怪的事情,暂时无法解释,可以给大家看下结果:

  当我们直接用tf.random_normal_initializer()初始化时,此时方差为1。

  不引入激活函数。

    

  100层后得到的期望和方差都为nan,应该是发生爆炸了。

  引入tanh函数:

    

  100层后竟然能保持方差为1。

  relu激活函数:

    

  期望和方差均为0。

  从上面的结果看好像在用tanh做激活函数时,可以直接将参数用0,1的正态分布初始化。

 4,初始化的随机性

  在实践中还发现一个问题,就是参数的大小也会影响最终的结果,以relu激活函数为例。为了方便计算,x和w的维度一致

  所有维度为512,两次得到的结果差异比较大:

    

    

  其实这个也好理解,本身x和w都是随机初始化的,虽然分布是一样的,但是具体的值并不一样,最终的结果也不一样,所以说即使同样的分布初始化,有时候得到的结果也会有所差异,这个差异可能是收敛的速度,也可能是最终的结果等等。

参考文献:

神经网络中的初始化

神经网络中的权重初始化一览:从基础到Kaiming

原文地址:https://www.cnblogs.com/jiangxinyang/p/11574049.html

时间: 2024-08-23 03:43:48

神经网络中的权值初始化方法的相关文章

caffe中权值初始化方法

首先说明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如果想看,可以看看哦,反正我是不想看,代码细节吧,现在不想知道太多,有个宏观的idea就可以啦,如果想看代码的具体的话,可以看:http://blog.csdn.net/xizero00/article/details/50921692,写的还是很不错的(不过有的地方的备注不对,不知道改过来了没). 文件 filler.hpp提供了7种权值初始化的方法,分别为:常量初始化(constant).高斯分布初

神经网络中权值初始化的方法

from:http://blog.csdn.net/u013989576/article/details/76215989 权值初始化的方法主要有:常量初始化(constant).高斯分布初始化(gaussian).positive_unitball初始化.均匀分布初始化(uniform).xavier初始化.msra初始化.双线性初始化(bilinear) 常量初始化(constant) 把权值或者偏置初始化为一个常数,具体是什么常数,可以自己定义 高斯分布初始化(gaussian) 需要给定

激活函数与权值初始化

1.sigmod函数--(tf.nn.sigmoid()) sigmod函数性质: 1.如图像所示其值域在[0,1]之间,函数输出不是0均值的,权重更新效率降低,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in ),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢. 当然了,如果你是按batch去训练,那么每个batch可能得

NSMutableDictionary 类中增加键值对方法分析

在iOS中可变字典增加一个键值对的方法有setObject: forKey: 和setValue : forKey: .为了方便我们把这两个方法简称为方法A和方法B. B这个方法中其中的value值是不能为nil,否则程序会出项崩溃.而A方法中的这个value可以为nil,但是当这个value位nil时,系统会自动调用removeObjectforKey:这个方法.这样就把这个键值对删除掉了.B方法中的key值可以是任意类型的,但是这个类型必须要实现NSCopying协议.而A方法中它的key值

【权值初始化+有条件的MST】hdu 1875 畅通工程再续

Source : hdu 1875 畅通工程再续 http://acm.hdu.edu.cn/showproblem.php?pid=1875 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2

golang中结构体的初始化方法(new方法)

自定义一个结构体 type Rect struct { x, y float64 width, height float64 } 初始化方法: rect1 := new(Rect) rect2 := &Rect{} rect3 := &Rect{0, 0, 100, 200} rect4 := &Rect{width:100, height:200} 注意这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new()函数和&操作符.而如果使用方法 a := Rec

Java 中无返回值的方法在使用时应该注意的问题

Java 中的方法是形态多样的.无返回值的方法在使用时应该规避哪些问题呢? 一.不可以打印调用或是赋值调用,只能是单独调用(非常重要): 二.返回值没有,不代表参数就没有: 三.不能return一个具体的值,否则会报错: 四.return分号可以直接省略: 五.无返回值方法应该使用类型void. 原文地址:https://www.cnblogs.com/yanglongbo/p/10981842.html

深度之眼PyTorch训练营第二期 --- 8、权值初始化

一.梯度消失与爆炸 二.Xavier方法与Kaiming方法 1.Xavier初始化 方差一致性:保持数据尺度维持在恰当范围,通常方差为1 激活函数:饱和函数,如Sigmoid,Tanh 三.常用初始化方法 10种: Xavier均匀分布.正态分布 Kaiming均匀分布.正态分布 均匀分布.正态分布.常数分布 正交矩阵初始化 单位矩阵初始化 稀疏矩阵初始化 nn.init.Calculate_gain 主要功能:计算激活函数的方差变化尺度 主要参数 nonlinearity:激活函数名 par

CNN卷积神经网络学习笔记3:权值更新公式推导

在上篇<CNN卷积神经网络学习笔记2:网络结构>中,已经介绍了CNN的网络结构的详细构成,我们已经可以初始化一个自己的CNN网络了,接下来就是要用训练得到一个确定的CNN的模型,也就是确定CNN的参数. CNN本质上就是人工神经网络的一种,只是在前几层的处理上有所不同,我们可以把卷积核看成是人工神经网络里的权值W,而采样层实质上也是一种卷积运算.所以可以基于人工神经网络的权值更新的方法来推导CNN里的权值更新公式.人工神经网络里是用反向传播算法将误差层层回传,利用梯度下降法更新每一层的权值,C