起源与发展

Transformer 源自于AI自然语言处理任务NLP;在计算机视觉领域CV,近年来Transformer逐渐替代CNN成为一个热门的研究方向。此外,Transformer在文本、语音、视频等多模态领域也在崭露头角,可见Transformer模型的重要之处。

2017 年 Google 在《Attention Is All You Need》中提出了 Transformer 结构用于序列标注,在翻译任务上超过了之前最优秀的循环神经网络模型;与此同时,Fast AI 在《Universal Language Model Fine-tuning for Text Classification》中提出了一种名为 ULMFiT 的迁移学习方法,将在大规模数据上预训练好的 LSTM 模型迁移用于文本分类,只用很少的标注数据就达到了最佳性能。

这些具有开创性的工作促成了两个著名 Transformer 模型的出现:

  • GPT (the Generative Pretrained Transformer);
  • BERT (Bidirectional Encoder Representations from Transformers)。

通过将 Transformer 结构与无监督学习相结合,我们不再需要对每一个任务都从头开始训练模型,并且几乎在所有 NLP 任务上都远远超过先前的最强基准。

Transformer和LSTM的最大区别,就是LSTM的训练是迭代的、串行的,必须要等当前字处理完,才可以处理下一个字。而Transformer的训练时并行的,即所有字是同时训练的,这样就大大增加了计算效率。Transformer使用了位置嵌入(Positional Encoding)来理解语言的顺序,使用自注意力机制(Self Attention Mechanism)和前馈全连接层进行计算,这是Transformer的创新点。

基本结构

模型的左半边Encoder部分可以看作是一个编码器,右半边Decoder部分可以看作是一个解码器,其中编码器是双向的,解码器是单向的需要循环迭代输出。

虽然新的 Transformer 模型层出不穷,它们采用不同的预训练目标在不同的数据集上进行训练,但是依然可以按模型结构将它们大致分为三类:

  • 纯 Encoder 模型(例如 BERT),又称自编码 (auto-encoding) Transformer 模型;
  • 纯 Decoder 模型(例如 GPT),又称自回归 (auto-regressive) Transformer 模型;
  • Encoder-Decoder 模型(例如 BART、T5),又称 Seq2Seq (sequence-to-sequence) Transformer 模型。

特点

  • 自注意力机制(Self-Attention):这是Transformer的核心概念之一,它使模型能够同时考虑输入序列中的所有位置,而不是像循环神经网络(RNN)或卷积神经网络(CNN)一样逐步处理。自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。
  • 多头注意力(Multi-Head Attention):Transformer中的自注意力机制被扩展为多个注意力头,每个头可以学习不同的注意权重,以更好地捕捉不同类型的关系。多头注意力允许模型并行处理不同的信息子空间。
  • 堆叠层(Stacked Layers):Transformer通常由多个相同的编码器和解码器层堆叠而成。这些堆叠的层有助于模型学习复杂的特征表示和语义。
  • 位置编码(Positional Encoding):由于Transformer没有内置的序列位置信息,它需要额外的位置编码来表达输入序列中单词的位置顺序。
  • 残差连接和层归一化(Residual Connections and Layer Normalization):这些技术有助于减轻训练过程中的梯度消失和爆炸问题,使模型更容易训练。
  • 编码器和解码器:Transformer通常包括一个编码器用于处理输入序列和一个解码器用于生成输出序列,这使其适用于序列到序列的任务,如机器翻译。

注意力

当人类的视觉机制察觉到一个物体时,通常不会从头到尾地扫视整个场景;一般会根据个人的需求集中关注特定的部分。

比如下面这张图,我们第一眼应该是看到一只动物,然后,眼睛会先注意到动物的脸,然后得出初步结论,这应该是一只狼;就像右边注意力图所示,颜色更深的部分表示一般是我们人类最先看见(注意)的。

注意力最早应用在机器视觉领域(CV,Computer Vision),后来才应用到NLP和LLM领域。

在Transformer架构中,有3种不同的注意力层:

  • 编码器中的全局自注意力层(Global self attention layer)
  • 解码器中的交叉注意力层(Cross attention layer)
  • 解码器中的因果自注意力层(Causal attention layer)

注意力机制基础

注意力机制的数学表示如下:

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V

其中,Q,K和V分别指的是查询(Query),键(Key)以及值(Value)矩阵。

简单来说,查询矩阵Q里的数据代表了我们关注的词,键矩阵K里的数据用来帮我们计算这些词之间的相似度(即注意力分数:attention score,向量点乘可以计算相似度),而值矩阵V里的数据则用来根据这些相似度计算出最终的输出结果

为了确保计算过程中的数据不会因为维度(即键的大小)太大而爆炸,或者太小而消失,注意力分数会通过键的维度的平方根来进行调整;接着,通过softmax函数把这些分数转化成权重,最后这些权重会和值矩阵相乘,得到最后的输出(注意力向量)。

理解Q、K、V

注意力机制中有两个输入:

  • 查询序列(Q):正在处理的序列(在底部)。
  • 上下文序列(K,V):被关注的序列(在左侧)。

输出序列的维度与查询序列相同。

这个操作常常被比作字典查找,但是,是一个模糊的,可微分的,向量化的字典查找。

举个例子,假设有一个普通的Python字典,有 3 个键和 3 个值,被传递了一个单独的查询:

d = {'color': 'blue', 'age': 22, 'type': 'pickup'}
result = d['color']

这里,查询(Q)是你要找的内容,键(K)表示字典里有什么样的信息,而值(V)则是对应的信息;在普通的字典查找中,字典会找到匹配的键,并返回其对应的值;如果查询找不到完全匹配的键,也许你会期望返回最接近的值,比如在上面的例子中,如果你查找 d["species"],你可能会期望返回 “pickup”,因为它是最接近查询的匹配

一个注意力层就像是这样的一个模糊查找,但它不仅仅是寻找最佳键;它结合了查询(Q)和键(K)向量,来确定它们匹配的程度,也就是“注意力分数”。然后,根据“注意力分数”对所有值进行加权平均;在注意力层中,每个位置的查询(Q)序列都提供一个查询向量,而上下文序列则充当了一个字典,每个位置提供一个键和值向量;在使用这些向量之前,注意力层会用一个全连接层对输入向量进行投影。

编码器 Encoder

自注意力 Self-Attention

随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。在处理过程中,自注意力机制会将对所有相关单词的理解融入到我们正在处理的单词中。更具体的功能如下:

  • 序列建模:自注意力可以用于序列数据(例如文本、时间序列、音频等)的建模。它可以捕捉序列中不同位置的依赖关系,从而更好地理解上下文。这对于机器翻译、文本生成、情感分析等任务非常有用。
  • 并行计算:自注意力可以并行计算,这意味着可以有效地在现代硬件上进行加速。相比于RNN和CNN等序列模型,它更容易在GPU和TPU等硬件上进行高效的训练和推理。(因为在自注意力中可以并行的计算得分)
  • 长距离依赖捕捉:传统的循环神经网络(RNN)在处理长序列时可能面临梯度消失或梯度爆炸的问题。自注意力可以更好地处理长距离依赖关系,因为它不需要按顺序处理输入序列。

自注意力结构如下:

参考链接

Hello! · Transformers快速入门

史上最详细Transformer讲解以及transformer实现中文版完形填空(掩蔽字训练MASK) 内容详细易懂且附有全部代码_transformer mask-CSDN博客

【超详细】【原理篇&实战篇】一文读懂Transformer-CSDN博客

第四篇:一文搞懂Transformer架构的三种注意力机制 - 知乎 (zhihu.com)