Transformer架构详解
概述
Transformer是Google在2017年论文《Attention Is All You Need》中提出的一种完全基于注意力机制的序列建模架构,彻底抛弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),成为了当前大模型的主流基础架构。
Transformer采用Encoder-Decoder的整体设计,Encoder负责对输入序列进行编码,Decoder负责根据编码结果生成输出序列。
整体架构
Transformer的核心特点:
- 并行计算:RNN需要按时间步依次计算,而Transformer可以一次性处理整个序列,大大提升训练速度
- 长程依赖:自注意力直接建模任意两个位置的依赖关系,不受距离限制
- 动态权重:根据内容动态分配注意力权重,更好地捕捉语义关系
核心组件详解
1. Embedding层
词嵌入(Word Embedding)将离散的token索引映射为连续的低维向量表示:
- 输入:形状为
(batch_size, seq_len) 的token索引序列
- 输出:形状为
(batch_size, seq_len, d_model) 的词嵌入矩阵
- 参数规模:
vocab_size × d_model
2. 位置编码(Positional Encoding)
由于自注意力本身不具备位置信息,需要额外向词嵌入中注入位置信息,详见《位置编码》一章。Transformer原文使用正弦余弦位置编码:
PE(pos,2i)=sin(100002i/dmodelpos)
PE(pos,2i+1)=cos(100002i/dmodelpos)
最终输入为词嵌入与位置编码相加:x = token_embedding + positional_encoding。
3. 多头自注意力(Multi-Head Self-Attention)
自注意力允许每个位置的token都能关注到序列中所有其他位置的token,并通过加权求和得到更新后的表示。多头注意力将特征维度切分为多个子空间,分别计算注意力,再拼接起来,让模型能够从不同表示子空间中学习不同的信息。
具体计算流程详见《自注意力机制》一章。
4. 前馈神经网络(Feed Forward Network, FFN)
在每个位置,多头注意力输出之后都会经过一个两层的前馈神经网络:
FFN(x)=max(0,xW1+b1)W2+b2
其中:
- 输入维度:
d_model
- 隐藏层维度:通常为
4 × d_model(原始Transformer设置)
- 激活函数:原始论文使用ReLU,现在大部分模型使用GELU或SwiGLU
FFN实际上是对每个位置独立做一次特征变换,增加了模型的非线性表达能力。
5. 残差连接
每个子层(注意力、FFN)都使用残差连接:
output=x+sublayer(x)
残差连接的作用是缓解深度网络训练时的梯度消失问题,让梯度能够直接回传到前面的层,使得更深的网络也能顺利训练。
6. Layer Normalization
在残差连接之后,都会接一次Layer Normalization,将每个样本特征维度归一化到均值0方差1。详见《LayerNormalization详解》一章。
训练流程
训练阶段(Encoder-Decoder架构)
- Encoder处理:一次性读入整个源序列,经过N层Encoder编码得到memory,所有位置都可以互相看到,使用双向注意力。
- Decoder处理:读入整个目标序列(已经右移一位,作为自回归输入),使用带掩码的自注意力(每个位置只能看到自己及之前的位置),然后通过Encoder-Decoder交叉注意力关注到源序列。
- 输出层:通过线性层+Softmax输出下一个token的概率分布。
- 损失计算:计算所有位置预测结果与真实标签的交叉熵损失,反向传播更新参数。
推理流程(自回归生成)
推理阶段,Decoder是逐个token生成的:
- 初始输入只包含起始符
<sos>。
- 根据当前已生成序列,预测下一个token的概率分布,通过采样或贪心选择输出一个token。
- 将新生成的token追加到输出序列中。
- 重复步骤2-3,直到生成结束符
<eos> 或达到最大长度限制。
自回归生成的特点:
- 每次只能生成一个token,推理速度慢
- 每个新token都能看到之前生成的所有token,能够保证上下文一致性
面试常见问题
1. 为什么Transformer用LayerNorm而不用BatchNorm?
回答要点:
- BatchNorm是对**批维度(batch)**做归一化,即对同一个batch中所有样本的同一特征维度做归一化,假设特征分布在batch上是稳定的。
- LayerNorm是对**特征维度(d_model)**做归一化,对每个样本单独归一化,不依赖于batch。
- Transformer处理的是变长序列,不同样本长度不同,而且推理时batch size可能为1,BatchNorm在batch size小时效果很差。
- 在Transformer中,每个token位置是独立处理的,序列长度维度变化频繁,LayerNorm更适合这种场景。
因此,Transformer中普遍使用LayerNorm,而不是BatchNorm。
2. 残差连接的作用是什么?
回答要点:
- 缓解梯度消失:残差连接提供了一条梯度直连通路,梯度可以从后层直接传到前层,不容易出现梯度消失。
- 简化学习目标:原来需要学习
H(x) = F(x) + x,有残差后只需要学习残差 F(x) = H(x) - x,当真实映射接近恒等映射时,残差学习更容易。
- 稳定训练:帮助训练深层网络,使得几十上百层的Transformer能够稳定收敛。
3. Transformer为什么比RNN更适合处理长序列?
回答要点:
- 长程依赖捕捉:RNN需要一步步传播信息,长距离信息容易丢失;而Transformer通过自注意力可以直接建模任意两个位置的依赖,与距离无关。
- 并行计算:RNN必须按时间步顺序计算,无法并行;Transformer所有位置可以并行计算,训练速度快得多。
- 梯度传播:RNN随着序列增长容易梯度消失;Transformer通过自注意力和残差连接,梯度传播更顺畅。
4. Encoder和Decoder的主要区别是什么?
回答要点:
| 特性 | Encoder | Decoder |
|---|
| 注意力类型 | 双向自注意力(所有位置可见) | 掩码因果自注意力(只能看过去) |
| 交叉注意力 | 无 | 有Encoder-Decoder交叉注意力,关注源序列 |
| 输出 | 编码整个输入序列的特征 | 自回归生成输出序列 |
| 适用 | 理解任务(分类、提取、编码) | 生成任务(翻译、文本生成) |
5. Transformer中主要参数都集中在哪些地方?
回答要点:
Transformer参数主要来自三个部分:
- 词嵌入层:
vocab_size × d_model,词汇表越大,参数越多
- 多头注意力:每个头有Q/K/V/O四个投影矩阵,参数规模约为
4 × d_model² × n_layers
- FFN层:两个线性层,参数规模约为
8 × d_model² × n_layers(当隐藏层为4d时)
总体而言,FFN层参数最多,其次是注意力层,词嵌入层大小取决于词汇表。
6. 为什么Transformer需要Multi-Head Attention,只用一个注意力头不行吗?
回答要点:
- 多头注意力允许模型在不同表示子空间学习不同的注意力模式,捕捉不同类型的依赖关系
- 不同头可以关注不同位置的语法、语义依赖,比如有的头关注指代关系,有的头关注长程依赖
- 多头也可以理解为一种集成学习,多个不同的注意力分布集成起来效果更好
- 拆分多头后每个头维度降低,计算量和单个大注意力差不多,但表达能力更强