14

神经网络中的权值初始化:从最基本的方法到Kaiming方法的历程

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA%3D%3D&%3Bmid=2247491965&%3Bidx=2&%3Bsn=9f310d6b3f213fe50a287f33adf17fb6
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

加入极市 专业CV交流群,与 6000+来自腾讯,华为,百度,北大,清华,中科院 等名企名校视觉开发者互动交流!更有机会与 李开复老师 等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。 关注  极市平台  公众号  , 回复  加群, 立刻申请入群~

导语

这篇文章通过实验一步一步验证了如何从最基础的初始化方法发展到Kaiming初始化方法,以及这之间的动机。

这篇文章中,我会通过不同的方法探索初始化神经网络层权值。一步一步地,通过各种简短的实验和思维练习,我们将发现为什么适当的初始化权重对训练深度神经网络如此重要。在此过程中,我们将介绍研究人员多年来提出的各种方法,并最终深入研究最适合你的最有可能使用的现代网络体系结构的方法。

为什么要初始化权值

权值初始化的目的是防止层激活输出在深度神经网络的正向传递过程中爆炸或消失。如果发生任何一种情况,损失梯度要么太大,要么太小,无法有利地向后流动,如果网络能够这样做,则需要更长的时间才能收敛。

矩阵乘法是神经网络的基本数学运算。在多层的深度神经网络中,一个前向传递只需要在每一层执行连续的矩阵乘法,在该层的输入和权重矩阵之间。这一层的乘积变成了下一层的输入,以此类推。

对于一个说明这一点的简单示例,我们假设有一个向量x,其中包含一些网络输入。当训练神经网络以确保我们的输入值被缩放到均值为0,标准差为1的正态分布中时,这是一种标准的做法。

假设我们有一个简单的100层网络,没有激活,并且每个层都有一个矩阵a,其中包含该层的权重。为了完成单次前向传递,我们必须在每100层的输入和权重之间执行矩阵乘法,这将导致总共100个连续矩阵乘法。

这样的话,从相同的标准正态分布初始化层权值,再缩放到我们的输入从来都不是一个好主意。为了了解原因,我们可以模拟通过我们假设的网络的正向传递。

vEjI3un.jpg!web

哇!在这100次乘法中,其中一层的输出变得如此之大,以至于计算机都无法识别它们的标准差和平均值。我们可以确切地看到这花了多长时间。

nAZRje2.jpg!web

激活输出在29个网络层中爆炸。我们显然将权重初始化为太大。

不幸的是,我们还必须担心防止层输出消失。为了看看当我们初始化网络权值时发生了什么——我们将调整权值,使其在均值为0的正态分布内时,标准差为0.01。

iuaa2mv.jpg!web

在上述假设的正向传递过程中,激活输出完全消失。

总而言之,如果初始化的权重过大,网络就不能很好地学习。当权重初始化过小时也会发生同样的情况。

我们能不能找到最佳的点?

请记住,如上所述,完成通过神经网络的正向传递所需要的数学只不过是矩阵乘法的连续。如果我们有一个输出y,它是我们的输入向量x和权重矩阵a之间矩阵乘法的乘积,那么y中的每个元素i都定义为:

BjyEviQ.jpg!web

其中i为权重矩阵a的给定行索引,k为权重矩阵a中的给定列索引,输入向量x中的元素索引,n为x中元素的范围或总数。这也可以在Python中定义为:

y[i] = sum([c*d for c,d in zip(a[i], x)])

我们可以证明在给定层,我们使用初始化标准正态分布的输入的矩阵乘积矩阵x 和权值矩阵a 的矩阵乘法平均而言,有一个标准偏差,非常接近输入连接的数量的平方根,它在我们的例子中是 √512。

yYZ3ay6.jpg!web

如果我们从定义矩阵乘法的角度来看,这个属性并不奇怪:为了计算y,我们将输入x的一个元素与权重a的一列相乘,得到512个乘积。在我们的示例中,x和a都使用标准正态分布初始化,这512个乘积的均值为0,标准差为1。

bquyqee.jpg!web

这512个乘积的和的均值为0,方差为512,因此标准差为√512。

这就是为什么在上面的例子中,我们看到我们的层输出在29次连续矩阵乘法之后爆炸。在我们最基本的100层网络架构中,我们希望每个层的输出的标准偏差约为1。可以想象,这将允许我们在尽可能多的网络层上重复矩阵乘法,而不需要激活发生爆炸或消失。

如果我们首先对权重矩阵a进行缩放,将其随机选择的所有值除以√512,那么填充输出y中的一个元素的元素乘平均方差将只有1/√512。

nai2IzQ.jpg!web

这意味着矩阵y的标准差为1,其中包含输入x与权重a相乘生成的512个值中的每一个。让我们通过实验来证实这一点。

FfaEZju.jpg!web

现在让我们重新运行我们的100层网络。和之前一样,我们首先从[-1,1]内部的标准正态分布中随机选择层权值,但这次我们将这些权值缩放1/√n,其中n是一层的网络输入连接数,在我们的示例中为512。

NN3Yvyb.jpg!web

成功!我们的层输出既没有爆炸也没有消失,即使在100个层之后也是如此。

乍一看,这似乎是我们可以收工了,但现实世界的神经网络并不像我们第一个例子所显示的那么简单。为了简单起见,省略了激活函数。然而,在现实生活中我们永远不会这样做。这是由于这些非线性激活函数的位置在网络层的尾端,深层神经网络可以创造非常复杂的函数,近似的描述现实世界的现象,然后可以用来产生令人印象深刻的预测,如笔迹样本的分类。

Xavier初始化

直到几年前,大多数常用的激活函数都是关于给定值的对称函数,其范围渐进地接近于与这个中点正负一定距离的值。双曲正切函数和softsign函数就是这类激活函数的典型的例子。

aIJVv2I.jpg!web

在我们假设的100层网络的每一层之后添加一个双曲正切激活函数,然后看看当我们使用我们自己的权值初始化方案时发生了什么,其中层权值按1/√n.进行缩放。

yQ3Q3i2.jpg!web

第100层激活输出的标准差约为0.06。这当然是一个小的方面,但至少激活还没有完全消失!

现在回想起来,发现我们自己开发的权重初始化策略的过程似乎很直观,但你可能会惊讶地发现,就在2010年,这还不是初始化权重层的传统方法。

当Xavier Glorot Yoshua Bengio发表了具有里程碑意义的论文题为Understanding the difficulty of training deep feedforward neural networks,他们比较的“常用的启发式”实验的初始化权重从均匀分布,然后由1 /√n扩展。

事实证明,这种“标准”方法实际上并不那么有效。

Rzm6niV.jpg!web

用“标准”权重初始化重新运行我们的100层tanh网络,导致激活梯度变得无穷小——它们几乎消失了。

这种糟糕的性能实际上促使Glorot和Bengio提出了他们自己的权重初始化策略,他们在论文中称之为“normalized initialization”,现在通常称为“Xavier初始化”。

Xavier初始化将一个层的权重设置为从一个有界的随机均匀分布中选择的值。

NNB3ayR.jpg!web

其中,nᵢ是传入网络连接的数量叫“扇入”,nᵢ₊₁是从那层出去的网络连接的数量,也被称为“扇出”。

Glorot和Bengio认为,Xavier权值初始化将保持激活和反向传播梯度的方差,一直向上或向下传播到网络层。在他们的实验中,他们观察到Xavier初始化使一个5层网络能够保持其跨层权重梯度的几乎相同的方差。

6RNf2qz.jpg!web

相反,使用“标准”初始化会导致网络较低层(较高)的权值梯度与最上层(接近于零)的权值梯度之间的差异更大。

qyMnqi6.jpg!web

为了说明这一点,Glorot和Bengio证明,使用Xavier初始化的网络在CIFAR-10图像分类任务上实现了更快的收敛速度和更高的准确性。

让我们再次运行我们的100层tanh网络,这次使用Xavier初始化:

RVF7zij.jpg!web

在我们的实验网络中,Xavier初始化执行的方法与我们前面导出的自定义方法非常相似,我们从随机正态分布中采样值,并按传入网络连接数n的平方根进行缩放。

Kaiming初始化

从概念上讲,当使用关于0对称且在[-1,1]内部有输出(如softsign和tanh)的激活函数时,我们希望每个层的激活输出的平均值为0,平均标准偏差为1,这是有意义的。这正是我们自己开发的方法和Xavier所支持的。

但是如果我们使用ReLU激活函数呢?以同样的方式缩放随机初始权重值是否仍然有意义?

aaQbqi7.jpg!web

为了看看会发生什么,让我们在我们假设的网络层中使用ReLU激活而不是tanh,并观察其输出的预期标准偏差。

UbmuQb6.jpg!web

结果表明,当使用ReLU激活时,单层的平均标准偏差非常接近输入连接数的平方根,除以√2 ,在我们的例子中是√512/√2。

FfQze2Y.jpg!web

将权重矩阵的值a乘以这个数字,将导致每个ReLU层的平均标准偏差为1。

qAJZbeV.jpg!web

正如我们之前所展示的,保持层激活的标准偏差在1左右,将允许我们在深度神经网络中叠加更多的层,而不会出现渐变爆炸或消失。

探索如何用类relu的激活函数在网络中最好地初始化权重是kobjective He等人,提出他们自己的初始化方案的动机,这是为使用这些非对称、非线性激活的深层神经网络量身定制的。

He et. al.在他们2015年的论文中证明,如果使用以下输入权初始化策略,深度网络(例如22层CNN)将会更早地收敛:

  1. 为给定层上的权值矩阵创建一个张量,并用从标准正态分布中随机选择的数字填充它。

  2. 将每个随机选择的数字乘以√2/√n,其中n是从上一层的输出(也称为“扇入”)进入给定层的连接数。

  3. 偏置张量初始化为零。

我们可以按照这些方向实现我们自己版本的kming初始化,并验证如果在我们假设的100层网络的所有层上使用ReLU,那么它确实可以防止激活输出爆炸或消失。

Nf67fyB.jpg!web

最后一个比较是,如果我们使用Xavier初始化,将会发生什么。

V3uAVv2.jpg!web

当使用Xavier初始化权重时,激活输出在第100层几乎完全消失!

顺便说一句,当他们训练使用ReLUs的更深层次的网络时,他等人发现,使用Xavier初始化的30层CNN完全停止工作,完全没有学习。但是,当按照上面概述的三步程序初始化同一个网络时,它的收敛性大大提高。

uA36RbJ.jpg!web

这个故事的寓意是,我们从零开始训练的任何网络,尤其是用于计算机视觉应用程序的网络,几乎肯定都包含ReLU激活功能,而且是多层的。在这种情况下,Kaiming应该是我们的首选权重初始化策略。

你也可以成为一个研究者

更重要的是,当我第一次看到Xavier和Kaiming公式时,我并不羞于承认我感到害怕。它们的平方根分别是6和2,我不禁觉得它们一定是某种神谕智慧的结果,而我自己却无法理解。

但我认为,我们在这里的经历向我们表明,这种感到恐惧的下意识反应虽然完全可以理解,但绝不是不可避免的。尽管kaiming和(尤其是)Xavier的论文确实包含了相当多的数学内容,但我们亲眼目睹了实验、经验观察和一些直观的常识如何足以帮助推导出支撑当前最广泛使用的权重初始化方案的核心原则集。

换句话说:当你怀疑的时候,要勇敢,去尝试,看看会发生什么!

-End-

CV细分方向交流群

添加极市小助手微信 (ID : cv-mart) ,备注: 研究方向-姓名-学校/公司-城市 (如:目标检测-小极-北大-深圳),即可申请加入 目标检测、目标跟踪、人脸、工业检测、医学影像、三维&SLAM、图像分割等极市技术交流群 (已经添加小助手的好友直接私信) ,更有每月 大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流 一起来让思想之光照的更远吧~

RrYj22I.jpg!web

△长按添加极市小助手

Yjqyyiq.jpg!web

△长按关注极市平台

觉得有用麻烦给个在看啦~    uE7RJjy.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK