Transformer

为什么Attention需要多个头?

本质就是回答为什么不能只用一个头

如果只用一个头,经过QKV运算后,得到一组权重,那么token只能用一种方式去理解自己。但是语言中token的关系从来不是一维的,单头使得被迫将不同层面的关系压缩进一组权重,注意力权重变成一个折中的分布。简单来说就是一个注意力分布无法承载多种独立的关系模式,表达能力被严重限制。

这就是问题,所以才使用多头,比如将512拆成8个64,每个子空间独立计算,生成各自的注意力分布,最后把多头的输出拼接起来,通过一个线性变化融合多个头的信息。这种模式使得每个头只需要捕获一种或少量关系模式。

这里也会有一个问题,拆成多个头降低了维度,可能会损失表达能力,但损失的远小于收益。拆分成多头在同等计算量上获取到的信息大于单头,并且低维子空间相当于隐含的正则化,保证每种学习关系独立,也防止了每个头在高维空间过拟合,多头保证了多种关系可以并行捕捉

Post-LN和Pre-LN的区别

Post-LayerNorm是原文设计

1
2
3
4
5
6
7
8
9
x

├── Sublayer(x) (Attention 或 FFN)

├── + residual (x)

└── LayerNorm

y

Attention block:
$$
x_1 = \mathrm{LayerNorm}(x+\mathrm{Attention}(x))
$$
FFN block:
$$
x_2 = \mathrm{LayerNorm}(x_1+\mathrm{FFN}(x_1))
$$
可以这么理解
$$
y = \mathrm{LN}(x+F(x))\quad z= x+F(x)
$$
损失对输入的梯度:
$$
\frac{\partial L}{\partial x}=\frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial \mathrm{LN}}{\partial z}(I
+\frac{\partial F}{\partial x})
$$
问题在于LN在在残差连接之后,${\partial \mathrm{LN}}/{\partial z}$梯度值近似为$1/\sqrt d_k$,使得残差传播的恒等路径梯度不再是1,每层都要缩放一次

所以梯度随网络深度呈指数衰减,导致低层(靠近输入的层)梯度几乎消失,梯度消失会导致Adam等优化器的更新变得不稳定


Pre-LayerNorm 把 LayerNorm 移到子层前面

1
2
3
4
5
6
7
8
9
x

├── LayerNorm

├── Sublayer

├── + residual

└── y

Attention block:
$$
x_1 =x+\mathrm{Attention}( \mathrm{LayerNorm}(x))
$$
FFN block:
$$
x_2 = x_1+\mathrm{FFN}(\mathrm{LayerNorm}(x_1))
$$
最关键的在于这样使得残差路径变成恒等映射
$$
y = x+F(\mathrm{LN}(x))\quad u = \mathrm{LN}(x)
$$
损失对输入的梯度:
$$
\frac{\partial L}{\partial x}=\frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} = \frac{\partial L}{\partial y}(I+\frac{\partial F}{\partial u}\cdot \frac{\partial u}{\partial x})
$$
梯度中始终存在恒等梯度通路,梯度更稳定,深层 Transformer 更容易训练

为什么现在模型主流是Decoder结构?

18年GPT和BERT发布

GPT采用Decoder-only,单向注意力,从左往右预测下一个token

BERT采用Encoder-only,双向注意力,采用 Masked Language Modeling,在当时的 NLP 基准测试上显著优于 GPT1

转变可以分为几个原因

  1. 核心原因 训练效率差异

    Decoder-only 采用因果语言模型训练,给定前面的 token,预测下一个 token

    在一段长度为n的序列中,每个位置都会产生预测任务,因此一个 1024 token 的序列可以产生 1024 个训练信号,并同时计算 loss

    相比之下,BERT 的 MLM 训练只对约 15% 被遮盖的位置计算 loss,同样长度的序列只有大约 150 个有效训练信号,其余位置不会产生梯度更新

    当训练数据规模达到万亿 token 级时,这种训练信号利用率差异会带来明显的效率差距

  2. 重要原因 训练和推理的一致性

    BERT 在训练时需要引入 mask 标记,模型学习的是“看到 mask 预测原 token”,而在实际下游任务或推理时,输入文本中通常并不存在 mask 标记,因此训练数据分布和推理分布并不完全一致

    虽然 BERT 通过随机替换等策略缓解这一问题,但本质上的分布偏移仍然存在

    Decoder-only 模型则始终执行同一种行为——从左到右预测下一个 token——训练和推理过程完全一致,因此在大规模生成任务中更加稳定

  3. 上下文学习(In-context Learning),也称为零样本学习(zero-shot)

    从 GPT2 开始发现模型即使不进行微调,只通过在 prompt 中给出几个示例,就可以在新任务上产生合理输出

    这种能力与 decoder-only 的训练方式高度一致:示例可以直接作为上下文的一部分,让模型继续生成答案

    而 BERT 的训练目标是“填空预测”,并不天然支持这种序列生成式学习,因此很难形成类似能力

  4. scaling 行为的可预测性

    OpenAI 的 scaling law 研究发现,在自回归语言模型中,当模型参数量、数据量和计算量同时扩大时,训练 loss 会按照稳定的幂律规律下降,并且这种趋势可以较好预测

    这种可预测性使工程团队能够在训练前评估算力投入和模型性能之间的关系,从而支持超大规模模型训练决策,Decoder-only 架构在这一 scaling 过程中表现出非常稳定的行为

  5. 因果注意力

    单向注意力迫使模型只能依赖已有上下文推断后续内容,不能直接利用未来信息,这种限制在模型规模扩大后反而有利于模型学习更强的因果推理能力

    而双向注意力虽然在小模型阶段拟合速度更快,但容易利用统计捷径

RELU激活和GELU激活的区别

ReLU 和 GELU 都是神经网络中的激活函数,本质作用是引入非线性,使模型能够表达复杂函数

但 ReLU 也有明显问题,由于负区间直接被截断为 0,一旦某些神经元长期落在负区间,梯度就变成 0,这些神经元可能永久失活

相比 ReLU,GELU 有几个重要特点:

  1. 它是平滑函数,没有硬拐点,因此梯度变化更连续,这对深层网络优化更稳定
  2. 它是软门控机制,小的负值不会被完全丢弃,而是被部分保留,使信息流动更细腻
  3. 它具有一定的概率解释:输入乘以“被激活的概率”,这种连续门控在高维表示学习中更有效