系列文章目录
【论文精读】Transformer:Attention Is All You Need
文章目录
- 系列文章目录
- 一、Encoder-only、Decoder-only和Encoder-Decoder
- (一)基本概念
- 1、Encoder-only 模型
- 2、Decoder-only 模型
- 3、Encoder-Decoder 模型
- (二)为什么现在的大语言模型都用Decoder-only
- 二、Transformer的基本结构和原理
- (一)基本背景
- (二)核心架构
- 1、Encoder 编码器
- 2、Decoder 解码器
- (三)Transformer中的注意力机制
- 1、多头注意力机制的核心原理
- 2、Transformer为何让Q(查询)和K(键)使用独立的权重矩阵进行计算
- 3、为什么需要 Q、K、V(查询、键、值)三个矩阵
- (四)位置编码
- (五)为什么Transformer用LayerNorm而不用BatchNorm
- 三、Transformer相比RNN、LSTM的优势
- 1、并行计算能力
- 2、长距离依赖问题
- 3、建模灵活性
- 4、应用领域的成功
一、Encoder-only、Decoder-only和Encoder-Decoder
标准的 Transformer 模型主要由两个模块构成:
- Encoder(左边):负责理解输入文本,为每个输入构造对应的语义表示(语义特征);
- Decoder(右边):负责生成输出,使用Encoder输出的语义表示结合其他输入来生成目标序列。
(一)基本概念
1、Encoder-only 模型
Encoder-only模型只使用Transformer的编码器部分。编码器的核心是处理输入序列,并生成该序列的上下文向量,能够很好地捕捉输入序列的全局信息。
- 典型模型:BERT (Bidirectional Encoder Representations from Transformers)
- 应用场景:适合理解类任务
- 文本分类:如情感分析、新闻分类
- 问答任务:通过输入问题和上下文,模型从上下文中抽取出准确的答案
- 命名实体识别:标注文本中的特定实体(如人名、地名等)
2、Decoder-only 模型
Decoder-only模型只使用Transformer的解码器部分。解码器主要用于生成序列,它依赖于自回归机制,每次生成一个单词,并根据之前生成的单词继续预测下一个单词。
- 典型模型:GPT(Generative Pretrained Transformer)
- 应用场景:适合生成类任务
- 文本生成:如对话生成、自动写作
- 对话系统:逐步生成自然语言响应,回答用户提问
- 机器翻译:逐词生成目标语言的翻译结果
3、Encoder-Decoder 模型
Encoder-Decoder 模型包含编码器和解码器两个部分。编码器处理输入序列,生成上下文向量;解码器则根据编码器的输出生成目标序列。这个结构能够同时处理输入和输出序列的关联。
- 典型模型:T5(Text-to-Text Transfer Transformer)
- 应用场景:适合需要输入和输出匹配的任务
- 机器翻译:将一个句子从源语言翻译成目标语言,编码器负责理解源语言句子,解码器负责生成目标语言句子
- 文本摘要:编码器处理长文本,解码器生成简短摘要
- 文本生成:如文本填空或者根据输入生成对应的完整文本
(二)为什么现在的大语言模型都用Decoder-only
Decoder-only模型的工作流程:模型在每一步生成一个词,作为下一步的输入,直到生成结束标记。
- 灵活性高:适用于任意长度的文本生成;
- 统一框架:同一模型可以处理多种任务,无需架构修改;
- 上下文建模:能够捕获长距离依赖,提高生成质量。
自回归语言模型的优势:
自回归模型以概率链式法则为基础,模型生成下一个词的概率仅依赖于之前的词。
P ( w 1 , w 2 , … , w n ) = ∏ i = 1 n P ( w i ∣ w 1 , … , w i − 1 ) P(w_1, w_2, \dots, w_n) = \prod_{i=1}^{n} P(w_i \mid w_1, \dots, w_{i-1})P(w1,w2,…,wn)=i=1∏nP(wi∣w1,…,wi−1)* 灵活性和统一性:Decoder-only 架构能够统一处理理解和生成任务,满足多样化的需求;
- 训练和部署效率:架构简单,易于训练和优化,适合大规模模型的开发;
- 实践验证:大量成功的模型(如 GPT 系列)证明了 Decoder-only 架构的有效性。
二、Transformer的基本结构和原理
Transformer 是一种完全基于注意力机制的神经网络模型,由 Vaswani 等人在2017年提出,标志着自然语言处理领域的一个重要突破。Transformer 解决了 RNN(循环神经网络)和 CNN(卷积神经网络)在处理长序列时的效率和性能问题,特别是在捕捉全局依赖关系、并行计算以及克服梯度消失等方面表现出色。
(一)基本背景
RNN 的局限性:
- 信息依赖于时间步长逐步传递,导致序列过长时早期信息容易衰减
- 无法并行处理,训练时间较长
CNN的局限性:虽然可以通过卷积核来捕捉局部特征,但它的感受野有限,很难处理序列中的远程依赖。
与 RNN 不同,Transformer 摒弃了序列顺序的递归处理方式,避免了序列长度增长带来的信息传递瓶颈,并且支持大规模并行计算。通过全局的注意力机制,Transformer允许每个位置的词语之间关注序列中的其他所有位置,实现了更高效的长程依赖捕捉。
(二)核心架构
Transformer 的架构基于经典的 Encoder-Decoder 结构
- 编码器 Encoder:
- 对输入序列进行编码,提取其中的特征和上下文信息,转化为更高维的隐状态表示(hidden states),即语义向量。
- 编码器通过自注意力机制(Self-Attention)和前馈神经网络(Feed-Forward Network)捕捉输入序列中各个位置之间的依赖关系,生成能够反映序列全局上下文的表示。
- 解码器 Decoder:
- 解码器根据编码器生成的隐状态表示,以及已经生成的目标序列部分(训练时目标序列已知,推理时逐步生成)生成最终的目标输出序列。
- 解码器不仅要关注编码器输出的全局语义信息,还需要通过自注意力机制在目标序列中引入依赖,使其在生成新词时考虑到已经生成的词。
1、Encoder 编码器
每个编码器层由两个主要子层组成,分别为多头自注意力机制和位置前馈神经网络。
- 多头自注意力机制:并行地计算多个自注意力头,从而使得模型从不同的角度对输入序列进行信息聚合。
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q,K,V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})VAttention(Q,K,V)=softmax(dkQKT)V - 前馈神经网络 FFN:独立地应用于每个位置的词向量表示,包含两个全连接层,中间加入ReLU激活函数:
FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x)=\max(0,xW_1+b_1)W_2+b_2FFN(x)=max(0,xW1+b1)W2+b2 - 残差连接与层归一化:每个子层都会加入残差连接,并且通过子层前进行层归一化,以解决梯度消失和加速模型收敛:
LayerNorm ( x + sublayer ( x ) ) \text{LayerNorm}(x+\text{sublayer}(x))LayerNorm(x+sublayer(x))
2、Decoder 解码器
解码器除了具有与编码器相似的多头自注意力机制和前馈神经网络外,还多了一个编码器解码器注意力层(Encoder-Decoder Attention Layer):
- 加入了掩码机制的多头自注意力机制:
- 解码器要求模型在预测下一个词时,只能利用之前生成的词,因此加入了掩码机制;
- 掩码操作将未来词的注意力权重置为负无穷,防止模型获取不应访问的信息。
- 多头注意力机制:
- 编码器-解码器注意力层:通过编码器输出的上下文向量,关注输入序列中的相关部分,来帮助解码器生成与输入相对应的目标序列。
- 前馈神经网络:
- 编码器中的结构相同,独立地应用于解码器中每个词的表示上。
(三)Transformer中的注意力机制
1、多头注意力机制的核心原理
在 Transformer 中,多头注意力机制(Multi-Head Attention) 的核心思想是将输入通过多个独立的注意力机制(即“头”)进行并行计算,然后将各个头的输出拼接(concatenate)起来,最终通过线性变换生成最后的注意力输出。
head i = Attention ( Q , K , V ) MultiHead ( Q , K , V ) = Concat ( head 1 , . . . , head h ) W O \text{head}_i=\text{Attention}(Q,K,V) \\ \text{MultiHead}(Q,K,V)=\text{Concat}(\text{head}_1,...,\text{head}_h)W_Oheadi=Attention(Q,K,V)MultiHead(Q,K,V)=Concat(head1,...,headh)WO
Transformer 使用多头注意力机制是为了提升模型捕捉复杂依赖关系的能力(模型能够从多个角度提取序列间的复杂依赖关系),增强表达能力,避免信息瓶颈,并且通过并行计算提高模型的计算效率和注意力分布的多样性。
2、Transformer为何让Q(查询)和K(键)使用独立的权重矩阵进行计算
Q 和 K 用独立的权重矩阵,是为了让模型有能力从不同角度表达输入序列中的依赖关系
- 不同任务、不同功能:
- Q 代表当前词向其他词发出的“查询”,目的是判断当前词与其他词的相关性;
- K 是其他词对这些查询的“响应”,它用来提供与查询匹配的线索;
- 如果 Q 和 K 共用同一矩阵,查询和响应的表达方式会高度相似,无法有效捕捉不同的关系信息,影响注意力机制的灵活性和表达能力。
- 独立性提供表达多样性:
- 通过不同的线性投影,Q 和 K 能够在不同的向量空间中表征输入的词;
- Q 可以以一种特定的方式编码查询,而 K 则以另一种方式编码响应,从而允许模型捕捉更丰富和复杂的上下文信息。
- 如果 Q 和 K 共用相同的权重矩阵,模型将难以灵活调整词与词之间的相关性表达。
把注意力想象成图书馆检索:
- Query 是你输入搜索框的关键词,Key 是每本书的标签,Value 是书的内容。
- 搜索框和书标签虽然都是文本,但它们的功能不同,所以应该用不同的编码方式。如果强制用同一套编码,搜索系统就很难同时优化“怎么问”和“怎么被找到”。
3、为什么需要 Q、K、V(查询、键、值)三个矩阵
如果只有 Q 和K,我们只能知道每个词与其他词的相关性,但无法获得与这些相关性对应的具体内容。V 是在相关性确定后,被权重加权的部分,生成的结果便是模型对输入序列的理解。
(四)位置编码
由于Transformer不具有处理序列顺序的内在机制(自注意力本身不知道顺序),因此通过为每个位置添加位置编码为模型提供顺序信息。
Transformer中常用的位置编码方法是正弦-余弦位置编码:
P E ( p o s , 2 i ) = sin ( pos 10000 2 i d m o d e l ) PE_{(pos,2i)}=\sin (\frac{\text{pos}}{10000^{\frac{2i}{d_{model}}}})PE(pos,2i)=sin(10000dmodel2ipos)
P E ( p o s , 2 i + 1 ) = cos ( pos 10000 2 i d m o d e l ) PE_{(pos,2i+1)}=\cos (\frac{\text{pos}}{10000^{\frac{2i}{d_{model}}}})PE(pos,2i+1)=cos(10000dmodel2ipos)
做法:把位置编码向量和 token 的embedding直接相加。再送进编码器 / 解码器。
为什么用 sin/cos:
- 不同频率的正余弦波,让每个位置有独特的模式;
- 相对位置可以通过线性变换表示:P E p o s + k PE_{pos+k}PEpos+k可以写成P E p o s PE_{pos}PEpos的线性函数。这让模型容易学到“相隔 k 个位置”的关系;
- 理论上可以外推到训练时没见过的更长序列。
局限性:
- 正弦-余弦位置编码的“可外推”更多是理论上的,实践中并不成立。虽然 sin/cos 函数本身能算出任意位置的值,但模型没学过怎么解读这些新位置。实验表明,直接用正弦编码外推,性能会明显下降,远不如后来 RoPE 的插值方法。
- 正余弦位置编码只给出绝对位置,不直接建模相对距离。模型需要通过注意力自己学出“位置 5 和位置 8 隔了 3”这种关系。
- 正余弦位置编码直接与与 token embedding 相加,信息混叠。
- 正余弦位置编码的不同维度对应不同的频率,导致不同距离范围的位置区分能力不均衡。低频维度的波长很长,相邻位置差异很小,区分度低;高频维度波长短,相邻位置差异大,但是容易周期混叠,远距离位置可能编码相似。
- 固定公式,不学习。
- 只在输入层加一次,之后经过多层注意力,位置信息会逐渐被语义信息稀释。
(五)为什么Transformer用LayerNorm而不用BatchNorm
- BatchNorm(批量归一化):
- 对每层激活,沿批量维度 N 归一化,每个特征通道有自己的统计量;
- 是在batch间选择同一个位置的值做归一化,相当于是对batch里相同位置的字或者单词embedding做归一化。
- LayerNorm(层归一化):
- 对每层激活,沿特征维度 C 归一化,每个样本独立计算。
- 是在一个Batch里面的每一行做normalization,相当于是对每句话的embedding做归一化。显然,LN更加符合我们处理文本的直觉。
NLP 序列任务的数据特性,让 BN 的批量统计量不可靠:
- 序列长度不固定:
- 一个 batch 里的句子长短不一,短的要用 padding 补齐。BN 沿批量维度统计时,padding 位置也会被算进去。padding 本身没有语义,却会拉偏均值和方差,导致归一化失真。LN 对每个样本独立计算,padding 只影响该样本自己的统计,不会跨样本污染。
- 批量大小受限:
- 大模型训练受显存限制,batch size 往往很小(甚至为 1)。BN 需要足够多的样本才能估计出可靠的均值和方差。batch 一小,统计量波动剧烈,训练容易崩。LN 完全不依赖 batch size,batch=1 也能稳定工作。
- 位置敏感性与语义漂移:
- BatchNorm 在批量维度上对每个位置分别计算均值和方差,但不同样本的同一位置可能对应不同的语义角色(如有的句子在第 5 个位置是主语,有的却是谓语),强行对这些语义不同的位置做归一化,会引入大量噪声,破坏特征的语义一致性。
- 训练与推理的不一致:
- BN 训练时用当前 batch 的统计量,推理时用训练阶段累积的滑动平均。如果训练和推理的数据分布有差异,BN 会出现明显的性能下降。LN 训练和推理完全一致,没有这个 gap。
三、Transformer相比RNN、LSTM的优势
1、并行计算能力
- RNN/LSTM:RNN和LSTM是顺序模型,依赖于序列的前后顺序处理数据,当前时刻的输出依赖于前一时刻的输入。这种顺序性限制了模型的并行计算能力,导致训练速度较慢,尤其当序列长度增加时,效率下降明显;
- Transformer:Transformer通过自注意力机制(Self-Attention)消除了序列顺序的依赖,允许模型同时处理输入序列的不同部分。这样大大提升了并行处理能力,训练速度也比RNN/LSTM快得多,尤其是在处理长序列时。
2、长距离依赖问题
- RNN/LSTM:虽然LSTM通过门控机制(如遗忘门和输入门)在一定程度上解决了长距离依赖问题,但依然可能由于梯度消失或梯度爆炸而导致模型难以捕捉长距离依赖;
- Transformer:Transformer的自注意力机制能够直接建立序列中任何位置的全局依赖,无论距离多远。因此在处理长距离依赖时,Transformer更为有效。
3、建模灵活性
- RNN/LSTM:这些模型由于顺序处理限制,只能按时间步长逐步建模,难以在序列的多个位置之间灵活捕捉关系;
- Transformer:自注意力机制可以对整个输入序列中的每个位置进行建模,捕捉序列中任何两个位置的关系,无论它们之间的距离有多远。这样不仅提高了模型的表达能力,还使得它在处理复杂依赖关系时更加灵活。
4、应用领域的成功
Transformer自2017年提出以来,已经在多个领域取得了显著的成功,尤其在自然语言处理(NLP)和计算机视觉领域。模型如BERT、GPT等都是基于Transformer架构,在各类任务中表现远超传统的RNN/LSTM模型。