醋醋百科网

Good Luck To You!

举例子讲解Transformer Decoder层流程

专注讲解一个完整的、独立的Decoder架构(比如在GPT这类纯Decoder模型中)。这次用最直白的语言和具体数字例子,追踪一个词向量从输入到输出的全过程。

任务: 用Decoder生成句子 "我很开心",我们观察它如何生成 "开心" 这个词。

模型极简参数(便于理解):

  • d_model(向量维度)= 3 (实际中512+,这里用3维可视化)
  • d_ff (FFN内部维度) = 6 (升维2倍)
  • 词表: [<SOS>, 我, 很, 开心, <EOS>, ...] (假设词表大小=5)
  • 已生成序列: ["<SOS>", "我", "很"](接下来要生成“开心”)

图解Decoder单层处理流程(生成“开心”的位置)

我们聚焦Decoder的某一层(比如第1层),看看它对当前要生成的位置(“开心”的位置,即序列第3位)做了什么。

阶段0:输入准备

  1. 输入序列: ["<SOS>", "我", "很"] (位置0, 1, 2)
  2. 目标输入: 模型当前要处理 位置3 (即将生成"开心"的位置)。
  3. 该位置的输入向量 (input_pos3):
  4. 位置嵌入: 因为位置3还没生成词,输入是<空位>。
  5. 操作: 使用 <SOS> 或 Padding 的嵌入 + 位置编码 (Position 3)。简单起见,我们假设初始输入为:
  6. input_pos3 = [0.1, 0.2, 0.3] (维度=3,代表“待生成位置3”的状态)

阶段1:Masked Multi-Head Self-Attention (只关注已知词!)

  • 目的: 让位置3 (待生成) 关注前面已生成的词 (<SOS>, 我, 很),但不能看自己或未来!
  • 输入: 所有位置0,1,2,3的向量(形状 [4, 3])。位置3的输入是 [0.1, 0.2, 0.3]。
  • 关键 - Masking:
    • 位置3 (待生成) 只能关注 位置0 (<SOS>)、位置1 (我)、位置2 (很)。
    • 位置3自己和位置4(未来)的注意力权重被强制设为极小值(如-999)!
  • 计算 (简化):
  • 位置3会计算和 <SOS>、我、很 的相似度。
  • 假设注意力权重分布:
    • 关注 <SOS> 权重 = 0.1
    • 关注 我 权重 = 0.3
    • 关注 很 权重 = 0.6 (“很”是刚生成的词,最相关)
  • 加权求和 (output_self_pos3):
output_self_pos3 = 0.1 * <SOS>向量 + 0.3 * "我"向量 + 0.6 * "很"向量
  • 作用: 位置3知道了:“我”是主语,“很”是一个程度副词(修饰后面内容),我需要生成一个形容词。
  • 输出 (output_self_pos3): [0.8, 1.2, 0.4]

阶段2:Add & Norm 1

  • 操作:
    • 残差连接 = output_self_pos3 + input_pos3 = [0.8+0.1, 1.2+0.2, 0.4+0.3] = [0.9, 1.4, 0.7]
    • 层归一化 (LayerNorm):对 [0.9, 1.4, 0.7] 进行标准化(使其均值为0,方差为1)。
      • 简化假设归一化后: [0.0, 1.0, -0.5] (形状 [1, 3])
  • 输出 (norm_out1_pos3): [0.0, 1.0, -0.5] (稳定后的信息)

阶段3:Position-wise Feed-Forward Network (FFN) - 特征放大器

  • 输入 (norm_out1_pos3): [0.0, 1.0, -0.5] (代表:“程度副词后需要一个正面形容词”)
  • FFN内部操作:
  • 升维映射: hidden = [0.0, 1.0, -0.5] * W + b
    • W 形状 [3, 6],b 形状 [1, 6]。
    • 假设结果: hidden = [0.5, -0.2, 1.8, 0.1, -1.0, 0.9](升维到6,可能捕获“正面情绪”、“形容词类”等特征)
  • ReLU激活: relu_hidden = max(0, hidden) = [0.5, 0, 1.8, 0.1, 0, 0.9] (过滤掉负值)
  • 降维映射: ffn_output = relu_hidden * W + b
    • W 形状 [6, 3],b 形状 [1, 3]。
    • 假设计算结果: ffn_output = [1.5, 0.2, 2.0](维度压缩回3)
  • 作用: 将“程度副词后接形容词”的提示,深度加工为“需要生成一个强烈的正面情绪形容词”!
  • 输出 (ffn_output_pos3): [1.5, 0.2, 2.0](维度 [1, 3])

阶段4:Add & Norm 2

  • 操作:
    • 残差连接 = ffn_output_pos3 + norm_out1_pos3 = [1.5+0.0, 0.2+1.0, 2.0+(-0.5)] = [1.5, 1.2, 1.5]
    • 层归一化 (LayerNorm): 简化假设归一化后: [0.8, 0.1, 1.5] (形状 [1, 3])
  • 输出 (layer_output_pos3): [0.8, 0.1, 1.5](该Decoder层对位置3的最终输出)
  • 注意: 这个输出会传递给下一层Decoder(如果有多层),或者直接用于预测。

阶段5:输出预测(在最终Decoder层之后)

  1. 最终输入: 假设是顶层Decoder对位置3的输出 (final_vector) = [0.8, 0.1, 1.5] (形状 [1, 3])
  2. 线性层: logits = final_vector * W_vocab + b_vocab
  3. W_vocab 形状 [3, 5](因为词表大小=5),b_vocab 形状 [1, 5]。
  4. 假设计算结果: logits = [ -0.2, 1.0, 0.5, 3.0, -1.0 ]
  5. 对应词表: [0: <SOS>, 1: 我, 2: 很, 3: 开心, 4: <EOS>]
  6. Softmax: 将 logits 转成概率:
  7. probs = softmax([ -0.2, 1.0, 0.5, 3.0, -1.0 ])
  8. 假设结果: [0.05, 0.15, 0.10, 0.65, 0.05]
  9. 开心 的概率 (index=3) = 0.65 (最高!)
  10. 我 = 0.15,很 = 0.10,<SOS>/<EOS> ≈ 0.05
  11. 预测输出: 选择概率最高的词 -> “开心”!生成成功!

核心总结:纯Decoder如何生成一个词(位置3“开心”)

阶段

输入向量(位置3)

处理内容

输出向量(位置3)

代表的意义 (简化)

0. 输入准备

[0.1, 0.2, 0.3]

位置3的初始状态

-

"开始生成位置3啦!"

1. Masked Self-Attn

[0.1, 0.2, 0.3]

只关注前面已生成的词(<SOS>, 我, 很),得知:很后面接形容词!

[0.8, 1.2, 0.4]

"前面有‘我’和‘很’,我要生成形容词!"

2. Add & Norm 1

[0.8, 1.2, 0.4]

稳定信息,保留初始状态

[0.0, 1.0, -0.5]

"初步整理:程度副词后需要形容词!"

3. FFN

[0.0, 1.0, -0.5]

深度加工:升维→激活→降维,提炼核心语义

[1.5, 0.2, 2.0]

"强烈!需要生成一个表示正面情绪、状态良好的形容词!"

4. Add & Norm 2

[1.5, 0.2, 2.0]

再次稳定信息

[0.8, 0.1, 1.5]

"最终结论:生成一个表示开心的词!"

5. 输出层

[0.8, 0.1, 1.5](顶层的)

线性层 → Softmax

probs = [..., **0.65**]

“开心”概率最高!它被选中了!

关键为什么需要这些?

  1. Masked Self-Attention:
  2. 目的: 让模型生成每个词时只依赖已经生成的词(符合语言规律)。
  3. 就像说话: 你只能说已经出口的词语,不能说后面还没想到的词。掩码保证了这个规则!
  4. FFN (前馈神经网络):
  5. 目的: 将注意力层捕获的上下文信息(这里是“我很__”)做深度加工、提炼、增强。它是特征提取和语义深化的核心引擎
  6. 就像思考: 注意力告诉你“需要形容词”,FFN 帮你深入想“需要什么样的形容词”(正面?强烈?表情绪?)。
  7. Add & Norm (残差连接+层归一化):
  8. 目的: 稳定训练过程,避免信息在网络传递中衰减或爆炸,让模型更容易学。
  9. 输出层:
  10. 目的: 把Decoder最后一层输出的隐藏状态(一个高维向量)转换回词表空间,告诉我们模型最想生成哪个词。

简单来说,Decoder的工作流就是:

看前面说了什么(Masked Self-Attn)深入思考要说什么(FFN)预测出下一个词(Output Layer)

不断重复这个过程,直到生成完整的句子或遇到结束符。

希望这个剥离Encoder、专注于Decoder自身工作流、使用直观数值的详解,能让你彻底明白它是如何运作的!




如何学习大模型?

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!

这是一份大模型从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

100套AI大模型商业化落地方案

大模型全套视频教程

200本大模型PDF书籍

学会后的收获:

o 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

o 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

o 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

o 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

LLM面试题合集

大模型产品经理资源合集

大模型项目实战合集

有需要的小伙伴,可以私信小编【大模型】领取

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言