Transformer模型的核心是编码器-解码器(Encoder-Decoder)架构,但与传统的序列到序列模型不同,它完全放弃了循环和卷积结构。

  • 编码器(Encoder):负责处理输入序列,将其编码成一个连续的向量表示。它由一系列相同的编码器层堆叠而成,每个编码器层包含两个子层:

    • 多头自注意力机制
    • 前馈神经网络
  • 解码器(Decoder):负责根据编码器的输出生成目标序列。它也由一系列相同的解码器层堆叠而成,每个解码器层包含三个子层:

    • 带掩码的多头自注意力机制
    • 交叉注意力机制
    • 前馈神经网络
      Transformer_20250914_U.png

1. input & output

输入:

  • 输入一段text ,每个词视为一个token,经过Embedding(词嵌入),每个token都转为稠密向量如32维 ->(batch,seqlen,32)
  • torch.nn.Embedding(num_embeddings, embedding_dim) 本质上是一个查找表矩阵,token作为index,返回一行向量,随机初始化然后通过优化器优化表示
  • (上述的嵌入维度也称 dmodeld_{model})
  • 位置编码:RoPE (Rotary PositionEmbedding)
  • 用于补充位置信息(注意力机制本身是顺序无关),编码方法本身可以随意,论文中使用的方法是正余弦函数交替,同样生成(batch,seqlen,32)
    Transformer_20250914_G.png
    - pos 是词语在序列中的位置(比如0、1、2...)
    - dmodel​ 是词嵌入向量的维度即embedding_dim
  • (对于dim为32的嵌入,会遍历i从0-15生成一个32维的位置编码向量,然后直接与word vector相加)
    为什么用RoPE?
  • 正余弦分解后,pos+k位置可用pos与k位置线性组合表示,包含相对位置信息*
    解码:
  • 输出一般是一个(batch,seqlen,vocab_size)
  • 最后一部分是logits向量,通过softmax转为概率分布probilities
  • 此处softmax变种,引入T(温度系数)来调整输出权重,T越高,将增加低概率token的权重,最终根据概率进行随机选择
    Transformer_20250914_J.png

2. Attention

为输入序列中的每个元素计算一个注意力分数,这些分数代表了该元素对当前任务的重要性。然后,模型使用这些分数对所有元素进行加权求和,从而得到一个包含上下文信息的向量表示

查询(Query, Q)、键(Key, K)和值(Value, V)
注意力分数:

  • => score(Q,K) = Q·KTK^T
  • 具体来讲,每个词都会有一个 QiQ_iKiK_i
  • 让一个词的 QiQ_i 去查询另一个词 KjK_j 其点积越大,表示这两个词之间的关系越值得注意
    Transformer_20250914_I 1.png
  • 为了防止点积结果过大导致梯度消失,通常需要对分数进行缩放然后转为一个概率分布,表示各词在序列中的重要程度:
    Transformer_20250914_I.png
  • 其中dkd_kKiK_i的维度,dkd_k 一般为 dmodel/nheadd_{model}/n_{head}
  • 比如512维嵌入,8注意力头,则dkd_k取64
  • 注意力分数维度 Q (seqlen,dkd_k) · KTK^T(dkd_k,seqlen) => (seqlen,seqlen)

掩码:

  • 在softmax之前,Q·KTK^T 矩阵左下角部分 设置为 -\infty
  • 这样在softmax之后,左下角都会变成 0,每个词对于该词之后的注意力分数都会变为 0,这样就无法看见未来的内容导致信息泄露
  • (根据任务而定,有些任务不用掩码)

上下文表示:αi\alpha_i · viv_i

  • => Attention = α\alpha · VV ( O(seqlen2)O(seqlen^2) )
  • shape:(seqlen,d_k)
  • Multihead => n_head contact => (seqlen,d_model)
  • 也即:
  • Transformer_20250914_G.png
    如何获得QKV?
  • Q = X·WQW^Q
  • K = X·WKW^K
  • V = X·WVW^V
  • 其中,WQW^Q WKW^K WVW^V都是随机初始化然后经过优化器学习而得的权重矩阵,维度都为(dmodeld_{model},dmodeld_{model})

Transformer_20250914_7.png

3.多头注意力

注意,对于多头注意力,三个权重矩阵是对于整体而言的

  • X (seqlen,d_model) WQW^Q (d_model,d_model)
  • Q => (seqlen,d_model)
    计算完QKV后,计算注意力分数之前,进行拆分:
  • 单头 => Q (seqlen,d_k)
    多头的输出:
  • 每个头的Attention(seqlen,d_k)拼接后再经过一个全连接层,变成(seqlen,d_model)
    输出:
    残差连接:Mulhead输出再和X相加
  • LayerNorm:对单个样本的所有特征维度进行归一化
  • [[FFN]]:对每个位置的向量进行独立的、非线性的变换
  • 之后再加残差和LayerNorm,作为输出

4.交叉注意力

这部分涉及 解码器 的设计:

  • 解码器自注意MulHead的输入:
  • 目标序列,模型看到的当前词和上下文(带掩码,表示只能看到当前和之前的内容)
  • (batch,seqlen,d_model)
  • 训练时,这个seqlen就是整个序列的长度
  • 推理时,这个seqlen会随着自回归的过程增大 1,2,...,
  • 交叉注意力CrossHead的输入:
  • Q: X来自解码器的前一个子层X · WQW^Q (查询目标)
  • K、V: X来自encoder的输出X · WKW^K , X · WVW^V (序列特征)

5.叠加

编码器块和解码器块都可以叠加更多的块以提高表现
编码器块:

  • 按顺序堆叠。第一个编码器块接收原始输入(词嵌入 + 位置编码),其输出作为第二个编码器块的输入,以此类推。
    解码器块:
  • 也按顺序堆叠。每个解码器块的输入来自前一个解码器块的输出,而其交叉注意力机制的输入则始终来自最后一个编码器块的输出

6. 对比

Transformer 的主要优势在于其通过自注意力(Self-Attention)机制,实现了卓越的并行计算能力和更强大的长距离依赖(Long-Range Dependencies)捕捉能力。 这使其在处理长序列(如长篇文章、基因序列等)时,效果和效率都远超传统的 RNN/LSTM
Transformer_20250914_G 1.png