Transformer入门知识
引言:为什么我们需要Transformer?
在Transformer诞生之前,自然语言处理(NLP)领域是RNN(循环神经网络)及其变体(LSTM、GRU)的天下。RNN按顺序处理文本,就像我们读一句话时一个字一个字地理解。这种顺序处理带来了两个致命问题:
-
长距离依赖难题:句子越长,早期信息在传递过程中越容易衰减(梯度消失),导致模型难以捕捉长距离的语义关联。
-
无法并行计算:因为必须等前一个字处理完才能处理后一个字,训练速度极慢,无法利用现代GPU的并行能力。
2017年,Google的论文《Attention Is All You Need》提出了Transformer架构,彻底改变了这一切。它抛弃了循环结构,完全基于注意力机制,让NLP进入了新时代。如今,BERT、GPT、T5等所有主流大模型都是Transformer的衍生。
Transformer整体架构:编码器-解码器
原始Transformer是为机器翻译设计的,采用编码器-解码器结构:
-
编码器(Encoder):将输入序列(如英文句子)编码成一系列隐藏表示。
-
解码器(Decoder):根据编码器的输出,逐步生成目标序列(如中文翻译)。
不过,后续的BERT只用了编码器部分(适合理解任务),GPT只用了解码器部分(适合生成任务)。但它们的核心组件是相通的。
核心组件详解
1. 输入嵌入与位置编码
Transformer没有循环结构,如何感知词的顺序?答案是位置编码。
-
词嵌入:每个输入词映射为一个固定维度的向量(比如512维)。
-
位置编码:为每个位置添加一个唯一的位置向量,与词嵌入相加,让模型知道词的绝对和相对位置。
原始Transformer使用正弦和余弦函数生成位置编码,因为这种编码方式能让模型容易地学习到相对位置关系。
2. 自注意力机制(Self-Attention)
这是Transformer的灵魂。自注意力允许每个词直接与序列中的所有词交互,计算它们之间的相关性。
计算过程(以一句话为例:“我 喜欢 猫”):
-
每个词生成三个向量:查询(Query)、键(Key)、值(Value)。这三个向量由输入嵌入乘以三个不同的权重矩阵得到。
-
计算注意力分数:对于“我”,用它的Q与所有词的K做点积,得到它对每个词的关注度(包括自己)。
-
缩放:除以 √d_k(d_k为键向量的维度),防止点积结果过大导致softmax梯度消失。
-
Softmax归一化:将分数转换为概率分布,和为1。
-
加权求和:用这个概率分布对每个词的V进行加权求和,得到“我”在这个上下文中的新表示。
公式:
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(dkQKT)V
直观理解:Q问“我”需要关注什么,K是所有词提供的标签,V是真正的信息。通过Q和K的匹配,找到最相关的V。
3. 多头注意力(Multi-Head Attention)
自注意力虽然强大,但可能过于关注某些方面而忽略其他。多头注意力让模型并行学习多个不同角度的注意力表示。
-
将Q、K、V分成h个头(比如8个头),每个头独立计算自注意力。
-
每个头可以关注不同的关系(比如一个头关注句法关系,另一个头关注语义相似性)。
-
最后将h个头的输出拼接起来,再经过一个线性层。
多头注意力极大地增强了模型的表达能力。
4. 残差连接与层归一化
为了防止网络过深导致梯度消失/爆炸,Transformer采用了两个经典技巧:
-
残差连接:每个子层(如自注意力、前馈网络)的输出加上它的输入,即
LayerOutput = LayerNorm(x + Sublayer(x))。这相当于为梯度开了一条“高速公路”,让信息可以无损传播。 -
层归一化:对每个样本的所有特征进行归一化,稳定训练过程。
5. 前馈神经网络(Feed-Forward Network)
在自注意力层之后,每个位置的表示会通过一个两层的全连接网络(先升维再降维),引入非线性变换,增强模型的拟合能力。这个网络是位置独立的,即对每个词分别应用相同的参数。
为什么Transformer如此强大?
-
并行计算:所有词可以同时处理,训练速度远超RNN。
-
全局感受野:每个词都能直接看到序列中的所有词,完美解决长距离依赖。
-
可解释性:注意力权重可以可视化,让我们知道模型关注哪些词。
-
扩展性强:通过堆叠层数、增加头数,可以轻松扩大模型容量。
代码示例:用HuggingFace Transformers体验Transformer
即使还不完全理解内部细节,你也能用几行代码体验Transformer的强大。这里以BERT(一个Encoder-only的Transformer)为例,进行情感分类:
python
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
# 1. 加载预训练模型和分词器
model_name = "bert-base-chinese" # 中文BERT
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)
# 2. 准备输入
texts = ["这家餐厅的菜真好吃!", "服务态度太差了,不会再来了。"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# 3. 推理
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
predictions = torch.argmax(logits, dim=-1)
print(predictions) # 输出类别标签(0或1)
运行这段代码,你会看到BERT成功区分了正面和负面评价,而这一切只用了不到10行代码。这就是预训练Transformer模型的魔力。
总结与展望
Transformer通过自注意力机制和巧妙的架构设计,成为NLP领域的事实标准。从BERT到GPT-4,从文本到图像(ViT),Transformer的身影无处不在。
作为初学者,掌握Transformer的核心思想是进入大模型世界的钥匙。接下来你可以:
-
深入学习BERT、GPT等变体。
-
实践微调Transformer模型完成具体任务。
-
探索大模型应用开发(RAG、Agent)。
希望这篇入门文章能帮你迈出第一步。如果你有任何疑问,欢迎在评论区交流!
参考资料:
-
Vaswani et al. “Attention Is All You Need.” NeurIPS 2017.
-
李宏毅《Transformer课程》
-
HuggingFace官方文档
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)