🤵♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱🏍
🙋♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]
梯度爆炸与消失
前置条件:先弄懂反向传播算法之后才能快速领悟。
梯度爆炸是指在使用梯度下降算法时,由于某些原因导致梯度值变得非常大,从而对参数的更新产生巨大影响。这可能会导致模型无法收敛或收敛速度过慢。
当神经网络层数较多、学习率设置过高或损失函数设计不合理时,就容易发生梯度爆炸现象。以下是一些可能引起梯度爆炸的原因(这其实就是根据反向传播的三个函数链式求导,一个是上一个神经元激活函数,一个是损失函数导数,一个是激活函数导数:
- 激活函数选择(损失函数导数):如果在神经网络中使用了具有饱和性质(如Sigmoid)的激活函数,并且权重初始化不当,则可能会出现数值上溢问题。当反向传播通过每一层传递时,sigmoid函数在中间区域的斜率很敏感变化很大,最终使得梯度变得异常大。
- 参数初始化(激活函数导数):如果权重参数初始化过大,则在前向传播和反向传播过程中都容易造成数值溢出问题。特别是在深层神经网络中,在后面的层级上发生累积效应并放大了初始错误。
- 学习率设置(上一个神经元激活函数):学习率决定了每次迭代更新参数时所采用的步长大小。如果学习率设置太大,每次更新时参数的变化就会非常剧烈,(即权重变大,数值上溢)可能导致梯度值爆炸。
饱和性质的激活函数是指在输入数据较大或较小时,激活函数的导数趋近于0,导致梯度消失或爆炸。这种情况下,神经网络可能会面临训练困难、收敛缓慢等问题。
常见的饱和性质的激活函数有Sigmoid函数和双曲正切(Tanh)函数。它们在输入接近极端值时,导数接近于0。对于Sigmoid函数而言,在输入非常大或非常小时,输出值会趋向于1或-1,并且导数几乎为0;对于Tanh函数而言,在输入非常大或非常小时,输出值也会趋向于1或-1,并且导数同样几乎为0。
相比之下,不饱和性质的激活函数没有上述问题并具有更好的表达能力。以下是两个例子:
ReLU(Rectified Linear Unit):
ReLU是一种简单但广泛使用的不饱和性质的激活函数。当输入为正时,ReLU将保持原始值作为输出;当输入为负时,则返回零作为输出。ReLU在实践中被证明可以有效地解决梯度消失问题,并提高神经网络模型的训练速度与效果。Leaky ReLU:
Leaky ReLU是对ReLU的改进,它在输入为负时不返回零,而是返回一个小的非零值。这样可以避免ReLU中出现的“神经元死亡”问题(即某些神经元永远不会被激活),并且有助于增加模型的表达能力。总结起来,饱和性质的激活函数可能导致梯度消失或爆炸问题,并且限制了神经网络模型能够学习复杂特征表示的能力。而不饱和性质的激活函数(如ReLU、Leaky ReLU等)则可以解决这些问题,并提供更好的训练效果。选择适当的激活函数取决于具体任务需求和实际情况。
为了解决梯度爆炸问题,可以采取以下措施:
-
权重初始化:合理选择权重的初始化方法,例如使用**Xavier(饱和函数)或He(不饱和函数)**等经典的初始化方法,并避免初始权重过大。
-
激活函数选择:选用具有较小饱和区域并且能够缓解梯度爆炸问题的激活函数(如ReLU、Leaky ReLU)。
-
梯度裁剪:通过限制梯度值的范围来防止其过大。一种常见做法是设置一个阈值,在反向传播过程中对超出阈值范围的梯度进行裁剪。
-
调整学习率:降低学习率可以减轻梯度爆炸现象。可以逐步减小学习率或者使用自适应优化算法(如Adam、Adagrad),使得模型在训练过程中更加稳定。
总而言之,当发生梯度爆炸时,需要检查神经网络结构、参数初始化和学习率设置等因素,并根据情况采取相应调整以解决该问题。
梯度消失是指在深层神经网络中,**随着反向传播过程的进行,较早层的权重更新变得非常小或趋近于零,导致这些层对整个网络参数的学习贡献几乎为零。**这可能会导致模型无法有效地学习和优化。
以下是一些常见导致梯度消失问题的原因:
1. 激活函数选择不当:
- 一些常用的激活函数(如sigmoid、tanh)在输入值接近饱和区域时具有很小的斜率(求导很小)。
- 当网络层数增加时,在多次应用这些激活函数后,梯度逐渐缩小到接近于零(求导后累乘下溢)。
2. 权重初始化不合适:
- 在深层神经网络中使用统一或过大/过小范围内初始化权重,可能会引发梯度消失问题(不平衡分布,每个隐藏单元计算出来的特征表示也将高度相似(对称性),在更新参数时无法利用到各个隐藏单元之间不同特征的差异,导致网络学习能力受限。)
- 如果初始权重太小,则每次通过网络传播的信号将被削弱(激活值小);如果初始权重太大,则容易使得某些神经元进入饱和状态(斜率变化小)。
3. 大规模架构设计不良:
- 构建一个非常深且复杂的神经网络结构时,信息必须通过多个层级进行传递,并且错误的设计可能会导致梯度消失。
- 过深的网络结构使得梯度在反向传播过程中需要经历多次相乘操作,从而容易受到数值计算误差和指数级衰减的影响(下溢或者上溢)。
4. 数据预处理不当:
- 不恰当的数据标准化或归一化方法可能导致输入特征分布不均匀(输入值或大或小,同样是导致上溢或者下溢,进而引发梯度消失问题。
为了应对梯度消失问题,可以尝试以下方法:
- 使用其他激活函数(如ReLU、Leaky ReLU等),它们不饱和具有更大的斜率并且在一定程度上缓解了梯度消失问题。
- 采用合适的权重初始化策略,例如Xavier初始化或He初始化。
Xavier初始化和He初始化是两种常用的权重初始化策略,它们旨在帮助神经网络模型更好地学习和收敛。
Xavier初始化(也称为Glorot初始化):
Xavier初始化适用于激活函数为sigmoid或tanh的神经网络层。该方法根据输入和输出节点数量来确定初始权重值的范围,使得信号在前向传播时能够保持一定程度上的平衡。(由 Xavier Glorot 和 Yoshua Bengio 在2010年提出。)具体步骤如下:
- 针对每个权重矩阵W,在[-a, a]之间均匀随机采样初始值,其中a = sqrt(6 / (n_in + n_out))。
- n_in是输入节点数
- n_out是输出节点数
这种方式通过考虑输入和输出维度来推导合适的初始范围(节点数越多权重值越小),并避免了梯度消失或爆炸等问题。实验证明,在训练深度神经网络时使用Xavier初始化可以加速收敛并提高模型性能。
He初始化:He初始化,也称为He正态分布初始化,是一种用于神经网络权重初始化的方法。它由Kaiming He等人在2015年提出,并被广泛应用于深度学习模型中。He初始化旨在解决激活函数为线性修正单元(Rectified Linear Unit, ReLU)时可能导致的梯度消失或爆炸问题。在**传统的随机权重初始化方法(如高斯分布、均匀分布)**下,如果网络较深且使用ReLU作为激活函数,则容易发生梯度消失或爆炸现象。
- He初始化通过将每个神经元层输入与一个服从标准差为sqrt(2/n) 的高斯分布进行采样来设置初始权重。 (其中n表示前一层神经元数量,输入点)
确保了输出信号在前向传播时能够更好地得到激活。He初始化在使用ReLU或其变种(如Leaky ReLU)作为激活函数时表现良好。其是一种针对ReLU等非线性激活函数的权重初始化方 法。
- 使用正则化技术(如批量归一化)来规范网络层之间的输入分布,并加速训练过程。
- 考虑使用残差连接(如Resnet)、跳跃连接等架构设计技术来减轻信息传递路径中信号被削弱或消失的影响。
跳跃连接指的是将输入数据直接添加到网络某一层输出之上。这种设计使得信息可以更自由地流动,并且保留了原始输入数据中的细节和语义信息。 使信息更容易传播到后面的层次,避免了信息丢失。跳跃连接通常会通过求和操作或拼接操作来实现。
以图像分类任务为例,假设我们使用卷积神经网络进行特征提取,在每个卷积层后面都加入一个池化层来减小特征图尺寸。然而,池化操作可能导致信息损失。通过添加一个跳跃连接,将原始输入直接与最后一个池化层输出相加或拼接起来,可以保留原始图像中更多的细节和语义信息。
如果感兴趣了解更多,建议阅读文章:
非常经典的文章《All You Need to Know About Skip Connections》: https://www.analyticsvidhya.com/blog/2021/08/all-you-need-to-know-about-skip-connections/
残差网络(Residual Network),也被称为ResNet
,是一种深度神经网络架构,旨在解决梯度消失和训练困难的问题。它的核心思想是通过引入残差块(residual blocks)来构建网络,并通过跳跃连接将输入直接添加到层输出上。具体而言,在每个块或子模块内部,输入被加到该块/子模块计算后得到的输出上,并且这两者尺寸必须相同。然后再将此结果送入下一个块/子模块进行处理。
残差网络(Residual Network),也被称为ResNet,是一种深度神经网络架构,旨在解决梯度消失和训练困难的问题。它的核心思想是通过引入残差块(residual blocks)来构建网络,并通过跳跃连接将输入直接添加到层输出上。
下面是详细解释残差网络的步骤:
基本结构:每个残差块由两个主要部分组成——主路径和捷径。主路径包含了一系列卷积、批归一化和非线性激活函数等操作,用于学习特征表示。捷径是一个直接连接,将输入数据“跳过”了主路径中的所有操作。
捷径连接:在传统的卷积神经网络中,信息必须从前向后依次通过每个层进行传递并逐渐轻微地改变。而在残差网络中,捷径连接允许信息更快地流动,在不同层之间形成了短路路径。
残差学习:对于每个残差块,在主路径内部会发生特征图尺寸缩小或通道数变化等情况。这样可能导致信息丢失或降低模型性能。为了解决这个问题,残差网络采用了跳跃连接将输入直接添加到输出上,使得模型可以学习到相对于期望输出的微小调整。
深度扩展:残差网络允许非常深的层次堆叠,因为捷径连接提供了一个快速通道来传播梯度和信息。通过增加更多的残差块,网络可以逐渐变得更深,并且在一定程度上能够减少过拟合现象。
预训练与微调:由于残差网络具有良好的初始化特性,在大规模数据集上进行预训练后往往能够获得较好的性能。然后可以使用迁移学习(transfer learning)技术,在其他任务或数据集上进行微调以达到更好的效果。
总结起来,残差网络通过引入捷径连接和利用残差学习机制来改善深层神经网络中的梯度消失、信息流动等问题。这些方法使得网络能够更轻松地训练,并且在图像分类、目标检测和语义分割等计算机视觉任务中取得了显著成果。
理解和解决梯度消失问题是构建有效深层神经网络模型非常重要的一步。通过合理选择参数初始化、优化算法以及网络结构设计等手段可以克服这个问题,并提高模型的性能和收敛速度。
🤞到这里,如果还有什么疑问🤞🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳