精华内容
下载资源
问答
  • 2022-03-10 20:19:47

    有些优化算法本质上是非迭代的,只是求解一个解点。有些其他优化算法本质上是迭代的,但是应用于这一类的优化问题时,能在可接受的时间内收敛到可接受的解,并且与初始值无关。深度学习训练算法通常没有这两种奢侈的性质。深度学习模型的训练算法通常是迭代的,因此要求使用者指定一些开始迭代的初始点。此外,训练深度模型是一个足够困难的问题,以至于大多数算法都很大程度地受到初始化选择的影响。初始点能够决定算法是否收敛,有些初始点十分不稳定,使得该算法会遭遇数值困难,并完全失败。当学习收敛时,初始点可以决定学习收敛得多块,以及是否收敛到一个代价高或低的点。此外,差不多代价的点可以具有区别极大的泛化误差,初始点也可以影响泛化。

    现代的初始化策略是简单的、启发式的。设定改进的初始化策略是一项困难的任务,因为神经网络优化至今还未被很好地理解。大多数初始化策略基于在神经网络初始化时实现一些很好的性质。然而,我们并没有很好地理解这些性质中的哪些会在学习开始进行后的哪些情况下得以保持。进一步的难点是,有些初始点从优化的观点看或许是有利的,但是从泛化的观点看是不利的。我们对于初始点如何影响泛化的理解是相当原始的,几乎没有提供如何选择初始点的任何指导。

    也许完全确知的唯一特性是初始参数需要在不同单元间“破坏对称性”。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。如果它们具有相同的初始参数,然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。即使模型或训练算法能够使用随机性为不同的单元计算不同的更新(例如使用Dropout的训练),通常来说,最好还是初始化每个单元使其和其他单元计算不同的函数。这或许有助于确保没有输入模式丢失在前向传播的零空间中,没有梯度模式丢失在反向传播的零空间中。每个单元计算不同函数的目标促使了参数的随机初始化。我们可以明确地搜索一大组彼此互不相同的基函数,但这经常会导致明显的计算代价。例如,如果我们有和输出一样多的输入,可以使用Gram-Schmidt正交化于初始的权重矩阵,保证每个单元计算彼此非常不同的函数。在高维空间上使用高熵分布来随机初始化,计算代价小并且不太可能分配单元计算彼此相同的函数。

    通常情况下,我们可以为每个单元的偏置设置启发式挑选的常数,仅随机初始化权重。额外的参数(例如用于编码预测条件方差的参数)通常和偏差一样设置为启发式选择的常数。我们几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。高斯或均匀分布的选择似乎不会有很大的差别,但也没有被详尽地研究。然而,初始分布的大小确实对优化过程的结果和网络泛化能力都有很大的影响。更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元。它们也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重太大,那么会在前向传播或反向传播中产生爆炸的值。在循环网络中,很大的权重也可能导致混沌(对于输入中很小的扰动非常敏感,导致确定性前向传播过程表现随机)。在一定程度上,梯度爆炸问题可以通过梯度截断来缓解(执行梯度下降步骤之前设置梯度的阈值)。较大的权重也会产生使得激活函数饱和的值,导致饱和单元的梯度完全丢失。这些竞争因素决定了权重的理想初始大小。

    关于如何初始化网络,正则化和优化有着非常不同的观点。优化观点建议权重应该足够大以成功传播信息,但是正则化希望其小一点。诸如随机梯度下降这类对权重较小的增量更新,趋于停止在更靠近初始参数的区域(不管是由于卡在低梯度的区域,还是由于触发了基于过拟合的提前终止准则)的优化算法倾向于最终参数应接近于初始参数。在某些模型上,提前终止的梯度下降等价于权重衰减。在一般情况下,提前终止的梯度下降和权重衰减不同,但是提供了一个宽松的类比去考虑初始化的影响。我们可以将初始化参数 θ \theta θ θ 0 \theta_0 θ0类比于强置均值为 θ 0 \theta_0 θ0的高斯先验 p ( θ ) p(\theta) p(θ)。从这个角度来看,选择 θ 0 \theta_0 θ0接近0是有道理的。这个先验表明,单元间彼此互不交互比交互更有可能。只有在目标函数的似然项表达出对交互很强的偏好时,单元才会交互。此外,如果我们初始化 θ 0 \theta_0 θ0为很大的值,那么我们的先验指定了哪些单元应互相交互,以及它们应如何交互。

    有些启发式方法可用于选择权重的初始大小。一种初始化 m m m个输入和 n n n输出的全连接层的权重的启发式方法是从分布 W i , j ∼ U ( − 1 m , 1 m ) W_{i, j}\sim U(-\frac{1}{\sqrt{m}}, \frac{1}{\sqrt{m}}) Wi,jU(m 1,m 1)中采样权重,而Glorot andBengio建议使用标准初始化(Normalized Initialization):
    W i , j ∼ U ( − 6 m + n , 6 m + n ) W_{i, j}\sim U(-\frac{6}{\sqrt{m+n}}, \frac{6}{\sqrt{m+n}}) Wi,jU(m+n 6,m+n 6)

    后一种启发式方法初始化所有的层,折衷于使其具有相同激活方差和使其具有相同梯度方差之间。这假设网络是不含非线性的链式矩阵乘法,据此推导得出。现实的神经网络显然会违反这个假设,但很多设计于线性模型的策略在其非线性对应中的效果也不错。

    Saxe等人推荐初始化为随机正交矩阵,仔细挑选负责每一层非线性缩放或增益因子 g g g。他们得到了用于不同类型的非线性激活函数的特定缩放因子。这种初始化方案也是启发于不含非线性的矩阵相乘序列的深度网络。在该模型下,这个初始化方案保证了达到收敛所需的训练迭代总数独立于深度。

    增加缩放因子 g g g将网络推向网络前向传播时激活范数增加,反向传播时梯度范数增加的区域。Sussillo表明,正确设置缩放因子足以训练深达1000层的网络,而不需要使用正交初始化。这种方法的一个重要观点是,在前馈网络中,激活和梯度会在每一步前向传播或反向传播中增加或缩小,遵循随机游走行为。这是因为前馈网络在每一层使用了不同的权重矩阵。如果该随机游走调整到保持范数,那么前馈网络能够很大程度地避免相同权重矩阵用于每层的梯度消失与爆炸问题。

    可惜,这些初始权重的最佳准则往往不会带来最佳效果。这可能有三种不同的原因。首先,我们可能使用了错误的标准——它实际上并不利于保持整个网络信号的范数。其次,初始化时强加的性质可能在学习开始进行后不能保持。最后,该标准可能成功提高了优化速度,但意外地增大了泛化误差。在实践中,我们通常需要将权重范围视为超参数,其最优值大致接近,但并不完全等于理论预测。

    数值范围准则的一个缺点是,设置所有的初始权重具有相同的标准差,例如 1 m \frac{1}{\sqrt{m}} m 1,会使得层很大时每个单一权重会变得极其小。Martens提出了一种被称为稀疏初始化(Sparse Initialization)的替代方案,每个单元初始化为恰好有 k k k个非零权重。这个想法保持该单元输入的总数量独立于输入数目 m m m,而不使单一权重元素的大小随 m m m缩小。稀疏初始化有助于实现单元之间在初始化时更具多样性。但是,获得较大取值的权重也同时被加了很强的先验。因为梯度下降需要很长时间缩小“不正确”的大值,这个初始化方案可能会导致某些单元出问题,例如Maxout单元有几个过滤器,互相之间必须仔细调整。

    如果计算资源允许,将每层权重的初始数值范围设为超参数通常是个好主意,如随机搜索,挑选这些数值范围。是否选择使用密集或稀疏初始化也可以设为一个超参数。作为替代,我们可以手动搜索最优初始范围。一个好的挑选初始数值范围的经验法则是观测单个小批量数据上的激活或梯度的幅度或标准差。如果权重太小,那么当激活值在小批量上前向传播于网络时,激活值的幅度会缩小。通过重复识别具有小得不可接受的激活值的第一层,并提高其权重,最终有可能得到一个初始激活全部合理的网络。如果学习在这点上仍然很慢,观测梯度的幅度或标准差可能也会有所帮助。这个过程原则上是自动的,且通常计算量低于基于验证集误差的超参数优化,因为它是基于初始模型在单批数据上的行为反馈,而不是在验证集上训练模型的反馈。由于这个协议很长时间都被启发式使用,最近Mishkin and Matas更正式地研究了该协议。

    目前为止,我们关注在权重的初始化上。幸运的是,其他参数的初始化通常更容易。设置偏置的方法必须和设置权重的方法协调。设置偏置为零通常在大多数权重初始化方案中是可行的。存在一些我们可能设置偏置为非零值的情况:

    • 如果偏置是作为输出单元,那么初始化偏置以获取正确的输出边缘统计通常是有利的。要做到这一点,我们假设初始权重足够小,该单元的输出仅由偏置决定。这说明设置偏置为应用于训练集上输出边缘统计的激活函数的逆。例如,如果输出是类上的分布,且该分布是高度偏态分布,第 i i i类的边缘概率由某个向量 c c c的第 i i i个元素给定,那么我们可以通过求解方程 softmax ( b ) = c \text{softmax}(b)=c softmax(b)=c来设置偏置向量 b b b。这不仅适用于分类器,也适用于其它的模型,例如自编码器和玻尔兹曼机。这些模型拥有输出类似于输入数据x的网络层,非常有助于初始化这些层的偏置以匹配 x x x上的边缘分布。
    • 有时,我们可能想要选择偏置以避免初始化引起太大饱和。例如,我们可能会将ReLU的隐藏单元设为0.1而非0,以避免ReLU在初始化时饱和。尽管这种方法违背不希望偏置具有很强输入的权重初始化准则。例如,不建议使用随机游走初始化。
    • 有时,一个单元会控制其他单元能否参与到等式中。在这种情况下,我们有一个单元输出 u u u,另一个单元 h ∈ [ 0 , 1 ] h\in[0,1] h[0,1],那么我们可以将 h h h视作门,以决定 u h ≈ 1 uh\approx1 uh1还是 u h ≈ 0 uh≈0 uh0。在这种情形下,我们希望设置偏置 h h h,使得在初始化的大多数情况下 h ≈ 1 h\approx 1 h1。否则, u u u没有机会学习。例如,Jozefowicz等人提议设置LSTM模型遗忘门的偏置为1。

    另一种常见类型的参数是方差或精确度参数。例如,我们用以下模型进行带条件方差估计的线性回归:
    p ( y ∣ x ) = N ( y ∣ x T x + b , 1 β ) p(y|x)=N(y|x^Tx+b, \frac{1}{\beta}) p(yx)=N(yxTx+b,β1)

    其中 β \beta β是精确度参数。通常我们能安全地初始化方差或精确度参数为1。另一种方法假设初始权重足够接近零,设置偏置可以忽略权重的影响,然后设定偏置以产生输出的正确边缘均值,并将方差参数设置为训练集输出的边缘方差。

    除了这些初始化模型参数的简单常数或随机方法,还有可能使用机器学习初始化模型参数。我们还可以用无监督模型训练出来的参数来初始化监督模型。我们也可以在相关问题上使用监督训练。即使是在一个不相关的任务上运行监督训练,有时也能得到一个比随机初始化具有更快收敛率的初始值。这些初始化策略有些能够得到更快的收敛率和更好的泛化误差,因为它们编码了模型初始参数的分布信息。其他策略显然效果不错的原因主要在于它们设置参数为正确的数值范围,或是设置不同单元计算互相不同的函数。

    更多相关内容
  • 主机的初始化方法初始化是指,将主机内的数据删除,恢复到购入时的状态。Nintendo Switch可以仅将一部分数据进行初始化初始化缓存与账号关联或发布截图和视频至社交平台时,将在主机中打开网页。初始化缓存将清除...

    主机的初始化方法

    初始化是指,将主机内的数据删除,恢复到购入时的状态。Nintendo Switch可以仅将一部分数据进行初始化。

    初始化缓存

    与账号关联或发布截图和视频至社交平台时,将在主机中打开网页。

    初始化缓存将清除在浏览网页过程中保存的ID、密码、Cookie、浏览记录等各种缓存数据。

    开始初始化

    选择主页菜单下方的“设置”→“主机”→“初始化”→“初始化缓存”。

    然后选择想要清除缓存的用户,根据画面指引操作即可。

    20191210142828-7789-15840.jpg

    20191210142707-7129-27228.jpg

    初始化键盘

    主机中的键盘系统会保存用户输入过的文字信息并形成记忆,在之后的输入过程中会提前预测或转换你想要输入的内容。

    这些键盘数据是根据用户来分别进行初始化的。

    开始初始化

    选择主页菜单下方的“设置”→“主机”→“初始化”→“初始化键盘”。

    然后选择想要清除缓存的用户,根据画面指引操作即可。

    20191210142828-7789-15840.jpg

    20191210142927-4672-91554.jpg

    初始化主机

    会删除所有软件数据、保存数据、截图和视频、用户数据等主机内存中储存的所有数据。

    主机初始化后,储存在microSD卡中的软件数据也将无法使用。

    如因主机出现问题想要还原出厂设置,建议“保留保存数据初始化” 而非整体初始化主机。

    请在有网络连接的环境下初始化主机

    如果没有网络连接的状态下进行初始化,本机的“随时游玩的主机”不会被解除。虽然初始化之后,在该主机首次登陆Nintendo e商店时会自动解除。但在解除前无法用你的账号将其他主机注册为“随时游玩的主机”。

    初始化主机之前请确认以下内容

    初始化后,主机内存中的数据将被全部删除,microSD卡中的数据也将无法使用。

    以下储存在主机内存中的数据也会被全部删除。

    软件数据

    保存数据

    截图/视频

    用户信息

    与微信帐号的关联

    账号 “随时游玩的主机” 的匹配(仅在有网络连接时)

    主机中的各种设置

    错误记录等数据

    储存在microSD卡中的软件数据将无法使用。

    但microSD卡中的截图和视频可以继续使用。

    即使进行初始化,以下项目也不会改变

    主机系统版本不会改变。

    已经关联到主机用户的账号不会被删除。

    关于重新下载软件数据

    Nintendo e商店的使用记录和余额将储存在账号中。在连接网络进行初始化之后,只要将账号与新的用户关联,即可从Nintendo e商店重新下载软件数据。

    无法下载时请确认是否有其他主机与账号匹配为“随时游玩的主机”。

    暂停或结束开放下载的软件无法重新下载。

    开始初始化

    选择主页菜单下方的“设置”→“主机”→“初始化”→“初始化主机”。

    20191210142828-7789-15840.jpg

    20191210143139-1095-30950.jpg

    保留保存数据初始化

    除了整体初始化主机外,还可以保留保存数据进行初始化。如因主机发生问题想要通过初始化还原出厂设置时,请先尝试这种方法。

    初始化时,除以下数据外,其他数据将被全部删除。

    保留的数据

    软件数据

    保存数据

    截图/视频

    用户信息

    与微信账号的关联

    账号“随时游玩的主机”的匹配(仅在有网络连接时)

    将无法使用microSD卡内的软件数据

    保留保存数据初始化后将无法使用储存在microSD卡中的软件数据。

    因会保留用户信息,所以无需重新设置与账号的关联,可直接从Nintendo e商店重新下载已删除的软件数据。

    储存于microSD卡内的截图和视频可以继续使用。

    暂停或结束开放下载的软件无法重新下载。

    开始初始化

    与其他初始化方法不同,需先进入特殊的维护模式。

    1、 关闭主机电源。

    2、按住音量键“+”和“-”(长按)的同时,再按一下电源键(不要松开音量键)即可进入维护模式。

    20191210143300-7517-31223.jpg

    3、选择“保留保存数据初始化”根据画面指引操作进行初始化。

    20191210143334-3774-82184.jpg

    以上是小编给大家带来的switch国行怎么初始化相关内容,希望对大家有帮助~

    48170.html

    48170.html

    48170.html

    48170.html

    发表评论:

    f6ed7cf3445aa1cf69180ddf7dbdd4b7.gif

    用户名:

    密码:

    匿名评论

    a6177dc9a13df653761a9bc7b48f7b3c.png

    评论

    人参与,条评论

    收藏(9)

    分享

    展开全文
  • 深度学习相关概念:权重初始化

    千次阅读 2022-03-19 15:10:42
    深度学习相关概念:权重初始化1.全零初始化(×)2.随机初始化2.1 高斯分布/均匀分布2.1.1权重较小—N(0,0.01)\pmb{\mathcal{N}(0,0.01)}N(0,0.01)​N(0,0.01)​​N(0,0.01)2.1.1权重较大—N(0,1\pmb{\mathcal{N}(0,...


      权重初始化(weight initialization)又称参数初始化,在深度学习模型训练过程的本质是对weight(即参数 W)进行更新,但是在最开始训练的时候是无法更新的,这需要每个参数有相应的初始值。在进行权重初始化后,神经网络就可以对权重参数w不停地迭代更新,以达到较好的性能。

    1.全零初始化(×)

      全零初始化是我们要避免的,它无法训练网络。因为全零初始化后,神经网络训练时,在反向传播时梯度相同,参数更新大学也一样,最后会出现输出层两个权值相同,隐层神经元参数相同,也就是说神经网络失去了特征学习的能力。通俗点说,把神经网络比作你在爬山,但身处直线形的山谷中,两边是对称的山峰。如果全零初始化,由于对称性,你所在之处的梯度只能沿着山谷的方向,不会指向山峰;你走了一步之后,情况依然不变。结果就是你只能收敛到山谷中的一个极大值,而走不到山峰上去。

    2.随机初始化

    2.1 高斯分布/均匀分布

      实验网络结构:10个隐层,1个输出层,每个隐层包含500个神经元,使用的双曲正切激活函数(tanh)。

    2.1.1权重较小— N ( 0 , 0.01 ) \pmb{\mathcal{N}(0,0.01)} N(0,0.01)N(0,0.01)N(0,0.01)

    在这里插入图片描述

    在这里插入图片描述

      除了前两层,后续所有层的激活值为0;此时,输入信息传递不到输出层;最终,网络得不到训练。小权重高斯初始化(小型网络中很常见),然而当网络越来越深的时候,会出现梯度消失的情况。

    2.1.1权重较大— N ( 0 , 1 ) \pmb{\mathcal{N}(0,1)} N(0,1)N(0,1)N(0,1)

    在这里插入图片描述

    在这里插入图片描述
      几乎所有的神经元都饱和了(不是-1就是1);前向传播时,神经元要么被抑制(0),要么被饱和(1)。此时,神经元局部梯度都是零,网络没有反向梯度流(梯度消失);最终,所有的参数得不到更新。

    2.1.3存在问题:

      随机初始化其实很难的,尝试太小的值,信息传不过去(2.1.1中权重分布都在0),值太大的时候梯度信息传递过去了,他们又进入了饱和区,梯度缺变成了0(2.1.2中权重不是1就是-1),虽然能让我的梯度传过来的每个成员的这个算的结果不一样,得出来的更新全值不一样但是很多时候能更新的机会都没有。在2.1.1的前项传播中,信息流消失;在2.1.2的反向传播中的梯度消失了,网络是没法训练的。

      那到底怎么应该初始化呢?

      有效的初始化方法:使网络各层的激活值和局部梯度方差在传播过程中尽量保持一致;以保持网络中正向和反向数据流动。

    2.2 Xavier初始化

    2.2.1 原理

      假设一个神经元, 其输入为 z 1 , z 2 , ⋯ z N z_{1}, z_{2}, \cdots z_{N} z1,z2,zN, 这 N N N 个输入是独立同分布的; 其权值为 w 1 , … … , w N w_{1}, \ldots \ldots, w_{N} w1,,wN, 它们也是独立同分布的,且 w w w z z z 是独立的; 其激活函数为 f f f; 其最终输出 y y y 的表达式:
    y = f ( w 1 ∗ z 1 + ⋯ + w N ∗ z N ) y=f\left(w_{1} * z_{1}+\cdots+w_{N} * z_{N}\right) y=f(w1z1++wNzN)
      基本思想: 使网络各层的激活值和局部梯度的方差在传 播过程中尽量保持一致, 即寻找 w w w 的分布使得输 出 y \mathrm{y} y 与输入 z z z 的方差一致.

      假设 f \pmb{f} fff 为双曲正切函数, w 1 , ⋯   , w N \pmb{w_{1}, \cdots, w_{N}} w1,,wNw1,,wNw1,,wN 独立同分布, z 1 , ⋯   , z N \pmb{z_{1}, \cdots, z_{N}} z1,,zNz1,,zNz1,,zN 独立同 分布, 随机变量w与 z z z 独立, 且均值都为 0 , 则有:
    Var ⁡ ( y ) = Var ⁡ ( ∑ i = 1 N w i z i ) = ∑ i = 1 N Var ⁡ ( w i z i ) = ∑ i N [ E ( w i ) ] 2 Var ⁡ ( z i ) + [ E ( z i ) ] 2 Var ⁡ ( w i ) + Var ⁡ ( w i ) Var ⁡ ( z i ) = ∑ i N Var ⁡ ( w i ) Var ⁡ ( z i ) = N Var ⁡ ( w i ) Var ⁡ ( z i ) \begin{aligned} \operatorname{Var}(y) &=\operatorname{Var}\left(\sum_{i=1}^{N} w_{i} z_{i}\right)=\sum_{i=1}^{N} \operatorname{Var}\left(w_{i} z_{i}\right) \\ &=\sum_{i}^{N}\left[E\left(w_{i}\right)\right]^{2} \operatorname{Var}\left(\mathrm{z}_{i}\right)+\left[E\left(z_{i}\right)\right]^{2} \operatorname{Var}\left(w_{i}\right)+\operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(z_{i}\right) \\ &=\sum_{i}^{N} \operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(z_{i}\right) \\ &=N\operatorname{Var}\left(\mathrm{w}_{i}\right) \operatorname{Var}\left(z_{i}\right) \end{aligned} Var(y)=Var(i=1Nwizi)=i=1NVar(wizi)=iN[E(wi)]2Var(zi)+[E(zi)]2Var(wi)+Var(wi)Var(zi)=iNVar(wi)Var(zi)=NVar(wi)Var(zi)
      当且仅当 var ⁡ ( w ) = 1 / N \pmb{\operatorname{var}(w)=1 / N} var(w)=1/Nvar(w)=1/Nvar(w)=1/N 时, y \pmb{y} yyy 的方差与 z \pmb{z} zzz 的方差一致。因此我们可以采用 N ( 0 , 1 / N ) \pmb{\mathcal{N}(0,1 / N)} N(0,1/N)N(0,1/N)N(0,1/N)的高斯分布,为输入神经元个数。

    2.2.2 N ( 0 , 1 / N ) \pmb{\mathcal{N}(0,1 / N)} N(0,1/N)N(0,1/N)N(0,1/N)高斯分布

      Xavier初始化可以帮助减少梯度消失的问题,使得信号在神经网络中可以传递得更深,在经过多层神经元后保持在合理的范围。每层神经元激活值的方差基本相同。符合正态分布,这样前向的信息流可以传递,反向传播梯度也可以更新。
    在这里插入图片描述

    2.2.3 Xavier初始化局限性

      Xavier初始化能够很好的 tanh 激活函数。但是对于目前最常用的 ReLU 激活函数,Xavier初始化表现的很差。
    在这里插入图片描述
      在较浅的层中效果还不错,但是随着神经网络层数的增加,权重趋势却是越来越接近0。

      那如何解决ReLU激活函数的初始化?

      采用恺明初始化(He 初始化)

    2.3 He 初始化(MSRA)

      He 初始化(MSRA)与Xavier初始化不同在哪里?

      Xavier初始化采用的是 N ( 0 , 1 / N ) \pmb{\mathcal{N}(0,1 / N)} N(0,1/N)N(0,1/N)N(0,1/N)高斯分布,He 初始化(MSRA)采用的是 N ( 0 , 2 / N ) \pmb{\mathcal{N}(0,2 / N)} N(0,2/N)N(0,2/N)N(0,2/N)高斯分布。

      He 初始化(MSRA)原理

      在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0(x负半轴中是不激活的),所以要保持variance不变,只需要在Xavier的基础上再除以2:
    在这里插入图片描述

    3.权重初始化总结

    1. 好的初始化方法可以防止前向传播过程中的信息消失,也可以解决反向传递过程中的梯度消失。

    2. 激活函数选择双曲正切或者Sigmoid时,建议使用Xaizer初始化方法

    3. 激活函数选择ReLU或Leakly ReLU时,推荐使用He初始化方法

    展开全文
  • TensorFlow-Keras 3.常见参数初始化方法

    千次阅读 2020-09-28 16:12:43
    上篇文章自定义 metrics 用到了 add_weights 方法,这个方法会初始化一个变量,维度不定。下面就常见的初始化方法,进行介绍。

    上篇文章自定义 metrics 用到了 add_weights 方法,这个方法会初始化一个变量,维度不定。参数初始化的选择,对后续的模型迭代效果与收敛速度都有一定影响。下面看下 Keras 有哪些常见的初始化方法:

    Tips:

    自定义 metrics 用到的 add_weight 并调用 initializer 初始化函数:

    class CategoricalTruePositives(keras.metrics.Metric):
        def __init__(self, name="categorical_true_positives", **kwargs):
            super(CategoricalTruePositives, self).__init__(name=name, **kwargs)
            self.true_positives = self.add_weight(name="ctp", initializer="zeros")
            # 也可以调整shape一次计算多个指标
            self.b = self.add_weight(name="b",initializer="random_uniform")

    常见的 keras 参数初始化方法:

    常见初始化方法
    初始化方法参数
    正态化的Glorot初始化glorot_normal
    标准化的Glorot初始化glorot_uniform
    正态化的he初始化he_normal
    标准化的he初始化he_uniform
    正态化的lecun初始化lecun_normal
    标准化的lecun初始化lecun_uniform
    截断正态分布 truncated_normal
    标准正态分布random_normal
    均匀分布 random_uniform

    一.常见初始化函数与分布图

    首先编写一个简单模型,并初始化其参数,然后 get_weights 并 plot 查看初始化参数的分布,这里接受 initial 参数并传给参数初始化,可以把上述常见初始化方法直接传入函数即可。这里 Dense 层 kernel 参数共有 50000 x 100 = 5000000 个:

        def getDenseWeights(initial):
            inputs = layers.Input(shape=(100,), name='input')
            d1 = layers.Dense(50000, activation='sigmoid', name='dense1',kernel_initializer=initial)(inputs)
            output = layers.Dense(7, activation='sigmoid', name='output')(d1)
            model = keras.Model(inputs=inputs, outputs=output)
            # 100 x 500
            w_dense1 = np.array(model.get_layer('dense1').get_weights()[0]).reshape(-1) # 获取dense1层的参数
            n, bins, patches = plt.hist(w_dense1,bins=1000)
            plt.title(initial)
            plt.xlabel('data range')
            plt.ylabel('probability')
            plt.show()

    直接输入上述初始化方法名称即可: 

        getDenseWeights("glorot_normal")

    1.正态化的Glorot初始化——glorot_normal

    keras.initializers.glorot_normal(seed=None)
    

    Glorot 正态分布初始化器,也称为 Xavier 正态分布初始化器。

    它从以 0 为中心,标准差为 stddev = sqrt(2 / (fan_in + fan_out)) 的截断正态分布中抽取样本, 其中 fan_in 是权

    值张量中的输入单位的数量, fan_out 是权值张量中的输出单位的数量。

    2. 标准化的Glorot初始化——glorot_uniform

    keras.initializers.glorot_uniform(seed=None)
    

    Glorot 均匀分布初始化器,也称为 Xavier 均匀分布初始化器。

    它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(6 / (fan_in + fan_out)), fan_in 是权值张量中的

    输入单位的数量, fan_out 是权值张量中的输出单位的数量。

    3.正态化的he初始化——he_normal 

    keras.initializers.he_normal(seed=None)
    

    He 正态分布初始化器。

    它从以 0 为中心,标准差为 stddev = sqrt(2 / fan_in) 的截断正态分布中抽取样本, 其中 fan_in 是权值张量中的输入

    单位的数量。

    4.标准化化的he初始化——he_uniform

    keras.initializers.he_uniform(seed=None)
    

    He 均匀方差缩放初始化器。

    它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(6 / fan_in), 其中 fan_in 是权值张量中的输入单位的

    数量。

    5.正态化的lecun初始化——lecun_normal

    keras.initializers.lecun_normal(seed=None)
    

    LeCun 正态分布初始化器。

    它从以 0 为中心,标准差为 stddev = sqrt(1 / fan_in) 的截断正态分布中抽取样本, 其中 fan_in 是权值张量中的输入

    单位的数量。

    6.标准化的lecun初始化——lecun_uniform

    keras.initializers.lecun_uniform(seed=None)
    

    LeCun 均匀初始化器。

    它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(3 / fan_in), fan_in 是权值张量中的输入单位的数

    量。

    7.截断正态分布 -- truncated_normal

    keras.initializers.TruncatedNormal(mean=0.0, stddev=0.05, seed=None)
    

    这个初始化方法是 tensorflow 的默认初始化方法,按照截尾正态分布生成随机张量的初始化器。

    生成的随机值与 RandomNormal 生成的类似,但是在距离平均值两个标准差之外的随机值将被丢弃并重新生成。这是用来生成

    神经网络权重和滤波器的推荐初始化器。

    参数

    • mean: 一个 Python 标量或者一个标量张量。要生成的随机值的平均数。
    • stddev: 一个 Python 标量或者一个标量张量。要生成的随机值的标准差。
    • seed: 一个 Python 整数。用于设置随机数种子。

    8.标准正态分布——random_normal

    keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)
    

    标准正太分布,这个都比较熟悉了。

    参数

    • mean: 一个 Python 标量或者一个标量张量。要生成的随机值的平均数。
    • stddev: 一个 Python 标量或者一个标量张量。要生成的随机值的标准差。
    • seed: 一个 Python 整数。用于设置随机数种子。

    9.均匀分布——random_uniform

    keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None)
    

    参数 

    • minval: 一个 Python 标量或者一个标量张量。要生成的随机值的范围下限。
    • maxval: 一个 Python 标量或者一个标量张量。要生成的随机值的范围下限。默认为浮点类型的 1。
    • seed: 一个 Python 整数。用于设置随机数种子。

    二.用initializers初始化参数

    上面展示的初始化方法都使用了默认的函数名传入,无法控制 mean, std, limit 等参数,如果想要输入非默认的参数,可以采用如下形式,以 mean = 5 ,std = 3 的标准正态分布为例: 

    init = keras.initializers.RandomNormal(mean=5, stddev=3, seed=None)
    
    def getDenseWeights(init):
        inputs = layers.Input(shape=(100,), name='input')
        d1 = layers.Dense(50000, activation='sigmoid', name='dense1',kernel_initializer=init)(inputs)
        output = layers.Dense(7, activation='sigmoid', name='output')(d1)
        model = keras.Model(inputs=inputs, outputs=output)

    参数换成对应的 initializers 

    三.自定义方式初始化参数

    除了使用Api给出的方法外,也可以调用其他方法,自定义参数。自定义参数需要遵循如下条件,如果传递一个自定义的可调用函数,那么它必须使用参数 shape(需要初始化的变量的尺寸)和 dtype(数据类型):

    1.Api方法

        def api_init(shape, dtype=None):
            return K.random_normal(shape, dtype=dtype)

    把 api_init 传给 getDenseWeights 即可。

    2.DIY

    有 50000 x 100 共 5000000 个参数,我比较任性,就想传 0 - 4999999 作为初始化参数怎么办:

        def my_init(shape,dtype=None):
            num = np.prod(shape)
            arr = np.array(range(0,num))
            return arr.reshape(shape)

    同理,传给 getDenseWeights :

        def getDenseWeights(initial):
            inputs = layers.Input(shape=(100,), name='input')
            d1 = layers.Dense(50000, activation='sigmoid', name='dense1',kernel_initializer=my_init)(inputs)
            output = layers.Dense(7, activation='sigmoid', name='output')(d1)
            model = keras.Model(inputs=inputs, outputs=output)
            # 100 x 500
            w_dense1 = np.array(model.get_layer('dense1').get_weights()[0]).reshape(-1) # 获取dense1层的参数
            plt.plot(np.array(range(0,5000000)),w_dense1)
            plt.title(initial)
            plt.savefig("hist/{}".format(initial))
            plt.show()
    
    
        getDenseWeights("my_init")

    这里就不画分布图了,只是演示一下怎么 diy ,如果想复用训练好的参数,在构建模型的时候,也可以调用 layer 的 set_weight 方法初始化参数,这里就不多赘述了。

    参数初始化还有很多生成方法与生成方式,这里并不代表全部,更多初始化方法可以查看参数初始化-keras中文文档

    展开全文
  • 如果你不想一步一步清理时,就可以直接初始化电脑,简单方便。下文就为大家介绍了win7电脑怎么初始化系统的详细步骤。电脑初始化系统方法/步骤:1.打开win7系统中的控制面板界面,直接选择“系统和安全”选项进入。2...
  • ibm v3500初始化工具

    2015-01-10 17:12:08
    ibm v3500初始化工具(InitTool工具)
  • C语言数组初始化及malloc初始化

    千次阅读 2021-05-06 20:39:20
    数组赋值初始化的三个方式 1、{0} 初始化 例如: int nums[3] = {0}; 但是经常出现的是给定长度(变量)然后需要进行初始化,如果写成下式: int main(){ int numsSize=0; scanf("%d",&numsSize); int ...
  • c语言结构体数组初始化

    千次阅读 2021-05-22 13:03:19
    有关结构体数组初始化的问题struct _m_usmart_nametab usmart_nametab[]={#if USMART_USE_WRFUNS==1 //如果使能了读写操作(void*)read_addr,"u32 read_addr(u32 addr)",(void*)write_addr,"void write_addr(u32 addr...
  • Java类的初始化、变量的初始化

    万次阅读 2018-06-02 15:21:23
    Java类的初始化、变量的初始化知识点Java常量, final 修饰,值被设定后不能再被修改静态变量里, static 修饰,顾名思义,无须创建对象,便可在内存中申请一个存储空间进行存储成员变量, 也称实例变量,它随着当前...
  • C语言中变量未初始化的处理

    千次阅读 2022-02-11 10:44:46
    字符指针默认null) 局部未初始化变量有时设置随机值或者默认值 实例测试3--VS2013环境: 总结3: VS2013环境,全局未初始化变量设置默认值(int类型默认0,指针默认null) 局部未初始化变量只定义不使用(警告);...
  • 文章目录标准初始化方法形式激活值和梯度特性实验Xavier初始化形式满足Glorot条件的初始化激活值和梯度特性实验Xavier初始化的缺点 Understanding the difficulty of training deep feedforward neural networks by ...
  • C#数组初始化

    千次阅读 2020-12-23 15:46:21
    C#的数组初始化是在声明数组时将初始值放在大括号({})之内。如果没有指定初始值,则数组成员将自动初始化为该数组类型的默认初始值。请阅读数组的属性。如果将数组声明为某类型的字段,则当实例化该类型时它将被设置...
  • 结构体数组初始化

    千次阅读 2021-03-17 15:24:52
    《代码大全》建议在变量定义的时候进行初始化,但是很多人,特别是新人对结构体或者结构体数组定义是一般不会初始化,或者不知道怎么初始化。 1、初始化 typedef struct _TEST_T { int i; char c[10]; }TEST_T; TEST...
  • 文章目录类加载机制类加载机制分类、类加载器、双亲委派机制类加载机制分类类加载器双亲委派机制加载.class文件的方式类生命周期类生命周期结束类加载过程JVM初始化步骤类加载时机类初始化时机类的初始化类的实例化 ...
  • Java初始化HashMap

    千次阅读 2021-02-08 07:41:12
    在本教程中,我们将学习在Java中初始化HashMap的各种方法。 2.静态HashMap的静态初始化器 我们可以使用静态代码块初始化HashMap: public static Map<String, String> articleMapOne; static { ...
  • Java 初始化 List 的几种方法

    千次阅读 2022-04-09 01:06:04
    最常见的初始化 List 方法为: List<String> languages = new ArrayList<>(); languages.add("Java"); languages.add("PHP"); languages.add("Python"); System.out.println(languages); 但是实际上...
  • 在AirtestIDE1.2.13版本中,我们新增了1个 **安卓手机设置初始化的功能** (以下简称手机初始化功能),能够在手机已经打开 `USB调试`、且已安装 `PocoService` 的前提下,**自动** 进行一些手机相关设置项的自动...
  • Java变量的初始化

    千次阅读 2021-03-08 17:33:43
    Java变量默认值Java变量的初始化,如果不赋值,将会有个默认值,对于基本类型,比如int,long是0, boolean 是false等,引用类型如果不设置,将会是null.package variable.initialize;public class Test {int intAge;...
  • mysql 配置 初始化

    千次阅读 2021-03-04 01:12:12
    初始化1.mysql初始化mysqld --initialize-insecure -- mysql -u rootset password =password('123456');2.修改端口后登入mysql -P3396 -uroot -p 3.允许mysql远程登入mysql -u root -pmysql>use mysql;mysql>...
  • 如何初始化mysql数据库

    千次阅读 2021-01-18 23:01:21
    匿名用户1级2016-10-29 回答一、mysql_install_db说明当MySQL的系统库(mysql系统库)发生故障或需要新加一个mysql实例时,需要初始化mysql数据库。需要使用的命令:/usr/local/mysql/bin/mysql_install_db#/usr/local...
  • 在pytorch中,有自己默认初始化参数方式,所以在你定义好网络结构以后,不进行参数初始化也是可以的。 1.Conv2d继承自_ConvNd,在_ConvNd中,可以看到默认参数就是进行初始化的,如下图所示 2.torch.nn.B...
  • C语言数组如何初始化

    千次阅读 2021-02-01 01:24:55
    1.一维数组的初始化1.1 未初始化的一维数组一维数组的成员在没有初始化时,数组成员的值都是未知的,一旦访问到未知的值,可能导致不可预料的情况,严重时可以导致软件运行异常。下面,将没有初始化的数组对应的值打印1. ...
  • 服务器初始化

    千次阅读 2021-08-09 15:30:10
    服务器初始化后(Ubuntu 20.04),创建了一个新的账户,创建命令如下: adduser Ant # 创建新用户Ant passwd Ant # 设置Ant账户的密码,然后输入密码即可 赋予Ant账号sudo权限 在root账户下,输入如下命令: ...
  • 用Java初始化HashSet

    千次阅读 2021-02-28 08:43:17
    以下是我们可以用Java初始化HashSet的方法。使用构造函数-将集合传递给构造函数以初始化HashSet。使用addAll()-将集合传递给Collections.addAll()以初始化HashSet。使用unmodifiableSet()-将集合传递给Collections....
  • 初始化神经网络权重的方法总结

    千次阅读 2020-11-01 11:06:28
    在本文中,评估了权值初始化的许多方法和当前的最佳实践 零初始化 将权值初始化为零是不行的。那我为什么在这里提到它呢?要理解权值初始化的需要,我们需要理解为什么将权值初始化为零是无效的。 让我们考虑一个...
  • C语言结构体初始化的几种方法

    千次阅读 多人点赞 2021-06-02 09:26:46
    二、常规初始化(先定义再初始化) typedef struct { int bandrate; int databits; int stopbits; int parity; int dtr; }serial_hard_config_def; serial_hard_config_def serial; serial.bandrate = 115200;...
  • SpringBoot项目中的容器初始化过程

    千次阅读 2022-04-13 17:29:44
    容器初始化及SpringBean加载详细过程 1. 创建Spring容器 2. 获取异常报告器 3. 准备Spring容器 4. 刷新Spring容器 启动内置Tomcat容器
  • Java Set的初始化方法

    千次阅读 2021-02-26 16:40:43
    定义了一个Set后,我想把它初始化一下.方法一. 利用了add函数, 如下:public static void main(String[] args) {Set testSet = new HashSet();testSet.add("Monday");testSet.add("Sunday");System.out.println...
  • MySQL 5.7初始化

    千次阅读 2022-01-30 20:24:30
    若要通过创建数据目录并在MySQL系统数据库中填充表来初始化MySQL安装,请使用以下任何一种方法初始化MySQL--initialize或--initialize-insecure。 初始化数据目录 如果使用noinstall包,您可能需要初始化数据目录: ...
  • 【c++】对象初始化

    千次阅读 2022-04-16 22:11:22
    1. 默认初始化 2.零初始化 3.值初始化 4.直接初始化 5.复制初始化 6.聚合初始化 7.列表初始化 C++类型大致分为: 标量: int; float; char; bool; enum; void,nullptr_t; 指针;引用 复合体:数组;union;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,126,730
精华内容 2,050,692
关键字:

初始化