Transformer - day01- Encode

编码器

第一步:输入嵌入(Input Embedding)

- 一张224×224的图像切成16×16的块,会得到 (224/16)² = 196 个图像块
- 如果是单通道图像,每个图像块由 16×16=256 个标量数值组成
- 输入嵌入(线性投射)
- 一个可训练的权重矩阵 W,其形状为 256 × d_model
- 输入的 196*256个标量,与 W 做矩阵乘法,矢量化
- 计算结果:(196 × 256) · (256 × d_model) = 196 × d_model
- 196 个 矢量,矢量维度 d_model

第二步:位置编码(Positional Encoding)

  • (正弦和余弦函数)直接计算得出
    • \(PE(pos, 2i) = sin(pos / 10000^(2i/d_model))\)
    • \(PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))\)
  • 其中
    • PE 是编码结果,是个矩阵,维度 块长度 × d_model
    • pos 是 块序号,如 第几块
    • \(i=\frac{d_{model}}{2}-1\)
  • 相加 \(\oplus\)
    • 输入,与权重矩阵 W 做乘法,与 PE 做加法

第三步:编码 Encode(重复 6 次)

子层一:多头自注意力机制 (Multi-Head Self-Attention)

  • STEP 1 : 生成 Q、K、V 矩阵

    • 引入了三个可训练的权重矩阵 \(W_q, W_k, W_v\),形状都是 (序列长度, d_model)
    • 将每个输入向量 x 分别映射为三个向量 Q , K , V
  • STEP 2 : 计算注意力分数 (Attention Scores)

    • \(Scores = (Q · K^T) / \sqrt{d_{model}}\)
    • \(Q · K^T\):矩阵乘法,结果是 (序列长度, 序列长度) 的方阵。
      • 其中第 i 行第 j 列的数值,表示序列中第 i 个词对第 j 个词的“注意力分数”
      • \(\sqrt{d_{model}}\):缩放因子(除以 d_model 的平方根),防止点积数值过大导致梯度进入饱和区,让训练更稳定
  • STEP 3 : 应用 Softmax,加权聚合

    • \(Attention Output = Softmax(Scores) · V\)
    • Softmax(Scores):对每个查询位置(行)做 Softmax 归一化,得到概率分布
    • V:用这些权重去加权求和 V 矩阵中的值向量
  • 结果

    • 输出矩阵,形状仍然是 (序列长度, d_model)
  • 多头 (Multi-Head):并行

    • 并行运行:将上述过程复制 h 份(原论文 h=8),每一份称为一个“头”(Head)
    • 独立参数:每个头都有自己的 \(W_Q、W_K、W_V\) 矩阵,维度 = d_model / h,它们独立地计算各自的注意力输出
    • 最终拼接:将 h 个头的输出在 d_model 维度上拼接起来,再经过一个线性投影层 \(W_O\),得到最终的多头自注意力输出
      • \(W_O\) 是一个可训练矩阵,形状 (d_model × d_model),初始可随机赋值

子层二:残差连接与层归一化 (Add & Norm)

  • 残差连接(Add)
    • 将子层的输入(即位置编码后的 X)与子层的输出(即多头自注意力机制的输出)直接相加
    • 得到 X + Attention(X)
    • 有效缓解深层网络中的梯度消失问题
  • 层归一化 (Norm)
    • 对每一个位置独立进行的。例如,对于序列中第 pos 个位置(pos = 0, 1, ..., 195),我们会取它那个长度为 512 的向量
    • 步骤:
      • STEP 1 : 计算该位置的均值 (Mean)
        • 对于第 pos 个位置,其向量为 \(x = [x_1, x_2, ..., x_{512}]\)
        • 均值 \(μ = (x_1 + x_2 + ... + x_{512}) / 512\)
      • STEP 2 : 计算该位置的方差 (Variance)
        • 方差 \(σ² = [(x_1 - μ)² + (x_2 - μ)² + ... + (x_{512} - μ)²] / 512\)
      • STEP 3 : 标准化 (Normalize)
        • 对向量中的每个元素 \(x_i\) 做变换
          • \(\hat{x_i} = \frac{(x_i - μ)}{\sqrt(σ² + ε)}\)
          • 除以标准差\(σ\)时,加一个很小的 ε,如 1e-5,防止除以零
          • 结果:向量里的数值,变成了均值为 0,方差为 1 的标准正态数据
      • STEP 4 : 缩放和平移 (Scale & Shift) —— 关键!
        • 标准化后的数据虽然稳定了,但也可能限制了模型的表达能力,因为所有值都被“压”到了同一个量级)
        • 因此,层归一化引入了两个可训练的参数:
          • γ (Gamma):缩放因子,形状 (d_model,),即 512 个数值
          • β (Beta):平移因子,形状 (d_model,),即 512 个数值
          • \(最终输出 = γ * \hat{x_i} + β\)
  • 整合到一起表示:
    - $ LayerNorm(x) = γ ⊙ (x - μ) / √(σ² + ε) + β$
    - 其中
    • ⊙ 表示逐元素相乘
    • μ 和 σ 是该向量自己的均值和标准差
    • γ 和 β 是可训练参数

输出(编码器)

  • 矩阵
  • 形状:序列长 × d_model (196 × 512)
posted on 2026-06-17 14:27  中年二班  阅读(8)  评论(0)    收藏  举报