Transformer

Transformer 由 Encoder 和 Decoder 两个部分组成。Transformer 的工作流程大体如下:

  1. 输入句子的每一个单词的表示向量 X,X由单词的 Embedding(Embedding就是从原始数据提取出来的Feature) 和单词位置的 Embedding 相加得到

  2. 将句子的向量矩阵传入 Encoder 中,经过 6 个 Encoder block 后可以得到句子所有单词的编码信息矩阵 C,如下图。句子向量矩阵用 表示, n 是句子中单词个数,d 是表示向量的维度 (论文中 d=512)。每一个 Encoder block 输出的矩阵维度与输入完全一致

  3. 将 Encoder 输出的编码信息矩阵 C传递到 Decoder 中,Decoder 依次会根据当前翻译过的单词 1~i 翻译下一个单词 i+1,如下图所示。在使用的过程中,翻译到单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 i+1 之后的单词

overview

输入

输入通常是一个长度为 n 的离散符号序列 X = (x1, x2, …, xn).

首先用词表查表把每个符号映射为一个整数索引,然后通过嵌入矩阵 E ∈ ℝ^{|V|×d} 得到词向量序列:
\(\mathbf{E}_i = E[x_i], \quad i=1..n.\)

Transformer 中单词的输入表示 x由单词 Embedding 和位置 Embedding (Positional Encoding)相加得到

位置编码 PositionEncoding PE_i ∈ ℝ^{d} 与词嵌入逐位置相加得到最终输入表示:
\(\mathbf{X}_i = \tilde{\mathbf{E}}_i + \text{PE}_i.\)

单词embedding

单词的 Embedding 有很多种方式可以获取,例如可以采用 Word2Vec、Glove 等算法预训练得到,也可以在 Transformer 中训练得到

Transformer 中常把嵌入乘以缩放因子 $\sqrt{d}$ 以稳定训练:
\(\tilde{\mathbf{E}}_i = \mathbf{E}_i \cdot \sqrt{d}.\)

位置embedding

常见固定正弦/余弦位置编码公式(第 k 维,k 从 0 开始):
\(\text{PE}_{i,2k} = \sin\!\left(\frac{i}{10000^{2k/d}}\right),\quad \text{PE}_{i,2k+1} = \cos\!\left(\frac{i}{10000^{2k/d}}\right).\) 也可采用可学习的位置向量,训练时更新。

注意力

形状约定(常用):

  • X: $n\times d$;Q,K,V: $n\times d_k$(每个头)或 $n\times d$(整体然后切头);
  • 在实现中常把批次维 B 加入:$B\times n\times d$。

自注意力

self-attn

自注意力需要用到矩阵Q(查询),K(键值),V(值)。在实际中,自注意力接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个 Encoder block 的输出。而Q,K,V正是通过自注意力的输入进行线性变换得到的

QKV

将每个位置的输入向量投影为查询、键、值向量:

给定输入矩阵 $\mathbf{X}\in\mathbb{R}^{n\times d}$,有参数矩阵 $W_Q,W_K,W_V\in\mathbb{R}^{d\times d_k}$:
\(Q = XW_Q,\quad K = XW_K,\quad V = XW_V,\)

其中$d_k$是$Q, K$的列数,通常取 $d_k=d/h$(h 为头数),或 $d_k=d$ 并在多头中切分。$X, Q, K, V$ 的每一行都表示一个单词

核心计算

自注意力的核心是计算查询与键的相似度并加权值:
\(\text{Attention}(Q,K,V)=\text{softmax}\!\left(\frac{QK^{\top}}{\sqrt{d_k}} + M\right)V,\) 其中 $M$ 是可选的掩码矩阵(例如解码器的未来位置掩码或填充掩码),softmax 在每一行上归一化。
缩放因子 $\sqrt{d_k}$ 防止$Q, K$点积值在 $d_k$ 增大时变得过大导致 softmax 梯度消失。
$QK^{\top}$ 得到的矩阵行列数都为 $n$,$n$ 为句子单词数,这个矩阵可以表示单词之间的 attention 强度
之后,使用 Softmax 计算每一个单词对于其他单词的 attention 系数,公式中的 Softmax 是对矩阵的每一行进行 Softmax,即每一行的和都变为 1.
得到 Softmax 矩阵之后可以和$V$相乘,得到最终的输出$Z$
Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数,最终单词 1 的输出 $Z_i$ 等于所有单词 i 的值 $V_i$ 根据 attention 系数的比例加在一起得到

多头注意力

multi-attn

多头注意力是由多个自注意力组合形成的

首先将输入$X$分别传递到 $h$ 个不同的自注意力中,计算得到 $h$ 个输出矩阵$Z_i$

将 Q,K,V 分为 h 个头,分别计算注意力,再拼接投影回 d 维:
\(\text{head}_i = \text{Attention}(QW_Q^{(i)},\,KW_K^{(i)},\,VW_V^{(i)}),\)

\[\text{MultiHead}(Q,K,V)=\text{Concat}(\text{head}_1,...,\text{head}_h)W_O,\]

其中每个投影维度为 $d_k=d/h$,最终拼接后乘输出投影 $W_O\in\mathbb{R}^{d\times d}$。

输出的矩阵$Z$与其输入的矩阵$X$的维度是一样的

多头的作用是并行学习不同子空间的相互关系,增强表示能力。

掩码机制

填充掩码 Padding Mask:屏蔽序列中填充位置,避免模型关注无效 token。通常把这些位置的相似度设置为 $-\infty$(在数值上用大负数)使 softmax 后权重为 0。

自回归未来掩码 Causal Mask:在解码器的自注意力中禁止查询看到未来位置数据,保证自回归生成正确性。掩码矩阵 M 的条目为 0 或 $-\infty$。

层级输入输出

每个子层遵循:子层输出 = LayerNorm(x + Sublayer(x))(或 Pre-LN 变体先 Norm 再子层)。

前馈网络 FFN 对每个位置独立应用两层线性与激活:
\(\text{FFN}(x) = \text{max}(0, xW_1 + b_1)W_2 + b_2\)

常用 GELU 替代 ReLU,隐藏维度通常为 $d_{ff}$(例如 $4d$)。

整体单层(Post-LN 形式)顺序:MultiHeadAttention → Add & LayerNorm → FFN → Add & LayerNorm。

形状、复杂度 与 实现注意事项

时间/空间复杂度:自注意力在序列长度 n 上为 $O(n^2 d)$ 的时间复杂度 与 $O(n^2)$ 的中间内存占用(因为需要保存 $QK^{\top}$ 或注意力权重)。

批次实现常把多头并行为形状 $B\times h\times n\times d_k$ 来做高效矩阵乘法。

数值稳定性技巧:在 softmax 前减去行最大值、使用缩放因子 $\sqrt{d_k}$、在加掩码时用大负值。

小结 输入到第一层的完整流程

  1. 离散 token → 索引 → 嵌入向量 E[x_i]。
  2. 嵌入向量乘以 $\sqrt{d}$ 并加上位置编码得到 X。
  3. X 通过线性映射得到 Q,K,V。
  4. 计算缩放点积注意力并应用掩码得到每个头的输出。
  5. 拼接多头输出并线性投影,作为注意力子层输出,后接残差与 LayerNorm,进入前馈网络并重复层规范化。

Encoder

encoder

概述

Transformer 的 encoder 由若干相同的编码层(Encoder Layer)堆叠而成,每一层负责把输入序列映射为更高层次的表示以供下游任务或 decoder 使用. Encoder 的关键模块包括:输入嵌入与位置编码、多头自注意力(Multi‑Head Self‑Attention)、逐位置前馈网络(Position‑wise Feed‑Forward Network)、残差连接与层归一化(Residual + LayerNorm).

输入处理 Embedding 和 Position Encoding

输入首先通过词/子词嵌入(embedding)得到向量序列 $x1…xn$,再加上位置编码以引入序列位置信息,因为自注意力本身不含序列顺序信息.

常用的位置编码包括固定的正弦/余弦编码或可学习的位置嵌入。把嵌入与位置编码相加作为 encoder 的初始输入.

多头自注意力 Multi Head Self Attention

自注意力的核心目标是让每个位置能够“关注”序列中其他位置的表示并按权重加权组合,从而捕捉远程依赖关系.

单头注意力的计算(缩放点积注意力)用公式表示为:
\(\text{Attention}(Q,K,V)=\text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V\) 其中 Q,K,V 分别为查询、键、值矩阵,$d_k$ 是键的维度,用于缩放以稳定梯度。

多头注意力把 embedding 分成 h 个子空间并行计算注意力,再将各头拼接并线性映射回原始维度:
\(\text{MultiHead}(Q,K,V)=\text{Concat}(\text{head}_1,\dots,\text{head}_h)W^O\) \(\text{head}_i=\text{Attention}(QW_i^Q,KW_i^K,VW_i^V)\) 这样能让模型在不同子空间同时关注不同类型的关系与特征.

位置前馈网络 Feed‑Forward Network

在每个注意力子层之后,编码层包含一个逐位置前馈网络(在序列的每个位置上独立应用相同的两层全连接网络),通常结构为 Linear → ReLU(或 GELU)→ Linear:
\(\text{FFN}(x)=\max(0,xW_1+b_1)W_2+b_2\) 第一层维度(称为中间隐藏维)通常大于模型维度,以增加非线性表达能力.

层结构 Residual、LayerNorm 与堆叠

每个子层(注意力或 FFN)都使用残差连接再接层归一化:

  • 对注意力子层: $x’=\text{LayerNorm}(x+\text{MultiHead}(x,x,x))$
  • 对 FFN 子层: $y=\text{LayerNorm}(x’+\text{FFN}(x’))$

LayerNorm 对单个样本的特征维度做归一化,使该样本在这一层的激活值 均值为 0、标准差为 1,并允许可学习的缩放和平移参数恢复表达能力,从而稳定训练和加速收敛
残差连接加速收敛并维持信息流
把上述完整的编码层重复 N 层形成最终的 encoder 输出,通常取 N=6(原始论文)或更深的层数用于大型模型.

LayerNorm

LayerNorm 定义与数学公式

LayerNorm 对单个样本的特征维度做归一化:给定输入向量 $x\in\mathbb{R}^{d}$(Transformer 中通常为某一位置的隐藏向量),计算该向量在特征维上的均值与方差,然后进行归一化并做可学习的仿射变换,公式为
\(\mu=\frac{1}{d}\sum_{i=1}^{d} x_i,\quad \sigma^2=\frac{1}{d}\sum_{i=1}^{d}(x_i-\mu)^2,\) \(\text{LayerNorm}(x)=\gamma\odot\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta,\) 其中 $\gamma$(scale)和 $\beta$(shift)为可学习参数,ε 为小常数以保证数值稳定性,符号 $\odot$ 表示逐元素乘法。

具体实现细节与形状约定
  • 输入形状通常为 $B\times N\times d$(批次 B、序列长度 N、隐藏维度 d);LayerNorm 在最后一维 d 上计算均值与方差,对每个样本每个时间步独立归一化,输出形状与输入相同。
  • 常见实现步骤:计算均值 $\mu$ 和方差 $\sigma^2$;按通道做 $(x-\mu)/\sqrt{\sigma^2+\epsilon}$;按维度乘以 γ 加上 β;在数值上在 softmax/激活前后加入 LayerNorm 可改善训练稳定性与收敛速度.
在 Transformer 中的位置与用途
  • 在 Transformer 中,每个子层(自注意力或前馈网络)通常与残差连接配合使用 LayerNorm。两种常见顺序是:Post-LN(先子层操作,再添加残差并做 LayerNorm)与 Pre-LN(先 LayerNorm,再子层操作并添加残差);LayerNorm 的存在能稳定深层网络训练并减轻批次大小与序列长度差异带来的统计偏差问题.
Pre-LN 与 Post-LN 的区别与影响
  • Post-LN(原始论文风格):子层输出加残差后做 LayerNorm,写作 $y=\text{LayerNorm}(x+\text{Sublayer}(x))$。Post-LN 在浅层通常工作良好,但随着层数增加可能导致梯度传播困难。
  • Pre-LN(训练中常用):先做归一化再送入子层,写作 $y=x+\text{Sublayer}(\text{LayerNorm}(x))$。Pre-LN 能改善梯度流、加速收敛并提高深层模型稳定性,是工程中经常采用的变体.
数值稳定性、反向传播与工程要点
  • 缩放与 ε:在计算标准差时加 ε(典型取值 1e-5)防止除零并保证稳定的梯度;γ 与 β 带来仿射不变性,允许模型恢复任意尺度与偏移。
  • 反向传播:均值与方差的梯度按链式法则回传到输入,LayerNorm 的 Jacobian 稍复杂但计算量固定为 $O(d)$ 每位置,与 BatchNorm 不同不依赖 batch 统计,适合变长序列与小 batch 场景。
  • 工程实现建议:对形状做好广播处理(γ/β 形状为 $d$);在混合精度训练中保留稳定的 ε 与在必要时对均值/方差做数值剪裁;选择 Pre-LN 可在大层数 Transformer 中显著改善训练稳定性与收敛速度.

Encoder 输出与应用

每一个编码器输入为 $ X \in R^{n\times d} $ , 输出 $ O \in R^{n\times d} $

把上述完整的编码器重复 $N$ 层形成最终的 encoder 输出,通常取 $N=6$(原始论文)或更深的层数用于大型模型

Encoder 的最终输出是一个与输入长度相同的高级表示序列,通常用于:

  • 作为 decoder 的上下文(在 seq2seq 任务中)
  • 作为分类/回归头的输入(对第一个 token 或池化后的表示做预测)
  • 作为检索、匹配等任务的特征向量.

Encoder 中每一步的注意力权重可用于解释模型关注的输入位置,便于分析模型行为.

Decoder

overview

概述

Decoder 在 Transformer 中负责把 Encoder 的表示和当前已生成的目标序列一起,逐步生成最终输出序列。每个 Decoder 层由三个子层按顺序组成:Masked Multi‑Head Self‑Attention、Encoder‑Decoder Multi‑Head Attention、Position‑wise Feed‑Forward Network,每个子层后接残差连接与 LayerNorm,以保证信息流和训练稳定性.

输入与位置编码

输入为目标序列的 token embedding,训练时常用 右移(right‑shift)/教师强制(teacher forcing) 的方式把目标序列作为上一步的输入。

在 embedding 上加上 位置编码(sinusoidal 或可学习) 以提供顺序信息。

解码时为了保证自回归性质,输入序列在自注意力中需要应用 因果(look‑ahead)掩码,遮挡当前位置之后的所有位置,防止“看到未来”信息.

Masked Multi‑Head Self‑Attention

功能:允许解码器在生成第 t 个 token 时,基于已生成的前 t−1 个 token 学习内部依赖并计算表示。

multi-attn-mask

实现细节:使用自注意力,多个头并行后拼接映射回原始维度。对 QK^T 应用因果掩码,将未来位置的 logits 设为 −∞ 或大负值以确保 softmax 后为 0。

还需要同时支持 padding mask(忽略填充位置),在批处理或不等长序列时与因果掩码合并使用以正确屏蔽无效位置.

Encoder‑Decoder Multi‑Head Attention

功能:把 Encoder 的上下文信息注入到 Decoder,使 Decoder 能够根据源序列信息选择性地关注输入不同位置来生成输出。

实现细节:这里的 Queries 来自前一子层(Masked Self‑Attn 的输出或其残差结果),Keys 与 Values 来自 Encoder 的最终输出。对 QK^T 计算注意力权重并与 V 相乘得到上下文向量,再与残差连接与 LayerNorm 结合用于后续计算.

前馈网络 与 归一化

每个解码层在两个注意力子层之后都接一个 Position‑wise Feed‑Forward Network:Linear → Activation(ReLU/GELU)→ Linear,用以引入逐位置的非线性变换。

每个子层使用 残差连接 + LayerNorm(Post‑Norm 或 Pre‑Norm 两种变体),使梯度更稳定并加速训练收敛,Pre‑Norm 在深层 Decoder 中通常更有利于稳定训练.

生成过程、训练差异与推理优化

训练阶段常用 teacher forcing,一次性把整段右移后目标序列输入 Decoder,同时使用因果掩码并计算交叉熵损失。

推理阶段为自回归逐步生成:每生成一个 token,就把其 embedding 追加到输入并重复执行 Decoder。为加速推理常用优化:

  • 缓存 Key/Value:对每层保存已计算的 K,V,使得在生成新 token 时只需为新 token 计算 Q 并与缓存的 K,V 交互,避免重复计算全部注意力矩阵。
  • 束搜索(beam search)/采样策略:用于平衡多样性与质量(beam search、top‑k、top‑p 等)。
  • 并行与张量化优化:融合算子、混合精度、批量化多步生成等方法提升吞吐与延迟性能.

实践注意事项与变体

  • 掩码管理:因果掩码与 padding mask 必须在计算注意力 logits 时正确合并并处理数值稳定性(使用大负值代替 −∞)。
  • Pre‑Norm vs Post‑Norm:Pre‑Norm 更易在深层网络中训练且梯度更稳定;Post‑Norm 原始实现语义更直观。
  • 相对位置编码与稀疏/长序列注意力:对长序列任务可采用相对位置编码、局部/稀疏注意力或线性注意力等变体以降低计算与内存成本。

输出投影与概率分布

解码器最后一层的隐藏状态通过一个线性投影映射到词表维度,得到每个候选 token 的 logits。 将 logits 经 softmax 转为概率分布用于采样或最大似然选择。 通常共享 embedding 与投影权重以减少参数并改善训练稳定性。