热闻岛
返回全网热点

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?

1小时前8 阅读
Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图
一、一句话讲清 Transformer Transformer 是一种处理序列数据的神经网络架构。它最关键的设计是 Self-Attention:让一句话里的每个 token 都能直接和其他 token 建立联系,再按重要程度聚合信息。 这
Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

一、一句话讲清 Transformer

Transformer 是一种处理序列数据的神经网络架构。它最关键的设计是 Self-Attention:让一句话里的每个 token 都能直接和其他 token 建立联系,再按重要程度聚合信息。

这和 RNN 的思路完全不同。RNN 是按顺序从左到右处理,前面的信息要一层层传到后面;Transformer 则是让所有位置在同一层里并行计算,任意两个位置都能直接关联。

二、Transformer 之前,RNN 卡在哪里?

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

RNN 的最大问题不是“不会处理文本”,而是不适合大规模并行训练。它必须先算第 1 个词,再算第 2 个词,后面的步骤依赖前面的结果。序列越长,这种顺序依赖越明显,GPU 的并行能力也越难发挥。

另一个问题是长距离信息衰减。比如一句话开头的主语,要影响几百个 token 后的动词,RNN 需要经过很多步传递,信息和梯度都会慢慢变弱。Transformer 通过注意力机制让任意两个位置直接连接,把“远距离通信”变成了一步到位。

三、Self-Attention:让每个 token 都会“找重点”

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

Self-Attention 可以理解为一次“内部检索”。当前 token 拿着自己的 Query 去和所有 token 的 Key 做匹配,匹配分越高,说明越值得关注;然后模型按权重汇总对应的 Value,得到当前 token 的新表示。

这里最容易混淆的是 Q、K、V 从哪里来。它们不是人工写死的,而是从同一个输入 X 经过三个不同的线性投影矩阵算出来的。

# X: [batch_size, seq_len, d_model]
# W_q / W_k / W_v 都是可训练参数
Q = X @ W_q
K = X @ W_k
V = X @ W_v
# Q 负责“我想找什么”
# K 负责“我有什么标签”
# V 负责“真正要被汇总的内容”

四、注意力公式其实就四步

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

注意力公式看起来像数学题,拆开就是四步:先用 Q 和 K 做点积得到相关度分数;再除以 sqrt(d_k) 稳定数值;然后用 softmax 转成权重;最后用这些权重对 V 做加权求和。

import torch
import math
def scaled_dot_product_attention(Q, K, V, mask=None):
d_k = Q.size(-1)
scores = Q @ K.transpose(-2, -1) / math.sqrt(d_k)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
weights = torch.softmax(scores, dim=-1)
output = weights @ V
return output, weights

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

为什么要除以 sqrt(d_k)?因为 Q 和 K 的维度越大,点积的数值越容易变得很大。数值太大以后,softmax 会变得很尖,几乎只保留最大的一项,其他位置权重接近 0,梯度也容易变小。除以 sqrt(d_k) 后,分数回到更合理的范围,训练更稳定。

五、Multi-Head Attention:不要只从一个角度看关系

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

单个注意力头只能学习一种关联方式。但语言里的关系很多:主谓关系、宾语关系、位置关系、指代关系、语义相似关系。Multi-Head Attention 的做法是把 Q、K、V 投影到多个子空间,让多个头分别学习不同类型的关系,最后再拼接融合。

这就像多个专家同时看同一句话:有人关注语法,有人关注指代,有人关注上下文主题。最后把这些观点合起来,模型得到的表示就更丰富。

六、一个 Transformer Block 里有哪些部件?

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

Transformer Block 通常由两大核心模块组成:Multi-Head Self-Attention 和 Feed-Forward Network。Attention 负责从上下文里找信息,FFN 负责对每个位置做非线性加工。

Add & Norm 也很关键。Add 是残差连接,能把输入原样带到后面,避免深层网络把原始信息冲掉;Norm 是归一化,让不同层的数值范围更稳定,训练更容易收敛。

def transformer_block(x, self_attention, ffn, norm1, norm2, mask=None):
attn_out = self_attention(norm1(x), mask)
x = x + attn_out
ffn_out = ffn(norm2(x))
x = x + ffn_out
return x

七、Encoder 和 Decoder 到底差在哪?

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

Encoder 的注意力是双向的。一个 token 可以看到前面的词,也可以看到后面的词,所以它更适合“理解类任务”,比如文本分类、命名实体识别、语义匹配、抽取式问答。

Decoder 的注意力带有因果遮蔽。生成第 N 个 token 时,只能看到前面已经生成的 token,不能提前偷看后面的答案。所以它天然适合“生成类任务”,比如对话、写作、代码生成。

# causal mask:下三角为 1,上三角为 0
# 作用:当前位置不能看到未来 token
seq_len = 5
mask = torch.tril(torch.ones(seq_len, seq_len))
# tensor([
# [1., 0., 0., 0., 0.],
# [1., 1., 0., 0., 0.],
# [1., 1., 1., 0., 0.],
# [1., 1., 1., 1., 0.],
# [1., 1., 1., 1., 1.]
# ])

八、三种架构:Encoder-only、Decoder-only、Encoder-Decoder

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

Encoder-only 代表是 BERT,一般用来理解文本。Decoder-only 代表是 GPT、LLaMA、Qwen,一般用来生成文本。Encoder-Decoder 代表是 T5、BART,一般用来做输入到输出的转换,比如翻译、摘要、改写。

不是说哪一种永远最好,而是看任务要什么。如果任务重点是“看懂输入”,Encoder 更合适;如果重点是“继续生成”,Decoder 更合适;如果输入和输出结构明显不同,Encoder-Decoder 更自然。

九、为什么现在通用大模型多选 Decoder-only?

Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?配图

现在很多通用大模型选择 Decoder-only,不是因为 Encoder 没价值,而是因为 Decoder-only 的训练目标非常统一:根据前文预测下一个 token。

这个目标足够简单,也足够强大。写文章是续写,聊天是续写,写代码是续写,翻译也可以包装成“根据指令继续生成目标语言文本”。更重要的是,互联网上大量文本天然适合做下一 token 预测,不需要每条数据都人工标注。

所以在大规模预训练时代,Decoder-only 更容易把数据规模、模型规模和任务统一性结合起来。它不是唯一架构,但确实是通用生成式大模型最顺手的选择。

十、面试时怎么总结?

讲 Transformer,不要只背“Encoder、Decoder、Attention”。更好的讲法是先说 RNN 的两个问题:顺序计算慢、长距离关系难学;再说 Self-Attention 怎么让每个 token 直接看到其他 token;接着讲 Q/K/V、sqrt(d_k)、多头注意力和 FFN;最后再解释 Encoder-only、Decoder-only、Encoder-Decoder 的场景差异。

如果能把“为什么现代大模型多选 Decoder-only”讲清楚,文章就会从概念介绍升级成架构理解。重点不是把所有公式堆出来,而是让读者明白:Transformer 的设计,是为了让模型更快、更稳、更容易吃下海量文本。

要点速读

一、一句话讲清 Transformer Transformer 是一种处理序列数据的神经网络架构。它最关键的设计是 Se

  • 一、一句话讲清 Transformer Transformer 是一种处理序列数据的神经网络架构
  • 它最关键的设计是 Se
  • 更多细节仍在持续更新中