Transformer
鉴于Transformer架构已经逐步成为深度学习乃至机器学习的核心架构,我单独开这么一篇笔记来记录学习Transformer架构。在DNN架构介绍中我们已经简单了解了Transformer的一些特点,在本笔记中我们将进一步深入了解Transformer。
笔记计划:架构原理、实际架构底层实现、french-english任务与preLN优化、ViT、时间序列
待思考:
- Q, K, V是什么?有什么作用?有什么限制?
- 既然不再按顺序读,模型如何知道词的先后顺序?
- 为什么Layer Norm?为什么比Batch Norm更有效?
- 模型在翻译“苹果”时,是否真的关注到了前面的动词“吃”?
- 为什么 Transformer 处理超长文本(比如整本书)时会非常吃显存?
大模型
Scaling Law
Scaling Laws 的发现(最早由 OpenAI 在 2020 年系统提出)指出:模型的最终性能(通常用 Loss 衡量)主要取决于三个要素: 参数量 (\(N\)) 、训练数据量 (\(D\)) 和 计算量 (\(C\)) 。当这三个要素不受限制时,Loss 会随着这三个维度的增加而呈 幂律下降 :
- \(L\) :模型在测试集上的交叉熵损失(可以理解为预测的“准确度”)。
- \(N\) :模型有效参数量(雕刻刀的精细度)。
- \(D\) :训练数据集的大小(见识的广度)。
- \(\alpha_N, \alpha_D\) :幂律指数。在 Transformer 架构下,这些系数表现出惊人的稳定性。
- 计算量关系 :通常 \(C \approx 6ND\)(前向传播 + 反向传播的总浮点运算量)。
三大要素的底层原理:
| 维度 | 原理理解 | 对应你的“空间折叠”理论 |
|---|---|---|
| 参数量 (\(N\)) | 空间分辨率 | 参数量越多,意味着在高维空间里用于“对折”的关节越多,能够雕刻出的分割面(Decision Boundary)越精细。 |
| 数据量 (\(D\)) | 流形覆盖度 | 数据量决定了模型对高维知识空间(Manifold)的覆盖率。没有足够的数据,再细的雕刻刀也只能在局部区域反复折叠,导致过拟合。 |
| 计算量 (\(C\)) | 折叠的动力 | 算力是执行梯度下降、寻找最优折叠方案的能源。算力保证了模型能从混乱状态(随机初始化)抵达那个万能逼近预言的“完美参数点”。 |
Scaling Laws带来的三大工程启示:
- 架构不重要,规模才重要。只要是基于 Transformer 的前馈结构,具体的微调(比如头的个数、残差的细节)对性能的影响远小于规模增加带来的收益。
- 算力分配的最佳比例 (Chinchilla Optimality):如果你的算力翻倍,你应该同比例地增加参数量和数据量。而不是只加参数(会导致模型“虚胖”,见多识广但没记牢)。
- 性能的可预测性:你可以在模型还没训练出来之前,先在小模型上试一下,然后精准预测出投 1 亿美元训练出来的大模型 Loss 到底是多少。
Scaling Laws 描述的是拟合精度的提升,而非逻辑本质的突变。虽然增加 \(N\) 和 \(D\) 可以无限逼近数据的分布(万能逼近定理),但如果数据的分布本身存在质量上限(比如互联网上充斥着垃圾信息),模型也只能学会‘平庸的规律’。此外,Scaling Laws 目前主要是在语言建模(Next Token Prediction)上表现稳定,在复杂的推理链条(Reasoning)和自我纠错上,我们可能还需要在架构上引入类似强化学习(RLHF/Search)的新维度,而不仅仅是堆规模。
自回归
KV-Cache
KV-cache 是专门为了服务于大语言模型的自回归(Auto-regressive)推理过程而诞生的技术,是大语言模型(如 GPT、LLaMA)在推理(Inference)阶段用来加速生成速度、减少重复计算的一种核心技术手段。
简单来说,它是模型为了“不把算过的东西重算一遍”而建立的一个临时存储区。
在 Transformer 的注意力机制中,每个词都会生成三个向量:
- Q (Query) :当前的查询(我是谁?我要找什么?)。
- K (Key) :索引标签(我的特征是什么?)。
- V (Value) :实际内容(我的含义是什么?)。
比如模型要生成句子 "我 爱 学习" :
- 第1步 :输入 "我",模型算出 "爱"。
- 第2步 :模型把 "我" 和 "爱" 放在一起看,算出 "学习"。
- 第3步 :模型把 "我"、"爱"、"学习" 放在一起看,算出下一个词(比如句号)。
如果没有 KV-cache,第3步会发生什么?
- 模型拿到 "我、爱、学习"。
- 模型重新计算 "我" 的 K 和 V。
- 模型重新计算 "爱" 的 K 和 V。
- 模型计算新词 "学习" 的 K、V 和 Q。
- 然后大家一起做注意力运算。
问题: "我" 和 "爱" 的 K 和 V,在第1步和第2步早就又算过一遍了!它们是固定的, 重复计算它们是在浪费时间(GPU 算力) 。
KV-cache 的逻辑是:算过的就存起来(Cache),下次直接用。带 KV-cache 的流程:
- 第1步(生成“爱”):
- 计算 "我" 的 \(K_{1}, V_{1}\)。
- 【存储】 把 \(K_{1}, V_{1}\) 存入显存(这就是 KV-cache)。
- 输出 "爱"。
- 第2步(生成“学习”):
- 输入新词 "爱"。
- 只计算 "爱" 的 \(K_{2}, V_{2}\) 和 \(Q_{2}\)。
- 【读取】 从显存里把 "我" 的 \(K_{1}, V_{1}\) 拿出来。
- 【拼接】 把旧的 \(K, V\) 和新的 \(K, V\) 拼在一起。
- 做注意力运算,输出 "学习"。
- 【存储】 把 \(K_{2}, V_{2}\) 也存入 KV-cache。
- 第3步(生成“。”):
- 输入新词 "学习"。
- 只计算 "学习" 的 \(K_{3}, V_{3}\) 和 \(Q_{3}\)。
- 【读取】 拿之前的 \(K_{1}, V_{1}, K_{2}, V_{2}\)。
- ...以此类推。
模型不需要重新“阅读”原文,只要拿着这些 KV 向量,就拥有了对过去所有对话的“记忆”。因此KV-Cache实际上是一种“工作时记忆”。在具身智能笔记中介绍世界模型的时候我们提到过,KV-Cache的局限性在于线性增长和显存爆炸:1000个词的对话,就要存1000组 KV;10万个词,就要存10万组。
ViT
Time Series Transformers
Transformer on French-English
本实验主要用来探讨不同的Normalization and Regularization如何影响实验结果:
- Normalization determines how the model's activations are scaled and shifted during training, which directly affect the shape of the layer input/output distributions (mean and variance) and can greatly influence whether the model will converge, the convergence speed, and the stability of learning.
- Regularization methods help prevent overfitting and improve generalization ability by controlling model complexity and constraining parameter updates. They can prevent units from co-adapting or penalize large weights, leading to smoother functions that are less sensitive to input variations and therefore achieve better generalization on unseen test data.
简单来说就是:
- Normalization通过调整模型内部激活值的分布(即均值和方差),来帮助模型更快、更稳定地收敛。
- Regularization则是一项防止过拟合、提升泛化能力的技术;它通过控制模型的复杂度(比如惩罚过大的权重),使模型不过度依赖训练数据的细节,从而在未见过的测试数据上表现更好。
更加简单来说,就是:
- Normalization让model学得动、学得快
- Regularization让model学得好、考得好
IWSLT2017 Dataset
IWSLT2017是一个非常经典且大小适中的机器翻译数据集:
- 来源:TED演讲的转录稿和翻译
- Training Set: 210,000 sentence pairs
- Validation Set: 890 pairs
- Testing Set: 8,000 pairs
每一个sample都包含一个source sentence in French and its corresponding target translation in English.
Transformer Model
具体的网络架构可以参见DNN笔记。简单复习一下就是:
- Transformer不依赖于传统的RNN的序列处理机制,可以高效捕捉长距离依赖,并且可以并行训练
- Multi-head Attention Mechanism 多头(就是多角度的意思)注意力机制可以让model在处理一个词的时候,能够关注到句子中其他所有相关的词
- Position-wise Feed-Forward Networks, FFNs会对每一个词独立加工,换句话说,句子中的每一个词都是单独而独立处理的
- Transformer在把词的含义向量(Embedding)喂给model之前,会给它先加上一个位置向量(Positional Encoding)
Transformer中两个核心的组件:
- Encoder 编码器:处理source sentence,在我们的项目中就是法语;编码器会生成一系列contextual representations(上下文表示),实现“理解”。
- Decoder 解码器:接收目标语言句子,在我们的项目中就是英语;解码器的目标是学会生成,简单来说,就是通过看着解码器的理解来逐词生成对应的英语句子。
那我们来看一下在翻译任务上,Transformer是如何工作的:首先,在训练过程中,encoder先看到所有的法语,理解法语关系;然后decoder看着所有的法语关系,然后一个英语单词一个英语单词地看,每一次都要对着所有法语关系和训练集中强制性喂过来的下一个词进行关联记忆,记住法语关系和decoder已经知道的词语+decoder应该输出的下一个词之间的预测关系。
换句话说,在训练过程中:
- INPUT:Context,即[法语理解] + [正确的英语开头,比如"The cat"]
- TARGET:让模型“猜”中[下一个词"is"]。这里是强制让模型学习的。
训练结束后,model看到一段法语后,就能不断猜出下一个对应的英语单词,然后不断地对着这段法语和已经猜出的英语单词,继续猜测下一个单词,直到所有的单词都被猜测完毕。这个像滚雪球一样的过程就是自回归(Autoregressive)。
Baseline Model
在最初的 Transformer 配置中,dropout (0.1) 在“Add & Norm”步骤之前被应用,使用 Adam 优化器,并且没有额外的正则化方法。该模型使用 后置层规范化 (post-layer normalization,在残差连接之后应用),并在最初的 4,000 个更新步骤中执行 学习率预热 (learning rate warm-up)。权重是使用 Xavier 均匀分布 (Xavier Uniform distribution)进行初始化的。在本项目中,我们将以这个 基线模型 (baseline model)为基础,来探索不同正则化和规范化方法所带来的影响。
Dropout 是一种强大的技术,在训练时,它会以 10% 的概率(0.1)随机“丢弃”或“关闭”神经元。这迫使模型不能过度依赖任何一个神经元,而是要学习更鲁棒、更多样化的特征,从而 防止过拟合 。
在本次实验中,我们需要首先复现baseline model,其核心要点包括:
- Normalization: Post-layer Normalization
- Regularization: Dropout 0.1
- Optimizer: Adam
- LR Scheduling: Learning Rate Warm-Up
- Initialization: Xavier Uniform Distribution
成功复现Baseline实验后,我们将探索不同的方法。
BLEU
BLEU (Bilingual Evaluation Understudy) Score 是一种自动评估机器翻译质量的标准指标 ,它通过将模型生成的翻译与一个或多个人工翻译的“标准答案”进行比较,并计算两者之间共有的词组(n-grams)的重叠程度来打分。在您的项目中, BLEU 分数将是衡量模型好坏的最终“成绩单” :一个更高的 BLEU 分数意味着模型的翻译在用词和句子结构上更接近人类的翻译,即 翻译质量更好 。
实验环境设置
硬件配置:
- Memory: 64GB
- GPU: H200 - 140GB
实验完成内容:
- 初步测试实验(在notebook中)
- 正式实验:10个长时实验(epoch=50),总运行时长约40小时