第7讲 Transformer 与大模型⚓
7.1 Sequence Modeling⚓
RNN 和 Transformer 进行序列建模(Sequence Modeling)的优缺点对比:
Generated by ChatGPT.
RNN
- 优点:
- 线性时间复杂度:单层每步 \(O(n)\) , \(n\) 为隐藏维度,对长序列空间占用仍然是 \(O(n)\) ;计算上更易控。
- 参数/显存较省:只需保存一个隐藏状态,显存随层数线性增长,适合显存受限环境或嵌入式设备。
- 在线/流式友好:按时间步逐帧输出,可边接收边推理,延迟低,适合语音识别、工业监控等实时任务。
- 短序列推理快:在小模型场景中一次前向仅做几何级矩阵乘加,没有全局注意力矩阵构造,单步延迟更低。
- 缺点
- 无法并行:时间维度串行依赖,GPU/TPU 计算利用率低,训练速度随序列长度线性变慢。
- 梯度消失/爆炸:长序列信息衰减,需 LSTM/GRU 或技巧(梯度裁剪、正则)仍难完全解决远程依赖。
- 难以大规模扩展:深/宽网络堆叠会加重串行瓶颈;要提升效果往往靠更复杂门控或外部注意力,工程代价高。
- 上下文窗口有限:理论上可跨步,但实践中有效记忆长度通常几百 token 以内,长文本表现受限。
Transformer
- 优点:
- 高度并行:自注意力对整个序列一次性计算,充分利用 GPU 张量核心;大批数据可显著加速训练。
- 长程依赖建模强:每个 token 直接与任意位置交互,信息传播路径为 \(O(1)\) ,捕捉全局模式能力优异。
- 可扩展性好:增宽或加层通常带来稳定性能提升;与分布式数据并行/模型并行天然适配。
- 表示通用性:统一的注意力框架易于跨模态(文本、图像、音频)迁移;位置编码灵活处理变长输入。
- 缺点
- 时间与显存 \(O(L^2)\) :标准自注意力需要 \(L\times L\) 矩阵(L 为序列长度);长序列(>4k)显存和计算迅速爆炸。
- 推理延迟随长度平方增长:在超长文本或实时场景,单句延迟明显高于 RNN;需缓存 KV 或采用稀疏/线性注意力优化。
- 部署成本高:大模型参数量和计算量庞大,对边端设备或低功耗场景不友好;量化/蒸馏复杂度高。
- 固有批处理依赖:完全并行的优势建立在足够大批尺寸上,小批/流式推理需增量注意力或交错重算,工程实现更复杂。
7.2 Self-Attention⚓
7.2.1 Self-Attention⚓
Transformer 处理文本数据的第一步是将 token 转换为 embedding 嵌入向量,使之称为可计算的数值。
假设序列的长度为 \(N\) ,相当于 \(N\) 个输入向量 \(\boldsymbol{x}_i\) 组成矩阵 \(\boldsymbol{X}\in \mathbb{R}^{N\times d}\) ,其中第 \(i\) 行为 \(\boldsymbol{x}_i^T\in \mathbb{R}^d\) 即为第 \(i\) 个输入向量。
我们希望将这组输入向量映射到一个嵌入空间,该空间能够捕捉更丰富的语义结构。假设输入向量 \(\boldsymbol{x}_i\) 映射为输出向量 \(\boldsymbol{y}_i\) ,则 \(\boldsymbol{y}_i\) 应当取决于所有的输入向量 \(\boldsymbol{x}_1,\dots\boldsymbol{x}_N\) ,才能捕捉输入之间的依赖关系。一个很自然的想法是将 \(\boldsymbol{y}_i\) 定义为所有输入向量的线性组合:
上式中的 \(\alpha_{ij}\) 称为注意力系数,表示输入向量 \(\boldsymbol{x}_j\) 对输出向量 \(\boldsymbol{y}_i\) 的贡献程度。注意力系数应满足2个约束条件: \(\alpha_{ij}\geqslant 0, \displaystyle\sum_{j=1}^N\alpha_{ij}=1\) 。
如何计算注意力系数?我们引入 查询 Query、键 Key、值 Value 的概念。想象我们在搜索引擎中搜索一部想看的电影,那么 Key 就相当于每部电影的特征,例如类型、主演、年份等,Query 就相当于观影偏好,例如“我想看一部漫威的科幻电影”,而 Value 就相当于最后搜引擎返回的结果。
引入点积自注意力机制,用点积衡量 Query \(\boldsymbol{x}_j\) 和 Key \(\boldsymbol{x}_i\) 之间的相似度:
除此之外,当前从输入向量到输出向量的转换时固定的,我们希望网络能够对输入向量的某些特征给予更多关注,因此通过引入一个可学习的权重矩阵 \(\boldsymbol{W}\) ,定义出各自具有线性独立变换的 Query、Key、Value 矩阵:
上面的3个权重矩阵 \(\boldsymbol{W}^{(q)},\boldsymbol{W}^{(k)},\boldsymbol{W}^{(v)}\) 即为最后 Transformer 架构所需要训练的可学习参数。并且通过权重矩阵 \(\boldsymbol{W}\) $所有输入数据可以实现实现 参数共享 。
计算注意力分数 \(\boldsymbol{S}=\boldsymbol{Q}\boldsymbol{K}^T \in \mathbb{R}^{N\times N}\) 。
注意力系数矩阵 \(\boldsymbol{A}=\text{softmax}\left(\dfrac{\boldsymbol{Q}\boldsymbol{K}^T}{\sqrt{d}}\right) \in\mathbb{R}^{N\times N}\) 。这里我们使用了点积缩放并做 Softmax 归一化,优化数值稳定性。注意 矩阵是每个行向量做 Softmax 运算 。
最后把注意力系数作用在 Value 上: \(\boldsymbol{Y}=\boldsymbol{A}\boldsymbol{V}=\text{softmax}\left(\dfrac{\boldsymbol{Q}\boldsymbol{K}^T}{\sqrt{d}}\right)\boldsymbol{V} ,\;\boldsymbol{Y}\in\mathbb{R}^{N\times d}\) ,相当于返回搜索结果。
输出矩阵 \(\boldsymbol{Y}\) 的每一行 \(\boldsymbol{y}_i\) 可以看成是 值矩阵 \(\boldsymbol{V}\) 中的行向量以 注意力系数矩阵 \(\boldsymbol{A}\) 为权重的线性组合。
输出矩阵 \(\boldsymbol{Y}\) 的计算复杂度为 \(O(N^2d)\) 。
对于单个输入 \(\boldsymbol{x}_i\) ,其对应的 Query、Key、Value 分别为 \(\boldsymbol{q}_i=\boldsymbol{x}_i\boldsymbol{W}^{(q)},\;\boldsymbol{k}_i=\boldsymbol{x}_i\boldsymbol{W}^{(k)},\;\boldsymbol{v}_i=\boldsymbol{x}_i\boldsymbol{W}^{(v)}\) 。
单个注意力系数:
7.2.2 Multi-Head Attention⚓
上述描述的注意力层称为 注意力头 (Attention Head),可以允许输出向量关注输入向量中与数据相关的模式。然而多数情况下,输入数据中可能存在多种不同的相关模式,例如在 NLP 中,可能要同时关注时态、词汇关系等多种信息。因此我们可以并行使用多个注意力头,让模型从不同角度关注输入数据的不同模式。
多头注意力机制,使用多个独立的注意力头,每个头都有自己独立的 Q,K,V 矩阵。这些头的结构完全相同,但参数是独立的。
这类似于 CNN 中每一个卷积层使用不同的卷积核来提取不同的特征。
假设有 \(H\) 个注意力头,每个注意力头 \(h\) 的 Q,K,V 矩阵为:
注意力系数矩阵为:
将所有 \(H\) 个头的输出拼接成一个矩阵: \(\boldsymbol{H}=[\boldsymbol{H}^{(1)},\dots \boldsymbol{H}^{(H)}]\in\mathbb{R}^{N\times Hd}\)
使用一个维度为 \(Hd\times d\) 的线性变换矩阵 \(\boldsymbol{W}^{(o)}\) 对拼接后的矩阵变换,得到最终的多头注意力输出: \(\boldsymbol{Y}=\boldsymbol{H}\boldsymbol{W}^{(o)}\) ,其中 \(\boldsymbol{Y}\in\mathbb{R}^{N\times d}\) 与输入矩阵 \(\boldsymbol{X}\) 维度相同。
输出矩阵 \(\boldsymbol{Y}\) 的计算复杂度为 \(O(HN^2d)\) 。
7.3 Transformer⚓
Transformer 的结构:
7.3.1 FFN⚓
前馈全连接模块(Feed-Forward Network):
全连接层——ReLU 激活层——全连接层,默认有偏置。
数学表示为:
7.3.2 Positional Encoding⚓
位置编码 Positional Encoding:
RNN 的序列建模方式时位置敏感的,序列中的每个元素所在位置会影响输出结果。而自注意力机制是对位置不敏感的。一种解决方法是在输入端显式引入与位置相关的编码向量,将其和实际输入序列的编码向量一起输入到模型,这就是位置编码。Transformer 通过位置编码来捕捉输入序列中 token 的位置信息。
在语言建模中,位置编码需要体现一定的先后顺序,能反映同一单词在不同位置的区别,并且具备一定的不变性。通常选择有界周期函数,如 Sinusoidal 正余弦函数:
其中, \(p\) 为 token 位置, \(i\) 为编码向量的维度索引, \(d\) 为模型的维度。
偶数维度使用 正弦函数,奇数维度使用 余弦函数。该 Sinusoidal 函数的核心是频率和维度的关系:低维频率较高,编码变化快,能够提供细粒度的位置信息;高维频率较低,编码变化慢,能够捕捉更长周期的位置信息。Sinusoidal 函数不仅能够表示绝对位置,还能通过位置之间的相对关系进行编码,使模型能够学习位置之间的相对关系。
7.3.3 Layer Normalization⚓
层归一化 Layer Normalization:
与前面的 批次归一化 Batch Normalization 不同,层归一化对每一个样本向量计算在不同特征维度上的均值和方差,利用其在维度上进行归一化和尺度变换。
常见的归一化方法有:batch normalization,对同一批次内数据计算均值和方差;layer normalization,对每个样本的不同维度的特征计算均值和方差;instance normalization,对每个样本的每个通道特征计算均值和方差;group normalization,对每个样本的特征按照通道分组计算均值和方差。
归一化方法对比:
方法 | 归一化维度 | 优点 | 缺点 |
---|---|---|---|
BN | 各通道批次 | 直接利用跨样本统计信息,在 batch size 较大时效果显著 | 在 batch size 较小时,估计的统计值不稳定 |
LN | 单样本所有特征 | 不依赖 batch size,适应变长数据和动态结构 | 对通道相关性敏感,可能丢失局部特征 |
IN | 单样本单通道特征 | 不依赖 batch size,更多地保留特征独特性 | 忽略通道间关系,可能不适合分类任务 |
GN | 单样本分组通道特征 | 平衡通道与空间关系,在 batch size 较小时维持稳定 | 需手动设置分组数目,超参数敏感 |
7.3.4 Encoder⚓
编码器主要用于特征的提取。把输入的原始句子编码为一些互相之间有交互的 embedding(对比 Word2Vec 词之间是没有交互的),所以不需要 mask。经过一个 Block 之后,输入和输出的 形状是一样的,都是 \(N\times d\) 。
编码器由 \(N\) 个相同结构的编码器层 Encoder Layer 组成,每个 Encoder Layer 包含两个子层:
- 多头自注意力机制层 Multi-head Self-attention
- 通过 多头注意力机制 和 位置编码 捕捉输入序列中各个 token 之间的依赖关系,捕捉局部和全局依赖关系。
- 残差连接 + Layer Normalization。
- 前馈全连接网络层 FFN
- 两个线性层 + ReLU 激活函数,增强非线性建模能力。
- 残差连接 + Layer Normalization。
Encoder 是由多头自注意力模块和 FFN 模块交替堆叠而成的,且不同的 Encoder Layer 之间 参数不共享 ,提高模型的表达能力,使得不同层可以学习到不同层次的特征。
7.4 Application⚓
应用:语言模型,机器翻译
7.4.1 LLM⚓
BERT: Bidirectional Encoder Representations from Transformers
架构:双向 Transformer,可以同时学习文本中的前后文信息。
预训练任务:遮挡语言模型(Masked Language Modeling)和下一句预测(Next Sentence Prediction)。前者通过在输入文本中随机遮挡一些词汇并预测被遮挡的词,帮助模型学会理解双向上下文(完形填空);后者则让模型学会判断两个句子是否是连续的。