美文网首页
神经网络中的权值初始化:从过去到现在

神经网络中的权值初始化:从过去到现在

作者: 有事没事扯扯淡 | 来源:发表于2019-11-28 10:34 被阅读0次

为什么进行权值初始化

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

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

x = torch.randn(512)

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

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

for i in range(100):
    a = torch.randn(512,512)
    x = a @ x
x.mean(), x.std()

output: tensor(nan),tensor(nan)

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

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

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

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

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

如何初始化最佳

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

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

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

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

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

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

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

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

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

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

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

Xavier初始化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Kaiming初始化

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

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

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

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

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

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

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

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

  1. 为给定层上的权值矩阵创建一个张量,并用从标准正态分布中随机选择的数字填充它。
  2. 将每个随机选择的数字乘以√2/√n,其中n是从上一层的输出(也称为“扇入”)进入给定层的连接数。
  3. 偏置张量初始化为零

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

最后一个比较是,如果我们使用Xavier初始化,将会发生什么。(ps:kming初始化用的标准正态分布,Xavier用的均匀分布)

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

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

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

[参考链接]
https://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&mid=2247491965&idx=2&sn=9f310d6ksm=ec1LMjjgnQQN921RIy3yYYwjZvSEGw

相关文章

网友评论

      本文标题:神经网络中的权值初始化:从过去到现在

      本文链接:https://www.haomeiwen.com/subject/zgevwctx.html