4623 个字词
23 分钟
大模型技术知识点 2
首次发布: 2025-09-03
... 次访问

大模型的一些应知知识点。

10. 如果 GPT 做生成前也需要把输入语句转为嵌入向量序列,那么 Encoder + Decoder 模型和 GPT 的区别是什么?

首先,需要明白两个东西

  • 虽然嵌入模型很像一个 Encoder (实现了 token 序号序列到 d 维向量的映射),但是实际上它并不是 Encoder!
  • 我们通常把 Embedding 层之后的向量空间叫做嵌入空间 (Emebdding Space),而把 Encoder、Decoder 通常操作的向量空间叫做表征空间 (Representation Space)

在文本领域,Embedding 模型通常只是薄薄的一层 Embedding 层,没有多余的线性层或注意力层。GPT 在生成文本时,使用的是 Masked Self Attention (没有 Cross Attention),就是把输入的 Context + Prompt 作为 K、Q、V 序列使用,然后预测新的 token;把新预测的 token 替换最前面的一个 添加到前面的输入序列的末尾后,再重复上面的操作,直至达到目标长度或者遇到 [EOS]

而 Encoder + Decoder 模型则不同了。它的范式是先将输入的文本经过 Embedding 后得到嵌入向量序列,然后把该嵌入向量经过 Encoder 处理后,将得到的上下文中间表示向量序列作为 Cross Attention K、V 传给 Decoder 使用;Decoder 的 Cross Attention 的 Q 则是嵌入向量经过 Self Attention 后得到的上下文中间表示。Decoder 最终也是做 next token prediction,只不过新的 token 只会加入到 Q 序列中,K、V 序列则保持不变。

二者的架构不同(有无 Encoder, 用不用 Cross Attention),自回归中新的 token 加到哪里(K, Q, V 都加入或者只加入 Q 中)这便是全部的差异。

需要指出的是,在多模态视觉部分,ViT patch projection / CNN stem 相对应于 Embedding 模型,是先把像素映射成了 patch tokens, ViT backbone / CNN feature extractor 是直接把原始图像映射到了表征空间中,是 Encoder 模型。

11. 为什么要有位置编码?什么是正弦型位置编码?

Transformer 本身是基于自注意力(Self-Attention)的,它没有循环结构(不像 RNN)也没有卷积结构(不像 CNN)。这意味着它看到的序列输入(词嵌入向量)本身是“无序”的。如果没有位置编码,模型就分不清 “I love you” 和 “You love I”。所以我们要给每个 token 附加上位置信息。

在 Vaswani 的文章中,正弦型位置编码被首次提出。

PE(x,2n)=sin(x100002nd)PE(x,2n+1)=cos(x100002nd)\begin{aligned} \text{PE}(x, 2n) &= \sin\left(\frac{x}{10000^\frac{2n}{d}}\right) \\ \text{PE}(x, 2n + 1) &= \cos\left(\frac{x}{10000^\frac{2n}{d}}\right) \end{aligned}

其中 x=0,1,,L1x = 0, 1, \ldots, L-1 是位置,n=0,1,,d/21n = 0, 1, \ldots, d/2-1 是维度索引,dd 是总维度。这样每个位置会映射成一组不同频率的正弦/余弦波。

例如,我们有一个输入 embedding X=[[[12][34][56]]]X = \begin{bmatrix}\begin{bmatrix}\begin{bmatrix}1 & 2\end{bmatrix} \\ \begin{bmatrix}3 & 4\end{bmatrix} \\ \begin{bmatrix}5 & 6\end{bmatrix}\end{bmatrix}\end{bmatrix},形状为 (B,L,D)=(1,3,2)(B, L, D) = (1, 3, 2),现在计算位置编码

PE(0)=[sin(0/100000/2)cos(0/100001/2)]=[01]PE(1)=[sin(1/100000/2)cos(1/100001/2)][0.84150.99995]PE(2)=[sin(2/100000/2)cos(2/100001/2)][0.90930.9998]\begin{aligned} \text{PE}(0) &= \begin{bmatrix}\sin(0/10000^{0/2}) & \cos(0/10000^{1/2})\end{bmatrix} = \begin{bmatrix}0 & 1\end{bmatrix} \\ \text{PE}(1) &= \begin{bmatrix}\sin(1/10000^{0/2}) & \cos(1/10000^{1/2})\end{bmatrix} \approx \begin{bmatrix}0.8415 & 0.99995\end{bmatrix} \\ \text{PE}(2) &= \begin{bmatrix}\sin(2/10000^{0/2}) & \cos(2/10000^{1/2})\end{bmatrix} \approx \begin{bmatrix}0.9093 & 0.9998\end{bmatrix} \end{aligned}

组合成位置编码矩阵

PE=[[01][0.84150.99995][0.90930.9998]]\text{PE} = \begin{bmatrix}\begin{bmatrix}0 & 1\end{bmatrix} \\ \begin{bmatrix}0.8415 & 0.99995\end{bmatrix} \\ \begin{bmatrix}0.9093 & 0.9998\end{bmatrix}\end{bmatrix}

然后广播相加

X+PE=[[12][34][56]]+[[01][0.84150.99995][0.90930.9998]]=[[13][3.84154.99995][5.90936.9998]]X + \text{PE} = \begin{bmatrix}\begin{bmatrix}1 & 2\end{bmatrix} \\ \begin{bmatrix}3 & 4\end{bmatrix} \\ \begin{bmatrix}5 & 6\end{bmatrix}\end{bmatrix} + \begin{bmatrix}\begin{bmatrix}0 & 1\end{bmatrix} \\ \begin{bmatrix}0.8415 & 0.99995\end{bmatrix} \\ \begin{bmatrix}0.9093 & 0.9998\end{bmatrix}\end{bmatrix} = \begin{bmatrix}\begin{bmatrix}1 & 3\end{bmatrix} \\ \begin{bmatrix}3.8415 & 4.99995\end{bmatrix} \\ \begin{bmatrix}5.9093 & 6.9998\end{bmatrix}\end{bmatrix}

12. 为什么选用正弦型位置编码?

正弦型位置编码有几个性质

  • 频率唯一且单调变化: 特征维度下标 nn 越大,频率越低,位置嵌入变化越慢;反之,频率越高,位置嵌入变化越快。这种设计使得模型更倾向于在 nn 较小的维度上捕捉局部信息,在 nn 较大的维度上捕捉全局信息(含有频率分析中低频对应于全局信息, 高频对应于局部信息的思想)。仿佛每一个维度上都有一个在序列长度上振荡的波。
  • 相对位置关系: sin(x+k)=sin(x)cos(k)+cos(x)sin(k)\sin(x + k) = \sin(x)\cos(k) + \cos(x)\sin(k),这意味着位移 kk 处的编码其实是位置 xx 处编码的线性组合,模型只要习得 cos(k)\cos(k)sin(k)\sin(k) 的值,就能推断出相对位置关系。
  • 初等函数性质: 正弦和余弦函数是连续可微、对称光滑的,且可以在 R\mathbb{R} 上都有定义。

13. RoPE (Rotary Position Embedding) 是什么?

二维示例

RoPE 初见论文 ReFormer: Enhanced Transformer with Rotary Position Embedding.传统的 Transformer 使用绝对位置编码(如正弦编码)或学习式的位置编码,这种位置编码方式在处理长序列时的外推性较差。模型只在训练时见过的序列长度 (如2048) 上表现良好,对于灭见过的更长的序列 (如4096),性能就会显著下降。

RoPE的想法就是通过绝对编码的形式,实现相对位置编码的效果。注意力机制的核心时内积,如果能确保在计算内积时,只依赖于两个 token 之间的相对位置 mnm - n,而不是它们的绝对位置 mmnn,那么模型就能更好地泛化到没见过的序列长度上。

设有一个词嵌入向量 xm=[xm(1),xm(2)]x_m = \left[x_m^{(1)}, x_m^{(2)}\right] 在位置 mm 处。用旋转矩阵将其编码为一个包含位置信息的向量 f(xm,m)f(x_m, m)。设旋转矩阵为 Rφ=[cosφsinφsinφcosφ]R_\varphi = \begin{bmatrix}\cos\varphi & -\sin\varphi\\ \sin\varphi & \cos\varphi\end{bmatrix},其中 φ\varphi 是旋转角度。在实际编码中,先预定义一个基础角度 θ\theta,并设置位置 mm 处使用的旋转角度为 mθm\theta,用旋转矩阵进行编码,得到编码后的向量为

f(xm,m)=Rmθ=[cosmθsinmθsinmθcosmθ][xm(1)xm(2)]=[xm(1)cosmθxm(2)sinmθxm(1)sinmθ+xm(2)cosmθ]f(x_m, m) = R_{m\theta} = \begin{bmatrix}\cos m\theta & -\sin m\theta\\ \sin m\theta & \cos m\theta\end{bmatrix}\begin{bmatrix}x_m^{(1)} \\ x_m^{(2)}\end{bmatrix} = \begin{bmatrix}x_m^{(1)}\cos m\theta - x_m^{(2)}\sin m\theta \\ x_m^{(1)}\sin m\theta + x_m^{(2)}\cos m\theta\end{bmatrix}

下面验证其位置相对性,位置 mmnn 处的编码向量的内积为

<f(xm,m),f(xn,n)>=(Rmθxm)(Rnθxn)=xmRmθRnθxn=xmR(nm)θxn\left<f(x_m, m), f(x_n, n)\right> = (R_{m\theta}x_m)^\top(R_{n\theta}x_n) = x_m^\top R_{m\theta}^\top R_{n\theta}x_n = x_m^\top R_{(n-m)\theta}x_n

利用旋转矩阵的正交矩阵性质,可以发现最终的内积只与相对位置有关,而与绝对位置无关。

高维推广

真实的词向量都是高维向量,为了推广二维的旋转编码,可以考虑将高维向量分成 d2\frac{d}{2} 个组,每一个组对应一个二维平面,然后在每一个平面分别应用旋转。不过我们会为不同的平面分配不同的基础旋转角度 θi\theta_i,通常的设置是 θi\theta_i 会随着维度增加而减小,如

θi=100002(i1)d\theta_i = 10000^{-\frac{2(i-1)}{d}}

其中 ii 为维度对的索引。根据矩阵分块原理,可以类似得到位置编码的相对性性质。

实际应用

在实际应用中,旋转位置编码并非作用于词嵌入向量上,而是作用于 query 向量和 key 向量上,这是因为

q^m=f(qm,m),k^n=f(kn,n)\hat q_m = f(q_m, m), \quad \hat k_n = f(k_n, n)

然后计算注意力分数

q^mk^n=(RΘ,mdqm)(RΘ,ndkn)=qmRΘ,nmdkn\hat q_m^\top \hat k_n = (R_{\Theta, m}^d q_m)^\top (R_{\Theta, n}^d k_n) = q_m^\top R_{\Theta, n - m}^d k_n

这样的设计可以保证 Value 向量中没有因为含有位置编码而引入不必要的信息,且保证了位置编码只在注意力计算时发挥重要作用。

14. 传统 Attention 存在哪些问题?Attention 优化方向有哪些?

主要问题

  • 复杂度与带宽瓶颈: 全连接注意力时间/显存均为 O(L2)O(L^2),prefill 峰值显存高;decode 阶段受内存带宽限制显著。
  • KV Cache 膨胀: 随上下文线性增长,多头重复存储 K/V,长对话吞吐急剧下降。
  • 长上下文退化: 远距信息衰减,注意力偏近邻;训练长度外推差,易出现“看不见远处”。
  • 数值稳定性: QK 点积过大导致 softmax 饱和;outlier token 使梯度不稳。
  • 计算冗余: 无信息 token、冗余注意力头、跨模态交叉注意力 O(LtextLvision)O(L_\text{text}·L_\text{vision}) 过大。
  • 工程痛点: mask/padding 浪费、内核非 IO 友好、内存碎片、批量与缓存调度复杂。

优化方向 (方法论)

  • 稀疏与结构化注意力: 滑窗/扩张/块稀疏、局部+少量全局锚点、LSH/路由式注意力;在不显著掉点下将复杂度降至近线性。
  • 低秩/核近似: Linformer、Performer、Nyström、CosFormer、线性注意力;以特征映射或投影逼近 QK^T。
  • 递归与状态空间: RWKV、S4/SSM、Hyena、RetNet、Mamba;用可并行的隐式卷积/有状态单元建模长依赖。
  • 检索与记忆: RAG/kNN-LM、Memory/Global tokens、Compressive/Streaming Transformer、滑动窗+锚点摘要;以检索代替全局全连接。
  • 位置与外推: RoPE 缩放与 NTK-aware 插值、ALiBi、XPOS、YaRN、分块相对位置;提升长序列外推稳定性。
  • 正交稳健化: QK 归一化/中心化、logit 裁剪、温度与缩放、pre/post-norm、熵正则/DropAttention 减少塌缩。

优化方向 (系统与内核)

  • FlashAttention 系列与内存高效注意力: tile 化计算+在线 softmax,消除 O(L^2) 中间显存,显著提高带宽利用。
  • KV Cache 工程: MQA/GQA 共享 K/V、Paged KV/块化缓存、滑动裁剪或淘汰、分段重计算、RoPE 融合旋转、按通道 8/4/2-bit 量化。
  • 推理加速:连续批处理、前缀复用、prefill/decode 分离、推测/多 token 解码、块并行调度、遮罩缓存。
  • 计算图与布局: 融合 QKV+RoPE+softmax、避免 padding、head/seq 友好布局、CUDA Graph、张量/流水并行。
  • 跨模态: 下采样/聚合视觉或语音 token、瓶颈潜变量(如 Perceiver IO)、分层交叉注意力。

实践建议

  • 训练: 混合长度课程+FlashAttention,启用 NTK-aware RoPE/ALiBi,监控长距离对齐指标。
  • 推理: GQA+Paged KV+KV 4bit 量化,滑窗注意力+少量全局 token,启用 FlashAttention2/3 与连续批处理。
  • 超长上下文( >32k\ >32k): 优先检索/分块摘要,其次再做 RoPE 缩放或位置插值扩窗。

15. 解释 PPO, DPO, 和 KTO

(i) PPO (近端策略优化)

PPO 是 OpenAI 在 2017 年提出的一种强化学习算法,它成为了之后多年训练大语言模型(如 ChatGPT 的早期版本)的核心算法之一。PPO 属于策略梯度方法。其核心思想是

  1. 智能体有一个策略,这个策略根据当前状态(对话上下文)输出一个动作(下一个词)。
  2. 智能体与环境(用户)交互,生成一段完整的对话(或回答)。
  3. 根据一个奖励模型对生成的回答进行打分,得到奖励信号。
  4. 算法根据这个奖励信号来更新策略,使得策略未来更倾向于生成能获得高奖励的动作(词序列)。

PPO 的关键创新在于解决了传统策略梯度方法(如 TRPO)中训练不稳定步长难以选择的问题。它通过引入一个“近端”约束,确保新策略不会偏离旧策略太远,从而避免因一次激进的更新而导致策略崩溃。

PPO 的核心是它的目标函数。最流行的形式是 PPO-Clip

LCLIP(θ)=Et[min(rt(θ)At,clip(rt(θ),1ϵ,1+ϵ)At)]L^{CLIP}(\theta) = \mathbb{E}_{t} \left[ \min\left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t \right) \right]
  • θ\theta:策略网络的参数。
  • rt(θ)r_t(\theta)概率比rt(θ)=πθ(atst)πθold(atst)r_t(\theta) = \frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}。表示新策略选择某个动作的概率与旧策略概率的比值。
  • AtA_t优势函数,表示在状态 sts_t 下选择动作 ata_t 比平均情况好多少。它由奖励模型计算得出。
  • ϵ\epsilon:一个超参数(如 0.2),用于限制 clipping 的范围。

公式内涵

  • 核心思想:如果某个动作的优势 AtA_t 是正的(好动作),我们就希望增加选择这个动作的概率,即让 rt(θ)>1r_t(\theta) > 1。反之,如果 AtA_t 是负的(坏动作),我们就希望减小其概率,即让 rt(θ)<1r_t(\theta) < 1
  • Clip 函数的作用:它防止 rt(θ)r_t(\theta) 变得过大或过小。例如,如果一个动作的优势很大,没有 clip 的话,rt(θ)r_t(\theta) 可能会变得极大,导致更新步长过大。Clip 函数将其限制在 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon] 范围内,从而确保更新是稳定、小幅度的。

在 LLM 中的应用流程(RLHF 阶段 3):

  1. 有一个初始模型(经过 SFT 微调)。
  2. 有一个训练好的奖励模型。
  3. 使用 PPO 算法,以初始模型为起点,用奖励模型作为奖励信号来优化策略(LLM),同时加入 KL 散度惩罚项,防止模型偏离初始模型太远而生成无意义的乱码。

优缺点:

  • 优点:稳定、通用、效果好。
  • 缺点:流程复杂,需要同时维护四个模型(待优化的策略模型、参考模型、奖励模型、价值模型),计算成本高且难以调试。

(ii) DPO (直接偏好优化)

DPO 是 2024 年提出的一种更直接的方法,它完全绕过了奖励模型的训练和复杂的 PPO 循环,直接将偏好数据用于优化语言模型。DPO 的核心洞察是一个巧妙的数学变换

与其先训练一个奖励模型,再用强化学习算法去优化策略以最大化奖励,不如直接定义一个在偏好数据上最优的策略应该满足的数学关系(基于 Bradley-Terry 模型),然后将这个关系作为目标函数来直接优化策略本身。

简单来说,DPO 将强化学习问题转化为了一个简单的监督学习问题

  1. 偏好概率模型(Bradley-Terry): 假设我们有一对回答,一个是被偏好的 ywy_w,一个是被拒绝的 yly_l。奖励模型 rr^* 给出奖励的概率为:

    P(ywylx)=exp(r(x,yw))exp(r(x,yw))+exp(r(x,yl))=σ(r(x,yw)r(x,yl))P(y_w \succ y_l | x) = \frac{\exp(r^*(x, y_w))}{\exp(r^*(x, y_w)) + \exp(r^*(x, y_l))} = \sigma(r^*(x, y_w) - r^*(x, y_l))

    其中 σ\sigma 是 sigmoid 函数。

  2. DPO 的关键变换: 在最优策略 π\pi^* 和最优奖励函数 rr^* 之间存在一个明确的关系(通过 RL 的目标函数推导得出):r(x,y)=βlogπ(yx)πref(yx)+...r^*(x, y) = \beta \log \frac{\pi^*(y|x)}{\pi_{ref}(y|x)} + ...。将这个关系代入上面的 Bradley-Terry 模型,可以发现奖励函数 rr^* 被消去了

  3. DPO 目标函数: 经过推导,可以得到一个只依赖于策略 πθ\pi_{\theta} 和参考模型 πref\pi_{ref} 的目标函数

    LDPO(πθ;πref)=E(x,yw,yl)D[logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))]L_{DPO}(\pi_{\theta}; \pi_{ref}) = -\mathbb{E}_{(x, y_w, y_l) \sim D} \left[ \log \sigma \left( \beta \log \frac{\pi_{\theta}(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi_{\theta}(y_l|x)}{\pi_{ref}(y_l|x)} \right) \right]
  • πθ\pi_{\theta}:我们要优化的策略(LLM)。
  • πref\pi_{ref}:参考模型(通常是 SFT 后的模型,在 DPO 中固定不变)。
  • β\beta:控制偏离参考模型程度的超参数。

公式内涵

  • 目标是最小化 LDPOL_{DPO},也就是最大化 log 里面的概率。
  • 它本质上是在最大化偏好回答 ywy_w 和拒绝回答 yly_l对数概率比。模型被鼓励去增大 ywy_w 相对于 πref\pi_{ref} 的概率,同时减小 yly_l 的概率。
  • β\betaπref\pi_{ref} 共同起到了 PPO 中 KL 惩罚项的作用,防止模型过度优化而“走火入魔”。

优缺点:

  • 优点:极其简单,训练稳定,不需要奖励模型,计算效率高。
  • 缺点:严重依赖于高质量的偏好对数据。理论上假设偏好完全由 Bradley-Terry 模型生成,可能与现实有偏差。

(iii) KTO (Kahneman-Tversky 优化)

KTO 可以看作是 DPO 的进一步简化和发展。它认为收集严格的偏好对(A 比 B 好)成本高昂,而判断一个回答是“好”还是“坏”则容易得多。KTO 的灵感来源于行为经济学中的“前景理论”。它不再使用偏好对 (yw,yl)(y_w, y_l),而是使用单个样本的期望值标签。对于每个提示 xx 和回答 yy,我们只需要一个人类标注者判断这个回答是“可取的”还是“不可取的”。KTO 的目标是让模型生成的回答的期望值尽可能高,同时避免生成期望值低的结果。

KTO 定义了一个基于“价值”的目标函数。

  1. 价值函数: 首先,它定义了一个样本 (x,y)(x, y) 的“价值”,类似于 DPO 中的奖励:

    vKTO(x,y;β)=βlogπθ(yx)πref(yx)v_{KTO}(x, y; \beta) = \beta \log \frac{\pi_{\theta}(y|x)}{\pi_{ref}(y|x)}
  2. 目标函数: 然后,根据样本的标签(可取/不可取)分别定义损失函数:

    LKTO(πθ,πref)=Ex,yD[wy(1vKTO(x,y;β))]L_{KTO}(\pi_{\theta}, \pi_{ref}) = \mathbb{E}_{x,y \sim D} \left[ w_{y} \left( 1 - v_{KTO}(x, y; \beta) \right) \right]

    但更常见的表述是使用 sigmoid 函数的一个变体,使其对不可取样本的惩罚更鲁棒

    LKTO(θ)=Ex,yD[λyσ(vKTO(x,y;β)zref)]L_{KTO}(\theta) = \mathbb{E}_{x, y \sim D} \left[ \lambda_{y} \cdot \sigma\left( v_{KTO}(x, y; \beta) - z_{ref} \right) \right]

    其中

    • 如果 yy可取的,我们希望 vKTOv_{KTO} 越大越好,因此损失函数是 σ(zrefvKTO)\sigma(z_{ref} - v_{KTO}),即价值低时损失大。
      • 如果 yy不可取的,我们希望 vKTOv_{KTO} 越小越好,因此损失函数是 σ(vKTOzref)\sigma(v_{KTO} - z_{ref}),即价值高时损失大。
    • zrefz_{ref} 是一个参考点,通常设为模型在一批数据上计算出的价值的均值。
    • λy\lambda_{y} 是权重,用于平衡两类样本。

公式内涵

  • 它直接拉高“好回答”的价值,压低“坏回答”的价值。
  • 由于不需要严格的配对,数据收集成本大大降低,并且可以充分利用那些只有一个回答的数据。

优缺点:

  • 优点:数据需求更简单、成本更低;对部分有噪声的标签更鲁棒。
  • 缺点:相比 DPO,可能损失了一些严格的偏好比较信息,理论上的最优性保证不如 DPO 严格。

总结对比

特性PPODPOKTO
核心思想使用RL,在奖励模型指导下稳定地更新策略。直接优化策略,使其符合偏好对的概率模型。直接优化策略,使“好回答”价值高,“坏回答”价值低。
数据格式通过模型采样,由奖励模型打分。偏好对 (x,yw,yl)(x, y_w, y_l)单样本标签 (x,y)(x, y),标注为“好/坏”。
数学基础策略梯度理论 + 近端优化(Clip)。布拉德利-特里偏好模型 + 奖励-策略的隐式映射。价值函数最大化 + 前景理论启发。
流程复杂度,需要多个模型,流程复杂。,类似于带参考模型的监督微调。,与 DPO 类似,甚至更简单。
优势非常通用、成熟,在复杂任务上潜力大。简单、稳定、高效,已成为当前主流。数据获取成本极低,更实用,性能与DPO相当。
劣势复杂、难以调试、计算成本高。依赖高质量的偏好对数据。损失了部分偏好信息,理论新颖度最高。

演进趋势:PPO -> DPO -> KTO 体现了整个领域向更简单、更稳定、数据效率更高的方向发展,目标都是让语言模型更好地与人类偏好对齐。

大模型技术知识点 2
https://adalovelemon.github.io/blog/posts/content/technotes/llm-misc/llm-misc2/
Author
Ada Lovelemon
Published at
2025-09-03

留言板