3 transformer架构

以CS336课程为基础 ​
☝️ 参考b站博主:炮哥带你学
☝️ Transformer算法原理与实战-课程链接

😄学习目标

  • 熟悉各个模块的原理,及面试常见问题
  • 数据流通时,形状是如何变化的?能口述下图结构

在这里插入图片描述


为更加具体,清晰展示各个模块中数据形状的变化,规定以下超参数:

  • Batch Size(B)=32
  • Seq Length(L)=10 【一句话的tokens】
  • Embedding Dim(d_model)=512 【每个token的向量维度】
  • Vocab Size(V)=30000 【词表大小,即词表的总tokens】
  • Head(h)=8 【多头注意力的头数】

3.1 输入层-词嵌入(Input/Output Embedding)

  • 核心:用多维向量,给每个Token附上语义信息

  • 在论文中,维度Embedding Dim(d_model) = 512
    在这里插入图片描述

  • 每一个token(即每一个词)都有对应的词向量,维度为d_model

  • 词表大小为V,即共有V个token

  • 所有的词向量拼接,构成了词嵌入矩阵,大小为[V,d_modle]


面试常见问题

  • Embedding 层和 One-Hot 有什么区别?

    • One-Hot: 稀疏、维度极其巨大(30000维)、无法表示词之间的相似度(正交)。
    • Embedding: 稠密、维度低(512维)、可学习(语义相似的词在空间中距离更近)
  • Embedding 层的参数量怎么算?

    • 公式: v × d v×d v×d
    • 例子: 30 , 000 × 512 = 15 , 360 , 000 30,000 \times 512 = 15,360,000 30,000×512=15,360,000 (约 1500 万参数)

3.2 输入层-位置编码(Positional Encoding)

  • Input = Embedding ( T o k e n ) + Positional Encoding ( P o s ) \text{Input} = \text{Embedding}(Token) + \text{Positional Encoding}(Pos) Input=Embedding(Token)+Positional Encoding(Pos)
    在这里插入图片描述

  • 基于三角函数的编码公式,让位置编码具有周期性和相对位置推导能力

    • d d d: 词向量的维度
    • i = 0 , 1 , . . . d 2 − 1 i=0,1,...\frac{d}{2}-1 i=0,1,...2d1
    • p o s pos pos:指当前token在序列中的第几个位置

    P E ( p o s , 2 i ) = sin ⁡ ( p o s 10000 2 i d ) PE(pos, 2i) = \sin \left( \frac{pos}{10000^{\frac{2i}{d}}} \right) PE(pos,2i)=sin(10000d2ipos)

P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 10000 2 i d ) PE(pos, 2i+1) = \cos \left( \frac{pos}{10000^{\frac{2i}{d}}} \right) PE(pos,2i+1)=cos(10000d2ipos)

  • 例子:“我 是 一 条 狗”位置索引 p o s = 0 , 1 , 2 , 3 pos = 0,1,2,3 pos=0,1,2,3,维度 d = 3 d=3 d=3 时:

    • p o s = 0 ( " 我 " ) pos = 0("我") pos=0(""): 0.000000 , 1.000000 , 0.000000 0.000000, 1.000000, 0.000000 0.000000,1.000000,0.000000

    • p o s = 1 ( " 是 " ) pos = 1("是") pos=1(""): 0.841471 , 0.540302 , 0.002154 0.841471, 0.540302, 0.002154 0.841471,0.540302,0.002154

    • p o s = 2 ( " 一条 " ) pos = 2("一条") pos=2("一条"): 0.909297 , − 0.416147 , 0.004309 0.909297, -0.416147, 0.004309 0.909297,0.416147,0.004309

    • p o s = 3 ( " 狗 " ) pos = 3("狗") pos=3(""): 0.141120 , − 0.989992 , 0.006463 0.141120, -0.989992, 0.006463 0.141120,0.989992,0.006463

3.3 多头注意力机制(Multi-Head Attention)

⛵️重点

  • 核心公式(Q/K/V)
  • 理解掩码Mask(填充掩码Padding Mask、因果掩码Causal Mask)的作用
  • 理解编码器中“多头注意力机制”
  • 理解解码器中“带因果掩码的多头注意力机制”、“多头交叉注意力机制”

3.3.1 Attention(注意力机制)

在这里插入图片描述

  • 核心公式: Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V
    • s c r o e = Q K T scroe=QK^T scroe=QKT,用 Q Q Q K K K作点积算相似度,记为分数 s c o r e score score
    • Q Q Q (Query - 查询): 你手里的便利贴(“我想找关于 AI 的书”)
    • K K K (Key - 索引): 书脊上的标签(“计算机科学”、“烹饪”、“历史”)
    • V V V (Value - 内容): 书里的具体内容
  • 为什么要有 d k \sqrt{d_k} dk
    • 原因: 防止点积结果过大。如果数值太大,Softmax 函数会进入“饱和区”(梯度几乎为 0),导致反向传播时梯度消失,模型练不动。
  • Softmax ( x i ) = e x i ∑ j e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} Softmax(xi)=jexjexi
    • Softmax 是一个归一化函数。它把一堆杂乱无章、有正有负的“原始分数 (Logits)”,瞬间变成一套总和为 1 的“概率分布”。
3.3.2 Multi-Head (多头)

在这里插入图片描述

😭 理解数据维度变换

假设 B = 32 , L = 10 , D m o d e l = 512 , H e a d s = 8 B=32, L=10, D_{model}=512, Heads=8 B=32,L=10,Dmodel=512,Heads=8。每个头维度 d k = 512 / 8 = 64 d_k = 512/8 = 64 dk=512/8=64

  1. Linear Projection ( Q , K , V Q, K, V Q,K,V):

    • 输入 [32, 10, 512] 经过三个不同的线性层。
    • 形状不变:[32, 10, 512]
  2. Split Heads (拆头):

    • 把 512 拆成 8 × 64 8 \times 64 8×64
    • Shape: [32, 10, 8, 64]
  3. Transpose (转置):

    • 把 Heads 维度移到前面,让每个头独立计算。
    • Shape: [32, 8, 10, 64] (Batch, Heads, Seq, Dim)。
  4. Attention Score:

    • Q × K T Q \times K^T Q×KT
    • Result: [32, 8, 10, 10] (注意最后是 10 × 10 10 \times 10 10×10 的矩阵,代表词与词的关系)。
  5. Concat (拼接):

    • 计算完并转置回来:[32, 10, 8, 64]
    • 拼起来:[32, 10, 512]
    • 拼接方式:在这里插入图片描述
  6. Final Linear:

    • 混合各头的信息:[32, 10, 512]
3.3.3 Mask (掩码)

😕 在 Attention 计算中,有些东西是不能看的,我们需要用 Mask 把它们的注意力分数设为 − ∞ -\infty (Softmax 后变成 0)

3.3.3.1 Padding Mask (填充掩码)
  • 场景: 在同一批次中的所有句子的长度要求一致(token数相同),句子长短不一,短句子后面补了 0
  • 目的: 不让 Attention 关注到这些没有意义的 0
  • 应用: EncoderDecoder 都要用。

在这里插入图片描述

3.3.3.2 Causal Mask (因果掩码)
  • 场景: 在并行计算的同时,强行保留串行的因果逻辑

  • 目的: 训练 Decoder 时,预测第 i i i 个词,只能看 0 0 0 i − 1 i-1 i1 的词,绝对不能偷看 i + 1 i+1 i+1 及其后面的词。

    • 训练时:我们手里拿着“标准答案”(比如整句翻译结果)。
    • 作弊风险:如果我们把标准答案一股脑喂给解码器,模型在预测第 2 个词时,如果不加掩码,它就能通过 Self-Attention 直接“偷看”到第 3 个词是什么。
    • 后果:模型会学会“抄答案”,而不是“学语法和语义”。一到考试(推理)时,没有答案可抄,模型就废了。
  • 形状: 一个上三角矩阵(全为 − ∞ -∞ )。

  • 应用: 仅用于 Decoder 的第一层 Attention (Masked Self-Attention)。

  • **例子:**假设我们要训练模型把 “I love AI” 翻译成 “我爱AI”。

    • 标准答案 (Ground Truth): <s> 我 爱 AI <eos>

    • 解码器输入 (Decoder Input): <s> 我 爱 AI (注意向右平移了一位)

    • 当前位置此时模型看到了什么?掩码遮住了什么?(Future)模型应该预测什么?
      第 0 步<s>, , AI (全黑掉)
      第 1 步<s>, , AI (黑掉)
      第 2 步<s>, , AI (黑掉)AI
      第 3 步<s>, , , AI<eos> (实际上是 Padding)

(1)训练过程

在这里插入图片描述

(2)推理过程

在这里插入图片描述

3.3.4 Cross-Attention(交叉注意力机制)
  • 位于解码器的第二层
  • 与注意力机制相同,唯一不同的是Q、K、V的来源
    • Q来自解码器
    • K、V来自编码器

面试常见问题

  • Transformer 的解码器里有两层 Attention,有什么区别?
    • 第一层 (Masked Self-Attention): Q,K,V 都来自 Decoder 自己。加了 Causal Mask。作用是理解已生成的译文
    • 第二层 (Cross-Attention): Q 来自 Decoder,K,V 来自 Encoder。只加 Padding Mask。作用是对齐原文和译文

3.4 Feed-Forward Networks (FFN)(前馈神经网络)

😆如果说 Attention 是在“”(收集上下文信息),那么 FFN 就是在“”(消化和整合这些信息)。 它对序列中的每一个位置 (Token) 独立地进行处理,且用的是同一套参数。

(1)FFN 的结构—三明治结构

就是两层全连接层(Linear),中间夹一个非线性激活函数。

(2)FFN中的维度变化

【Transformer 的 FFN 有一个标志性的**“先膨胀,后压缩”**设计】

输入: [Batch, Seq_Len, 512] ( d m o d e l d_{model} dmodel)

第一层 (膨胀): 映射到 4 倍宽度的维度。

  • 维度变化: 512 → 2048 512 \to 2048 5122048 ( d f f d_{ff} dff)
  • 作用:把数据投射到高维空间,让特征更容易被区分(解缠)。

激活函数: ReLU (原始)

第二层 (压缩): 映射回原来的维度。

  • 维度变化: 2048 → 512 2048 \to 512 2048512 ( d m o d e l d_{model} dmodel)
  • 作用:把提取好的特征压缩回来,方便传给下一层。

输出: [Batch, Seq_Len, 512]

(3)核心公式

FFN ( x ) = Activation ( x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \text{Activation}(xW_1+b_1)W_2+b_2 FFN(x)=Activation(xW1+b1)W2+b2

  • A c t i v a t i o n Activation Activation为激活函数,Transformer 使用的是ReLU
  • W W W为权重, b b b为偏置

3.5 Add & Norm(残差连接与层归一化)

☺️一句话定义: 它俩是深度学习的“稳定器”和“高速公路”。

  • Add: 建立信息直通车,防止信息在深层网络中丢失。
  • Norm: 统一数据分布,让模型训练得又快又稳。

3.5.1 Add: Residual Connection (残差连接)

核心公式: Output = x + SubLayer ( x ) \text{Output} = x + \text{SubLayer}(x) Output=x+SubLayer(x)

  • x x x: 上一层的原始输入(原汁原味的信息)。

  • SubLayer ( x ) \text{SubLayer}(x) SubLayer(x): 这一层计算出的新特征(Attention 或 FFN 的结果)。

在这里插入图片描述

上图为transformer架构中每一个Block中的最后子层,对应到上述残差连接的核心公式

  • x为经过Attention后的结果
  • S u b L a y e r ( x ) SubLayer(x) SubLayer(x)为经过Feed-Forward Network (FFN) 后的结果

面试常见问题

  • 残差连接为什么要相加?(Why Add?)
    • 解决梯度消失 : 在反向传播时,梯度通常是连乘的(越乘越小)。有了加法,梯度可以直接通过 x x x 这条路(导数为 1)毫无损耗地传回前面的层。
    • 兜底机制: 如果这一层(SubLayer)学得很烂或者没用,模型可以简单地把权重设为 0,这样输出就等于 x x x(恒等映射)。这保证了加了一层至少不会比不加更差。

3.5.2 Norm: Layer Normalization (层归一化)

在计算机视觉 (CV) 里我们常用 Batch Norm,但在 自然语言处理(NLP) 里我们用 Layer Norm。

  • 层归一化(Layer Norm)
    • 归一化对象:每个样本的每一层(特征维度)进行归一化
    • 计算方式:对单个样本的每一层的所有神经元进行归一化
  • 核心公式: LayerNorm ( x ) = x − μ σ + ϵ ⋅ γ + β \text{LayerNorm}(x) = \frac{x - \mu}{\sigma + \epsilon} \cdot \gamma + \beta LayerNorm(x)=σ+ϵxμγ+β
    • μ \mu μ (均值): 这一个词向量里 512 个数的平均值。
    • ** σ \sigma σ **(方差): 这一个词向量里 512 个数的标准差。
    • ϵ \epsilon ϵ: 一个极小的数,防止除以 0。

面试常见问题

  • Batch Norm和Layer Norm的区别是什么?
    • 简单来说:Batch Norm (BN) 是“竖着切”(对一个特征),Layer Norm (LN) 是“横着切”(对所有特征)。
    • 用学生的考试成绩来直观比喻在这里插入图片描述

3.6 整体架构

😴重点

  • 以输入数据[32, 10]且词嵌入向量维度为512为例,疏通整个架构中数据的维度变化
  • Block是什么?

在这里插入图片描述

一个Block由三部分组成:Attention + FFN + Add & Norm

  • ​Encoder Block
  • Decoder Block

1️⃣Encoder Block (2 个子层) [它是用来“理解”输入的]

在这里插入图片描述

  • Sub-layer 1: Multi-Head Self-Attention + Add & Norm

  • Sub-layer 2: Feed-Forward Network (FFN) + Add & Norm

2️⃣Decoder Block (3 个子层) [它是用来“生成”输出的]

Decoder Block

  • Sub-layer 1: Masked Self-Attention + Add & Norm

    • 注意:这里带 Mask,防偷看。
  • Sub-layer 2: Cross-Attention + Add & Norm

    • 注意:这里连接 Encoder 的输出 (K, V)。
  • Sub-layer 3: Feed-Forward Network (FFN) + Add & Norm

更多推荐