大模型基础:Foundamentals of LLM
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间的相对位置绑定,解决了传统位置编码依赖绝对位置、长序列泛化差的问题。其数学原理基于二维旋转的高维扩展,兼具高效性和优异的建模能力,已成为现代大语言模型位置编码的首选方案。