欢迎光临
我们一直在努力

Transformer 10. Decoder Only Transformer 架构以及每一步骤的详细计算

摘要:本文在 Transformer 整体架构、Encoder、以及带掩码自注意力与交叉注意力的基础上,对 Decoder-only 架构进行系统总结。内容包括:Decoder-only 在整体中的位置与自回归目标、从输入到 Decoder 的数据流(Tokenization、Embedding、位置编码)、Decoder 的每一层结构(带掩码的多头自注意力、前馈网络、残差连接与层归一化)及其矩阵维度与矩阵运算、输出层(线性层与 Softmax)、以及训练与推理流程的对比。旨在帮助读者建立对 GPT/LLaMA 等大语言模型骨干架构的完整、可计算的理解。

关键词:Decoder-only;自回归;掩码自注意力;Teacher Forcing;前馈网络;残差连接;层归一化;大语言模型;GPT


请添加图片描述

💡 理解要点:Decoder-only 是「只保留解码器、去掉编码器与编码器-解码器注意力」的 Transformer 变体,专用于生成式任务:根据已见 token 自回归地预测下一个 token,是 GPT、LLaMA、Qwen 等大语言模型的骨干架构。

1. 概述:Decoder-only 在整体中的位置

在 Transformer 3. 整体架构 与 Transformer 9. Decoder-Encoder 层多头自注意力机制 中我们看到,完整 Transformer 的 Decoder 包含三块:带掩码的多头自注意力、编码器-解码器注意力(交叉注意力)、前馈网络。Decoder-only 即去掉编码器与交叉注意力,只保留「带掩码的多头自注意力 + 前馈网络」,并配合残差连接与 Layer Normalization。因此从结构上看,Decoder-only 的每一层更像「只有自注意力的 Encoder」,但必须保留掩码,以保证在生成第

i

i

i 个 token 时只能看到位置

0

∼

i

−

1

0 \\sim i-1

0∼i−1,与自回归生成一致。

自回归目标可概括为两点:

  • 用序列前半段预测后半段:输入为已生成的 token 序列(或 prompt),输出为对「下一个 token」的预测;重复「将预测出的 token 拼回输入、再预测下一个」即得到整段生成。
  • 训练与推理的数据差异:训练时用 Teacher Forcing,即用真实标签(下一个 token)作为下一步的输入,便于并行计算;推理时用上一步的预测结果作为下一步的输入,只能逐步、循环生成。
  • 在生成式任务中,通常不再区分「特征」与「标签」两种数据:我们只有一段要续写或补全的序列;在训练里,当前步的「标签」在下一时间步就变成「输入」。除主序列外,也可通过图上所示的 inputs 线路向 Decoder 注入条件或背景知识(如对话历史、检索片段),用于条件生成。

    🔍 实际例子:若序列长度为

    L

    =

    1300

    L=1300

    L=1300、模型维度

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288,则 Decoder 的输入与每层输出均为

    L

    ×

    d

    model

    =

    1300

    ×

    12288

    L \\times d_{\\text{model}} = 1300 \\times 12288

    L×dmodel​=1300×12288 的矩阵;最后一层取最后一个位置的向量,经线性层与 Softmax 得到词表上的概率分布,再取 argmax 或采样得到下一个 token。

    下文先说明数据如何进入 Decoder、再逐层给出矩阵维度与运算,最后归纳训练与推理流程。

    2. 从输入到 Decoder:数据如何进入

    Decoder 不直接接收原始文本,而是接收已经 Tokenization、Embedding、位置编码 后的表示。这一过程与 Encoder 完全一致,在 Transformer 3. 整体架构 与 Transformer 4. Embedding层与位置编码技术 中有更详细的展开;下面按 Decoder 的输入流顺序,对每一步做简要说明并给出矩阵形状与维度,便于与后文 Decoder 层的计算衔接。

    2.1 Tokenization:从文本到 Token 序列

    什么是 Tokenization? Tokenization 是将一段文字转换为一组 Token(词元) 的过程,就像把一篇文章拆成一块块「积木」。每个 Token 在模型内部对应一个整数 ID,模型实际处理的是这串 ID,再通过查表得到向量。

    Token 与 ID 长什么样?

    以「我喜欢吃苹果」为例,在不同分词策略下可能变成:

    文本Token 序列(直观)对应的 Token ID(示例)
    我喜欢吃苹果 [“我”, “喜欢”, “吃”, “苹果”] [234, 5678, 890, 1234]
    Hello world [“Hello”, " world"] 或 [“Hel”, “lo”, " world"] [15496, 995] 或 [9906, 4435, 995]
    • 中文:常见做法是按词或按字切分,一个汉字可能单独成一个 token,也可能与相邻字组成一个 token(如「苹果」)。
    • 英文:通常按子词(BPE、WordPiece)切分,例如 “Transformer” 可能变成 ["Transform", "er"] 两个 token。

    也就是说:Tokenization 之后,文本变成「一串整数 ID」,长度记为

    L

    L

    L。同一段话在不同模型(GPT-3、Llama、Qwen)里 ID 序列可能不同,因为词表与分词算法不同。

    词汇表规模(Decoder-only 常见模型):

    • GPT-3:50,257 个 Token
    • GPT-4:100,256 个 Token
    • Llama-3:128,000 个 Token

    💡 理解要点:Decoder 的「输入序列」在数值上就是这串长度为

    L

    L

    L 的 Token ID;后续 Embedding 层用这些 ID 去查表,得到

    L

    L

    L 个向量,再拼成矩阵。

    2.2 Embedding:从 Token ID 到向量

    数学本质:Embedding 层是一张可学习的查找表。词表大小为

    V

    V

    V,模型维度为

    d

    model

    d_{\\text{model}}

    dmodel​,则 Embedding 矩阵为

    E

    ∈

    R

    V

    ×

    d

    model

    E \\in \\mathbb{R}^{V \\times d_{\\text{model}}}

    E∈RV×dmodel​。对每个 Token ID

    w

    i

    w_i

    wi​(

    0

    ≤

    w

    i

    <

    V

    0 \\leq w_i < V

    0≤wi​<V),有:

    Embedding

    (

    w

    i

    )

    =

    E

    [

    w

    i

    ]

    ∈

    R

    d

    model

    .

    \\text{Embedding}(w_i) = E[w_i] \\in \\mathbb{R}^{d_{\\text{model}}}.

    Embedding(wi​)=E[wi​]∈Rdmodel​.

    矩阵形状:

    • 查表矩阵:

      E

      ∈

      R

      V

      ×

      d

      model

      E \\in \\mathbb{R}^{V \\times d_{\\text{model}}}

      E∈RV×dmodel​(词表大小 × 模型维度)。

    • 整段序列:

      L

      L

      L 个 token 各自查表后,按位置堆叠成矩阵

      L

      ×

      d

      model

      L \\times d_{\\text{model}}

      L×dmodel​。

    与 one-hot 的对比:one-hot 将每个 token 编成

    V

    V

    V 维、仅一维为 1 的稀疏向量;Embedding 则用固定维度

    d

    model

    d_{\\text{model}}

    dmodel​(如 512、12288)的稠密向量,且该矩阵随训练更新,语义相近的 token 在向量空间中距离更近,便于模型学习上下文与生成关系。

    🔍 实际例子:若序列长度

    L

    =

    1300

    L=1300

    L=1300、

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288,则 Embedding 输出为 1300×12288 的矩阵,每一行是一个 token 的 12288 维向量。

    2.3 位置编码:补足顺序信息

    为什么需要位置信息? 注意力机制是并行计算的,本身不显式编码「谁在前、谁在后」。同样的字在不同位置含义可能完全不同,例如「猫咬了狗」与「狗咬了猫」。因此需要为每个位置注入位置信息。

    技术实现:为每个位置

    p

    o

    s

    pos

    pos(

    0

    ≤

    p

    o

    s

    <

    L

    0 \\leq pos < L

    0≤pos<L)生成一个

    d

    model

    d_{\\text{model}}

    dmodel​ 维的向量

    P

    E

    (

    p

    o

    s

    )

    \\mathrm{PE}(pos)

    PE(pos),加到该位置的 Embedding 向量上:

    I

    n

    p

    u

    t

    [

    i

    ]

    =

    E

    m

    b

    e

    d

    d

    i

    n

    g

    [

    i

    ]

    +

    P

    E

    (

    i

    )

    ,

    i

    =

    0

    ,

    1

    ,

    …

    ,

    L

    −

    1.

    \\mathrm{Input}[i] = \\mathrm{Embedding}[i] + \\mathrm{PE}(i), \\quad i = 0, 1, \\ldots, L-1.

    Input[i]=Embedding[i]+PE(i),i=0,1,…,L−1.

    常见做法包括:正弦/余弦位置编码(原版 Transformer,见 Transformer 4. Embedding层与位置编码技术)或可学习位置编码(如 GPT 系列)。无论哪种,位置编码与 Embedding 逐元素相加后,矩阵形状不变,仍为

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​。

    💡 理解要点:进入 Decoder 的输入 = 词嵌入 + 位置编码,既带语义又带顺序,是 Decoder 所有后续层(掩码自注意力、前馈网络)的计算基础。

    2.4 小结:进入 Decoder 第一层的矩阵

    综合上述三步:

    • Tokenization:文本 → 长度为

      L

      L

      L 的 Token ID 序列。

    • Embedding:

      L

      L

      L 个 ID 查表 →

      L

      ×

      d

      model

      L \\times d_{\\text{model}}

      L×dmodel​ 矩阵。

    • 位置编码:与 Embedding 相加,形状不变 → 仍为

      L

      ×

      d

      model

      L \\times d_{\\text{model}}

      L×dmodel​。

    因此,进入 Decoder 第一层的输入矩阵为

    X

    ∈

    R

    L

    ×

    d

    model

    X \\in \\mathbb{R}^{L \\times d_{\\text{model}}}

    X∈RL×dmodel​:

    L

    L

    L 为当前序列长度,

    d

    model

    d_{\\text{model}}

    dmodel​ 为模型维度(如 512、768、12288)。后续各层 Decoder(掩码自注意力、前馈网络)的输入与输出也均保持

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​,直到最后一层取最后一个位置的向量送入输出层做下一个 token 的预测。

    L

    L

    L 会一直变化吗?

    • 训练时:在一个 batch 内,通常把所有序列 pad 到同一长度,或按固定长度截断,因此一次前向传播里

      L

      L

      L 是固定的(例如该 batch 的 max length)。

    • 推理时(自回归生成):每一步都会把「上一步预测出的 token」拼回输入,所以序列长度每一步加 1。例如一开始输入「你好,请问」对应

      L

      0

      =

      4

      L_0 = 4

      L0​=4;模型预测出下一个 token 后,下一轮输入就是 4+1=5 个 token,即

      L

      =

      5

      L=5

      L=5;再下一轮

      L

      =

      6

      L=6

      L=6,依此类推,直到生成 EOS 或达到最大长度。因此推理时,每次循环进入 Decoder 的

      L

      L

      L 确实都会变化(

      L

      0

      →

      L

      0

      +

      1

      →

      L

      0

      +

      2

      →

      ⋯

      L_0 \\to L_0+1 \\to L_0+2 \\to \\cdots

      L0​→L0​+1→L0​+2→⋯)。公式

      X

      ∈

      R

      L

      ×

      d

      model

      X \\in \\mathbb{R}^{L \\times d_{\\text{model}}}

      X∈RL×dmodel​ 里的

      L

      L

      L 指的就是「当前这一步」的序列长度,在不同步骤可以取不同值。

    3. Decoder 的核心结构:每一层在做什么

    每一层 Decoder 由两个主要子层组成,且每个子层外都有残差连接与 Layer Normalization(Add & Normalize)。

    3.1 带掩码的多头自注意力层

    作用:在序列内部做样本间相关性计算,但只允许位置

    i

    i

    i 看到

    0

    ∼

    i

    0 \\sim i

    0∼i,避免「偷看未来」,与自回归一致。详见 Transformer 8. Decoder: 掩码注意力机制以及数学推导。

    矩阵与运算 分两步说明:先给出单头的完整流程,再展开多头的维度拆解与拼接。

    单头注意力(一个「头」在算什么)
    • 输入:该层输入

      X

      ∈

      R

      L

      ×

      d

      model

      X \\in \\mathbb{R}^{L \\times d_{\\text{model}}}

      X∈RL×dmodel​。

    • Q、K、V:由同一

      X

      X

      X 经三个线性层得到:

      • Q

        =

        X

        W

        Q

        Q = X W_Q

        Q=XWQ​,

        K

        =

        X

        W

        K

        K = X W_K

        K=XWK​,

        V

        =

        X

        W

        V

        V = X W_V

        V=XWV​

      • W

        Q

        ,
         

        W

        K

        ,
         

        W

        V

        ∈

        R

        d

        model

        ×

        d

        k

        W_Q,\\, W_K,\\, W_V \\in \\mathbb{R}^{d_{\\text{model}} \\times d_k}

        WQ​,WK​,WV​∈Rdmodel​×dk​(单头时

        d

        k

        =

        d

        model

        d_k = d_{\\text{model}}

        dk​=dmodel​;多头时

        d

        k

        =

        d

        model

        /

        h

        d_k = d_{\\text{model}}/h

        dk​=dmodel​/h,见下)

      • 故

        Q

        ,
         

        K

        ,
         

        V

        ∈

        R

        L

        ×

        d

        k

        Q,\\, K,\\, V \\in \\mathbb{R}^{L \\times d_k}

        Q,K,V∈RL×dk​。

    • 注意力分数:

      S

      =

      Q

      K

      T

      /

      d

      k

      S = Q K^T / \\sqrt{d_k}

      S=QKT/dk​

      ​,形状为

      L

      ×

      L

      L \\times L

      L×L(每个位置对所有位置的相似度)。

    • 掩码:在 softmax 前将「未来位置」置为

      −

      ∞

      -\\infty

      −∞,即

      S

      ←

      S

      +

      M

      S \\leftarrow S + M

      S←S+M,其中

      M

      M

      M 为下三角为 0、上三角为

      −

      ∞

      -\\infty

      −∞ 的

      L

      ×

      L

      L \\times L

      L×L 矩阵;softmax 后这些位置权重为 0。

    • 加权求和:

      A

      t

      t

      e

      n

      t

      i

      o

      n

      (

      Q

      ,

      K

      ,

      V

      )

      =

      s

      o

      f

      t

      m

      a

      x

      (

      S

      )
       

      V

      \\mathrm{Attention}(Q,K,V) = \\mathrm{softmax}(S) \\, V

      Attention(Q,K,V)=softmax(S)V,形状

      L

      ×

      d

      k

      L \\times d_k

      L×dk​。

    单头时上述输出即为该子层输出;多头时需要对每个头重复上述过程,再拼接并做一次线性投影。

    多头注意力的详细计算

    动机:使用

    h

    h

    h 组不同的

    W

    Q

    ,
     

    W

    K

    ,
     

    W

    V

    W_Q,\\, W_K,\\, W_V

    WQ​,WK​,WV​,相当于

    h

    h

    h 个「专家」从不同子空间(不同角度)对同一序列做注意力,再合并结果,使表示更丰富。详见 Transformer 2. Attention 注意力机制 中的多头部分。

    维度约定:设头数为

    h

    h

    h,令

    d

    k

    =

    d

    model

    /

    h

    d_k = d_{\\text{model}} / h

    dk​=dmodel​/h(每头对应的 Q/K/V 维度)。例如

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288、

    h

    =

    96

    h=96

    h=96 时,

    d

    k

    =

    128

    d_k=128

    dk​=128。这样

    h

    ⋅

    d

    k

    =

    d

    model

    h \\cdot d_k = d_{\\text{model}}

    h⋅dk​=dmodel​,拼接后总维度与模型维度一致。

    每一步的矩阵形状(以第

    t

    t

    t 个头为例,

    t

    =

    1

    ,

    …

    ,

    h

    t=1,\\ldots,h

    t=1,…,h):

  • 每头的 Q、K、V 对第

    t

    t

    t 个头,用该头独有的权重矩阵把

    X

    X

    X 投影到

    d

    k

    d_k

    dk​ 维:

    • Q

      (

      t

      )

      =

      X

      W

      Q

      (

      t

      )

      Q^{(t)} = X W_Q^{(t)}

      Q(t)=XWQ(t)​,

      K

      (

      t

      )

      =

      X

      W

      K

      (

      t

      )

      K^{(t)} = X W_K^{(t)}

      K(t)=XWK(t)​,

      V

      (

      t

      )

      =

      X

      W

      V

      (

      t

      )

      V^{(t)} = X W_V^{(t)}

      V(t)=XWV(t)​

    • W

      Q

      (

      t

      )

      ,
       

      W

      K

      (

      t

      )

      ,
       

      W

      V

      (

      t

      )

      ∈

      R

      d

      model

      ×

      d

      k

      W_Q^{(t)},\\, W_K^{(t)},\\, W_V^{(t)} \\in \\mathbb{R}^{d_{\\text{model}} \\times d_k}

      WQ(t)​,WK(t)​,WV(t)​∈Rdmodel​×dk​

    • Q

      (

      t

      )

      ,
       

      K

      (

      t

      )

      ,
       

      V

      (

      t

      )

      ∈

      R

      L

      ×

      d

      k

      Q^{(t)},\\, K^{(t)},\\, V^{(t)} \\in \\mathbb{R}^{L \\times d_k}

      Q(t),K(t),V(t)∈RL×dk​

  • 每头的注意力(含掩码)

    • S

      (

      t

      )

      =

      Q

      (

      t

      )

      (

      K

      (

      t

      )

      )

      T

      /

      d

      k

      S^{(t)} = Q^{(t)} (K^{(t)})^T / \\sqrt{d_k}

      S(t)=Q(t)(K(t))T/dk​

      ​,形状

      L

      ×

      L

      L \\times L

      L×L

    • 加因果掩码:

      S

      (

      t

      )

      ←

      S

      (

      t

      )

      +

      M

      S^{(t)} \\leftarrow S^{(t)} + M

      S(t)←S(t)+M(

      M

      M

      M 同上,下三角 0、上三角

      −

      ∞

      -\\infty

      −∞)

    • h

      e

      a

      d

      (

      t

      )

      =

      s

      o

      f

      t

      m

      a

      x

      (

      S

      (

      t

      )

      )
       

      V

      (

      t

      )

      \\mathrm{head}^{(t)} = \\mathrm{softmax}(S^{(t)}) \\, V^{(t)}

      head(t)=softmax(S(t))V(t),形状

      L

      ×

      d

      k

      L \\times d_k

      L×dk​

  • 多头拼接 将

    h

    h

    h 个头的输出在特征维上拼接(沿列拼):

    C

    o

    n

    c

    a

    t

    (

    h

    e

    a

    d

    (

    1

    )

    ,

    …

    ,

    h

    e

    a

    d

    (

    h

    )

    )

    ∈

    R

    L

    ×

    (

    h

    ⋅

    d

    k

    )

    =

    R

    L

    ×

    d

    model

    .

    \\mathrm{Concat}(\\mathrm{head}^{(1)}, \\ldots, \\mathrm{head}^{(h)}) \\in \\mathbb{R}^{L \\times (h \\cdot d_k)} = \\mathbb{R}^{L \\times d_{\\text{model}}}.

    Concat(head(1),…,head(h))∈RL×(h⋅dk​)=RL×dmodel​.

  • 输出投影 再经过一个线性层,把

    h

    ⋅

    d

    k

    h \\cdot d_k

    h⋅dk​ 维映射回

    d

    model

    d_{\\text{model}}

    dmodel​(多数实现中

    h

    ⋅

    d

    k

    =

    d

    model

    h \\cdot d_k = d_{\\text{model}}

    h⋅dk​=dmodel​,这一步做一次可学习的混合):

    M

    u

    l

    t

    i

    H

    e

    a

    d

    (

    X

    )

    =

    C

    o

    n

    c

    a

    t

    (

    h

    e

    a

    d

    (

    1

    )

    ,

    …

    ,

    h

    e

    a

    d

    (

    h

    )

    )
     

    W

    O

    ,

    W

    O

    ∈

    R

    d

    model

    ×

    d

    model

    .

    \\mathrm{MultiHead}(X) = \\mathrm{Concat}(\\mathrm{head}^{(1)}, \\ldots, \\mathrm{head}^{(h)}) \\, W_O, \\quad W_O \\in \\mathbb{R}^{d_{\\text{model}} \\times d_{\\text{model}}}.

    MultiHead(X)=Concat(head(1),…,head(h))WO​,WO​∈Rdmodel​×dmodel​. 输出形状为

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​。

  • 等价实现(常见写法):也可以先对

    X

    X

    X 做一次线性变换得到

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​,再在实现上按「头」切分成

    h

    h

    h 个

    L

    ×

    d

    k

    L \\times d_k

    L×dk​ 的块,每块做一次

    L

    ×

    L

    L \\times L

    L×L 的注意力和

    L

    ×

    d

    k

    L \\times d_k

    L×dk​ 的加权求和,再拼回

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​ 后乘

    W

    O

    W_O

    WO​。数学上与上述「每头一组

    W

    Q

    (

    t

    )

    ,

    W

    K

    (

    t

    )

    ,

    W

    V

    (

    t

    )

    W_Q^{(t)}, W_K^{(t)}, W_V^{(t)}

    WQ(t)​,WK(t)​,WV(t)​」等价。

    数值示例(与 GPT 系列同量级):

    L

    =

    1300

    L=1300

    L=1300,

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288,

    h

    =

    96

    h=96

    h=96,

    d

    k

    =

    128

    d_k=128

    dk​=128。则每头内

    Q

    (

    t

    )

    K

    (

    t

    )

    T

    Q^{(t)} K^{(t)T}

    Q(t)K(t)T 为 1300×1300,

    h

    e

    a

    d

    (

    t

    )

    \\mathrm{head}^{(t)}

    head(t) 为 1300×128;拼接后 1300×12288,经

    W

    O

    W_O

    WO​ 仍为 1300×12288。

    💡 理解要点:多头 = 多组 Q/K/V 并行做「缩放点积注意力 + 掩码」,得到

    h

    h

    h 个

    L

    ×

    d

    k

    L \\times d_k

    L×dk​,沿特征维拼成

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​,再经

    W

    O

    W_O

    WO​ 得到该子层输出

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​。计算量仍为

    O

    (

    L

    2

    )

    O(L^2)

    O(L2)(且

    h

    h

    h 个头可并行算),只是参数量约为单头的

    h

    h

    h 倍(多组

    W

    Q

    ,

    W

    K

    ,

    W

    V

    W_Q,W_K,W_V

    WQ​,WK​,WV​)。

    3.2 前馈神经网络层(FFN)

    作用:对每个位置独立做非线性变换,是模型主要的非线性来源。结构为「放大再缩小」:

    d

    model

    →

    4

    ⋅

    d

    model

    →

    d

    model

    d_{\\text{model}} \\to 4 \\cdot d_{\\text{model}} \\to d_{\\text{model}}

    dmodel​→4⋅dmodel​→dmodel​。详见 Transformer 5. Transformer中的残差连接、归一化与前馈神经网络。

    矩阵与运算(以

    d

    =

    d

    model

    =

    12288

    d = d_{\\text{model}} = 12288

    d=dmodel​=12288 为例):

    • 第一层:

      z

      1

      =

      X

      W

      1

      +

      b

      1

      z_1 = X W_1 + b_1

      z1​=XW1​+b1​,

      X

      ∈

      R

      L

      ×

      12288

      X \\in \\mathbb{R}^{L \\times 12288}

      X∈RL×12288,

      W

      1

      ∈

      R

      12288

      ×

      49152

      W_1 \\in \\mathbb{R}^{12288 \\times 49152}

      W1​∈R12288×49152(即

      12288

      ×

      (

      4

      ⋅

      12288

      )

      12288 \\times (4 \\cdot 12288)

      12288×(4⋅12288)),

      z

      1

      ∈

      R

      L

      ×

      49152

      z_1 \\in \\mathbb{R}^{L \\times 49152}

      z1​∈RL×49152;再经激活(如 GELU/ReLU)。

    • 第二层:

      z

      2

      =

      a

      c

      t

      (

      z

      1

      )

      W

      2

      +

      b

      2

      z_2 = \\mathrm{act}(z_1) W_2 + b_2

      z2​=act(z1​)W2​+b2​,

      W

      2

      ∈

      R

      49152

      ×

      12288

      W_2 \\in \\mathbb{R}^{49152 \\times 12288}

      W2​∈R49152×12288,输出

      L

      ×

      12288

      L \\times 12288

      L×12288。

    即 FFN 输入与输出均为

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​。参数量(仅权重):

    W

    1

    W_1

    W1​ 为

    12288

    ×

    49152

    12288 \\times 49152

    12288×49152,

    W

    2

    W_2

    W2​ 为

    49152

    ×

    12288

    49152 \\times 12288

    49152×12288。

    3.3 残差连接与 Layer Normalization

    每个子层均采用 Add & Normalize:子层输出与子层输入(残差)相加,再对每个样本做 Layer Normalization。数学上为:

    O

    u

    t

    p

    u

    t

    =

    L

    a

    y

    e

    r

    N

    o

    r

    m

    (

    S

    u

    b

    L

    a

    y

    e

    r

    (

    X

    )

    +

    X

    )

    .

    \\mathrm{Output} = \\mathrm{LayerNorm}(\\mathrm{SubLayer}(X) + X).

    Output=LayerNorm(SubLayer(X)+X).

    残差保证梯度直通,LayerNorm 稳定训练、加速收敛。单层 Decoder 可写为:

    DecoderLayer

    (

    X

    )

    =

    L

    N

    2

    (

    F

    F

    N

    (

    L

    N

    1

    (

    M

    a

    s

    k

    e

    d

    A

    t

    t

    n

    (

    X

    )

    +

    X

    )

    )

    +

    L

    N

    1

    (

    M

    a

    s

    k

    e

    d

    A

    t

    t

    n

    (

    X

    )

    +

    X

    )

    )

    .

    \\text{DecoderLayer}(X) = \\mathrm{LN}_2\\big( \\mathrm{FFN}( \\mathrm{LN}_1( \\mathrm{MaskedAttn}(X) + X )) + \\mathrm{LN}_1( \\mathrm{MaskedAttn}(X) + X ) \\big).

    DecoderLayer(X)=LN2​(FFN(LN1​(MaskedAttn(X)+X))+LN1​(MaskedAttn(X)+X)).

    这层的输入输出矩阵大小一致,都是

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​ (

    1300

    ×

    12288

    1300 \\times 12288

    1300×12288)。

    💡 理解要点:Decoder-only 的一层 = 带掩码的多头自注意力(+ 残差 + LN)+ 前馈网络(+ 残差 + LN);没有编码器-解码器注意力,因此 Q、K、V 全部来自同一 Decoder 输入,仅通过掩码限制为「只看过去」。

    4. 输出层:线性层与 Softmax

    最后一个位置的向量

    h

    L

    ∈

    R

    d

    model

    \\mathbf{h}_L \\in \\mathbb{R}^{d_{\\text{model}}}

    hL​∈Rdmodel​,经线性层**映射到词表维度:

    h

    L

    \\mathbf{h}_L

    hL​ 的含义:所有 Decoder 层输出为

    L

    ×

    d

    model

    L \\times d_{\\text{model}}

    L×dmodel​ 的矩阵;

    h

    L

    \\mathbf{h}_L

    hL​ 即该矩阵的第

    L

    L

    L 行,也就是最后一个位置(第

    L

    L

    L 个 token)对应的

    d

    model

    d_{\\text{model}}

    dmodel​ 维隐藏向量。该位置已见过整段输入(位置

    1

    ∼

    L

    1 \\sim L

    1∼L),故用

    h

    L

    \\mathbf{h}_L

    hL​ 预测「下一个」token(第

    L

    +

    1

    L+1

    L+1 个)是合理的。

    s

    =

    h

    L

     

    W

    out

    +

    b

    out

    ,

    W

    out

    ∈

    R

    d

    model

    ×

    V

    ,
      

    s

    ∈

    R

    V

    ,

    \\mathbf{s} = \\mathbf{h}_L \\, W_{\\text{out}} + b_{\\text{out}}, \\quad W_{\\text{out}} \\in \\mathbb{R}^{d_{\\text{model}} \\times V}, \\; \\mathbf{s} \\in \\mathbb{R}^V,

    s=hL​Wout​+bout​,Wout​∈Rdmodel​×V,s∈RV,

    其中

    V

    V

    V 为词表大小(如 GPT-3 的 50257、Llama-3 的 128000)。再经 Softmax 得到下一个 token 的概率分布:

    P

    (

    next token

    )

    =

    s

    o

    f

    t

    m

    a

    x

    (

    s

    )

    .

    P(\\text{next token}) = \\mathrm{softmax}(\\mathbf{s}).

    P(next token)=softmax(s).

    训练时用交叉熵损失与真实下一个 token 比较;推理时对

    P

    P

    P 做 argmax(贪婪)或采样得到下一个 token,并拼回输入序列继续自回归。

    5. 训练流程与推理流程

    Decoder-only 状态下,训练时利用 Teacher Forcing 与掩码,可对整段序列并行计算;推理时必须逐步生成,每步依赖上一步的预测结果。

    5.1 训练流程(并行)

    假设要预测的序列为

    y

    y

    y,编码后的嵌入为

    e

    b

    d

    _

    y

    \\mathrm{ebd}\\_y

    ebd_y,取前

    n

    n

    n 个 token 作为输入、第

    n

    n

    n 个位置对应的真实 token 为标签。对

    n

    =

    0

    ,

    1

    ,

    …

    ,

    L

    −

    1

    n = 0, 1, \\ldots, L-1

    n=0,1,…,L−1 可一次性完成:

    • 输入

      e

      b

      d

      _

      y

      [

      0

      :

      n

      ]

      \\mathrm{ebd}\\_y[0:n]

      ebd_y[0:n](或整段

      e

      b

      d

      _

      y

      \\mathrm{ebd}\\_y

      ebd_y 配合 loss 只对「下一个 token」位置算损失),Decoder 输出每个位置的表示;取最后一个有效位置的表示经线性层 + Softmax 得到该步的预测

      y

      ^

      [

      n

      ]

      \\hat{y}[n]

      y^​[n],与真实标签

      y

      [

      n

      ]

      y[n]

      y[n] 计算损失。

    由于掩码的存在,位置

    i

    i

    i 的表示只依赖

    0

    ∼

    i

    0 \\sim i

    0∼i,与「用前

    i

    i

    i 个 token 预测第

    i

    i

    i 个」等价;因此一次前向传播即可得到所有位置的预测,训练可并行。

    5.2 推理流程(自回归、循环)

    • 第 1 步:输入当前序列的嵌入(如「这」「是」「最好的」「时代」)→ 输出下一个 token 的预测(如「这」)。
    • 第 2 步:将上一步预测的 token 拼入序列,再输入 Decoder → 输出再下一个 token(如「是」)。
    • 重复直到生成结束符(如 EOS)或达到最大长度。

    因此推理时无法并行:下一步的输入依赖上一步的输出,必须循环执行。

    下面用表格形式复述上述训练与推理中的输入/输出对应关系(保留你原有的「序列前半段 → 预测 → 真实标签」的示例)。

    5.3 训练流程示例(步骤对应关系)

    假设需要预测的序列为

    y

    y

    y,编码好的结果为

    e

    b

    d

    _

    y

    \\mathrm{ebd}\\_y

    ebd_y,取前

    n

    n

    n 个 token 作为输入、第

    n

    n

    n 个位置对应真实标签。例如:

    • 第1步,输入 ebd_y[0] >> 输出预测标签yhat[0],对应真实标签y[0]

    输入Decoder序列的前半段

    索引y1y2y3y4y5
    0 "sos" 0.1821 0.4000 0.2248 0.4440 0.7771

    预测出

    ➡

    当前时间步的预测标签yhat

    索引y1y2y3y4y5
    0 yyy 0.5621 0.8920 0.7312 0.2543 0.1289

    对应

    ➡

    真实标签y序列的后半段

    索引
    0 这
    1 是
    2 最好的
    3 时代
    4 这
    5 是
    6 最坏的
    7 时代
    8 "eos"

    …

    • 第n+1步,输入 ebd_y[:n] >> 输出预测标签yhat[n],对应真实标签y[n]

    输入Decoder序列的前半段

    索引y1y2y3y4y5
    0 "sos" 0.1821 0.4000 0.2248 0.4440 0.7771
    1 这 0.1821 0.4000 0.2248 0.4440 0.7771
    2 是 0.1721 0.5030 0.8948 0.2385 0.0987
    3 最好的 0.1342 0.8297 0.2978 0.7120 0.2565
    4 时代 0.1248 0.5003 0.7559 0.4804 0.2593

    预测出

    ➡

    当前时间步的预测标签yhat

    索引y1y2y3y4y5
    4 yyy 0.5621 0.8920 0.7312 0.2543 0.1289

    对应

    ➡

    真实标签y序列的后半段

    索引
    0 这
    1 是
    2 最好的
    3 时代
    4 这
    5 是
    6 最坏的
    7 时代
    8 "eos"
    • 第n+2步,输入 ebd_y[:n+1] >> 输出预测标签yhat[n+1],对应真实标签y[n+1]

    输入Decoder序列的前半段

    索引y1y2y3y4y5
    0 "sos" 0.1821 0.4000 0.2248 0.4440 0.7771
    1 这 0.1821 0.4000 0.2248 0.4440 0.7771
    2 是 0.1721 0.5030 0.8948 0.2385 0.0987
    3 最好的 0.1342 0.8297 0.2978 0.7120 0.2565
    4 时代 0.1248 0.5003 0.7559 0.4804 0.2593
    5 这 0.1821 0.4000 0.2248 0.4440 0.7771

    预测出

    ➡

    当前时间步的预测标签yhat

    索引y1y2y3y4y5
    5 yyy 0.5621 0.8920 0.7312 0.2543 0.1289

    对应

    ➡

    真实标签y序列的后半段

    索引
    0 这
    1 是
    2 最好的
    3 时代
    4 这
    5 是
    6 最坏的
    7 时代
    8 "eos"
    • 第n+3步,输入 ebd_y[:n+2] >> 输出预测标签yhat[n+2],对应真实标签y[n+2]

    输入Decoder序列的前半段

    索引y1y2y3y4y5
    0 "sos" 0.1821 0.4000 0.2248 0.4440 0.7771
    1 这 0.1821 0.4000 0.2248 0.4440 0.7771
    2 是 0.1721 0.5030 0.8948 0.2385 0.0987
    3 最好的 0.1342 0.8297 0.2978 0.7120 0.2565
    4 时代 0.1248 0.5003 0.7559 0.4804 0.2593
    5 这 0.1821 0.4000 0.2248 0.4440 0.7771
    6 是 0.1721 0.5030 0.8948 0.2385 0.0987

    预测出

    ➡

    当前时间步的预测标签yhat

    索引y1y2y3y4y5
    6 yyy 0.5621 0.8920 0.7312 0.2543 0.1289

    对应

    ➡

    真实标签y序列的后半段

    索引
    0 这
    1 是
    2 最好的
    3 时代
    4 这
    5 是
    6 最坏的
    7 时代
    8 "eos"

    5.4 推理流程示例(自回归、逐步)

    在推理时,Decoder 每次只预测下一个 token,再将其拼入输入继续预测,直到生成 EOS 或达到最大长度。流程如下——

    • 第一步,输入 ebd_y(全部的数据) >> 输出下一步的预测标签

    输入Decoder全部的序列

    索引y1y2y3y4y5
    0 这 0.1821 0.4000 0.2248 0.4440 0.7771
    1 是 0.1721 0.5030 0.8948 0.2385 0.0987
    2 最好的 0.1342 0.8297 0.2978 0.7120 0.2565
    3 时代 0.1248 0.5003 0.7559 0.4804 0.2593

    预测出

    ➡

    当前时间步的预测标签yhat

    索引y1y2y3y4y5
    4 yyy 0.5621 0.8920 0.7312 0.2543 0.1289
    • 第二步,输入 ebd_y(全部的数据)+ 预测的yhat >> 输出下一步的预测标签

    输入Decoder全部的序列

    索引y1y2y3y4y5
    0 这 0.1821 0.4000 0.2248 0.4440 0.7771
    1 是 0.1721 0.5030 0.8948 0.2385 0.0987
    2 最好的 0.1342 0.8297 0.2978 0.7120 0.2565
    3 时代 0.1248 0.5003 0.7559 0.4804 0.2593
    4 yyy 0.5621 0.8920 0.7312 0.2543 0.1289

    预测出

    ➡

    当前时间步的预测标签yhat

    索引y1y2y3y4y5
    5 yyy 0.5621 0.8920 0.7312 0.2543 0.1289
    • 第三步,输入 ebd_y(全部的数据)+ 预测的yhat >> 输出下一步的预测标签

    输入Decoder全部的序列

    索引y1y2y3y4y5
    0 这 0.1821 0.4000 0.2248 0.4440 0.7771
    1 是 0.1721 0.5030 0.8948 0.2385 0.0987
    2 最好的 0.1342 0.8297 0.2978 0.7120 0.2565
    3 时代 0.1248 0.5003 0.7559 0.4804 0.2593
    4 yyy 0.5621 0.8920 0.7312 0.2543 0.1289
    5 yyy 0.5621 0.8920 0.7312 0.2543 0.1289

    预测出

    ➡

    当前时间步的预测标签yhat

    索引y1y2y3y4y5
    6 yyy 0.5621 0.8920 0.7312 0.2543 0.1289

    以此类推,直到预测出“eos”后停止。

    💡 理解要点:训练时利用掩码与 Teacher Forcing,整段序列可一次前向、并行计算;推理时必须自回归、在下一时间步前先得到上一步的预测,因此需用循环逐步生成。

    6. 总结:Decoder-only 的核心价值

    Decoder-only 架构在 Transformer 家族中承担纯生成任务:仅用「带掩码的自注意力 + 前馈网络 + 残差与 LayerNorm」堆叠,无编码器、无交叉注意力,是 GPT、LLaMA、Qwen 等大语言模型的基础。要点归纳如下:

    • 输入与数据流:Tokenization → Embedding(

      V

      ×

      d

      model

      V \\times d_{\\text{model}}

      V×dmodel​ 查表)→ 位置编码,得到

      L

      ×

      d

      model

      L \\times d_{\\text{model}}

      L×dmodel​ 的 Decoder 输入。

    • 单层结构:掩码多头自注意力(

      X

      →

      Q

      ,

      K

      ,

      V

      →

      s

      o

      f

      t

      m

      a

      x

      (

      (

      Q

      K

      T

      /

      d

      k

      )

      +

      M

      )

      V

      →

      X \\to Q,K,V \\to \\mathrm{softmax}((QK^T/\\sqrt{d_k})+M)V \\to

      X→Q,K,V→softmax((QKT/dk​

      ​)+M)V→ 多头拼接与线性)→ 残差 + LN → 前馈网络(

      d

      model

      →

      4

      d

      model

      →

      d

      model

      d_{\\text{model}} \\to 4d_{\\text{model}} \\to d_{\\text{model}}

      dmodel​→4dmodel​→dmodel​)→ 残差 + LN;输入与输出形状均为

      L

      ×

      d

      model

      L \\times d_{\\text{model}}

      L×dmodel​。

    • 输出与生成:取最后一层最后一位置向量,经线性层

      d

      model

      ×

      V

      d_{\\text{model}} \\times V

      dmodel​×V 与 Softmax 得到词表上的概率分布;训练时并行、推理时自回归循环。

    结合前文 Transformer 8. Decoder: 掩码注意力机制以及数学推导、Transformer 5. Transformer中的残差连接、归一化与前馈神经网络、Transformer 6. Encoder 模块总结 以及 Autoencoder 介绍,Decoder-only 的每一环都可在对应章节找到更细的数学与直觉说明。

    7. 各步骤可训练参数量统计

    下面按数据流顺序,给出 Decoder-only 模型中每一步骤的可训练参数量(权重 + 偏置,若该模块有偏置则一并计入)。

    符号定义与典型取值(与上文一致,便于代入计算):

    符号含义典型取值(如 GPT-3 同量级)

    V

    V

    V

    词表大小 50257(GPT-3)或 128000(Llama-3),下面我们取1300作为测试

    d

    model

    d_{\\text{model}}

    dmodel​

    模型维度 12288

    h

    h

    h

    注意力头数 96

    d

    k

    d_k

    dk​

    每头维度,

    d

    k

    =

    d

    model

    /

    h

    d_k = d_{\\text{model}}/h

    dk​=dmodel​/h

    128

    N

    N

    N

    Decoder 层数 96

    L

    max

    ⁡

    L_{\\max}

    Lmax​

    最大序列长度(用于可学习位置编码) 2048

    下文公式中均可用上表取值代入,得到具体参数量。

    7.1 Embedding 层

    • 词嵌入矩阵

      E

      ∈

      R

      V

      ×

      d

      model

      E \\in \\mathbb{R}^{V \\times d_{\\text{model}}}

      E∈RV×dmodel​:

      V

      ⋅

      d

      model

      V \\cdot d_{\\text{model}}

      V⋅dmodel​。

    小计:

    V

    ⋅

    d

    model

    V \\cdot d_{\\text{model}}

    V⋅dmodel​。代入

    V

    =

    1300

    V=1300

    V=1300、

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288 得

    1300

    ×

    12288

    =

    15
     

    974
     

    400

    ≈

    1.60

    ×

    10

    7

    1300 \\times 12288 = 15\\,974\\,400 \\approx 1.60 \\times 10^7

    1300×12288=15974400≈1.60×107。

    7.2 位置编码

    • 正弦/余弦位置编码:无参数。
    • 可学习位置编码(如 GPT 系列):

      L

      max

      ⁡

      ⋅

      d

      model

      L_{\\max} \\cdot d_{\\text{model}}

      Lmax​⋅dmodel​(每位置一个

      d

      model

      d_{\\text{model}}

      dmodel​ 维向量)。

    小计:0(固定编码)或

    L

    max

    ⁡

    ⋅

    d

    model

    L_{\\max} \\cdot d_{\\text{model}}

    Lmax​⋅dmodel​(可学习)。代入

    L

    max

    ⁡

    =

    2048

    L_{\\max}=2048

    Lmax​=2048、

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288 得

    2048

    ×

    12288

    =

    25
     

    165
     

    824

    ≈

    2.52

    ×

    10

    7

    2048 \\times 12288 = 25\\,165\\,824 \\approx 2.52 \\times 10^7

    2048×12288=25165824≈2.52×107。

    7.3 单层 Decoder 内的参数量(共

    N

    N

    N 层)

    7.3.1 带掩码的多头自注意力
    • W

      Q

      ,
       

      W

      K

      ,
       

      W

      V

      W_Q,\\, W_K,\\, W_V

      WQ​,WK​,WV​:共

      h

      h

      h 个头,每头三个矩阵,每个

      R

      d

      model

      ×

      d

      k

      \\mathbb{R}^{d_{\\text{model}} \\times d_k}

      Rdmodel​×dk​,故

      3

      ⋅

      h

      ⋅

      (

      d

      model

      ⋅

      d

      k

      )

      =

      3

      ⋅

      d

      model

      ⋅

      (

      d

      k

      ⋅

      h

      )

      =

      3

      ⋅

      d

      model

      2

      3 \\cdot h \\cdot (d_{\\text{model}} \\cdot d_k) = 3 \\cdot d_{\\text{model}} \\cdot (d_k \\cdot h) = 3 \\cdot d_{\\text{model}}^2

      3⋅h⋅(dmodel​⋅dk​)=3⋅dmodel​⋅(dk​⋅h)=3⋅dmodel2​。

    • W

      O

      W_O

      WO​:

      R

      d

      model

      ×

      d

      model

      \\mathbb{R}^{d_{\\text{model}} \\times d_{\\text{model}}}

      Rdmodel​×dmodel​,即

      d

      model

      2

      d_{\\text{model}}^2

      dmodel2​。注意,

      W

      O

      W_O

      WO​ 是多头自注意力里的输出投影矩阵,章节3.1中有详细描述。

    • 偏置(若实现中有):Q/K/V 与 O 各

      d

      k

      d_k

      dk​ 或

      d

      model

      d_{\\text{model}}

      dmodel​,常见为

      4

      ⋅

      d

      model

      4 \\cdot d_{\\text{model}}

      4⋅dmodel​(或不计,依实现而定)。

    小计(仅权重):

    4

    ⋅

    d

    model

    2

    4 \\cdot d_{\\text{model}}^2

    4⋅dmodel2​。代入

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288 得

    4

    ×

    12288

    2

    =

    603
     

    979
     

    776

    ≈

    6.04

    ×

    10

    8

    4 \\times 12288^2 = 603\\,979\\,776 \\approx 6.04 \\times 10^8

    4×122882=603979776≈6.04×108(单层)。

    7.3.2 子层后的 Layer Normalization(共 2 个)
    • 每个 LN 有 scale

      γ

      \\gamma

      γ 与 shift

      β

      \\beta

      β,各

      d

      model

      d_{\\text{model}}

      dmodel​ 维,故每层 Decoder 内 2 个 LN:

      2

      ⋅

      (

      2

      ⋅

      d

      model

      )

      =

      4

      ⋅

      d

      model

      2 \\cdot (2 \\cdot d_{\\text{model}}) = 4 \\cdot d_{\\text{model}}

      2⋅(2⋅dmodel​)=4⋅dmodel​。

    小计:

    4

    ⋅

    d

    model

    4 \\cdot d_{\\text{model}}

    4⋅dmodel​。代入

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288 得

    4

    ×

    12288

    =

    49
     

    152

    4 \\times 12288 = 49\\,152

    4×12288=49152(单层)。

    说明:每个 Decoder 层里有两个子层,每个子层后面各有一个 LayerNorm,所以每层要算 2 个 LN:

    • 第一个 LN 层在「带掩码的多头自注意力 + 残差」之后
    • 第二个 LN 层在「前馈网络 FFN + 残差」之后。
    7.3.3 前馈网络(FFN)
    • W

      1

      W_1

      W1​:

      R

      d

      model

      ×

      4

      d

      model

      \\mathbb{R}^{d_{\\text{model}} \\times 4d_{\\text{model}}}

      Rdmodel​×4dmodel​,即

      4

      ⋅

      d

      model

      2

      4 \\cdot d_{\\text{model}}^2

      4⋅dmodel2​。

    • W

      2

      W_2

      W2​:

      R

      4

      d

      model

      ×

      d

      model

      \\mathbb{R}^{4d_{\\text{model}} \\times d_{\\text{model}}}

      R4dmodel​×dmodel​,即

      4

      ⋅

      d

      model

      2

      4 \\cdot d_{\\text{model}}^2

      4⋅dmodel2​。

    • 偏置

      b

      1

      ,
       

      b

      2

      b_1,\\, b_2

      b1​,b2​:

      4

      ⋅

      d

      model

      +

      d

      model

      =

      5

      ⋅

      d

      model

      4 \\cdot d_{\\text{model}} + d_{\\text{model}} = 5 \\cdot d_{\\text{model}}

      4⋅dmodel​+dmodel​=5⋅dmodel​(若存在)。

    小计(仅权重):

    8

    ⋅

    d

    model

    2

    8 \\cdot d_{\\text{model}}^2

    8⋅dmodel2​;含偏置则为

    8

    ⋅

    d

    model

    2

    +

    5

    ⋅

    d

    model

    8 \\cdot d_{\\text{model}}^2 + 5 \\cdot d_{\\text{model}}

    8⋅dmodel2​+5⋅dmodel​。代入

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288 得

    8

    ×

    12288

    2

    =

    1
     

    207
     

    959
     

    552

    ≈

    1.21

    ×

    10

    9

    8 \\times 12288^2 = 1\\,207\\,959\\,552 \\approx 1.21 \\times 10^9

    8×122882=1207959552≈1.21×109(单层,仅权重)。

    7.3.4 单层 Decoder 合计
    模块参数量(权重)备注
    多头自注意力

    4
     

    d

    model

    2

    4 \\, d_{\\text{model}}^2

    4dmodel2​

    含

    W

    O

    W_O

    WO​

    两个 LayerNorm

    4
     

    d

    model

    4 \\, d_{\\text{model}}

    4dmodel​

    γ

    ,
     

    β

    \\gamma,\\,\\beta

    γ,β × 2

    FFN

    8
     

    d

    model

    2

    8 \\, d_{\\text{model}}^2

    8dmodel2​

    W

    1

    ,
     

    W

    2

    W_1,\\,W_2

    W1​,W2​

    单层合计

    12
     

    d

    model

    2

    +

    4
     

    d

    model

    12 \\, d_{\\text{model}}^2 + 4 \\, d_{\\text{model}}

    12dmodel2​+4dmodel​

    未计注意力偏置

    单层代入得

    12

    ×

    12288

    2

    +

    4

    ×

    12288

    =

    1
     

    812
     

    017
     

    664

    +

    49
     

    152

    =

    1
     

    812
     

    066
     

    816

    ≈

    1.81

    ×

    10

    9

    12 \\times 12288^2 + 4 \\times 12288 = 1\\,812\\,017\\,664 + 49\\,152 = 1\\,812\\,066\\,816 \\approx 1.81 \\times 10^9

    12×122882+4×12288=1812017664+49152=1812066816≈1.81×109。

    N

    N

    N 层总计:

    N

    ⋅

    (

    12
     

    d

    model

    2

    +

    4
     

    d

    model

    )

    N \\cdot (12 \\, d_{\\text{model}}^2 + 4 \\, d_{\\text{model}})

    N⋅(12dmodel2​+4dmodel​);代入

    N

    =

    96

    N=96

    N=96 得

    96

    ×

    1
     

    812
     

    066
     

    816

    =

    173
     

    958
     

    414
     

    336

    ≈

    1.74

    ×

    10

    11

    96 \\times 1\\,812\\,066\\,816 = 173\\,958\\,414\\,336 \\approx 1.74 \\times 10^{11}

    96×1812066816=173958414336≈1.74×1011。

    7.4 输出层(线性层 + Softmax)

    • W

      out

      W_{\\text{out}}

      Wout​:

      R

      d

      model

      ×

      V

      \\mathbb{R}^{d_{\\text{model}} \\times V}

      Rdmodel​×V,即

      d

      model

      ⋅

      V

      d_{\\text{model}} \\cdot V

      dmodel​⋅V。

    • b

      out

      b_{\\text{out}}

      bout​:

      V

      V

      V 维,即

      V

      V

      V。

    小计:

    d

    model

    ⋅

    V

    +

    V

    d_{\\text{model}} \\cdot V + V

    dmodel​⋅V+V。代入

    d

    model

    =

    12288

    d_{\\text{model}}=12288

    dmodel​=12288、

    V

    =

    1300

    V=1300

    V=1300 得

    12288

    ×

    1300

    +

    1300

    =

    15
     

    975
     

    700

    ≈

    1.60

    ×

    10

    7

    12288 \\times 1300 + 1300 = 15\\,975\\,700 \\approx 1.60 \\times 10^7

    12288×1300+1300=15975700≈1.60×107。

    7.5 总参数量汇总

    步骤参数量(公式)典型数值示例(

    d

    model

     ⁣

    =
     ⁣

    12288

    d_{\\text{model}}\\!=\\!12288

    dmodel​=12288,

    V
     ⁣

    =
     ⁣

    1300

    V\\!=\\!1300

    V=1300,

    N
     ⁣

    =
     ⁣

    96

    N\\!=\\!96

    N=96,

    L

    max

    ⁡

     ⁣

    =
     ⁣

    2048

    L_{\\max}\\!=\\!2048

    Lmax​=2048)

    Embedding

    V

    ⋅

    d

    model

    V \\cdot d_{\\text{model}}

    V⋅dmodel​

    1300 × 12288 ≈ 1.60e7
    位置编码(可学习)

    L

    max

    ⁡

    ⋅

    d

    model

    L_{\\max} \\cdot d_{\\text{model}}

    Lmax​⋅dmodel​

    2048 × 12288 ≈ 2.52e7

    N

    N

    N 层 Decoder

    N

    ⋅

    (

    12
     

    d

    model

    2

    +

    4
     

    d

    model

    )

    N \\cdot (12 \\, d_{\\text{model}}^2 + 4 \\, d_{\\text{model}})

    N⋅(12dmodel2​+4dmodel​)

    96 × (12×12288² + 4×12288) ≈ 1.74e11
    输出层

    d

    model

    ⋅

    V

    +

    V

    d_{\\text{model}} \\cdot V + V

    dmodel​⋅V+V

    12288×1300 + 1300 ≈ 1.60e7
    总计(不含位置)

    V

    ⋅

    d

    model

    +

    N

    ⋅

    (

    12
     

    d

    model

    2

    +

    4
     

    d

    model

    )

    +

    (

    d

    model

    +

    1

    )

    ⋅

    V

    V \\cdot d_{\\text{model}} + N \\cdot (12 \\, d_{\\text{model}}^2 + 4 \\, d_{\\text{model}}) + (d_{\\text{model}}+1) \\cdot V

    V⋅dmodel​+N⋅(12dmodel2​+4dmodel​)+(dmodel​+1)⋅V

    约 1.74e11

    💡 理解要点:Decoder 的

    N

    N

    N 层(注意力 + FFN + LN)占绝大部分参数;Embedding 与输出层均为

    O

    (

    V

    ⋅

    d

    model

    )

    O(V \\cdot d_{\\text{model}})

    O(V⋅dmodel​),在

    V

    V

    V 较大时也相当可观。若使用权重共享(如 Embedding 与输出层

    W

    out

    W_{\\text{out}}

    Wout​ 共享同一矩阵),则输出层线性部分可视为

    0

    0

    0 额外参数(仅多一个

    b

    out

    b_{\\text{out}}

    bout​ 或不计)。

    赞(0)
    未经允许不得转载:171主机测评 » Transformer 10. Decoder Only Transformer 架构以及每一步骤的详细计算
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址