文章目录
🍃作者介绍:双非本科大四网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发,目前开始人工智能领域相关知识的学习
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹
下一篇文章是:一文带你全面上手Transformer的代码实现
1、Transformer背景介绍
1.1、Transformer的诞生
1.1.1、首次提出
Transformer 模型的诞生时间可以追溯到2017年6月,当时由Google Brain团队的研究人员提出。
这一重要的突破性成果是标志性论文《Attention is All You Need 》的发表,这篇论文奠定了Transformer模型的基础。
具体来说,这篇论文由Vaswani等人(包括Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, 和 Illia Polosukhin)撰写,并于2017年6月12日发表在arXiv上。
论文介绍了Transformer模型,这是一个基于注意力机制的神经网络架构,能够在自然语言处理任务中取得优异的表现,尤其是在机器翻译任务中。
在这之前 ,大多数自然语言处理任务主要依赖于循环神经网络(RNNs)和长短时记忆网络(LSTMs) ,这些模型在处理序列数据时效果良好。
然而,这些模型的计算效率较低 ,尤其在处理长序列时 ,因为它们依赖于逐步处理序列中的每一个元素。Transformer通过引入自注意力机制,消除了这种顺序性依赖,使得计算能够并行化,从而极大地提升了训练和推理的速度。
《Attention is All You Need》这篇论文的核心贡献在于提出了一种全新的架构------Transformer ,这种架构完全抛弃了循环和卷积的结构 ,而是仅依赖注意力机制来捕捉序列中的依赖关系。
它引入了自注意力(Self-Attention)机制,使得模型在处理每一个词时,能够根据序列中所有其他词的相关性来调整当前词的表示,这大大提升了模型的性能和灵活性。
总的来说:
- 2017年发表的《Attention is All You Need》标志着Transformer模型的诞生,这篇论文在自然语言处理领域具有划时代的意义,并且引发了深度学习和人工智能领域的一系列创新和变革
- 自此之后,Transformer模型被广泛应用于各种NLP任务,并且成为了诸如BERT、GPT、T5等众多成功模型的基础架构
1.1.2、后续的发展
2018年10月,Google发出一篇论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》, BERT模型横空出世, 并横扫NLP领域11项任务的最佳成绩!
而在BERT中发挥重要作用的结构就是Transformer , 之后又相继出现XLNET,roBERT等模型击败了BERT,但是他们的核心没有变,仍然是:Transformer。
在《Attention is All You Need》一文提出了Transformer模型之后,研究界开始探索如何在更广泛的自然语言处理任务中应用这一架构。
BERT的出现正是在这一背景下进行的,它的目标是通过预训练和微调的方法,进一步提升模型在语言理解任务中的表现。
BERT的核心创新在于它引入了一种新的预训练方法,该方法结合了深度双向Transformer架构 和无监督的语言模型 训练技术;
与传统的单向语言模型(如GPT)不同,BERT模型在预训练阶段使用了双向注意力机制,即模型在处理某个词时,可以同时关注该词前后的上下文信息;
这使得BERT能够捕捉更丰富的上下文关系,从而提高了其在各种下游任务中的表现。
论文的主要贡献与方法:
- 双向Transformer架构:BERT基于Transformer的编码器部分,但它与最初的Transformer模型不同,BERT是一个深度的、双向的模型。这意味着BERT在处理每一个词时,能够同时利用词的左侧和右侧的上下文信息,这种双向性在捕捉句子语义时尤为重要。
- Masked Language Model (MLM):在预训练阶段,BERT使用了"掩码语言模型"任务。具体做法是随机掩盖输入文本中的一些词,然后要求模型根据上下文预测这些被掩盖的词。这一任务使得模型能够学习词语的上下文相关表示。
- Next Sentence Prediction (NSP):除了掩码语言模型任务,BERT还引入了"下一句预测"任务。模型会输入成对的句子,并要求判断第二个句子是否是第一个句子的下一句。这一任务帮助模型学习句子级别的关系,对于下游的任务如问答、自然语言推理等非常有用。
- 迁移学习与微调:BERT模型在大量无标注的文本数据上进行预训练,然后可以通过微调应用到具体的下游任务中。这种预训练-微调的范式在NLP中取得了巨大的成功,成为了之后许多模型的标准做法。
影响与后续发展:
BERT的提出标志着自然语言处理领域进入了一个新的时代。它的表现远远超越了之前的模型,在多个标准基准任务(如GLUE、SQuAD)上刷新了记录。BERT的成功证明了预训练语言模型在处理语言理解任务中的巨大潜力,这种方法被广泛应用于各类NLP任务,并且成为了许多后续模型(如RoBERTa、DistilBERT、ALBERT等)的基础。
总之,2018年发表的《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》这篇论文,是NLP领域的重要里程碑之一,它不仅推动了基于Transformer架构的模型的发展,还使得预训练-微调的范式成为标准,大大提升了机器在各种语言理解任务中的表现。
1.2、Transformer的优势
相比之前占领市场的LSTM 和GRU模型,Transformer有两个显著的优势:
- Transformer能够利用分布式GPU进行并行训练,提升模型训练效率;
- 在分析预测更长的文本时, 捕捉间隔较长的语义关联效果更好
具体展开如下:
- 并行化训练与分布式GPU的利用
- Transformer模型能够利用分布式GPU进行并行训练,这确实是其相对于LSTM和GRU的一个显著优势
- 由于Transformer模型采用了自注意力机制,计算不再依赖于序列的顺序处理,因此可以对整个序列数据进行并行处理
- 这种特性使得Transformer在现代硬件(尤其是GPU和TPU)上具有更高的训练效率
- 相比之下,LSTM和GRU等循环神经网络(RNN)模型由于其顺序依赖的特性,必须逐步处理输入序列,难以进行有效的并行计算;这使得它们在处理长序列数据时的计算效率较低,训练速度也相对较慢
- 处理长距离依赖的能力
- Transformer在分析和预测长文本时,能够更好地捕捉间隔较长的语义关联
- 这一优势源自自注意力机制,它允许模型在处理一个词时,同时关注到整个输入序列中的所有其他词
- 这种机制使得Transformer在捕捉长距离依赖关系时非常有效
- 相比之下,LSTM和GRU虽然也设计了机制(如门控单元)来处理长距离依赖,但它们仍然受到梯度消失和梯度爆炸问题的困扰,尤其是在处理非常长的序列时
- 此外,LSTM和GRU在每一步处理时只能依赖之前的状态信息,而不能像Transformer那样一次性获取全局的上下文信息
下面是一张测评比较图:
- 这张图展示了不同模型在不同句子长度(Sent Lengths)上的BLEU分数表现,比较了有无注意力机制的翻译系统在句子长度变化时的效果;
- 图中使用了不同符号和颜色来表示不同的系统和配置,BLEU(Bilingual Evaluation Understudy)是一个常用的机器翻译质量评估指标,得分越高,说明翻译质量越好;
- 这张图强调了注意力机制在神经机器翻译中的关键作用,特别是在处理长句子时,注意力机制能够显著提升模型的翻译性能;
- 通过对比,图中展示了各种模型的表现,突出了使用优化的注意力配置能够带来的显著改进
1.3、Transformer的市场
在著名的SOTA机器翻译榜单上,几乎所有排名靠前的模型都使用Transformer:
其基本上可以看作是工业界的风向标,市场空间自然不必多说!
2、Transformer架构
2.1、总览
Transformer 也由编码器和解码器组成。编码器将输入序列编码成隐藏状态,解码器则生成输出序列。这些操作都通过多个堆叠的注意力层和前馈网络层实现
位置编码:因为 Transformer 模型不具有内置的顺序处理机制(不像 RNN 有时间步概念),因此它依赖 位置编码(Positional Encoding) 为输入数据注入序列位置信息。位置编码通过正弦和余弦函数生成,向模型提供相对和绝对位置信息
所以,其实Transformer就是四个部分:
- 输入部分
- 输出部分
- 编码器部分
- 解码器部分
2.2、输入部分
- 源文本嵌入层及其位置编码器
- 目标文本嵌入层及其位置编码器
2.3、输出部分包含
- 线性层
- softmax层
2.4、编码器部分
2.4.1、总览
- 由N个编码器层堆叠而成
- 每个编码器层由两个子层连接结构组成
- 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
- 第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接
下面进行详细拆分。
2.4.2、详细拆分
左侧是传统的Encoder,使用RNN或者CNN实现,
右侧则是Transformer的Encoder架构:
对右侧的图先做一个简单的介绍:
- 输入嵌入 (
Input Embedding
):Transformer 的输入序列首先通过嵌入层(Input Embedding)被转换为向量表示,这类似于传统编码器中的词嵌入。 - 位置编码 (
Positional Encoding
):Transformer 没有像 RNN 那样的内在顺序处理机制,因此需要显式地添加位置信息。位置编码被加到输入嵌入上,使得模型能够感知输入序列中元素的位置。 - 多头注意力机制 (
Multi-Head Attention
):核心组件之一是多头注意力机制,它允许模型在每个位置上都可以关注输入序列的所有其他位置。这种机制使得 Transformer 可以捕捉序列中的全局依赖关系,而不依赖于序列的顺序处理。 - 前馈神经网络 (
Feed Forward
):在注意力机制之后,每一层还有一个前馈神经网络,对每个位置的表示进行进一步的非线性变换。 - 层归一化和残差连接 (
Add & Norm
):每个多头注意力和前馈网络层之后,都有一个层归一化操作和残差连接。这些操作有助于稳定训练过程,避免梯度消失或爆炸。 - 重复 N 次 (
Nx
) :Transformer 编码器通常由多个这样的层堆叠而成,每层都包含多头注意力机制和前馈神经网络。N
表示层数,通常设置为 6 或 12 层。
每一个transformer的Encoder经历输入到输出的中间过程,可能是有多个Block组成的,这里的Block可以理解为"不止一个网络层":
下面这个图片展示残差连接(Residual Connection) 和 层归一化(Layer Normalization):
- 残差连接(Residual Connection)
- 定义:残差连接是一种技术,在模型中将输入直接传递到后续层,与后续层的输出相加。这种连接方式最早在 ResNet(残差网络)中被提出,目的是解决深层神经网络中的梯度消失问题,保持信息流通顺畅。
- 图中表示 :
a
和b
: 图中a
和b
代表两个操作的输出。例如,a
可能是自注意力层的输出,b
可能是输入或其他层的输出。通过将a
和b
相加(表示为a + b
),实现了残差连接。- 这种相加操作使得模型能够直接学习到与输入相关的特征,而不仅仅是学习输入的变换。这有助于模型在训练时更容易优化,并在深层结构中保持性能稳定。
- 层归一化(Layer Normalization, Layer Norm)
- 定义: 层归一化是对输入进行标准化处理,使得输入在每一层中具有相同的分布。具体来说,对于每个神经元的输入,它会减去其均值并除以标准差,然后乘以一个缩放因子并加上一个偏量,以确保不同层之间有较好的协同工作。
- 公式 :层归一化的公式是: x i ′ = x i − m σ x_i' = \frac{x_i - m}{\sigma} xi′=σxi−m其中, x i x_i xi 是输入, m m m 是均值, σ \sigma σ 是标准差, x i ′ x_i' xi′ 是归一化后的输出。
- 图中表示 :在图中,层归一化位于残差连接后的步骤,它将相加后的结果(
a + b
)进行标准化。这一操作有助于稳定训练过程,尤其是在深层模型中,避免梯度消失或梯度爆炸。
2.5、解码器部分
2.5.1、总览
- 由N个解码器层堆叠而成
- 每个解码器层由三个子层连接结构组成
- 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
- 第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接
- 第三个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接
2.5.2、详细拆分
Transformer当中的Decoder有一个非常重要的模式,那就是 自回归(Autoregressive, AT)
模式。
- 自回归生成:自回归模式意味着解码器一次生成序列中的一个元素,并且每个元素的生成都依赖于前面已经生成的元素。例如,在生成翻译句子时,生成下一个单词时会基于之前生成的单词。
- 输入与输出 :
- 输入序列(Input Sequence):这是输入到编码器的原始序列,例如一个句子的单词。
- 输出序列(Output Sequence):解码器生成的目标序列,例如目标语言的翻译句子。
- 解码器的工作过程 :逐步生成:解码器在生成第一个词后,将其作为输入的一部分,用来生成第二个词,依此类推,直到生成完整的序列。这种逐步生成的方式使得解码器的每一步都可以考虑前面已经生成的内容,从而更好地捕捉序列间的依赖关系。
先输入一个开始标记,然后接下来的每一个输出,都是下一个的输入:
如果放任它挨个往下输出:
所以最后需要输出一个结束标记,完成本次的Decoder解码:
如果把Decoder架构中间的跟Encoder交互的那一部分先遮掉,我们可以发现,剩下部分的Decoder和Encoder架构并无明显差别(但是也并不相同):
可以看到标红色框的地方,二者的区别就是,Encoder采用的是Multi-Head Attention,而Decoder采用的是Masked Multi-Head Attention。
那么它们有何区别呢?请往下看:
首先是Self-attention的,非常熟悉了:
那么为何需要Masked Multi-Head Attention,这需要从Decoder的工作原理入手:
前面提到了Decoder是挨个输入挨个输出的,它这里跟Self-attention最大的区别就是:self-attention可以同时考虑所有内容,来进行下一步判断,而这里的Decoder并不行;
所以就有了Masked Multi-Head Attention!
Masked Multi-Head Attention主要用于在生成序列时防止信息泄露(即模型在生成一个词时,不能提前看到后续的词)。这是实现自回归生成模式的关键技术。
也就是说,它考虑的是它本身以及前面输出过的内容,对于后续内容它不做考虑也无法考虑!
3、为什么说Transformer可以代替seq2seq?
3.1、seq2seq的两大缺陷
- seq2seq架构的第一大缺陷是将Encoder端的所有信息压缩成一个固定长度的语义向量中, 用这个固定的向量来代表编码器端的全部信息. 这样既会造成信息的损耗, 也无法让Decoder端在解码的时候去用注意力聚焦哪些是更重要的信息.
- seq2seq架构的第二大缺陷是无法并行, 本质上和RNN/LSTM无法并行的原因一样.
3.2、Transformer的改进
Transformer架构同时解决了seq2seq的两大缺陷, 既可以并行计算, 又应用Multi-head Attention机制来解决Encoder固定编码的问题, 让Decoder在解码的每一步可以通过注意力去关注编码器输出中最重要的那些部分.
4、对于AT和NAT
这张图片对比了 自回归解码器(Autoregressive Transformer, AT) 和 非自回归解码器(Non-Autoregressive Transformer, NAT) 两种解码器在序列生成任务中的不同之处。它们都是用于生成序列(如文本)的模型,但在生成方式上存在显著差异。
4.1、AT Decoder(自回归解码器)
- 工作方式 :
- 自回归解码器是逐步生成输出序列的。在每一步中,解码器根据前一步生成的输出来预测当前步的输出。
- 例如,生成第一个词
w1
后,模型将w1
作为输入,用来生成第二个词w2
。生成w2
后,再用w1
和w2
作为输入来生成w3
,依此类推,直到生成特殊标记END
表示序列结束。
- 图示 :
- 图中
START
表示解码器的初始输入,通常是一个特殊的开始标记。 - 解码器逐步生成
w1
、w2
、w3
等词,并最终生成END
,表示序列结束。
- 图中
- 优点 :
- 高质量生成:由于每一步生成时都参考了前面的生成结果,生成的序列通常连贯性更好,质量更高。
- 灵活性:可以处理不同长度的输出序列,并且能很好地捕捉词与词之间的依赖关系。
- 缺点 :
- 生成速度慢:由于每一步都依赖于前一步的结果,生成过程无法并行化,尤其在处理长序列时,速度较慢。
4.2、NAT Decoder(非自回归解码器)
- 工作方式 :
- 非自回归解码器在生成序列时,所有词汇可以同时生成,而不需要依赖之前生成的词。这种并行生成的方式极大地加快了生成速度。
- 解码器直接根据输入(如编码器的输出)生成整个序列,所有位置上的词汇在同一时间生成。
- 图示 :
- 图中
START
表示解码器的初始输入,非自回归解码器为每个位置都提供了相同的起始标记,或者一些固定的输入,之后并行生成整个序列w1, w2, w3, w4
等。 - 在这种模式下,解码器不需要等待前一步的输出即可生成每一步的词汇。
- 图中
- 优点 :
- 生成速度快:由于生成过程是并行化的,非自回归解码器的生成速度比自回归解码器快得多。这在实时应用中(如文本到语音合成,TTS)非常有优势。
- 稳定性:在某些任务(如 TTS)中,非自回归解码器的并行生成方式可以提供更稳定的生成结果。
- 缺点 :
- 质量问题:由于每个词的生成是独立的,非自回归解码器难以捕捉词与词之间的依赖关系,容易出现生成质量较低或不连贯的问题。
- 多模态问题(Multi-modality):在生成过程中,由于词与词之间的独立性,非自回归解码器可能在相同的上下文下生成多种可能的序列,导致生成的不确定性增大。
4.3、细节讨论
- 如何确定 NAT 解码器的输出长度 :
- 长度预测器:需要一个额外的模型或模块来预测输出序列的长度。
- 生成超长序列 :另一种策略是生成一个非常长的序列,然后丢弃多余的部分,直到遇到
END
标记。
- AT 和 NAT 的对比 :
- AT 通常在生成质量上优于 NAT,特别是在生成需要考虑上下文和依赖关系的任务上,如机器翻译。
- NAT 的优势在于速度,在对生成速度要求高的应用(如 TTS)中有明显的优势。
4.4、小结
- 自回归解码器(AT):依赖于前面生成的词汇,逐步生成整个序列,生成质量较高但速度较慢。
- 非自回归解码器(NAT):所有词汇同时生成,生成速度极快,但在捕捉上下文依赖和生成连贯性上存在挑战,通常生成质量较低。