戳蓝字“架构师带你玩转AI” 关注我哦!****
本系列文章的初衷是带领大家深入剖析Transformer,逐步揭示其内在机制和工作原理。 本系列第五篇: 残差连接和层归一化 ,它是理解Transformer 工作原理的基础。
在Transformer模型中,在每个子层周围使用残差连接,之后是层归一化。也就是说,每个子层的输出是 LayerNorm(x + Sublayer(x)),其中 Sublayer(x) 是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层都产生维度为 dmodel = 512 的输出。
目录
1. 梯度问题
1.1 梯度消失
**************1.2 梯度爆炸**************
2. 层归一化(解决梯度问题)
2.1 归一化
**************2.2 层归一化**************
3. 网格退化问题
**4. 残差连接 (解决网格退化问题)
4.1 残差网络
**************4.2 *******残差连接*********************
5. 总结
01
梯度问题
神经网络训练过程中,随着网络深度的增加, 梯度消失、梯度爆炸 等问题导致模型训练困难,性能难以进一步提升。
梯度消失
梯度消失( Gradient Vanishing ): 在反向传播过程中,梯度在逐层传递时逐渐减小,甚至趋向于零。 这通常发生在网络层数很深或者使用某些类型的激活函数(如sigmoid函数)时。 由于梯度值变得非常小, 参数的更新会变得非常缓慢,导致模型训练停滞不前,难以收敛到好的解。
为什么会梯度消失?
- 在使用激活函数为Sigmoid或Tanh等饱和激活函数时,因为这些函数在输入较大或较小的情况下会饱和并导致梯度变得非常小。当输入接近1时,Sigmoid函数的输出值会接近于1,导数趋近于0。于是在反向传播过程中,梯度的乘积会趋近于零。 (为了缓解梯度消失问题,深度神经网络中常常使用其他类型的激活函数,如ReLU)
- 深度神经网络中,梯度是通过链式法则进行反向传播的。每一层的梯度都需要与前一层的梯度相乘,然后再传递到前一层,依此类推,直到传递到网络的输入层。 如果网络层数较多,那么在反向传播过程中会经过多次连续的乘法操作,从而可能导致梯度的值指数级地减小,最终趋近于零,即梯度消失。
梯度爆炸
梯度爆炸与梯度消失相反。
梯度爆炸( Gradient Explosion ): 在网络训练过程中,梯度值随着反向传播而急剧增大,导致网络权重更新过大,甚至超出数值范围。 这会使模型训练变得不稳定,甚至导致模型崩溃。 梯度爆炸通常发生在网络层数过多、学习率设置不当或权重初始化不合理等情况下。
为什么会梯度爆炸?
- 神经网络经过多次的连乘,每次乘法操作都可能将梯度放大,从而导致梯度值变得非常大,从而导致梯度爆炸。
- 梯度爆炸会导致网络的权重参数更新过大,从而使得模型的训练变得不稳定。
02
层归一化(解决梯度问题)
如何解决梯度问题?
梯度问题,包括梯度消失和梯度爆炸,是深度神经网络训练过程中常见的挑战。这些问题通常是由于网络深度过大、激活函数选择不当或权重初始化不合理等因素导致的。
为了解决这些问题,提出了多种策略,其中归一化(Normalization)是其中一种重要的方法。
归一化 在训练过程中对输入数据或网络层的输出进行处理,从而对激活函数的输入值进行调整,避免其过大或过小而 导致的梯度消失、梯度爆炸等问题,提高网络的学习效果和泛化性能。
归一化
归一化(Normalization) : 一种对输入或者网络层的输出进行线性或非线性的缩放处理,将其映射到一个特定的范围或者分布内,以便提高网络的训练稳定性和性能的作法。
在神经网络中,常见的归一化方法包括:
- 批归一化(Batch Normalization): 它通过在每个批次中对输入数据进行规范化,使其均值为0、方差为1,从而加速网络的收敛过程,降低网络对初始化和学习率的敏感性,同时也有一定的正则化效果。
- 层归一化(Layer Normalization): 与批归一化不同,它在每层中对所有样本的输出进行规范化,而不是对每个批次进行规范化。层归一化在处理序列数据等不适合批处理的情况下,可以作为替代方案使用。
- 组归一化(Group Normalization): 组归一化是一种介于批归一化和层归一化之间的方法,它将输入数据分成多个小组,然后对每个小组内的样本进行归一化,从而减小小组之间的相关性,提高网络的学习能力。
层归一化
层归一化( Layer Normalization ):Transformer使用的是层归一化, 用于调整神经网络中每一层的激活值的分布,使得模型的训练更加稳定并提升性能。基本上所有的规范化技术,都可以概括为如下的公式:
对于隐层中某个节点的输出,即激活值
a
,进行非线性变换(如ReLU、tanh等)后得到
h
。
层归一化的过程
就是先计算这一层所有激活值的均值
μ
和方差
σ²
,然后使用这些统计量对
h
进行分布调整。
这种调整 就是把“高瘦”和“矮胖”的都调整回正常体型(深粉色),把偏离x=0的拉回中间来(淡紫色)。
03
网格退化问题
尽管梯度消失和梯度爆炸问题在深度学习中得到了广泛的关注并得到了相应的解决方案,但随之而来的另一个问题逐渐凸显出来,那就是网络退化问题。
网络退化( Degradation ): 在模型能够收敛的情况下,随着网络层数的增加, 模型的性能(如准确率)并未得到提升,反而出现下降的现象。 更为奇怪的是,这种性能下降并不是由于过拟合(overfitting)导致的,因为在训练集上, 深层网络的表现同样不如浅层网络。
例如,一个56层的网络在测试集上的错误率可能会比一个20层的网络更高。这种现象并不是由于数据拟合不足或者噪声过多所导致的,因为即使在训练集上,深层网络的表现依然不如浅层网络。
04
残差连接(解决网格退化问题)
如何解决网络退化问题?
为了解决网络退化问题,提出了残差网络(ResNet)这一创新性的网络结构。 ResNet通过引入残差连接,使得深层网络能够更有效地学习到恒等映射,从而缓解网络退化问题。
借助ResNet,能够成功训练出更深的网络模型,这些模型的性能不仅不低于浅层网络,而且在许多任务上表现得更好。现在,我们可以训练出超过1000层的深度神经网络,而不用担心网络退化问题对模型性能的影响。
残差网络
残差网络(ResNet):
一种采用残差学习策略的深度卷积神经网络,通过引入残差连接有效网格退化问题。
例如:
ResNet-50是一种深度学习模型,由微软研究院的研究员在2015年提出。 这个模型在当年的ImageNet比赛中获得了第一名,其准确率相比前一年的获胜者提高了3.6%。
ResNet-50的网络架构如下:
- 输入处理: 输入数据首先经过一个卷积层和一个最大池化层进行预处理,以提取初步的特征并降低空间维度。
- 残差阶段: 经过预处理后,数据进入多个阶段(stage),每个阶段包含多个残差块。
- 输出层: 经过多个stage的残差学习后,网络通过一个全局平均池化层来减少空间维度并提取全局特征。这些特征被送入一个全连接层,用于输出最终的预测结果。
残差连接
残差连接(Add): 本质上类似一种兜底策略,目的是当模型的深度已经达到最优解,后面再增加冗余层也至少不会导致之前的效果下降。它的做法是将上一层的输出直接连接到下一层的输出,及上一层的输出直接和下一层的原始输出对应位置相加形成最终输出。例如:模型一共50层,若第20层时模型已经充分学习达到测试集最佳效果,则让从21层开始到第50层学习一种 恒等变换
,在最后一层将第20层的输出恒等映射出来 。
05
总结
本文全面概述了Transformer的残差连接和层归一化。
残差连接解决了深度网络退化问题,确保信息畅通;层归一化稳定输出分布,解决梯度问题,提升训练稳定性。两者结合使Transformer在自然语言处理中表现卓越。
下 一篇: 为什么选择自注意力机制 , 将深入探讨选择自注意力机制的背后逻辑
。
全文完,如果觉得写得不错,那就点个赞或者“在看”吧,感谢阅读。
如果转载本文, 文末 务必注明:“ 转自微信公众号:架构师带你玩转AI ”。
推荐阅读
- 深入剖析Transformer - 总体架构
- 深入剖析Transformer - 注意力机制
- 深入剖析Transformer - 文本向量化
- 深入剖析Transformer - 前馈神经网络
- 大模型开发 - 一文搞懂Transformer工作原理
- 神经网络算法 - 一文搞懂Transformer
- 神经网络算法 - 一文搞懂GPT(Generative Pre-trained Transformer)
- 神经网络算法 - 一文搞懂BERT(基于Transformer的双向编码器)
- 秒懂AI-深度学习五大模型:RNN、CNN、Transformer、BERT、GPT简介
全文完,如果觉写错,那就点个赞或者“在看”吧,多谢阅读。
如果转载本文,文末务必注明:“转自微信公众号:九边”。