首页 > 其他分享 >深度模型中的优化 - 参数初始化策略篇

深度模型中的优化 - 参数初始化策略篇

时间:2024-07-29 20:56:47浏览次数:15  
标签:初始化 权重 模型 参数 初始 深度 单元

序言

在深度模型优化中,参数初始化策略是决定模型性能与训练效率的重要基石。恰当的初始化不仅能加速模型的收敛过程,还能有效缓解梯度消失与爆炸等问题,从而提升模型的泛化能力。随着深度学习技术的飞速发展,研究者们不断探索与提出各类参数初始化方法,旨在针对不同模型结构和数据特性,找到最优的初始化策略。

参数初始化策略

  • 有些优化算法本质上是非迭代的,只是求解一个解点。其他有些优化算法本质上是迭代的,但是应用于这一类的优化问题时,能和初始值无关地在可接受的时间内收敛到可接受的解。
  • 深度学习训练算法通常没有这两种奢侈的性质。
    • 深度学习模型的训练算法通常是迭代的,因此要求使用者指定一些开始迭代的初始点。
    • 此外,训练深度模型是一个足够困难的问题,以至于大多数算法都很大程度地受到初始化选择的影响。
    • 初始点能够决定算法是否收敛,有些初始点十分不稳定,使得该算法会遭遇数值困难,并完全失败。
    • 当学习收敛时,初始点可以决定学习收敛得多块,以及是否收敛到一个损失高或低的点。
    • 此外,差不多损失的点可以具有区别极大的泛化误差,初始点也可以影响泛化。
  • 现代的初始化策略是简单的,启发式的。
    • 设定改进的初始化策略是一项困难的任务,因为神经网络优化至今还未被很好理解。
    • 大多数初始化策略基于在神经网络初始化时实现一些很好的性质。
    • 然而,我们并没有很好地理解这些性质中的哪些会在学习开始进行后的哪些情况下得以保持。
    • 进一步的难点是,有些初始点从优化的观点看或许是有利的,但是从泛化的观点看是不利的。
    • 我们对于初始点如何影响泛化的理解是相当原始的,几乎没有提供如何选择初始点的任何指导。
  • 也许完全确知的唯一特性是初始参数需要在不同单元间“破坏对称性”
    • 如果具有相同激励函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。
    • 如果它们具有相同的初始参数,然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。
    • 即使模型或训练算法能够使用随机性为不同的单元计算不同的更新(例如具备信息丢失的训练),通常来说,最好还是初始化每个单元使其和其他单元计算不同的函数。
    • 这或许有助于确保没有输入模式丢失在前向传播的零空间中,没有梯度模式丢失在反向传播的零空间中。
    • 每个单元计算不同函数的目标促使了参数的随机初始化。
    • 我们可以明确地搜索一大组彼此互不相同的基函数,但这经常会导致明显的计算代价。
    • 例如,如果我们有和输出一样多的输入,我们可以使用 Gram-Schmidt \text{Gram-Schmidt} Gram-Schmidt正交化于初始的权重矩阵,保证每个单元计算彼此非常不同的函数。
    • 在高维空间上使用高熵分布来随机初始化,计算代价小并且不太可能分配单元计算彼此相同的函数。
  • 通常情况下,我们可以为每个单元的偏置设置启发式挑选的常数,仅随机初始化权重。额外的参数——例如编码预测条件方差的参数——通常和偏差一样设置为启发式选择的常数。
  • 我们几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。高斯或均匀分布的选择似乎不会有很大的差别,但也没有被详尽地研究。然而,初始分布的大小确实对优化过程的结果和网络泛化能力都有很大的影响。
  • 更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元。
    • 它们也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。
    • 如果初始权重太大,那么会在前向传播或反向传播中产生爆炸的值。
    • 在循环网络中,很大的权重也可能导致混乱(chaos)(对于输入中很小的扰动非常敏感,导致确定性前向传播过程表现随机)。
    • 在一定程度上,梯度爆炸问题可以通过梯度截断来缓解(执行梯度下降步骤之前设置梯度的阈值)。
    • 较大的权重也会产生使得激励函数饱和的值,导致饱和单元的梯度完全丢失。这些竞争因素决定了权重的理想初始大小。
  • 关于如何初始化网络,正则化优化有非常不同的视角。
    • 优化视角建议权重应该足够大以成功传播信息,但是正则化希望其小一点。
    • 诸如随机梯度下降这类对权重较小的增量更新,趋于停止在更靠近的初始参数的区域(不管是由于卡在低梯度的区域,还是由于触发了基于过拟合的提前停止准则)的优化算法倾向于最终参数应接近于初始参数。
    • 回顾提前终止篇,在某些模型上,提前停止的梯度下降等价于权重衰减。
    • 在一般情况下,提前停止的梯度下降和权重衰减不同,但是提供了一个宽松的类比去考虑初始化的影响。
    • 我们可以将初始化参数 θ \boldsymbol{\theta} θ为 θ 0 \boldsymbol{\theta}_0 θ0​类比于强置均值为 θ 0 \boldsymbol{\theta}_0 θ0​的高斯先验 p ( θ ) p(\boldsymbol{\theta}) p(θ)。
    • 从这个角度来看,选择 θ 0 \boldsymbol{\theta}_0 θ0​接近 0 0 0是有道理的。
    • 这个先验表明,单元间彼此互不交互比交互更有可能。
    • 只有在目标方程的似然项表达出对交互很强的偏好时,单元才会交互。
    • 另一方面,如果我们初始化 θ 0 \boldsymbol{\theta}_0 θ0​为很大的值,那么我们的先验指定了哪些单元应互相交互,以及它们应如何交互。
  • 有些启发式方法可用于选择权重的初始大小。一种初始化 m m m个输入和 n n n输出的全连接层的权重的启发式方法是从分布 U ( − 1 m , 1 m ) U(-\frac{1}{\sqrt{m}},\frac{1}{\sqrt{m}}) U(−m ​1​,m ​1​)中采样权重,而Glorot et al. (2011a) 建议使用标准初始化(normalized initialization):
    W i , j ∼ U ( − 6 m + n , 6 m + n ) W_{i,j}\sim U\left(-\sqrt{\frac{6}{m+n}},\sqrt{\frac{6}{m+n}}\right) Wi,j​∼U(−m+n6​ ​,m+n6​ ​) — 公式1 \quad\textbf{---\footnotesize{公式1}} —公式1
  • 这后一种启发式方法初始化所有的层,折衷于使其具有相同激励方差和使其具有相同梯度方差之间。
    • 该式由不含非线性的链式矩阵乘法网络的假设推导得出。
    • 现实的神经网络显然会违反这个假设,但很多设计于线性模型的策略在其非线性对应中效果也不错。
  • Saxe et al. (2013) 建议初始化随机正交矩阵,仔细挑选负责每一层非线性缩放或增益(gain)因子 g g g。
    • 他们得到了用于不同类型非线性激励函数的特定缩放因子。
    • 这种初始化方案也是受启发于不含非线性的矩阵相乘序列的深度网络。
    • 在该模型下,这个初始化方案保证了达到收敛所需的训练迭代总数独立于深度。
  • 增加缩放因子 g g g将网络推向网络前向传播时激励范数增加,反向传播时梯度范数增加的区域。
    • Sussillo (2014) 表明,正确设置缩放因子足以训练深达 1000 1000 1000层的网络,不需要使用正交初始化。
    • 这种方法的一个重要观点是,在前馈网络中,激励和梯度会在每一步前向或反向传播中增加或缩小,遵循随机游动行为。
    • 这是因为前馈网络在每一层使用了不同的权重矩阵。
    • 如果该随机游动调整到保持范数,那么前馈网络能够很大程度地避免相同权重矩阵用于每层的梯度消失和爆炸问题,如神经网络优化中的挑战篇所述。
  • 不幸的是,这些初始权权重的最佳准则往往不会带来最佳效果。这可能有三种不同的原因。
    • 首先,我们可能使用了错误的标准——它实际上并不能有利于保持整个网络信号的范数。
    • 其次,初始化时强加的性质可能在学习开始进行后不能保持。
    • 最后,该标准可能成功提高了优化速度,但意外地增大了泛化误差。在实践中,我们通常需要将权重范围视为超参数,其最优值大致接近,但并不完全等于理论预测。
  • 数值范围准则的一个缺点是,设置所有的初始权重具有相同的标准差,例如 1 m \frac{1}{\sqrt{m}} m ​1​,会使得层很大时每个单一权重会变得极其小。
    • Martens(2010)提出了一种被称为稀疏初始化(sparse initialization) 的替代方案,每个单元初始化为恰好有 k k k个非零权重。
    • 这个想法保持该单元输入的总数量独立于输入数目 m m m,而不使单一权重元素的大小随 m m m缩小。
    • 稀疏初始化有助于实现单元之间在初始化时更具多样性。
    • 但是,它也非常偏好于具有很大高斯值的权重。
    • 因为梯度下降需要很长时间缩小”不正确“的大值,这个初始化方案可能会导致单元问题,例如 maxout \text{maxout} maxout单元有几个过滤器,必须互相之间仔细调整。
  • 计算资源允许的话,将每层权重的初始数值范围设为超参数通常是个好主意,使用篇章:实用方法- 选择超参数介绍的超参数搜索算法,如随机搜索,挑选这些数值范围。
    • 是否选择使用密集或稀疏初始化也可以设为一个超参数。
    • 替代地,我们可以手动搜索最优初始范围。
    • 一个好的挑选初始数值范围的经验法则是观测单个 minibatch \text{minibatch} minibatch数据上的激励或梯度的范围或标准差。
    • 如果权重太小,那么当激励值在 minibatch \text{minibatch} minibatch上前向传播于网络时,激励值的范围会缩小。
    • 通过重复识别具有不可接受的激励小值的第一层,并提高其权重,最终有可能得到一个全部都是合理初始激励的网络。
    • 如果学习在这点上仍然很慢,观测下梯度的范围或标准差可能也会有所帮助。
    • 这个过程原则上是自动的,且通常计算量低于基于验证集误差的超参数优化,因为它是基于初始模型在单批数据上的行为反馈,而不是在验证集上训练模型的反馈。
    • 由于这个协议很长时间都被启发式使用,最近Mishkin and Matas (2015)更正式地确定,研究了该协议。
  • 目前为止,我们关注在权重的初始化上。幸运的是,其他参数的初始化通常更容易。
  • 设置偏置的方法必须和设置权重的方法协调。设置偏置为零通常在大多数权重初始化方案中是可行的。有些我们可能设置偏置为非零值的情况:
    • 如果偏置是作为输出单元,那么初始化偏置以获取正确的输出边缘统计通常是有利的。
      • 要做到这一点,我们假设初始权重足够小,该单元的输出仅由偏置决定。
      • 这说明设置偏置为应用于训练集上输出边缘统计的激励函数的逆。
      • 例如,如果输出是类上的分布,且该分布是高度偏态分布,第 i i i类的边缘概率由某个向量 c \boldsymbol{c} c的第 i i i个元素给定,那么我们可以通过求解方程 softmax ( b ) = c \text{softmax}(\boldsymbol{b}) = \boldsymbol{c} softmax(b)=c 来设置偏置向量 b \boldsymbol{b} b。
      • 这不仅适用于分类器,也适用于我们将在后续篇章遇到的模型,例如自编码器和波尔兹曼机。
      • 这些模型拥有输出类似于输入数据 x \boldsymbol{x} x的网络层,非常有助于初始化这些层的偏置以匹配 x \boldsymbol{x} x上的边缘分布。
    • 有时,我们可能想要选择偏置以避免初始化引起太大饱和。例如,我们可能会将 ReLU \text{ReLU} ReLU的隐藏单元设为 0.1 0.1 0.1而非 0 0 0,以避免 ReLU \text{ReLU} ReLU在初始化时饱和。尽管这种方法不符合不希望偏置具有很强输入的权重初始化准则。例如,不建议使用随机游走初始化 (Sussillo, 2014)。
    • 有时,一个单元会控制其他单元能否参与到方程中。
      • 在这种情况下,我们有一个单元输出 u u u,另一个单元 h ∈ [ 0 , 1 ] h\in[0,1] h∈[0,1],那么我们可以将 h h h视作闸门,以决定 u h ≈ 1 uh ≈ 1 uh≈1还是 u h ≈ 0 uh ≈ 0 uh≈0。
      • 在这种情形下,我们希望设置偏置 h h h,使得在初始化的大多数情况下 h ≈ 1 h ≈ 1 h≈1。
      • 否则, u u u没有机会学习。
      • 例如, Jozefowicz et al. (2015) 提议设置 LSTM \text{LSTM} LSTM模型遗忘门的偏置为 1 1 1,如篇章:序列建模之循环和递归网络 - 长短期记忆和其他门控 RNN \text{RNN} RNN所述。
  • 另一种常见类型的参数是方差或精度参数。例如,我们用以下模型进行带条件方差估计的线性回归:
    p ( y ∣ x ) = N ( y ∣ w ⊤ x + b , 1 / β ) p(y\mid\boldsymbol{x})=\mathcal{N}(y\mid\boldsymbol{w}^\top\boldsymbol{x}+b,1/\beta) p(y∣x)=N(y∣w⊤x+b,1/β) — 公式2 \quad\textbf{---\footnotesize{公式2}} —公式2
    • 其中 β \beta β是精确度参数。
    • 通常我们能安全地初始化方差或精确度参数为 1 1 1。
    • 另一种方法假设初始权重足够接近零,设置偏置可以忽略权重的影响,然后设定偏置以产生输出的正确边缘均值,并设置训练集输出的边缘方差的方差参数。
  • 除了这些初始化模型参数的简单固定或随机方法,还有可能使用机器学习初始化模型参数。
    • 深度学习研究讨论的常用策略是初始化监督模型的参数为无监督模型训练于相同的输入上学习出的参数。
    • 我们也可以在相关问题上使用监督训练。
    • 即使是运行监督训练在一个不相关的任务上,有时也能得到一个比随机初始化具有更快收敛率的初始值。
    • 这些初始化策略有些能够得到更快的收敛率和更好的泛化误差,因为它们编码了模型初始参数分布的信息。
    • 其他策略显然效果不错的原因主要在于它们设置参数为正确的数值范围,或是设置不同单元计算互相不同的函数。

总结

深度模型优化中的参数初始化策略丰富多样,主要包括随机初始化、 Xavier \text{Xavier} Xavier初始化、 He \text{He} He初始化等经典方法。随机初始化简单直观,但可能因参数分布不当导致训练不稳定; Xavier \text{Xavier} Xavier初始化通过考虑输入输出神经元数量来平衡激活值和梯度的方差,适用于 tanh \text{tanh} tanh等激活函数;而 He \text{He} He初始化则针对 ReLU \text{ReLU} ReLU等非线性激活函数进行优化,通过调整方差来保持前向传播时激活值的稳定,有效提升了模型收敛速度。此外,还有预训练初始化等策略,利用已训练模型的知识来指导新模型的参数设置,进一步提升了优化效果。综上所述,选择合适的参数初始化策略对于深度模型的优化至关重要,需要根据实际情况灵活应用。

往期内容回顾

深度学习中的正则化技术 - 提前终止篇
深度模型中的优化 - 神经网络优化中的挑战篇

标签:初始化,权重,模型,参数,初始,深度,单元
From: https://blog.csdn.net/benny_zhou2004/article/details/140701447

相关文章

  • 线程参数传递 同一个结构体指针,并且要传递id(0-xx)的方法
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、代码示例?总结前言提示:这里可以添加本文要记录的大概内容:线程参数传递同一个结构体指针,并且要传递id(0-xx)的方法在创建线程时候可能会遇到不仅要传递全局唯一的结构体指针给线程,还......
  • 织梦DedeCMSv5.7安装初始化数据体验包失败的解决方法
    有些朋友在安装织梦DEDECMS程序时,安装初始化数据体验包失败,因为体验包数据比较大,网络不好的时候很容易失败,下面是一种比较保险的初始化数据体验包安装方法.1、先安装一个全新的DedeCMSv5.7GBK程序,安装时不要勾选安装初始化体验包.2、下载数据体验包(dedecmsv5.6与V5.7通......
  • 深度学习与图像识别day5(机器学习基础)
    线性问题主要处理回归问题,回归问题即预测一个连续问题的数值。计算决定系数(R-squared,也称为R²或系数决定)是衡量回归模型预测准确性的一个常用指标。R-squared值越接近1,表示模型的预测性能越好;如果R-squared值为0,则表示模型只是简单地预测了目标变量的平均值;如果R-squared值为负,......
  • React 的 KeepAlive 实战指南:深度解析组件缓存机制
    Vue的Keep-Alive组件是用于缓存组件的高阶组件,可以有效地提高应用性能。它能够使组件在切换时仍能保留原有的状态信息,并且有专门的生命周期方便去做额外的处理。该组件在很多场景非常有用,比如:·tabs缓存页面·分步表单·路由缓存在Vue中,通过KeepAlive包裹内的组件......
  • Java 启动参数最全详解
    Java启动参数最全详解!在Java开发中,发布JAR文件是一个常见的操作。合理设置启动参数可以确保应用程序在不同环境中正常运行,并优化性能。本文将详细介绍所有可能的启动参数,以及它们的使用场景、设置建议和具体示例。一、JAR文件基础JAR(JavaArchive)文件用于打包Java......
  • 函数 动态参数
    #固定参数+动态位置参数defmy_function(a,b,*args):print(a)print(b)print(args)my_function(1,'c',1,2,3,4,5,6)#输出#1#固定位第一个占位符#c#固定位第二个占位符#(1,2,3,4,5,6)#剩下的部分#可变关键词参数defmy_funciton2(a,b,......
  • 既时聊天交友语聊软件开发的深度剖析:逻辑性与用户导向的并重
    在当今互联网技术的蓬勃发展中,聊天交友语聊软件已成为连接人与人之间情感与信息的桥梁,其独特的即时互动性和丰富的社交场景,深刻影响着现代人的生活方式。本文旨在深入探讨这类软件的开发过程,特别是如何融合深度思考与逻辑性,以满足日益多元化的用户需求。一、用户需求的深度洞察......
  • 深度解析ChatGPT-4的最新能力与功能
    深度解析ChatGPT-4的最新能力与功能在现代科技的不断进步下,人工智能(AI)技术正在以前所未有的速度发展。而其中,OpenAI的ChatGPT-4(简称GPT-4)作为自然语言处理领域的代表性产品,其最新的能力和功能更是备受瞩目。在这篇博客中,我们将详细分析ChatGPT-4的最新能力和功能,并探讨其在......
  • 深度优先搜索
    树和图的框架#include<iostream>#include<algorithm>usingnamespacestd;constintN=10010;inth[N],e[N],ne[N],idx;voidadd(inta,intb){ e[idx]=b,ne[idx]=h[a],h[a]=idx++;}intmain(){ memset(h,-1,sizeof(h));}数和图的深度优先遍......
  • k8s修改pod的内核参数以优化服务网络性能
    k8s修改pod的内核参数以优化服务网络性能1、面对高并发场景:TIME_WAIT连接复用如果短连接并发量较高,它所在netns中TIME_WAIT状态的连接就比较多,而TIME_WAIT连接默认要等2MSL时长才释放,长时间占用源端口,当这种状态连接数量累积到超过一定量之后可能会导致无法新建连接。所......