xaviar initializer deep learning 参数初始化

来源:互联网 发布:肿泡眼双眼皮知乎 编辑:程序博客网 时间:2024/06/03 08:31

xavier initilizer解读

本文原版对论文 Understanding the difficulty of training deep feedforward neural networks 的理解,不对之处,欢迎指正

动机

我们都知道,深度学习中的初始化好坏直接影响到模型的效果,包括使用pre-training, 也无非是为了给模型优化一个好的起点。

最简单直接的方法当然是各种对参数进行随机,如均匀随机,高斯随机,可以直接拍一个值,一般都会是0均值,而对于高斯方法而言,应该选定方差多少合适呢,论文中就是要解答这个问题

问题

在这里,先抛出一个砖。

常见的神经网络结构中的某一层可用如下的表达式表示:

y=w1x1+w2x2+...+wNxN+b

那么现在想知道当前层输出y的方差var(y) 是多少呢?根据维基百科,有如下公式:

var(wixi)=E(xi)2var(wi)+E(wi)2var(xi)+var(wi)var(xi)

这里我们可假设输入x及参数w均值为0, 则只剩下最后一项

var(wixi)=var(wi)var(xi)

那么则有

var(y)=Nvar(wi)var(xi)

到这里,来看下如果随便拍下一个方差会有什么问题,由于神经网络是一层层叠起来,如果方差太小,那么越往后,方差越小,则y就越接近于0,即大部分位于0附近,对于一般的激活函数,0附近区域为线性区域,则整个网络的非线性能力大打折扣;相反,如果取的方差太大,会使y远远偏离0附近,使激活单元位于饱和区域附近,梯度反向传播时,会极容易形成梯度消散(vanish), 因此,本文即是要寻找到一个合适的方差,能应对以上的两个问题。

方案

由以上的简单的推导公式,我们可以看出来,最好是保持方差var不变向后传播,这样才不会当多层结构叠在一起时,由于连乘的关系,var爆炸或消失,因此这就要求:

Nvar(wi)=1

即 var(w)=1/N, N即输入单元的个数,在文章中,作者同时考虑到了反向作用,因此使用了拆衷的:

var(wi)=2ni+ni+1

其中分母上分别为当前层的输入和输出的单元个数

到这里,本篇的基本思想说完,但要想深刻理解作者的思想,还是要细致的读下原文