热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

startupinfo为什么需要初始化_初始化神经网络权重的方法总结

在本文中,评估了权值初始化的许多方法和当前的最佳实践零初始化将权值初始化为零是不行的。那我为什么在这里提到它呢?要理解权值初始化的需要,我们需要理解为什
在本文中,评估了权值初始化的许多方法和当前的最佳实践

20325df0410936d38b40688c2cc40bc5.png

零初始化

将权值初始化为零是不行的。那我为什么在这里提到它呢?要理解权值初始化的需要,我们需要理解为什么将权值初始化为零是无效的。

让我们考虑一个类似于上面所示的简单网络。每个输入只是一个标量X₁,X₂X₃。和每个神经元的权重是W₁和W₂。每次权重更新如下:

Out₁ = X₁*W₁ + X₂*W₁ + X₃*W₁

Out₂ = X₁*W₂ + X₂*W₂ + X₃*W₂

正如你所看到的现在,如果权重矩阵W = [W₁W₂]被初始化为零,然后out1和out2都完全一样。

即使我们对两者都添加一个非零的随机偏差项,权值也会更新为非零,但它们仍将保持相同,因此隐藏单元的两个神经元都在计算相同的东西。换句话说,它们是对称的。

这是非常不可取的,因为这是浪费计算。这就是零初始化无法工作的原因。

随机初始化

现在我们知道权重必须是不同的,下一个想法是随机初始化这些权重。随机初始化比零初始化好得多,但是这些随机数可以是任意数吗?

假设你使用的是s型非线性。sigmoid函数如下所示。

48d14ac745d4b5cd5e3b6bf13a8be137.png

我们可以看到,对于大到6的值,sigmoid的值几乎是1,对于小到-6的值,sigmoid的值为0。这意味着如果我们的权值矩阵被初始化为过大或过小的值,所有有用的信息都会在sigmoid函数中丢失。

如果我们使用ReLu非线性,这就不那么重要了,但是在将权重初始化为大值或小值时还有其他问题。有更好的方法来初始化权重。

Xavier初始化

Xavier初始化是由Xavier Glorot和Yoshua Bengio在2010年提出的。本文的主要目标是初始化权重,使激活的平均值为零,标准偏差为1。考虑如下所示计算的函数。

Z = WX + b

这里W是权值矩阵,X是来自前一层的输入,b是偏差。Z是一个层计算的输出,也称为激活。我们希望Z的均值是0,标准差是1。(从技术上讲,Z是ReLu等非线性激活后的结果)

为什么均值为0,标准差为1这么重要?

考虑一个有100层的深度神经网络。在每一步,权重矩阵乘以来自前一层的激活。如果每一层的激活大于1,当它们被重复乘以100次时,它们就会不断变大,爆炸到无穷大。类似地,如果激活值小于1,它们将消失为零。这叫做渐变爆炸和渐变消失问题。我们可以从下图中看到这一点。甚至比1稍大一点的值也会爆炸成非常大的数字,而比1稍小一点的值也会消失为零。

089d7cde4a667efc6ec41eebdc5b31e9.png

为了避免梯度和激活的爆炸和消失,我们希望激活的平均值为0,标准偏差为1。我们可以通过仔细选择权重来实现这一点。

在本文发布期间,权值的最佳实践是从均匀分布[-1,1]中随机选取,然后除以输入维数的平方根。事实证明,这不是一个好主意,梯度消失了,如果可能的话,训练也非常缓慢。

这个问题通过Xavier的初始化得到了解决,Xavier的初始化建议我们从一个均匀分布中随机初始化权重,如下图所示。

9e3ee927da11c14ddc2ee55447b4da40.png

Xavier 初始化的 Uniform分布

现在,Xavier的初始化是通过从标准正态分布中选择权重来完成的,每个元素都要除以输入维度大小的平方根。在PyTorch中,代码如下所示。

torch.randn(n_inp, n_out)*math.sqrt(1/n_inp)

Xavier的初始化工作相当好,对于对称非线性,如sigmoid和Tanh。然而,对于目前最常用的非线性函数ReLu,它的工作效果并不理想。

Kaiming 初始化

2015年,何凯明等人撰写了一篇名为《Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》的论文,在论文中,他们介绍了现在广为人知的Kaiming 初始化。

但是为什么我们需要Kaiming 初始话呢?关于ReLu非线性的Xavier Init有什么问题?

75f3e69be5ba3e233bc37c65322842c7.png

从上图中可以看出&#xff0c;ReLu对所有X<0给出了0&#xff0c;对所有X>给出了Y&#61;X。ReLu并没有很好地定义0&#xff0c;但大多数程序都将其赋值为接近于0的近似&#xff0c;比如machine epsilon。

0edff1ba7a5d21967d8ed3c5b6a28b91.png

左:均值0&#xff0c;标准差1的正态分布。右:通过ReLu后的正态分布。

在上面我们可以看到2个散点图&#xff0c;左边是ReLu之前的数据&#xff0c;右边是ReLu之后的数据。从图像中可以清楚地看到&#xff0c;在ReLu之后&#xff0c;方差几乎是一半&#xff0c;平均值略高。这改变了激活&#xff0c;方差减少了一半&#xff0c;所以我们需要将方差加倍才能得到Xavier Init的原始效果。因此&#xff0c;我们将权重乘以一个额外的值√2。所以在PyTorch中&#xff0c;Kaiming  初始化如下所示。

torch.randn(n_inp, n_out)*math.sqrt(2/n_inp)

如果你仍然对上面的公式不太理解&#xff0c;那么记住:

方差&#61;标准差的平方

方差翻倍所以需要乘以√2

Fixup初始化

Fixup是Zhang等人在2019年提出的初始化。根据他们的观察&#xff0c;Kaiming 的初始化和其他标准的初始化不能很好地用于有残差分支的网络(又叫残差网络)。他们发现&#xff0c;标准初始化的残差网络只有在BatchNorm下才能正常工作。

让我们看看为什么Kaiming Init不能在残差网络上更好的工作。考虑如下图所示的跳过连接。X2 &#61; f(X1) X3 &#61; f(X2) &#43; X1。我们知道Kaiming init选择的权重使得每一层后的激活有0均值和1方差。我们知道X1的方差是1 X2的方差是1。但是Kaiming  init不考虑跳过连接。因此&#xff0c;根据总方差定律&#xff0c;X3的方差翻倍。由残差分支添加的额外方差在Kaiming  Init中没有考虑在内。因此残差网络不能很好地与标准初始化一起工作&#xff0c;除非它们有BatchNorm。没有BatchNorm&#xff0c;输出方差会随深度呈指数爆炸式增长。

Var[Xₗ₊₁] ≈ 2Var[Xₗ ]

ecef872267fccfc6ed45e8c75a026c44.png

残差网络中的跳过连接

该论文的作者提出了一个重要的观察结果&#xff0c;即SGD更新每个残差分支的权重会在高度相关的方向上更新网络输出。这意味着&#xff0c;如果所有残差分支权重都由X更新&#xff0c;则网络输出也将在相同的权重更新方向上按比例地更改为X。

作者将所需的网络输出变化定义为Θ(η)。如我们所知&#xff0c;平均每个残差分支对输出更新的贡献均等。如果我们称残差分支的数量为L&#xff0c;则每个残差分支平均应将输出改变Θ(η/ L)&#xff0c;以实现总变化。输出上的Θ(η)。

接下来&#xff0c;作者展示如何初始化m层的残差分支&#xff0c;以便SGD更新将输出更改Θ(η/ L)。作者表明&#xff0c;可以通过以下方式重新调整这些权重层的标准初始化&#xff1a;

611a7072972d16bd5e914e3758a49f70.png

权重比例因子

作者还讨论了偏差和乘数的效用。他们发现在每次卷积&#xff0c;添加一个初始值为0的偏置层&#xff0c;线性层和逐元素激活导致训练显着改善之前。他们还发现&#xff0c;在每个残差分支上添加一个乘法标度有助于通过标准化来模仿网络的权重范数动态。

所有的解决方案汇总如下

00ce52e3c0747f60d6835867a1769ed2.png

LSUV初始化

Mishkin等人在2016年的一篇论文《All you need is a good Init》中介绍了LSUV。LSUV Init是一种数据驱动的方法&#xff0c;它具有最小的计算量和非常低的计算开销。初始化是一个2部分的过程&#xff0c;首先初始化标准正交矩阵的权值(与高斯噪声相反&#xff0c;它只是近似正交)。下一部分是迭代一个小批处理并缩放权重&#xff0c;以便激活的方差为1。作者断言&#xff0c;在大范围内&#xff0c;小批量大小对方差的影响可以忽略不计。

在论文中&#xff0c;作者列出了以下初始化步骤。

  1. 使用单位方差将权重初始化为高斯噪声。

  2. 使用SVD或QR将它们分解为正交坐标。

  3. 使用第一个微型批处理在网络中进行迭代&#xff0c;并在每次迭代比例时权重以使输出方差接近1。重复直到输出方差为1或发生最大迭代。

论文中&#xff0c;作者提出比例因子为√Var(BL)&#xff0c;其中BL —它的输出Blob

作者还提出了最大迭代次数的值&#xff0c;以防止无限循环。但是&#xff0c;在他们的实验中&#xff0c;他们发现在1–5次迭代中实现了单位方差。

可以将LSUV Init看作是正交初始化和BatchNorm的组合&#xff0c;它仅在第一个迷你批处理中执行。作者在实验中表明&#xff0c;与完整的BatchNorm相比&#xff0c;该方法在计算上非常高效。

0e35b5666233585ff9ccf139e25b9fb3.png

转移学习

转移学习是一种在我们的新模型中使用已经训练有素的模型进行权重的方法&#xff0c;该模型已经针对相似的任务进行了训练。这些权重已经学习了很多有用的信息&#xff0c;我们可以针对我们的特定目标进行微调&#xff01;我们有一个了不起的模型&#xff0c;没有初始化的麻烦。

每次使用来自另一个模型的预训练权重都是最好的方法。唯一需要我们自己初始化权值的情况是&#xff0c;我们在一个从未有人训练过的网络上工作。在大多数实际情况下&#xff0c;情况并非如此&#xff0c;所以一般情况下&#xff0c;我们使用一个与训练的模型作为我们训练的开始是一个很好的习惯。

作者 Akash Shastri

deephub翻译组




推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • keras归一化激活函数dropout
    激活函数:1.softmax函数在多分类中常用的激活函数,是基于逻辑回归的,常用在输出一层,将输出压缩在0~1之间,且保证所有元素和为1,表示输入值属于每个输出值的概率大小2、Si ... [详细]
  • 都会|可能会_###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了###haohaohao###图神经网络之神器——PyTorchGeometric上手&实战相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
sanyyy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有