尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

收藏!深入浅出Transformer核心架构:Encoder与Decoder实战指南

收藏!深入浅出Transformer核心架构:Encoder与Decoder实战指南
📅 发布时间:2026/6/18 1:50:58

本文详解Transformer两大核心组件Encoder和Decoder,重点讲解位置编码Positional Encoding的三角函数实现与掩码Mask操作(padding mask和casual mask)的作用。通过PyTorch代码示例展示具体实现方法,并以英文翻译任务为例展示Transformer模型的训练与推理过程,帮助读者深入理解Transformer架构细节与应用实践。

一、Encoder和Decoder

首先看一下“Attention is all you need”原文给出的Transformer模型整体结构图:

左半部分是编码器Encoder,右半部分是解码器Decoder,Encoder负责将句子的可见部分编码为key和value,Decoder部分负责往后接着生成新的句子内容。从细节来看,Encoder和Decoder都包含了位置编码Positional Encoding子模块,Decoder还额外包含了掩码Mask操作,下面将一一分析它们的作用。

1. 位置编码Positional Encoding

上一篇我们讲述注意力分数计算时使用了一个长度为四个分词的句子,如下图所示

可见第一个分词a1和离它最近的a2、最远的a4都是相同的计算方式,完全忽略了分词之间的相对位置,解决办法是对每个分词的位置进行编码,然后加到词嵌入向量上。一种常用的位置编码是三角函数编码:

其中pos是分词在句子中的位置编号,d 是词嵌入向量的长度,i 是词嵌入向量的第 i 维,偶数维度用正弦编码,奇数维度用余弦编码,同一位置不同维度差90°的相位,不同位置相同维度周期性变化,维度越低周期性变化越快。要想两个位置pos1和pos2的位置编码完全相同需要满足:

左边是整数、右边是无理数,这个条件是不可能成立的,所以三角函数位置编码兼具高低频变化成分以及唯一性。

词嵌入维度512、句子长度1024的位置编码矩阵

三角函数位置编码实现:

import torch from torch import nn class PositionEncoding(nn.Module): def __init__(self, d_model=512, max_seq_len=1024): super().__init__() # shape [max_seq_len, 1] pos = torch.arange(0, max_seq_len).unsqueeze(1) item = 1 / 10000 ** (torch.arange(0, d_model) / d_model) tmp_pos = pos * item pe = torch.zeros(max_seq_len, d_model) pe[:, 0::2] = torch.sin(tmp_pos[:, 0::2]) pe[:, 1::2] = torch.cos(tmp_pos[:, 1::2]) pe = pe.unsqueeze(0) self.register_buffer("pe", pe, False) def forward(self, x): batch, seq_len, _ = x.shape pe = self.pe return x + pe[:, :seq_len, :]
2. 掩码Mask操作

掩码操作就是按某种条件强制地屏蔽矩阵中的某些位置的值,Transformer中的掩码操作可以分为padding mask和casual mask,它们分别应对两个问题:

  • 为了对不同长短的句子进行批量训练推理,需要将较短的句子使用一个特殊的pad token补齐到固定长度,另外要生成的句子也是作为一个矩阵预先填充pad token。pad token只是作为一个占位符,我们并不想让它参与注意力,所以在计算出注意力分数矩阵后,会将pad token参与计算的那些数值屏蔽掉(比如置为一个很小的数值1e-9)
  • 在训练时我们会将问题(句子前半部分)和答案(句子后半部分)全部给到模型,而推理时模型只能看到问题,不能看后面的答案,这导致了训练和推理过程的不一致。为了解决这个问题,在训练时可以用一个上三角矩阵来遮挡句子后半部分,让模型一次只能看到一个分词。
def generate_mask(self, query, key, triu=False): # query shape: [batch, seq_q] device = query.device batch, seq_q = query.shape _, seq_k = key.shape # key shape: [batch, seq_k] mask = (key == self.pad_idx).unsqueeze(1).unsqueeze(2) # mask shape: [batch, 1, 1, seq_k] mask = mask.expand(batch, 1, seq_q, seq_k).to(device) # mask shape: [batch, 1, seq_q, seq_k] if triu: dst_triu_mask = torch.triu( torch.ones(seq_q, seq_k, dtype=torch.bool), diagonal=1 ) dst_triu_mask = ( dst_triu_mask.unsqueeze(0) .unsqueeze(1) .expand(batch, 1, seq_q, seq_k) .to(device) ) mask = mask | dst_triu_mask return mask def forward(self, src, dst): # src_mask用于屏蔽padding的影响,这些padding是为了让句子对齐 src_mask = self.generate_mask(src, src) # dst_mask用于同时屏蔽padding和未见部分,后者需要上三角mask dst_mask = self.generate_mask(dst, dst, True) # src_dst_mask仅用于屏蔽key的padding,不需要上三角 src_dst_mask = self.generate_mask(dst, src)

明白了位置编码和掩码操作后,Encoder和Decoder的实现就比较容易了,就剩下一些layer堆叠和residual的常规操作,可以参看资料[4]的详细实现。

二、训练和推理过程

这里使用一个英文翻译的seq2seq任务来验证Transformer模型效果,使用的数据集部分如下,包含了29909条中英文句子对,经过T5 tokenizer后最长的句子包括39个分词,再在每一个句子开头加上一个BOS。

原始数据集经过划分,80%做训练、20%做测试,核心训练代码如下:

with tqdm.tqdm(total=epochs) as t: for epoch in range(1, epochs + 1): model.train() for index, (en_in, de_in, de_label) in enumerate(train_loader): en_in, de_in, de_label = (en_in.to(device),de_in.to(device),de_label.to(device)) outputs = model(en_in, de_in) # outputs shape: [batch, seq_len, dst_vocab_size] outputs_ = outputs.reshape(-1, outputs.shape[-1]) # outputs_ shape: [batch * seq_len, dst_vocab_size] # de_label shape: [batch, seq_len] de_label_ = de_label.reshape(-1) # de_label_ shape: [batch * seq_len] train_loss = loss_fun(outputs_, de_label_) preds = torch.argmax(outputs_, -1) label_mask = de_label_ != pad_idx correct = preds == de_label_ acc = torch.sum(label_mask * correct) / torch.sum(label_mask) optimizer.zero_grad() train_loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), 1) optimizer.step()

训练日志:

部分推理测试代码,略去了模型初始化和权重加载:

input_ = ["My mother is cooking", "I won!"] en_in = tokenizer(input_, padding="max_length",max_length=max_seq_len,truncation=True,return_tensors="pt",)["input_ids"].to(device) de_in = torch.ones(batch_size, max_seq_len, dtype=torch.long).to(device) * pad_idx de_in[:,0] = tokenizer.bos_token_id model.eval() with torch.no_grad(): for i in range(1, de_in.shape[1]): pred_ = model(en_in, de_in) for j in range(batch_size): de_in[j, i] = torch.argmax(pred_[j, i - 1]) for i in range(de_in.shape[0]): in_ = input_[i] out = [] for token_id in de_in[i]: if token_id == tokenizer.eos_token_id: break out.append(tokenizer.decode(token_id)) print(in_, "->", out)

推理结果:

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包:

  • ✅ 从零到一的 AI 学习路径图
  • ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
  • ✅ 百度/阿里专家闭门录播课
  • ✅ 大模型当下最新行业报告
  • ✅ 真实大厂面试真题
  • ✅ 2025 最新岗位需求图谱

所有资料 ⚡️ ,朋友们如果有需要《AI大模型入门+进阶学习资源包》,下方扫码获取~

① 全套AI大模型应用开发视频教程

(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)

② 大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

③ 大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

④ AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

⑤ 大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

⑥ 大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

以上资料如何领取?

为什么大家都在学大模型?

最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

不出1年,“有AI项目经验”将成为投递简历的门槛。

风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!

这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

以上全套大模型资料如何领取?

相关新闻

  • 通过Miniconda-Python3.9快速启动Jupyter Notebook进行AI开发
  • Miniconda-Python3.9如何避免Python依赖冲突
  • 大模型伦理测试深度复盘:当AI学会“掀桌子”,我们该重新审视编程逻辑了!

最新新闻

  • 告别等待焦虑:Elsevier审稿状态追踪插件让科研投稿进度一目了然
  • 珠海卡地亚手表表冠维修!珠海卡地亚蓝气球表冠锁扣失效暗藏进水风险?2026 最全密封配件更换流程亨得利全盘解析 - 亨得利官方维修中心
  • 音响改装方案:上海冉声汽车音响如何破解上海车主的改装痛点,汽车音响升级/坦克音响改装/汽车音响改装,音响改装门店选哪家 - 音响改装门店分享
  • 2026广州南沙代理记账怎么选?自贸区外贸跨境老板真实避坑心得 - GrowthUME
  • 2026 东莞黄金回收商家深度测评,持证实体门店交易更安心 - 讯息早知道
  • 终极自动化学习方案:智慧树网课高效学习插件完全指南

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号