大模型基础:Foundamentals of LLM
摘要: 自回归生成模型(如GPT)通过逐步预测序列元素(文字、像素等)实现内容生成,核心是Transformer解码器的掩码自注意力机制。其优势在于生成连贯性强,但受限于逐词生成的顺序性。为提升效率,LLM引入past_key_values缓存历史注意力计算结果(key/value),将计算复杂度从O(n²)降至O(n)。该技术与扩散模型形成互补(离散vs连续数据生成),共同推动生成式AI发展。
Embedding:将高维数据嵌入低维空间
Grounding: 将抽象表示(如语言、符号、向量)与真实的知识或具体的实体联系起来
判别时AI和生成式AI的对比
| 维度 | 判别式AI | 生成式AI |
|---|---|---|
| 目标 | 学习输入数据到标签/类别的映射关系,专注于“判别”数据的类别或属性(如判断图像是猫还是狗,预测文本情感)。本质是建模条件概率分布P(标签/输入)。 | 学习输入数据的潜在分布,专注于“生成”与原始数据相似的新样本(如生成逼真图像、文本、音频)。本质是建模数据本身的概率分布P(输入) 或条件生成分布P(输出/输入)(如文本到图像)。 |
| 神经网络架构 | 以分类/回归为核心,常见架构包括: - 卷积神经网络(CNN,用于图像分类) - 循环神经网络(RNN,用于序列标注) - 普通Transformer(如BERT,用于文本分类、命名实体识别) - 支持向量机(SVM)、逻辑回归等传统模型也属于判别式方法。 |
以生成新数据为核心,常见架构包括: - Transformer(语言模型,如GPT系列、LLaMA) - 生成对抗网络(GAN,如DCGAN、StyleGAN) - 扩散模型(如Stable Diffusion、DALL-E 2) - 自编码器(Autoencoder)及变体(如VAE) - 流模型(Flow-based Models)等。 |
| 训练范式 | 通常采用“监督学习”: - 依赖带标签数据(输入-标签对) - 目标是最小化预测标签与真实标签的误差(如交叉熵损失、MSE损失) - 训练过程聚焦于优化判别边界,无需完整建模数据分布。 |
以“无监督/自监督学习”为主,部分结合监督微调: - 预训练阶段依赖大规模无标签数据,学习数据的潜在结构(如语言模型通过预测下一个token训练) - 核心是最小化生成数据与真实数据的分布差异(如GAN的对抗损失、扩散模型的降噪损失) - 大规模预训练+微调是主流范式(如先用无标签数据预训练,再用少量标注数据微调以适应特定生成任务)。 |
| 典型应用 | 图像分类、情感分析、垃圾邮件检测、预测任务(如房价预测)、语音识别等。 | 文本生成(如写文章、对话)、图像生成(如AI绘画)、视频生成、代码生成、数据增强(生成模拟训练数据)等。 |
| 核心能力 | 擅长“判断”和“决策”,能对输入数据进行分类、回归或标注,但无法创造新数据。 | 擅长“创造”和“生成”,能产出与原始数据分布一致的新样本,但判别能力较弱(需额外模块辅助)。 |
总结
判别式AI是“分类器”,专注于学习数据的类别边界;生成式AI是“创造者”,专注于学习数据的生成规律。两者在目标、架构和训练方式上有本质区别,但实际应用中常结合使用(如生成式AI用判别式模型辅助优化生成质量)。
自回归生成模型
自回归生成模型(Autoregressive Generative Model) 是生成式AI的核心技术之一,尤其驱动了当前主流的大语言模型(如GPT系列、Llama等)。它的核心思想是:通过序列中已知的部分,逐步预测下一个元素,最终生成完整内容(文字、音频、图像像素等)。其本质是一种“条件概率链式分解”。
核心原理:逐元素生成
-
“自回归”的含义
- “自”:指模型基于自身已生成的部分作为输入。
- “回归”:指通过统计方法预测序列中的下一个元素(如文本中的下一个词、图像中的下一个像素)。
- 核心公式:
P(完整序列)=P(x1)⋅P(x2∣x1)⋅P(x3∣x1,x2)⋯P(xn∣x1,x2,…,xn−1) P(\text{完整序列}) = P(x_1) \cdot P(x_2|x_1) \cdot P(x_3|x_1,x_2) \cdots P(x_n|x_1,x_2,\dots,x_{n-1}) P(完整序列)=P(x1)⋅P(x2∣x1)⋅P(x3∣x1,x2)⋯P(xn∣x1,x2,…,xn−1)
即:将生成整个序列的概率,分解为逐步预测每个元素的概率乘积。
-
工作流程(以文本生成为例)
- 输入提示(Prompt):
“天空是” - 模型预测下一个词分布:
蓝色(概率0.7)、灰色(概率0.2)、透明的(概率0.1) - 根据采样策略(如选最高概率或随机采样)生成词:
“蓝色” - 更新输入:
“天空是蓝色”→ 预测下一个词:“的”(概率0.9) - 继续生成直到结束符或达到长度限制。
- 输入提示(Prompt):
关键技术特点
| 特点 | 说明 |
|---|---|
| 顺序依赖性 | 生成严格从左到右(或按固定顺序),后生成的内容依赖前文。 |
| 单向上下文 | 传统模型(如GPT)生成时只能利用左侧上下文,无法看到右侧(非双向)。 |
| 可并行训练 | 训练时可通过掩码(Mask)让模型同时学习预测所有位置(如Transformer架构)。 |
| 生成可控性 | 通过调节温度(Temperature)、Top-k采样等参数控制生成结果的多样性与质量。 |
典型应用场景
-
文本生成
- 大语言模型(LLM):GPT、Claude、Llama等均基于自回归架构。
- 应用:聊天机器人、文章续写、代码补全(如GitHub Copilot)。
-
图像生成
- 将图像像素按顺序排列成序列(如逐行扫描),生成每个像素的颜色值。
- 示例:PixelCNN、早期版本的图像生成模型。
-
音频生成
- 将音频波形或频谱图转化为序列,逐点生成(如WaveNet)。
⚙️ 底层架构:Transformer 的解码器
自回归模型的高效性源于 Transformer 解码器:
- 核心组件:
- 掩码自注意力层:确保生成时只关注已生成的左侧上下文。
- 位置编码:标记序列中元素的顺序关系。
- 训练目标:预测被掩盖(Mask)的词(语言建模任务)。
例如:GPT-3 的生成过程
输入: "人工智能是" 输出分布: ["未来", 0.6], ["技术", 0.3], ["趋势", 0.1] 采样 → "未来" 新输入: "人工智能是未来" → 继续生成...
✅ 优势与局限
| 优势 | 局限性 |
|---|---|
| 生成内容连贯性强,符合语言逻辑 | 生成速度慢(必须逐词生成,无法并行) |
| 灵活支持长文本生成 | 错误会累积(早期生成错误影响后续结果) |
| 易于控制生成方向(通过Prompt引导) | 无法在生成中“回头修改”已生成部分 |
与扩散模型(Diffusion)的对比
| 自回归模型 | 扩散模型(如Stable Diffusion) |
|---|---|
| 生成顺序:严格序列化 | 生成顺序:从噪声逐步去噪(非固定顺序) |
| 擅长离散数据(文本、代码) | 擅长连续数据(图像、音频) |
| 依赖语言概率建模 | 依赖图像空间结构建模 |
一句话总结
自回归模型像一个“逐词接龙大师”:它根据已说出的内容,一步步预测下一个词,最终完成整个句子、段落甚至一本书。它是当前大语言模型的“心脏”,但也因逐词生成而速度受限。
KVCache
在大型语言模型(LLM)中,past_key_values 是一个与模型推理效率密切相关的核心概念,主要用于优化自回归生成过程中的计算性能。它本质上是对历史序列的注意力计算结果(key 和 value 张量)的缓存机制,下面从原理、作用和应用场景三个方面详细解释:
1. 背景:LLM的自回归生成与注意力机制
LLM(如GPT系列)的文本生成遵循自回归机制:模型每次生成一个token(如一个词或子词),然后将该token与历史生成的token拼接,作为下一轮输入,重复此过程直到生成结束。
而模型的核心是Transformer解码器,其核心组件是自注意力机制。在自注意力中,每个token会被转换为三个向量:
query(查询):当前token用于“查询”其他token的向量;key(键):其他token用于被“查询”的向量;value(值):其他token被“查询”后,用于加权求和的向量。
注意力分数的计算方式为:query 与所有 key 的点积(衡量相似度),再通过softmax归一化,最终对 value 进行加权求和,得到当前token的注意力输出。
2. 为什么需要 past_key_values?
在自回归生成中,假设已生成序列为 [t1, t2, ..., tn],现在要生成第 n+1 个token t(n+1)。此时,模型需要计算 t(n+1) 与历史序列 [t1, ..., tn] 的注意力。
如果不做优化,每次生成新token时,模型会重新计算所有历史token的 key 和 value(因为输入是 [t1, ..., tn, t(n+1)])。但实际上,t1 到 tn 的 key 和 value 在生成 tn 时已经计算过了,重复计算会导致:
- 计算量随序列长度增长而平方级增加(注意力的时间复杂度为
O(n²),n是序列长度); - 生成长文本时效率极低(例如生成1000个token,需重复计算约50万次冗余操作)。
past_key_values 的作用就是缓存历史序列的 key 和 value,避免重复计算,从而将每次生成的计算量从 O(n²) 降至 O(n)。
3. past_key_values 的结构与工作流程
结构
past_key_values 通常是一个元组列表,其中每个元素对应 Transformer 解码器的一层。对于每一层,又包含两个张量:
past_key:该层中所有历史token的key向量,形状通常为(batch_size, num_heads, seq_len_so_far, head_dim);past_value:该层中所有历史token的value向量,形状与past_key相同。
其中:
batch_size:批量处理的样本数;num_heads:注意力头的数量;seq_len_so_far:当前已生成的序列长度;head_dim:每个注意力头的维度。
工作流程
以生成第 n+1 个token为例,past_key_values 的使用步骤如下:
-
初始状态:生成第一个token
t1时,past_key_values为空(无历史序列),模型需计算t1的key和value,并将其存入past_key_values(此时seq_len_so_far=1)。 -
生成第二个token
t2:- 输入为
t2(仅当前token,而非[t1, t2]); - 模型计算
t2的query、key、value; - 从
past_key_values中取出t1的key和value,与t2的key、value合并(此时总序列长度为2); - 计算
t2与t1的注意力(仅关注历史),并更新past_key_values(存入t2的key和value,seq_len_so_far=2)。
- 输入为
-
后续生成:重复步骤2,每次仅计算当前token的
query、key、value,与past_key_values中的历史key、value合并,计算注意力后更新缓存。
4. 应用场景与工具实现
past_key_values 是LLM高效推理的核心优化手段,几乎所有主流LLM推理框架(如Hugging Face Transformers、vLLM、TensorRT-LLM)都依赖这一机制。
以Hugging Face Transformers为例:
- 调用
model.generate()时,框架会自动管理past_key_values,无需用户手动处理; - 若需手动控制生成过程(如自定义解码逻辑),可通过
model(**inputs, past_key_values=past)传入缓存,并从返回结果中获取past_key_values用于下一轮:# 初始输入 inputs = tokenizer("Hello,", return_tensors="pt") outputs = model(** inputs, use_cache=True) # 启用缓存 past_key_values = outputs.past_key_values # 获取第一轮缓存 # 生成下一个token next_token_logits = outputs.logits[:, -1, :] next_token = torch.argmax(next_token_logits, dim=-1).unsqueeze(0) outputs = model(next_token, past_key_values=past_key_values, use_cache=True) # 传入缓存
总结
past_key_values 是LLM在自回归生成中对历史序列 key 和 value 的缓存机制,其核心作用是避免重复计算,将生成过程的时间复杂度从 O(n²) 降至 O(n),从而显著提升长文本生成的效率。理解这一概念有助于深入掌握LLM的推理原理和优化思路。
旋转编码
旋转位置编码(Rotary Position Embedding,简称RoPE)是一种用于Transformer架构的位置编码方式,由论文《RoPE: Rotary Position Embedding》提出,目前已被广泛应用于LLaMA、GPT-NeoX、PaLM等主流大语言模型中。其核心特点是通过旋转矩阵对注意力机制中的Query(查询)和Key(键)进行旋转变换,从而在注意力计算中自然引入相对位置信息,解决了传统位置编码在长序列建模和相对位置依赖上的局限性。
一、核心思想:用“旋转”建模相对位置
传统位置编码(如正弦余弦编码、可学习编码)通常通过“绝对位置向量”与Token嵌入相加的方式注入位置信息,这种方式存在两个问题:
- 注意力分数依赖于Token的绝对位置,而非更重要的相对位置(语言中“词与词的关系”更多由距离决定,而非绝对位置);
- 对长序列的泛化能力差(训练时未见过的长序列位置,编码效果会显著下降)。
RoPE的核心创新是:不直接给Token嵌入添加位置向量,而是通过旋转矩阵对Query和Key进行变换,使得注意力分数的计算仅依赖于两个Token之间的相对位置,而非绝对位置。
具体来说,对于位置为m和n的两个Token,RoPE确保:当计算它们的注意力分数时(即Q_m · K_n),结果仅由相对位置k = m - n决定,与m和n的绝对位置无关。
二、数学原理:旋转矩阵的构造与作用
RoPE的实现依赖于二维旋转矩阵的高维扩展,其核心是通过三角函数(正弦、余弦)定义旋转角度,进而构造旋转矩阵对向量进行旋转。
1. 二维空间的旋转(基础)
在二维空间中,一个向量(x, y)绕原点旋转θ角后得到新向量(x', y'),其变换公式为:
x' = x·cosθ - y·sinθ
y' = x·sinθ + y·cosθ
用矩阵表示即:
[x′y′]=[cosθ−sinθsinθcosθ][xy]\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} \cosθ & -\sinθ \\ \sinθ & \cosθ \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}[x′y′]=[cosθsinθ−sinθcosθ][xy]
这个旋转矩阵的关键特性是:旋转后的向量与其他向量的内积,仅依赖于旋转角度的差值(即相对旋转)。这正是RoPE建模相对位置的数学基础。
2. 高维向量的旋转(扩展)
Transformer中的Query和Key是高维向量(维度为d,通常是偶数),RoPE通过将高维向量拆分为d/2个二维子空间,每个子空间独立应用旋转变换,从而实现高维扩展。
具体步骤如下:
-
步骤1:为每个二维子空间定义旋转角度
对于第i个二维子空间(i从0到d/2 - 1),位置为m的Token对应的旋转角度θ_i定义为:
θi=10−2i/d(基频衰减,确保不同子空间旋转速率不同)θ_i = 10^{-2i/d} \quad \text{(基频衰减,确保不同子空间旋转速率不同)}θi=10−2i/d(基频衰减,确保不同子空间旋转速率不同)
则位置m的旋转角度为m·θ_i,位置n的旋转角度为n·θ_i,两者的相对角度差为(m-n)·θ_i = k·θ_i(k为相对位置)。 -
步骤2:对Query和Key进行旋转
对于高维向量Q(Query)和K(Key),将其按维度拆分为(Q_0, Q_1), (Q_2, Q_3), ..., (Q_{d-2}, Q_{d-1})共d/2个二维向量对。
位置为m的Q的第i个二维对(Q_{2i}, Q_{2i+1})旋转后变为:
[Q2i′Q2i+1′]=[cos(mθi)−sin(mθi)sin(mθi)cos(mθi)][Q2iQ2i+1]\begin{bmatrix} Q'_{2i} \\ Q'_{2i+1} \end{bmatrix} = \begin{bmatrix} \cos(mθ_i) & -\sin(mθ_i) \\ \sin(mθ_i) & \cos(mθ_i) \end{bmatrix} \begin{bmatrix} Q_{2i} \\ Q_{2i+1} \end{bmatrix}[Q2i′Q2i+1′]=[cos(mθi)sin(mθi)−sin(mθi)cos(mθi)][Q2iQ2i+1]同理,位置为
n的K的第i个二维对旋转后变为:
[K2i′K2i+1′]=[cos(nθi)−sin(nθi)sin(nθi)cos(nθi)][K2iK2i+1]\begin{bmatrix} K'_{2i} \\ K'_{2i+1} \end{bmatrix} = \begin{bmatrix} \cos(nθ_i) & -\sin(nθ_i) \\ \sin(nθ_i) & \cos(nθ_i) \end{bmatrix} \begin{bmatrix} K_{2i} \\ K_{2i+1} \end{bmatrix}[K2i′K2i+1′]=[cos(nθi)sin(nθi)−sin(nθi)cos(nθi)][K2iK2i+1]
3. 注意力分数中的相对位置信息
旋转后的Query(Q'_m)和Key(K'_n)的内积(即注意力分数的核心)为:
Qm′⋅Kn′=∑i=0d/2−1[Q2iK2i+Q2i+1K2i+1]⋅cos(kθi)+[Q2iK2i+1−Q2i+1K2i]⋅sin(kθi)Q'_m \cdot K'_n = \sum_{i=0}^{d/2-1} \left[ Q_{2i}K_{2i} + Q_{2i+1}K_{2i+1} \right] \cdot \cos(kθ_i) + \left[ Q_{2i}K_{2i+1} - Q_{2i+1}K_{2i} \right] \cdot \sin(kθ_i)Qm′⋅Kn′=i=0∑d/2−1[Q2iK2i+Q2i+1K2i+1]⋅cos(kθi)+[Q2iK2i+1−Q2i+1K2i]⋅sin(kθi)
可以发现,这个结果仅由相对位置k = m - n和θ_i决定,与m和n的绝对位置无关。这意味着:RoPE成功将注意力分数与相对位置绑定,解决了传统编码对绝对位置依赖的问题。
三、RoPE的优势
相比传统位置编码,RoPE的核心优势体现在:
-
精准建模相对位置
注意力分数直接依赖于Token间的相对距离k,更符合自然语言中“上下文关系由相对位置决定”的特性(如“我”和“你”的关系,与它们在句子中的绝对位置无关,仅与距离有关)。 -
优异的长度外推性
传统位置编码(如正弦余弦)在序列长度超过训练时的最大长度时,编码会出现“未见过的位置”,性能下降明显。而RoPE的旋转角度随位置线性增长(mθ_i),即使对于训练时未见过的超长序列(如m远大于训练最大长度),其相对位置k的编码仍能保持一致性,因此在长文本任务上泛化更好。 -
计算高效
旋转矩阵的计算仅依赖于三角函数,无需额外存储可学习参数(相比可学习位置编码),且可与Token嵌入的计算并行,几乎不增加额外耗时。 -
与注意力机制自然融合
传统编码通过“加性”注入位置信息(位置向量+Token嵌入),而RoPE直接作用于Query和Key,与注意力机制的内积计算深度耦合,更高效地将位置信息融入模型决策。
四、应用场景
RoPE目前已成为大语言模型的主流位置编码方案,尤其在需要处理长序列的场景中表现突出,例如:
- 长文档理解(如法律条文、学术论文);
- 多轮对话(对话历史随轮次增长);
- 代码生成(代码文件通常较长)。
典型模型如LLaMA、GPT-NeoX、PaLM等均采用RoPE,其优异的长序列建模能力是这些模型性能的重要保障。
总结
旋转位置编码(RoPE)通过旋转矩阵对Query和Key进行变换,将注意力分数与Token间的相对位置绑定,解决了传统位置编码依赖绝对位置、长序列泛化差的问题。其数学原理基于二维旋转的高维扩展,兼具高效性和优异的建模能力,已成为现代大语言模型位置编码的首选方案。
为什么使用QLoRA要调低学习率?
原因概括:
- 量化噪声更大:QLoRA 在 4-bit(nf4 + double quant)下前向/反向都基于量化权重,损失曲面更“台阶化”、梯度方差更大;大学习率更容易震荡、发散或出现 NaN。
- 动态范围受限:低比特权重与激活的有效数值范围更窄,步长过大会导致过冲,训练不稳定。
- 适配器易漂移:LoRA 只训练少量低秩层,大学习率容易让适配器学到“激进补偿”,破坏基座行为(灾难性漂移),泛化变差。
- 实践经验:从全精度/纯 LoRA 切到 QLoRA,通常将学习率降低到原来的 1/2~1/3,并略增 warmup,更稳。
更多推荐




所有评论(0)