本系列目录
《带你自学大语言模型》系列部分目录及计划,完整版目录见:带你自学大语言模型系列 —— 前言
第一部分 走进大语言模型(科普向)
- 第一章 走进大语言模型
第二部分 构建大语言模型(技术向)
- 第二章 基础知识
- 2.1 大语言模型的训练过程 —— 《带你自学大语言模型》系列
- 2.2 大模型理论基础:Transformer (本篇)
- 2.3 大模型硬件基础:AI芯片(上篇) —— 《带你自学大语言模型》系列
- 2.3 大模型硬件基础:AI芯片(下篇)(next)
- 2.4 大模型理论基础:数据 (next)
- 从LLaMa 3 技术报告,再看LLM构建过程 ——《带你自学大语言模型》系列(番外)
- 第三章 预训练
… …
说明:本文有很多公式一直转换失败,所以这里没展现,公众号上的是完整的。
欢迎关注同名公众号【陌北有棵树】,关注AI最新技术与资讯。
写在前面
如前文说,大模型的发展是「数据+算法+算力」的三重叠加,本系列的所有内容,从纵向看是大模型的各个阶段,从横向看,也都绕不开这三个因素。本节说算法,大模型时代的核心算法:Transformer。
先来一张图,看一下现在流行的大模型的架构对比就不难发现,都是在Transformer的基础上做一些组件的替换和魔改,但整体架构都是几乎不变的。
OpenAI前首席科学家llya Sutskerer在一次采访中提到,Transformer论文发表的当天,他就意识到,“他给了我们想要的一切”,于是他立刻让人去尝试,再后来,就有了GPT。
本节目录
- 2.2.1 Transformer基本概念和发展
- 2.2.2 为什么Transformer如此重要?
- 2.2.3 注意力机制
- 2.2.3.1 前Transformer时代的注意力机制
- 2.2.3.2 自注意力机制
- 2.2.3.3 多头注意力机制
- 2.2.3.4 掩码注意力机制
- 2.2.4 Transformer架构组成
- 2.2.4.1 编码器结构
- 2.2.4.2 解码器结构
- 2.2.5 Transformer主要技术
- 2.2.5.1 前馈神经网络
- 2.2.5.2 位置编码
- 2.2.5.3 残差连接
- 2.2.5.4 层归一化
2.2.1 背景
有几个概念以及他们之间的关系需要先明确:编码器-解码器架构、注意力机制、自注意力机制。
注意力机制不是Transformer的首创,它最早是在2014年Google Mind团队在论文《Recurrent Models of Visual Attention》中提出,首次将RNN与注意力机制结合,解决图像分类问题。
2015年,注意力机制首次应用于自然语言处理。Bahdanau等人发表《Neural Machine Translation by Jointly Learning to Align and Translate》,将注意力机制引入机器翻译领域,对传统RNN架构进行改进,详细内容在 2.2.3.1 小节详细说明。
在Transformer之前,注意力机制都是在RNN架构上,更精确来说,是在基于RNN的Seq2Seq架构上。直到2017年,Google发表论文《Attention Is All You Need》,提出Transformer架构,在此之后,注意力机制全部都是以实现自注意力机制的Transformer架构。
2.2.2 为什么Transformer如此重要?
Transformer的哪些特性,让它成为大模型时代的扛把子呢?要回答这个问题,就要先来看在Transformer之前遇到了哪些问题。
注:下面这段话,如果你没有相关基础,可以先大概有个印象,等后面的部分读完,再回看这段话,会有一个较为清楚的认识。
在Transformer模型出现之前,处理序列数据的任务(如机器翻译、文本生成),主要依靠循环神经网络(RNN)及其衍生体,比如长短期记忆网络(LSTM)和门控循环单元(GRU)。这些网络通过逐元素地处理序列,学习元素之间的依赖性,尽管它们在序列处理任务上取得了不小的成功,但仍然存在几个较为明显的问题。
首先,RNN的这种逐步处理机制意味着难以进行并行计算,这在处理较长的序列时尤其成问题,因为它会大幅增加训练所需的时间。其次,尽管LSTM和GRU被设计来捕获长距离依赖,但在实际应用中,它们仍然挣扎于理解序列中相隔甚远的元素间的关系。最后,传统的序列到序列模型依赖于将整个输入序列编码成一个固定长度的向量,这个向量包含了所有必要的信息以供解码器生成输出。这种方法在捕获复杂的序列间依赖性方面存在局限性。
Transformer的诞生旨在解决这些问题。通过引入自注意力机制,Transformer允许模型在不考虑序列中元素的相对位置的情况下,直接计算序列内所有元素之间的依赖关系。这种机制的一个显著优点是能够实现高度的并行化处理,从而大幅度提高模型的训练效率。自注意力机制的引入还使得模型能够更有效地理解序列中的长距离依赖,因为它能够直接“看到”序列中任意两个元素间的直接联系,而不是通过一系列中间步骤间接地理解它们之间的关系。
Transformer进一步通过动态地计算输入序列的表示来弥补了固定长度上下文向量的不足。这意味着每个输出元素都可以基于整个输入序列来动态地“聚焦”于对其最重要的部分,而不是依赖于一个尝试捕获所有必要信息的单一固定向量。这种方式使得Transformer在理解和处理序列数据时更为灵活和强大。
此外,Transformer的架构设计也非常适合扩展,允许模型通过增加更多的层或扩大模型的大小来适应更大规模的数据集和更复杂的任务。这些特点使得Transformer不仅解决了之前基于RNN的模型面临的挑战,而且开启了自然语言处理乃至整个深度学习领域的新篇章,其强大的性能和灵活性为解决各种序列处理任务提供了新的可能性。
2.2.3 注意力机制
注意力机制核心是在做什么?在1.2 如何让机器说人话?万字长文回顾自然语言处理(NLP)的前世今生 那篇文章里,我们较为详细的介绍了Word2Vec,Word2Vec就像是一个字典,已经能将词表中的所有词映射成向量了,那么为什么还需要RNN,还需要Transformer呢?因为没有Word2Vec没有考虑上下文。
“伯牙绝弦”跟喝放在一起,指代的是一杯奶茶,跟听放在一起,指代的是一首歌,跟高山流水钟子期放在一起,指代的是一个典故。而这,仅仅靠Word2Vec是做不到的。所以,无论是循环神经网络,还是注意力机制,都是在解决上下文的问题。
注意力机制,简单来说就是针对一个具有多个元素的输入序列(如对于输入的一句话,其中的每个元素即为该语句中的一个词或者词的某种特征表示),对其计算出一组能够表达重要性程度的值向量——注意力权重,然后以此权重对数据项进行加权求和作为输出序列中的一个元素或该元素的某种表示。
注意力选择性地关注对当前任务更为关键的信息,过滤掉无关因素,从而提升了准确性。
2.2.3.1 前Transformer时代的注意力机制
前Transformer时代的注意力机制,基本都是采用带有注意力机制的RNN架构。
第一个使用注意力机制的是机器翻译的Sequence-to-sequence模型(序列到序列模型,简称 Seq2Seq),简单来说,就是输入是一个序列,输出也是一个序列。Seq2Seq模型通过编码器-解码器架构实现。
机器翻译就是将一种语言序列转换为另一种语言序列,再例如对话问答,也是将问题序列转换为答案序列。理论上来说,只要能将输入和输出都抽象成序列,就可以使用Sequence-to-sequence模型。2024年2月,OpenAI发布的文生视频模型Sora,也使用了Transformer架构,可以进一步印证这一点,因为视频也被抽象成了一个序列。
没有注意力机制的Seq2Seq模型
Seq2Seq模型是一个典型的机器翻译模型,诞生于2014年,这时还没有注意力机制,模型的架构如下图:
带有注意力机制的Seq 2Seq模型
2015年,Bahdanau等人提出注意力Seq2Seq模型
注意力机制的Seq2Seq模型,提出了两个改进:
(1)将原来的输入序列全部压缩到一个固定长度的上下文,改为映射为多个上下文向量c1,…,cT′
(2)每个上下文向量则是通过对输入投射可学习的注意力权重综合得到
注意力机制的形式化表示定义在查询(query)、键(key)和值(value)3个集合之上,其中,注意力的权重由查询集合和键集合产生,然后再作用在值集合上。关于Q、K、V矩阵如何形成,放在2.2.3.2一起来写。
2.2.3.2 自注意力机制
自注意力机制(self-attention)是注意力机制的一种特殊形式,也是Transformer架构的核心机制。在《Attention Is All You Need》中提出的基于自注意力机制的Seq2Seq模型,取代了之前基于RNN的Seq2Seq模型,正如论文标题”你只需要注意力“,言外之意就是,已经不再需要RNN了。
在自注意力机制中,输入序列的每个元素都会与序列中的所有其他元素进行交互,以决定它们各自的注意力权重。
自注意力机制与传统注意力机制的核心区别在于,自注意力的查询、键、值都来自于同一组输入。应用在文本处理中,能够更深入地捕捉句子内部及其成分之间的关联,从而揭示词语间复杂的依存关系。
为什么有了注意力机制,还需要自注意力机制呢?
尽管注意力机制在处理序列数据时已经表现出色,但在处理长距离依赖关系和提高计算效率方面仍有不足。自注意力机制通过引入内部元素间的全局依赖关系建模和并行计算,能够直接建模序列中任意两个位置之间的依赖关系,无论它们之间的距离多远。
Transformer的意义体现在它的长距离依赖关系处理和并行计算,而这两点都离不开自注意力机制。
自注意力机制的运行原理
自注意力机制的核心思想在于为序列中的每个元素分配一个权重,这些权重决定了模型处理特定元素时对其他元素的关注程度。首先计算一个词的特征值,接着通过自注意力机制,将该词与给定句子中的所有词联系起来。
如图2-6所示,输入向量a1对应的输出向量b1,并不是只考虑了向量a1的值,而是考虑了a1,a2,a3,a4后生成的,同理,a2,a3,a4的输出向量b2,b3,b4也都是考虑了整个序列的所有向量后产生的。如图2-7和2-8所示。
那么具体是如何实现的呢?在Transformer的自注意力机制中,采用的注意力汇聚方式是缩放点积注意力(Scaled Dot Product Attention),正因如此,Transformer中使用的注意力被称为“缩放点积注意力”。
自注意力机制最主要的功能是计算输入序列中每个元素与其他元素之间的相关性。我们用表示向量和向量的相关性,用表示向量和向量的相关性…
关于如何计算向量和向量的相关性,前文也有提到要拆分为Query矩阵(“查询”矩阵,简称Q矩阵),Key矩阵(“键”矩阵,简称K矩阵),Value矩阵(“值”矩阵,简称V矩阵),具体落到矩阵运算中,通过这三个矩阵的各种加权求和计算,从而计算出相关性,进而生成输出序列。为了得出Q、K、V三个矩阵,我们还需要创建三个权重矩阵、、,这三个向量都是要学习的参数。如下图所示。
求出相关性评分后,接下来要进行一个softmax操作,softmax的作用是将向量转换为概率分布,在这里,应用softmax函数获取权重的分布。Softmax的分数决定了当前单词在每个句子中每个单词位置的表示程度。如下图所示。
在实际的处理中,上述的计算过程通过矩阵的形式进行,矩阵计算公式如下:
接下来通过一个实际例子对这个公式进行逐步深入分析。
比如将“小北喝奶茶”这个句子输入给Transformer,首先会对这个句子进行分词,按照句意,会被分为“小北”、“喝”、“奶茶”三个词元,并转换为特征向量(特征向量也是通过另一个训练后的模型获得)。特征向量是一个三维向量,于是,“小北”、“喝”、“奶茶”的输入序列向量如下:
在这里,我们假设词嵌入向量的维度是4维(为举例做了简化处理,实际场景维度数量远大于此),输入矩阵行列值分别为:句子分词数量、词嵌入向量维度。如前文所说,每个特征向量都还会对应3个向量:Q、K、V,如图2-12所示。
接下来,需要计算查询矩阵与转置后的键矩阵的点积,具体计算如下:
然后,我们将上面得出的的点积矩阵除以键向量维度的平方根。这样可以获得更加稳定的梯度。
还需要将所求得的相似度分数进行归一化,在这里使用softmax函数进行归一化处理。处理后的数值分布在0到1的范围内,且每一行的所有数之和等于1。这里为了方便后续计算,将 的结果设为较简单的值。
现在,我们已经得到了相关性分数矩阵,通过这个分数矩阵,我们可以得到句子中的每个词与所有词的相关程度。
最后一步是计算注意力矩阵,注意力矩阵是将归一化后的相关性分数矩阵,与值矩阵相乘得到的,注意力矩阵包含句子中每个单词的注意力值。它可以通过将分数矩阵softmax 乘以值矩阵得出值向量与分数加权之后求和所得到的结果。
得到结果如下:
2.2.3.3 多头注意力机制
多头注意力机制是自注意力机制的扩展形式,它允许模型并行处理多个不同的注意力模式。
多头注意力机制通过同时运行多个自注意力层,并将这些层的结果综合起来,从而增强模型的表达能力和泛化能力。
在多头注意力中,查询(Query)、键(Key)和值(Value)首先经过线性变换,然后被分割成多个头,每个头独立地进行自注意力计算,最后将这些头的输出拼接并再次通过线性变换得到最终输出
“多头”是指:自注意力层的输出空间被分解为一组独立的子空间,对这些子空间分别进行学习,也就是说,初始的查询、键和值分别通过3组独立的密集投影,生成3个独立的向量。每个向量都通过神经注意力进行处理,然后将多个输出拼接为一个输出序列。每个这样的子空间叫作一个“头”。
为什么需要多头注意力机制
多头注意力机制的主要目的在于,能够让模型关注到多种类型的信息,从而学习到更多元的特征。
自注意力机制本质是在计算词之间的相关性,但是词和词之间往往不止存在一种相关性,所以我们将Q、K、V拆分为多个矩阵,这样可以捕获到多种相关性,例如,某些头可能专注于捕捉语法关系,而其他头可能捕捉语义关系。通过这种方式,多头注意力机制能够提高模型的表示能力,使其能够更好地理解和处理输入数据。
也就是说,通过不同的注意力头,模型可以学习并捕捉到输入序列中的不同类型信息。
当给定相同的Q、K、V集合时,我们希望模型可以基于相同的注意力机制学习不同的行为,然后将不同的行为作为知识组合起来,捕获序列内各种范围的依赖关系。因此,允许注意力机制组合使用查询、键、值的不同表示子空间可能是有益的。
此外,多头注意力机制通过增加注意力头的数量,扩大了模型的容量,使其能够处理更复杂的任务。这样可以在不增加模型层数的情况下,实现更强大的表达能力。另外,多头注意力的设计支持高度并行化的计算,因此在配置多个处理器或GPU的硬件环境下,多头注意力能进一步提高计算效率。
多头注意力层的输出可以作为下一层的输入,或者与其他层一起构成Transformer模型的整体架构。每个注意力头能够关注到输入序列中的不同信息。
**
**
多头注意力机制实现方式
多头注意力的计算过程可以分为以下几个步骤:
1、线性变换:多头注意力机制首先将输入的Query(Q)、Key(K)、Value(V)通过线性(全连接)层转换,为每个头生成不同的表示。这一步骤实质上是通过不同的权重矩阵将Q、K、V映射到较低维度的子空间。
2、独立注意力计算:在每个头上独立计算注意力权重。这一步骤通常使用缩放点积注意力机制,即通过计算Q与K的点积来获取注意力权重,然后进行缩放和softmax激活,与值矩阵进行相乘,最后得到每个头的输出。
3、注意力输出合并:将所有头的注意力输出拼接起来,并通过另一个线性层转换,以生成最终的多头注意力输出。这个向量包含多个注意力头捕捉到的各种信息。
2.2.3.4 掩码注意力机制
掩码注意力机制是在处理序列数据时使用的一种技术,它通过在注意力机制的计算中引入掩码,确保模型在预测每个序列元素时只依赖于之前的元素,而不是未来的信息。掩码注意力机制只存在于Transformer架构的解码器中,这种机制特别适用于生成式模型(如GPT),能够帮助模型在生成文本时只考虑到当前位置之前的上下文信息。
为什么需要掩码注意力机制
解码器的输入和编码器在处理上不太一样,一般认为编码器的输入是一个完整的序列,而解码器在训练和数据的生成过程中是逐个进行Token的生成的。
Transformer需要掩码注意力机制是因为它有助于捕捉因果自注意,即一个token只能注意到序列中过去的标记。这种机制可以帮助模型更好地理解和处理序列数据,提高模型的性能和效率。而且,这种注意力机制可以更好地处理不同时间步的信息,提升模型在处理时间序列数据时的效果。因此,掩码注意力机制在Transformer中起着至关重要的作用。
如何实现掩码注意力机制
掩码注意力机制是通过在注意力机制的计算过程中引入一个掩码来实现的,该掩码会屏蔽掉对未来信息的注意力权重,也就是在实际的矩阵计算中引入一个掩码矩阵。
掩码矩阵用于调整注意力权重,确保模型不会将注意力分配给应该被掩蔽的序列部分。
例如,在处理填充后的序列时,掩码可用于指示哪些位置是填充的,从而在注意力分配时忽略这些位置,保证模型的注意力仅集中在实际的序列数据上。
掩码一般通过与序列同等长度的0和1组成的向量实现,其中1表示对应位置的信息是有效的,而0则表示该位置的信息应被忽略。
2.2.4 Transformer架构组成
首先Transformer的编码器和解码器都是由N层堆叠而成,堆叠的方式如下:
在《Attention Is All You Need》中,给出Transformer的架构图如下图所示,每层包括以下几个核心组成部分:多头注意力机制(Multi-Head Attention)、前馈神经网络(Feed Forward)、残差连接(Residual Connection)、层归一化(Layer Normalization)和位置编码(Positional Encoding)。
接下来我们逐步拆解这个复杂的架构图是如何诞生的。
Transformer依然是一个Seq2Seq架构,所以分别来看编码器和解码器的结构。
2.2.4.1 编码器结构
编码器(Encoder)的主要功能是编码器的作用是对输入的字符序列进行编码处理,从而获得特定的词向量结果。
在实际中,编码器的模块组成并非是固定的,只是因为Transformer的编码器是目前最常用的架构,所以本节基于Transformer的编码器结构进行介绍。这里将编码器的模块分为前置处理,核心处理和后置处理三大部分,其中前置处理包括特征向量化、位置编码,核心处理包括多头注意力机制、前馈神经网络,后置处理包括残差连接、层归一化。
前置处理
进入核心处理之前,输入的序列要做一次向量化(Embedding)处理,就像计算机不能直接处理程序,需要先转换成二进制一样,模型也不能直接处理文字,需要先转换成向量。并且,由于Transformer的核心是自注意力机制,并未考虑序列的位置信息,所以加入位置编码捕获词语间的位置信息。
核心处理
编码器的核心处理逻辑包括一个多头注意力层和一个前馈神经网络层。输入向量先到注意力层做一次转换,转换后的向量再传入全连接层。
后置处理
为了加速训练过程并提高模型性能,在注意力层和前馈网络层处理完成后,都加了残差连接(Residual Connection)和层归一化(Layer Normalization)。
2.2.4.2 解码器结构
接下来来看解码器(Decoder)的结构,虽然Transformer的编码器和解码器在某些基本构件上相似,但它们在组件的设计和编排上有一些的不同,以适应它们各自的任务需求。
每层内模块组成不同
虽然从层级结构上,编码器和解码器都是由6个相同的层叠加,但是它们每一层的结构编排是不同的:编码器每一层有两个子层:一个多头自注意力机制(Multi-Head Self-Attention mechanism)和一个全连接的前馈网络层;解码器每一层有三个子层:一个多头自注意力机制、一个多头编码器-解码器注意力机制和一个前馈网络。
注意力机制设计不同
解码器的自注意力机制使用的是掩码自注意力机制,防止当前位置后面的元素流入当前位置的信息,确保解码器仅根据前面的输出元素进行预测,以此保证了解码的自回归性质。编码器-解码器注意力层的输入向量是解码器本身的输入和编码器的输出。
2.2.5 Transformer主要技术
Transformer中除了注意力机制,还有一些其他技术点,下面分别进行介绍。
2.2.5.1 前馈神经网络
前馈神经网络(FFNN)是Transformer模型中的一个关键组成部分,它在多头注意力机制后进一步加工处理信息。将这些向量转换成适合传递给下一个编码器或解码器层的形式。这种网络结构的设计有助于模型捕捉输入数据中的复杂模式,特别是非线性特征,从而提高模型的表达能力和泛化能力。
前馈网络层本质上是一个多层感知器(Multi-Layer Perceptron,MLP),由一个ReLU激活函数的全连接层组成。通过两层数据的映射处理,显示将数据映射到高维空间,再将其从高维空间映射回原维度。这两个线性层之间的激活函数引入了非线性,使得前馈神经网络能够捕捉复杂的数据模式。
前馈神经网络解决什么问题
在复杂的自然语言序列中,存在许多具有非线性特性的模式和结构,所以能捕捉到输入数据中的非线性特征就显得尤为重要。
在Transformer模型中,多头注意力机制使模型能够同时关注输入序列的不同部分,从而捕获复杂的词语间依赖关系。而前馈神经网络则在这一过程之后,对每个位置的表示进行独立的处理,通过增加非线性,进一步提高了模型的表达能力。
同时,这种设计允许Transformer模型有效处理长距离依赖问题,这是以往如RNNs和LSTMs等模型难以解决的。
**
**
如何实现前馈神经网络
Transformer中的前馈神经网络通常由两个全连接层和一个非线性激活函数(通常是ReLU)组成,这种简单的堆叠结构能够对自注意力层的输出进行有效的非线性转换。此外,为了防止过拟合和保持模型的稳定性,通常还会在这些层之间引入Dropout和Layer Normalization等正则化技术。
2.2.5.2 位置编码
位置编码是一种在神经网络中用于处理序列数据的技术,它通过在模型中嵌入元素的位置信息,帮助网络理解序列中各个元素的顺序和位置关系。这种编码方式使得神经网络不仅能够捕捉到序列中元素的内容,还能够识别它们的相对或绝对位置。
位置编码通常利用正弦和余弦函数的周期性,有效地处理长序列,并且能够对未知长度的序列进行泛化处理。此外,神经网络可以根据具体任务的需求,通过学习过程调整位置信息的权重,从而提高模型对序列数据的处理能力和适应性。
为什么需要位置编码
通过上文介绍可知,自注意力机制的核心在于通过矩阵乘法的方式来获取查询、键和值以获取词汇之间的关系,但由于自然语言中,词语所处的位置对于语义的影响是十分重要的,上述的计算过程中并没有考虑位置的计算,这会导致句子中包含两个相同的词,尽管位置不同,其表示也会完全相同,这显然是不符合语言逻辑的,所以引入位置编码的概念。
位置编码的技术细节
位置编码的主要目标是表示输入序列中每个词汇的位置,并将这些信息与原始词汇表示相结合。实现方法是通过将每个单词的嵌入与其相对应的位置编码相加,从而为模型提供位置信息。
Transformer模型中的位置编码通过固定的正弦函数和余弦函数来生成。在Transformer中,使用的是固定的正弦和余弦函数来生成位置编码,这种方法的选择基于几个理由。首先,正弦和余弦函数的周期性特征使得模型能够有效处理不同长度的序列,并且能够对序列长度超出训练集的情况进行泛化。其次,这种方法能够使模型根据相对位置(而非绝对位置)学习词汇之间的关系,这对于理解自然语言特别重要。例如,在一句话的不同部位,相同的词汇序列可能具有相似的语义,而其语义与它们在句子中的绝对位置关系不大。
位置编码的具体计算过程如下:
对于给定的位置p和维度i,位置编码函数定义如下:
上述公式中,pos表示该词在句子中的位置,表示在输入矩阵中的位置,表示词嵌入的维度,与介绍自注意力时保持一致设置为4 我们将公式直接带入矩阵计算,会更加直观的看出位置编码的作用,位置编码矩阵P如下
我们将公式直接带入矩阵计算,会更加直观的看出位置编码的作用,位置编码矩阵P如下
然后我们将实际的pos值代入,得到位置矩阵P的值如下
接下来需要做的就是将输入矩阵与计算后的位置编码矩阵P进行矩阵加法,将处理后的矩阵继续进行编码器的相关处理即可。
2.2.5.3 残差连接
残差连接(Residual Connection)是2015年在深度残差网络(ResNet)中被首次提出,在深度学习中应用得十分广泛,被成功地应用于多种不同的网络架构中,包括DenseNet、Highway Networks和Transformer模型。
在Transformer模型中,残差连接主要应用于多头注意力机制和前馈神经网络,以提高信息流和梯度传递的效率。
**
**
残差连接解决什么问题
残差连接用于解决深度神经网络中的梯度消失和梯度爆炸问题。梯度消失和梯度爆炸是深度学习中常见的问题,特别是在深层网络的训练过程中。
梯度消失指的是,在深度网络的反向传播过程中,梯度逐层减小,导致网络难以学习。
梯度爆炸则是梯度逐层增大,可能导致网络权重的快速增长,从而引发训练不稳定。残差连接通过直接将输入加到输出上,有助于梯度直接跨过一些层传播,缓解了梯度消失的问题,使得深层网络的训练变得更加可行和稳定
首先,它们通过为梯度提供直接的反向传播路径来解决了梯度消失问题,使得可以训练更深的网络。
其次,残差连接通过允许网络学习残差函数来防止性能退化问题,从而使得添加更多层时不会导致训练误差增加。这些特性使得残差连接在提升网络深度和复杂性时,能够维持或甚至提高网络的性能
**
**
如何实现残差连接
残差连接的核心思想是将层的输出表示为输入加上一个残差函数的结果,这样,即使加深网络层次,也能保证网络的学习效率和性能。
**
**可以理解为是****通过在网络的一部分之间引入一种“捷径”,使得网络的输入可以直接传播到后面的层。
这种结构允有助于减轻深度网络中的梯度消失问题,即使加深网络层次,也能保证网络的学习效率和性能。
通过引入简单的跳跃连接,允许部分输入直接流向后续层,这在数学上表现为将输入 与经过非线性变换的输出相加,即输出为。这里,x代表输入信号,F(x)代表神经网络中某层的变换。如果输入和输出的维度不匹配,可以使用线性投影(如1x1卷积)来调整它们的维度,使得可以进行元素级的加法操作。
将输入x与F(x)相加,实际上得到的是原始输入信号与该层学习到的残差之和。这种连接方式在反向传播过程中有助于梯度的更好传递,能有效缓解梯度消失问题,从而提升训练效果。
这种结构有助于梯度在网络中的有效传播,尤其是在深层网络中,从而减轻梯度消失的问题,使网络能够通过更深的层来学习复杂的特征,而不会严重影响训练的稳定性和效率。这种机制使得深度学习模型能够从更深的网络结构中获益,而不会因为梯度问题而受限。
2.2.5.4 层归一化
层归一化(Layer Normalization)这项技术由JimmyBa等于2016年首次提出,其主要目标是稳定神经网络的训练过程并优化模型性能。
层归一化是一种在神经网络的每个隐藏层内部应用的标准化技术,它通过计算层内所有神经元输入的均值和方差来进行标准化,旨在解决内部协变量偏移问题,加速训练过程并提高模型的泛化能力。与批量归一化(Batch Normalization)不同,层归一化不依赖于批次的大小,可以在每个样本内部独立应用,因此特别适合于批次大小为1或小批次的情况,如在线学习或循环神经网络(RNN)。
****层归一化解决什么问题
层归一化的主要机制是对每一层的神经元输出进行归一化处理。
在Transformer模型中,层归一化通过对神经元的输出进行归一化处理,可以加速梯度下降的收敛,从而提升训练效率,减少不同层之间的协方差偏移,提高模型性能,使训练过程更加稳定,避免梯度爆炸和梯度消失的问题,降低模型对输入数据分布的敏感性,从而提升模型在新数据上的表现。
层归一化是一种规范化神经网络层内部激活的方法,它对每一层的激活值进行规范化,有助于加速训练过程,提高模型的泛化能力
如何实现层归一化
层归一化通过计算层内所有神经元激活值的均值和标准差,并用这些统计数据来标准化激活值,确保输出分布具有零均值和单位方差。具体来说,对于给定的一层输出,层归一化的数学表达式为:
μ
其中,是单个神经元的输出,μ和分别是这层所有神经元输出的均值和方差,ϵ是一个很小的数,以避免分母为零的情况。
经过归一化后的输出具有零均值和单位方差,有助于加速神经网络的训练并优化模型性能。
2.2.5 写在最后
写到最后,如果总结为什么Transformer能对自然语言模型产生如此深远的影响,有如下几点:
首先,它沿用了注意力机制,又对它进行了更复杂和可扩展的设计,完全释放了它的语义表征潜力。
然后,它去除了RNN中的序列关系,可以让训练并行化,充分利用了硬件性能的释放。
至此,让使用海量数据训练大规模语言模型成为可能。
应读者留言,在最后放一棵树,不知道他是不是能看到…