从0到1理解Transformer:Encoder-Decoder架构如何重塑AI对话能力
【免费下载链接】happy-llm 📚 从零开始的大语言模型原理与实践教程 项目地址: https://gitcode.com/GitHub_Trending/ha/happy-llm
你是否曾好奇ChatGPT如何流畅理解上下文?为何翻译软件能精准转换多语言?这些AI能力的核心源于Transformer架构的Encoder-Decoder设计。本文将通过happy-llm项目的实战代码,用3个场景案例+5段核心代码,带你揭开这个改变AI行业的"黑盒子"。
一、从翻译困境到架构革命
传统神经机器翻译依赖RNN逐词处理,就像用打字机写信——必须按顺序输入,遇到长句还会"失忆"。2017年Google提出的Transformer彻底颠覆这一模式,通过并行计算让模型同时"看见"整个句子。
图1:Transformer与传统RNN架构对比,Encoder负责理解输入,Decoder专注生成输出
项目中第二章详细解析了这一突破:Encoder将"我爱中国"编码为语义向量,Decoder再将其解码为"I love China"。这种分工协作模式,使模型既懂"理解"又会"表达"。
二、Encoder:如何让机器真正"读懂"文本
Encoder就像人类的"阅读理解系统",通过6层叠加网络深度解析输入。核心包含两大模块:
2.1 多头自注意力:同时关注多个关键词
当处理"猫坐在垫子上,它很开心"时,模型需要知道"它"指代"猫"。多头自注意力通过8个并行注意力头,同时捕捉不同词语间的关联:
# 多头注意力核心实现 [docs/chapter2/code/transformer.py#L21]
class MultiHeadAttention(nn.Module):
def __init__(self, args):
self.wq = nn.Linear(args.n_embd, args.n_heads * self.head_dim) # 查询矩阵
self.wk = nn.Linear(args.n_embd, args.n_heads * self.head_dim) # 键矩阵
self.wv = nn.Linear(args.n_embd, args.n_heads * self.head_dim) # 值矩阵
def forward(self, q, k, v):
xq, xk, xv = self.wq(q), self.wk(k), self.wv(v) # 线性变换
xq = xq.view(bsz, seqlen, self.n_heads, self.head_dim).transpose(1, 2) # 拆分为多头
scores = torch.matmul(xq, xk.transpose(2, 3)) / math.sqrt(self.head_dim) # 计算相似度
output = torch.matmul(F.softmax(scores, dim=-1), xv) # 加权求和
每个注意力头专注不同关系,比如一个头关注语法结构,另一个关注语义关联,最后拼接结果得到丰富表征。
2.2 前馈网络:增强特征表达
注意力输出经LayerNorm归一化后,送入两层线性网络+ReLU激活函数,进一步提炼特征:
# 前馈神经网络实现 [docs/chapter2/code/transformer.py#L116]
class MLP(nn.Module):
def forward(self, x):
return self.dropout(self.w2(F.relu(self.w1(x)))) # 线性变换→ReLU→线性变换→Dropout
多个EncoderLayer堆叠形成完整Encoder:
# Encoder实现 [docs/chapter2/code/transformer.py#L153]
class Encoder(nn.Module):
def __init__(self, args):
self.layers = nn.ModuleList([EncoderLayer(args) for _ in range(args.n_layer)])
def forward(self, x):
for layer in self.layers:
x = layer(x) # 逐层处理
return self.norm(x)
图2:EncoderLayer结构示意图,包含多头注意力和前馈网络双重处理
三、Decoder:如何让机器生成流畅文本
Decoder在Encoder基础上增加了"序列生成"能力,关键在于两个特殊设计:
3.1 掩码自注意力:防止"偷看"未来信息
生成时需确保模型只能看到前文。通过上三角掩码矩阵,将未来位置注意力分数设为负无穷:
# 掩码矩阵生成 [docs/chapter2/code/transformer.py#L49]
mask = torch.full((1, 1, args.max_seq_len, args.max_seq_len), float("-inf"))
mask = torch.triu(mask, diagonal=1) # 上三角矩阵,对角线以上为负无穷
图3:掩码自注意力机制,确保生成第i个词时只能关注前i-1个词
3.2 编码器-解码器注意力:融合理解与生成
Decoder第二层注意力以自身输出为Query,Encoder输出为Key/Value,实现"按需关注"输入信息:
# DecoderLayer实现 [docs/chapter2/code/transformer.py#L167]
class DecoderLayer(nn.Module):
def forward(self, x, enc_out):
# 第一层:掩码自注意力
x = x + self.mask_attention.forward(x, x, x)
# 第二层:编码器-解码器注意力
x = x + self.attention.forward(x, enc_out, enc_out)
return x + self.feed_forward.forward(x)
这种机制让翻译模型在生成法语时,能精准对齐英语原文对应词。
四、位置编码:赋予序列顺序感知
注意力机制本身无序,需通过位置编码注入序列信息:
# 位置编码实现 [docs/chapter2/code/transformer.py#L208]
class PositionalEncoding(nn.Module):
def __init__(self, args):
pe = torch.zeros(args.block_size, args.n_embd)
position = torch.arange(0, args.block_size).unsqueeze(1)
div_term = torch.exp(torch.arange(0, args.n_embd, 2) * -(math.log(10000.0)/args.n_embd))
pe[:, 0::2] = torch.sin(position * div_term) # 偶数维度用正弦
pe[:, 1::2] = torch.cos(position * div_term) # 奇数维度用余弦
图4:位置编码可视化,不同位置有独特的正弦余弦波形组合
五、完整Transformer:从输入到输出
将各组件组装成完整模型:
# Transformer整体实现 [docs/chapter2/code/transformer.py#L235]
class Transformer(nn.Module):
def __init__(self, args):
self.transformer = nn.ModuleDict(dict(
wte=nn.Embedding(args.vocab_size, args.n_embd), # 词嵌入
wpe=PositionalEncoding(args), # 位置编码
encoder=Encoder(args), # 编码器
decoder=Decoder(args), # 解码器
))
def forward(self, idx):
tok_emb = self.transformer.wte(idx) # 词嵌入
pos_emb = self.transformer.wpe(tok_emb) # 位置编码
enc_out = self.transformer.encoder(pos_emb) # 编码
dec_out = self.transformer.decoder(pos_emb, enc_out) # 解码
return self.lm_head(dec_out) # 输出预测
图5:完整Transformer架构,包含Encoder-Decoder双向信息流
六、实战应用:从理论到代码
项目提供完整可运行代码,通过以下步骤体验Transformer工作流程:
- 环境准备:安装依赖
pip install -r docs/chapter2/code/requirements.txt
- 运行示例:执行主函数
# 代码入口 [docs/chapter2/code/transformer.py#L322]
def main():
args = ModelArgs(n_embd=100, n_heads=10, dim=100) # 配置模型参数
transformer = Transformer(args) # 初始化模型
logits, _ = transformer.forward(inputs_id) # 前向计算
- 可视化注意力:通过工具查看各层注意力权重分布,直观理解模型如何关注输入
七、架构演进与应用场景
Encoder-Decoder架构衍生出多种变体:
- 仅Encoder:BERT等预训练模型,擅长理解类任务
- 仅Decoder:GPT系列,专注生成任务
- Encoder-Decoder:T5等,适用于翻译、摘要等Seq2Seq任务
图6:不同Transformer变体在LLM排行榜上的表现
通过happy-llm项目的Transformer章节,你可以深入学习更多细节,包括:
- 不同位置编码方案对比
- 注意力头可视化工具使用
- 模型参数量与性能关系
结语:注意力即一切
Transformer抛弃传统RNN的顺序计算,通过纯注意力机制实现并行处理,为大语言模型奠定基础。理解Encoder-Decoder架构,就掌握了现代NLP的"金钥匙"。立即动手实践项目代码,开启你的大模型探索之旅!
点赞+收藏本文,关注项目更新,下期将解析LoRA低秩适配技术如何高效微调大模型。
【免费下载链接】happy-llm 📚 从零开始的大语言模型原理与实践教程 项目地址: https://gitcode.com/GitHub_Trending/ha/happy-llm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考







