Back

语言模型发展历程#

语言模型发展历程

涌现能力 (Emergent Ability) 指的是当模型扩展到一定规模时,其特定任务性能突然出现显著跃升的趋势。具体来说包括三种 - 上下文学习、指令遵循和逐步推理的能力。

训练阶段扩展法则#

模型的性能随着 模型规模 (N)、数据规模 (D) 和计算算力 (C) 的增长而呈现可预测的提升趋势。也就是在给定算力 (FLOPs) 的情况下,如何对其余参数进行合理的分配使得模型的性能最好。

OpenAI#

NoptC0.73,BoptC0.24,SoptC0.03,D=BS,C6ND\small N_{opt} \propto C^{\textcolor{red}{0.73}}, \hspace{0.2cm} B_{opt} \propto C^{\textcolor{red}{0.24}}, \hspace{0.2cm} S_{opt} \propto C^{\textcolor{red}{0.03}}, \hspace{0.2cm}D = B \cdot S, \hspace{0.2cm} C \approx 6ND

可以发现当算力固定的时候,扩大模型规模带来的收益最客观。

DeepMind#

Nopt=G(C6)a,Dopt=G1(C6)b,a=βα+β=0.46,b=αα+β=0.54\small N_{opt} = G \left( \frac{C}{6} \right)^{a}, \hspace{0.2cm}D_{opt} = G^{-1} \left( \frac{C}{6} \right)^{b}, \hspace{0.2cm}a = \frac{\beta}{\alpha + \beta} = \textcolor{red}{0.46}, \hspace{0.2cm}b = \frac{\alpha}{\alpha + \beta} = \textcolor{red}{0.54}

可以发现指数 a\small ab\small b 十分接近,意味着当计算预算增加时,模型规模和数据规模应该几乎等比例增长。

推理阶段扩展法则#

分词#

分词可视化网址 - https://tiktokenizer.vercel.app/

分词 (Tokenization) 指的是将输入文本转换成若干词元 (Token),且保证每个词元拥有相对完整和独立的语义。目前最常用的分词算法是 Byte-level BPE (B-BPE),其核心思想是通过滑动窗口来统计字节对,找到最频繁的连续字节对并将它们合并,重复这个过程直到达到预设的子词数量。

B-BPE

词表 (Vocabulary) 是由词元到索引的映射组成的字典,即 {'<pad>': 0, 'hello': 1, 'world': 2}。可以通过 Summary of the tokenizers 查看其他的分词类别。

词嵌入#

分词过程结束之后,会得到一个优化后的词表,然后我们使用嵌入层 (Embedding) 将每个词元映射为一个稠密向量,全部映射完成之后得到一个 可学习的参数矩阵/查找表,其大小为 [vocab_size, embed_dim]。

"hello world"
↓ 分词
['hello', 'world']
↓ 映射为 ID - 由词表确定
[1, 2]
↓ 查找嵌入(lookup) - 大小为(2, 5),即 (seq_len, embed_dim)
[[0.1234, -0.5678, 0.9012, -0.3456, 0.7890],
[-0.1111, 0.2222, 0.3333, -0.4444, 0.5555]]

Word2Vec#

基于分布式假设,即 语义相近的文本在向量空间中的距离也相近。其模型的本质是具有一个隐藏层的网络,最后取输入层到隐藏层的权重矩阵作为词的分布式表示。

word2vec 包含两种任务类型:

  • CBOW - 上下文窗口内的词元向量平均值作为输入,目标词元作为输出,最大化目标词元的条件概率;
  • Skip-Gram - 目标词元作为输入,上下文窗口内的词元作为输出,最大化上下文词元的条件概率。

由于要进行条件概率的计算,所以涉及 softmax 操作,但是该操作在词汇量较大的时候计算效率低,因此引入了两种优化算法:

  • 层级 Softmax (Hierarchical Softmax) - 构建一个树形结构来代替隐藏层到 softmax 层的映射,根据词频构建 哈夫曼树,高频词在浅层,低频词在深层。将输出词的概率分布建模为从根节点到叶子结点的路径选择(多分类 -> 二分类),复杂度从 O(V)\small O(V) 降低到 O(logV)\small O(\log V)
  • 负采样 (Negative Sampling) - 从噪声分布中随机采样负样本(词表中词频较大的无关词),并且使用词频的 0.75 次方作为权重,以平衡高频词和低频词的采样概率。目标是最大化正例的概率,同时最小化负例的概率。在更新的过程中也仅更新正例和负例的权重。

负采样的训练目标为:

min[logσ(vwoTh)wjWneglogσ(vwjTh)]\small \min \left[ -\log \sigma(v^{\prime}_{w_o^\text{T}} h) - \sum_{w_j \in \mathcal{W}_{\text{neg}}} \log \sigma(-v^{\prime}_{w_j^\text{T}} h)\right]

其中 hh 是中心词的词向量,vwov'_{w_o} 是正例上下文词的词向量,Wneg\mathcal{W}_{\text{neg}} 是噪声分布。

FastText#

FastText 在 Word2Vec 的基础上进行了改进,引入了 子词嵌入,即将输入文本拆分成子词,然后将子词嵌入向量进行平均得到输入文本的嵌入向量,有效提升了模型对 OOV 和形态变化的处理。

在 n-gram 序列的构建上采用了 滑动窗口 的方式,假设窗口大小为 3,对于输入文本 “hello”,其序列为:

<he, hel, ell, llo, lo>

并且为了避免显示存储所有子词的词向量,使用 哈希函数 将 n-gram 序列映射到固定大小的哈希表中。

预训练#

语言建模 (NTP) - 给定一个词元序列 u={u1,,uT}\small u= \{u_1, \cdots, u_{T}\},语言建模的任务是基于当前位置之前的词元序列 {u<t}\small \{u_{<t}\} 以自回归的方式对下一个词元进行预测。代表模型为 GPT、LLaMA。

LLM(u)=t=1TlogP(utu<t)\small L_{\text{LM}}(u)=\sum_{t=1}^{T}\log P(u_t|u_{<t})

前缀语言建模 (Prefix LM) - 专为前缀解码器架构而设计,本质是利用前缀信息来预测后缀的词元,并且只有后缀中的词元计入总损失。代表模型为 ChatGLM、U-PaLM。

Lprefix=logP(uprefixusuffix)=t=k+1TlogP(utu<t)\small L_{\text{prefix}}=\log P(u_{\text{prefix}}|u_{\text{suffix}})=\sum_{t=k+1}^{T}\log P(u_t|u_{<t})

该架构对因果解码器的掩码机制进行了修改,即对输入(前缀)部分采用双向注意力机制进行编码,而对输出部分利用单向的掩码注意力进行自回归地预测。

去噪自编码 (DAE) - 输入序列经过一系列的随机替换和删除操作之后形成损坏的文本 u\u~\small u_{\char92 \tilde{u}},模型的目标就是根据损坏的文本来恢复被替换或删除的词元片段 u~\small \tilde{u}。代表模型为 BERT、T5。

LDAE=logP(u~u\u~)\small L_{\text{DAE}}=\log P(\tilde{u}|u_{\char92 \tilde{u}})

指令微调#

指令微调 (Instruction Tuning) 指的是用自然语言形式的数据对预训练模型进行参数微调,使得模型具备 指令遵循 的能力,从而在 零样本 的情况下完成诸多下游任务。该阶段的主要目的是优化模型输出格式,从而对齐人类和真实应用场景的需求。

指令微调

指令微调最重要的一环是指令数据的构建,即 [指令+输入+输出] 对,例如下面的翻译任务:

{
"instruction": "将下述中文翻译为英文",
"input": "中国的首都是北京。",
"output": "China's capital city is Beijing."
}

主要有三种构建方式 - 在已有的 NLP 数据集上添加指令、人类专家编写的指令数据集以及通过大模型来生成指令数据集 (Self-Instruct)。

指令微调

参数高效微调#

Adapter Tuning#

Adapter Tuning 指的是在模型中引入适配器(瓶颈网络架构)从而不需要训练整个模型,只需要更新适配器参数即可,不同的任务可以使用不同的适配器。

x=x+σ(xWup)Wdown\small x=x+\sigma(x\cdot W_\text{up})\cdot W_{\text{down}}

其中 WdownRk×r\small W_{\text{down}}\in \mathbb{R}^{k\times r}WupRr×k\small W_\text{up}\in \mathbb{R}^{r\times k}rkr \ll k

具体来说,首先将特征向量压缩到较低维度,然后使用激活函数进行非线性变换,最后恢复到初始维度。并且使用残差连接来保证梯度的传递。

LoRA#

LoRA 指的是在预训练模型的参数矩阵的旁路添加低秩分解矩阵来近似每层的参数更新。

W=W0+ΔW=W0+BA\small W=W_0+\Delta W=W_0+BA

其中 W0Rd×k\small W_0\in \mathbb{R}^{d\times k}BRd×r\small B\in \mathbb{R}^{d\times r}ARr×k\small A\in\mathbb{R}^{r\times k}rmin(d,k)\small r \ll \min(d,k),且矩阵 A\small AB\small B 分别通过高斯、零初始化。

具体来说,模型在前向传播的过程中,原始参数矩阵保持不变,而引入的低秩矩阵会被更新。训练完成之后将二者合并得到新的参数矩阵。推理阶段,相较于 Adapter 的串行来说,并行推理速度会更快。

对齐#

对齐 (Alignment) 指的是大语言模型的行为与人类价值观、人类真实意图和社会伦理相一致。我们希望对齐之后的大模型是 有用的、诚实的、无害的 (3H 标准)

RLHF#

RLHF

(1) 监督微调 - 使用标注数据 (q,o)\small (q,o) 训练基于 GPT-3 的微调模型 πSFT\small \pi^{\text{SFT}}

(2) 奖励模型 - 使用筛选的偏好数据 (q,ow,ol)\small(q,o_w,o_l) 基于 πSFT\small \pi^{\text{SFT}} 训练奖励模型 rφ(q,ow)\small r_\varphi(q,o_w) 来输出标量分数

基于 Bradley-Terry 模型,给出人类偏好片段 ow\small o_w 超过 ol\small o_l 的概率:

P(owolq)=exp(rφ(q,ow))exp(rφ(q,ow))+exp(rφ(q,ol))\small P(o_w\succ o_l\mid q)=\frac{\exp(r_\varphi(q,o_w))}{\exp(r_\varphi(q,o_w))+\exp(r_\varphi(q,o_l))}

通过最大化对数 / 最小化负对数似然来训练该模型,即希望偏好/非偏好输出之间的奖励差值较大:

loss(φ)=E(q,ow,ol)D[logσ(rφ(q,ow)rφ(q,ol))Bradley-Terry 模型]\small \text{loss}(\varphi)=-\mathbb{E}_{(q,o_w,o_l)\sim D}\left[\log \underbrace{\sigma(r_\varphi(q,o_w)-r_\varphi(q,o_l))}_{\text{Bradley-Terry 模型}}\right]

Bradley-Terry 模型是基于偏好对的 (两个输出),Lackett–Luce 模型是基于排序的 (多个输出)。

(3) PPO 优化 - 初始策略为 πSFT\small \pi^{\text{SFT}},结合奖励模型和 KL 惩罚不断优化策略从而最大化奖励模型的输出期望

loss(θ)=EqDRLEoπθRL(q)1ot=1o[rφ(q,ot)β logπθRL(otq,o<t)πSFT(otq,o<t)KL 惩罚]最终奖励+γ EqDpretrainlogπθRL(otq,o<t)预训练目标函数\small \begin{aligned} \text{loss}(\theta)&=\mathbb{E}_{q\sim D_\text{RL}} \mathbb{E}_{o\sim \pi^\text{RL}_\theta(q)}\frac{1}{|o|} \sum_{t=1}^{|o|}\overbrace{\left[r_\varphi(q,o_{\le t})-\beta\underbrace{ ~\log \frac{\pi_{\theta}^{\text{RL}}(o_t\mid q,o_{<t})}{\pi^{\text{SFT}}(o_t\mid q,o_{<t})}}_{\text{KL 惩罚}}\right]}^{\text{最终奖励}} \\ &+ \gamma ~\underbrace{\mathbb{E}_{q\sim D_\text{pretrain}}\log \pi_{\theta}^{\text{RL}}(o_t \mid q, o_{<t})}_{\text{预训练目标函数}} \end{aligned}

加入 KL 惩罚是希望模型的优化目标不会太过偏离微调结果,减少奖励模型对 OOD 数据的敏感性以及避免 Reward Hacking 问题,需要注意分布之间的 KL 散度是逐词元计算 (Per-Token KL Penalty)。加入预训练目标函数是希望模型能够保留基础能力,避免遗忘预训练知识 (减轻对齐税)。

直接优化带 KL 散度的目标函数是二阶的,通过引入裁剪 (Clipping) 概率比来直接限制新旧策略的更新幅度,从而在实践中达到类似 KL 散度的约束效果,并将其转换为一阶优化问题:

loss(θ)=E[qDRL,oπθoldRL]1ot=1omin[πθRL(otqt,o<t)πθoldRL(otqt,o<t)At,clip(πθRL(otqt,o<t)πθoldRL(otqt,o<t),1ε,1+ε)At]\small \begin{aligned} \text{loss}(\theta)&=\mathbb{E}_{[q\sim D_\text{RL},{o\sim \pi_{\theta_{old}}^{\text{RL}}}]} \frac{1}{|o|} \sum_{t=1}^{|o|} \\ & \min \left[\frac{\pi_\theta^{\text{RL}}(o_t\mid q_t,o_{<t})}{\pi_{\theta_{\text{old}}}^{\text{RL}}(o_t\mid q_t,o_{<t})}A_t, \text{clip}\left(\frac{\pi_\theta^{\text{RL}}(o_t\mid q_t,o_{<t})}{\pi_{\theta_{\text{old}}}^{\text{RL}}(o_t\mid q_t,o_{<t})}, 1-\varepsilon, 1+\varepsilon\right)A_t\right] \end{aligned}

其中 At\small A_t 是优势函数,定义为实际奖励与基准奖励的差值,其回答了在当前状态 qt\small q_t 下,采取某个动作 ot\small o_t 比平均水平好多少的问题。其中实际奖励通过奖励模型输出得到,而基准奖励则由可学习的价值模型 V\small V 提供:

At=r(qt,ot)V(ot)\small A_t=r(q_t, o_t) - V(o_t)

在实践中,通常使用广义优势估计 (GAE) 来平衡偏差和方差,从而计算一个更加稳健的优势值。单步优势函数进一步扩展为多步优势的指数加权平均 (Per-Token):

AtGAE=l=0Tt(γλ)lδt+l,δt=r(qt,ot)+γV(ot+1)新的估计V(ot)旧的估计\small A_t^{\text{GAE}} = \sum_{l=0}^{T-t} (\gamma \lambda)^l \delta_{t+l}, \quad \delta_t = \underbrace{r(q_t, o_t) + \gamma V(o_{t+1})}_{新的估计} - \underbrace{V(o_t)}_{旧的估计}

其中 δt\small \delta_t 表示时序差分误差 (TD Error),该差值衡量了单步更新的 “惊喜” 程度,若其大于 0,则表示为正向惊喜,反之为负向惊喜。具体的步骤为:

  1. 在生成序列的每一步 t\small t 都会计算一个 TD 误差 δt\small \delta_t,它告诉我们这一步的表现是正向还是负向惊喜;
  2. 计算在 t\small t 时刻的总优势 AtGAE\small A_t^{\text{GAE}},我们不仅需要这一步的惊喜 δt\small \delta_t,还需要未来几步的惊喜 δt,δt+1,\small \delta_t, \delta_{t+1}, \dots
  3. 把所有惊喜加起来并用衰减因子 (γλ)l\small (\gamma \lambda)^l 限制,意味着越遥远的未来的惊喜对当前的决策影响越小。

(4) 详细流程图 - 来自 Secrets of RLHF in Large Language Models Part I: PPO PPO

TL;DR - 引入 Clip 机制的好处是可以通过优势函数的正负来判断是否更新策略,而优势函数通过对比模型回答内容的实际奖励是否高于基准奖励来实现策略更新的定向调节。如果高于基准奖励,则指导模型增大当前输入下相应输出的概率 (增大策略在这个状态下采取对应动作的概率),反之减小。

GRPO#

以写作来举例 - PPO 当你每写一个词,他都给你一个反馈。而 GRPO 让你先写出 G 篇完整的文章,然后他阅读所有文章并告诉你哪一篇是最好的。

GRPO

由于价值模型是与策略模型是类似规模的,且都要进行参数更新,因此会引入较大的内存和计算负担,并且 PPO 的优化信号是基于词元级别,这种机制可能导致训练过程不稳定,且不一定能达到最优性能。

GRPO 通过消除价值模型并 将相同问题、不同输出的归一化奖励作为基准奖励,从而在 序列级别 对策略进行优化:

loss(θ)=E[qDRL,{oi}iGπθold]1Gi=1G1oit=1oi{min[πθ(oi,tq,oi,<t)πθold(oi,tq,oi,<t)A^i,t,clip(πθ(oi,tq,oi,<t)πθold(oi,tq,oi,<t),1ε,1+ε)A^i,t]β DKL[πθπref]}\small \begin{aligned} \text{loss}(\theta)&= \mathbb{E}_{[q\sim D_\text{RL}, \{o_i\}_i^G \sim \pi_{\theta_{\text{old}}}]} \frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_{i}|}\sum_{t=1}^{|o_{i}|} \\ &\left\{\min \left[\frac{\pi_{\theta}(o_{i,t}|q,o_{i,<t})}{\pi_{\theta_{\mathrm{old}}}(o_{i,t}|q,o_{i,<t})}\hat{A}_{i,t},\text{clip}\left(\frac{\pi_{\theta}(o_{i,t}|q,o_{i,<t})}{\pi_{\theta_{\mathrm{old}}}(o_{i,t}|q,o_{i,<t})},1-\varepsilon,1+\varepsilon\right)\hat{A}_{i,t}\right]-\beta~\mathbb{D}_{KL}\left[\pi_{\theta}||\pi_{\text{ref}}\right]\right\} \\ \end{aligned}

使用无偏差估计方法来计算 KL 散度:

DKL[πθπref]=πref(oi,tq,oi,<t)πθ(oi,tq,oi,<t)logπref(oi,tq,oi,<t)πθ(oi,tq,oi,<t)1\small \mathbb{D}_{\text{KL}}[\pi_\theta||\pi_{\text{ref}}]=\frac{\pi_{\text{ref}}(o_{i,t}|q,o_{i,<t})}{\pi_\theta(o_{i,t}|q,o_{i,<t})}-\log\frac{\pi_{\text{ref}}(o_{i,t}|q,o_{i,<t})}{\pi_\theta(o_{i,t}|q,o_{i,<t})}-1

具体来说,通过旧策略采样同一输入的一组输出并使用奖励模型对组内的每个输出打分,然后采用 “群组相对优势估计” 来计算归一化之后的基准奖励 / 优势,有两种不同的途径:

  • 结果监督 - 使用每个输出的最后一个词元计算奖励值
A^i,t=r~i=rimean(r)std(r)\small \hat{A}_{i,t} = \tilde{r}_{i} = \frac{r_{i} - \text{mean}(\mathbf{r})}{\text{std}(\mathbf{r})}
  • 过程监督 - 使用每个输出的每个词元计算奖励值
A^i,t=index(j)tr~iindex(j)=index(j)triindex(j)mean(r)std(r)\small \hat{A}_{i,t}=\sum_{\text{index}(j) \geq t}\tilde{r}_{i}^{\text{index}(j)}=\sum_{\text{index}(j) \geq t}\frac{r_i^{\text{index}(j)}-\text{mean}(\mathbf{r})}{\text{std}(\mathbf{r})}

其中 A^i,t\small \hat{A}_{i,t} 表示在第 i\small i 个样本下第 t\small t 个时间步的优势估计,且 r={r1,r2,,rG}\small \mathbf{r}=\{r_1,r_2,\cdots,r_G\}

DPO#

上述两种对齐方法都依赖显式奖励模型,且需要复杂的策略优化过程 (多阶段)。而 DPO 提出我们可以直接绕过奖励模型直接优化人类偏好策略,从而将多阶段学习转换为端到端学习。

根据 KL 约束下的最优策略表达式反解得到关于策略的奖励函数:

πrRL(oq)=1Z(x)πSFT(oq)exp(1βr(q,o))用奖励函数表示策略    rπ(q,o)=βlogπRL(oq)πSFT(oq)+βlogZ(x)用策略表示奖励函数\small \underbrace{\pi_r^\text{RL}(o\mid q)=\frac{1}{Z(x)}\pi^{\text{SFT}}(o\mid q)\exp \left(\frac{1}{\beta}r(q, o)\right)}_{\text{用奖励函数表示策略}} \iff \underbrace{r_\pi(q,o) =\beta \log \frac{\pi^\text{RL}(o\mid q)}{\pi^{\text{SFT}}(o\mid q)}+\beta \log Z(x)}_{\text{用策略表示奖励函数}}

其中 Z(x)\small Z(x) 是配方函数。然后将关于策略的奖励函数 rπθ(q,o)\small r_{\pi_\theta}(q,o) 代入 RLHF 中奖励模型的目标函数得到(奖励模型的重参数化):

loss(θ)=E[owol][logσ(rπθ(q,ow)rπθ(q,ol))]对比排序损失=E[owol][logσ(βlogπθRL(owq)πSFT(owq)βlogπθRL(olq)πSFT(olq))]\small \begin{aligned} \text{loss}(\theta)&= -\mathbb{E}_{[o_w \succ o_l]}\overbrace{\left[\log \sigma(r_{\pi_{\theta}}(q, o_w)-r_{\pi_\theta}(q, o_l))\right]}^{对比排序损失} \\ &= -\mathbb{E}_{[o_w \succ o_l]}\left[\log \sigma\left(\beta \log \frac{\pi_{\theta}^{\text{RL}}(o_w\mid q)}{\pi^{\text{SFT}}(o_w\mid q)}-\beta \log \frac{\pi_{\theta}^\text{RL}(o_l\mid q)}{\pi^{\text{SFT}}(o_l\mid q)}\right)\right] \end{aligned}

通过隐式定义奖励函数 rπθ(q,o)\small r_{\pi_{\theta}}(q, o) 使其与策略函数 πθ\small \pi_{\theta} 关联,将强化学习的策略优化问题转换为直接优化策略参数 θ\small \theta 的监督学习问题。并且只要让策略在同一输入下更偏向被选中的 ow\small o_w,就能对齐偏好,而不需要显式训练一个奖励 / 价值模型。适用于有大量的偏好对数据,希望稳定、低成本提升对齐与风格,并且对 “过程奖励 / 逐步信号” 依赖不强的任务。

RLAIF#

RLAIF

Constitutional AI 是一种以原则为核心的监督方式,人类仅制定一套高层次的规则 / 宪法,AI 便可依此生成反馈并自我改进,而无需人工撰写示范答案或进行排序。整个训练过程分为两个阶段:

  • 监督阶段 - Critique (批判) → Revision (修正) → Supervised Learning (监督学习);
  • RLAIF 阶段 - AI Comparison (AI 比较) → Preference Model (偏好模型) → RL (强化学习)。

帕累托改进 (Pareto Improvement) 在这里意味着 CAI 在提升 “无害性” 的同时,并没有牺牲 “有用性”。

提示工程#

提示工程 (Prompt Engineering) 指的是通过在提示词中写入有价值的信息从而提升大语言模型的现有能力。提示工程指南收集了非常多的方法。

上下文学习 (In-Context Learning) 指的是大语言模型在推理阶段无需参数更新,仅通过在输入中添加任务示例即可快速适应并完成新任务的能力。

思维链

如果仅是使用 “Let’s think step by step.” 而不提供示例,则为 Zero-shot CoT。

思维链 (Chain-of-Thought) 指的是在给定的示例中添加具体的推理步骤使得模型能够应对复杂推理问题。

  • 思维树 (ToT) - 将线形 CoT 扩展为树形结构,通过回溯和前瞻策略促进对多条推理路径的探索;

  • 思维图 (GoT) - 将线形 CoT 扩展为图结构,来更好地捕捉推理步骤之间的依赖和组合关系。

  • 基于采样的方法 (Self-Consistency) - 生成多条推理路径和答案,然后选取多数为最终答案;

  • 基于验证的方法 - 比对真实答案和生成答案训练分类器,并对整个推理路径和中间推理步骤进行验证。

通过上述策略,能够有效避免单一推理路径不稳定以及推理错误累积现象。

检索增强生成#

推荐阅读 - Modular RAG

检索增强生成 指的是通过检索与问题相似的外部数据来增强提示词,以此来缓解大模型知识的局限性、幻觉以及数据安全性问题。主要包含三个步骤:

  • 索引 - 将文档库进行拆分并分块,转换成嵌入向量并存储到向量数据库中,从而构建向量索引;
  • 检索 - 将输入内容和向量数据库中的内容进行相似度检索,选取若干最优相关片段;
  • 生成 - 将选取到的片段拼接到输入中提供给大模型,生成回答。

RAG techniques 这里面收集了非常多的 RAG 技巧。

智能体#

智能体 指的是基于大语言模型的智能代理,能自主理解任务、规划步骤并调用工具以完成复杂目标。它主要包含四个部分:

  • 规划 - 子任务分解、反思与完善 (ReAct / Reflexion);
  • 记忆 - 长期记忆 (RAG / mem0)、短期记忆 (上下文学习);
  • 工具使用 - 调用外部 API 补全模型权重信息、直接是使用外部模型 (HuggingGPT);
  • 行动 - 与环境交互并更改环境的状态。

多智能体系统 指的是通过多个自主或半自主的智能体进行协作、竞争或角色分工,以动态交互和互补能力解决复杂任务,并提升生成结果的可靠性、一致性和创造性。

多模态基础模型#

https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models

多模态的核心是在语言模型中通过可训练的 连接模块 (Connection Module) 来注入视觉特征,通过自回归预测下一个文本令牌。

MLLM

CLIP#

CLIP (Contrastive Language-Image Pretraining) 是 OpenAI 在 2021 年提出的第一个 多模态预训练算法。它首次将图像和文本映射到同一个高维空间 (多模态嵌入空间),使得跨模态的相似度计算成为可能。

clip

CLIP 采用 对比学习 (Contrastive Learning) 预训练来训练两个编码器 - Image/Text Encoder,并通过对比损失来学习一个优质的嵌入空间,在该空间中 正样本的距离较近,而负样本的距离较远

常用的对比损失函数为 InfoNCE Loss,其本质上是带有温度系数的交叉熵+Softmax损失:

Lq=logexp(sim(q,k+)/τ)i=0kexp(sim(q,k)/τ)\small L_q = -\log \frac{\exp{(\text{sim}{(q,k_+)}}/\tau)}{\sum_{i=0}^{k}\exp{(\text{sim}{(q,k_-)}/\tau})}

其中温度系数为 τ\small \tau, 较小的系数会使相似度分布变得更“尖锐”,模型会更专注于区分困难的负样本。

在训练过程中,将每个批量的 图像-文本对 传入模型得到若干个图像/文本嵌入,我们希望最大化真实匹配的图像-文本嵌入的余弦相似度 (对角线),同时最小化错误匹配的相似度。此外由于不同编码器输出的嵌入维度不一致,因此使用线形映射进行维度统一。训练完成后可以通过提示词实现零样本推理能力。

在推理过程中,以 ImageNet 为例,对一千个类别标签,分别生成一千个对应的文本,比如 A photo of a #Class,然后通过 Image/Text Encoder 计算特征向量并进行相似度匹配,最后选择相似度最高的类别。

SigLIP#

SigLIP 是 Google 在 2023 年提出的用于解决 CLIP 中依赖大批量以及对比损失中 Softmax 计算复杂度过高的问题,其通过 Sigmoid 来判断每一个图像-文本对是否匹配来解决 CLIP 中单个正样本的相似度计算依赖于批量中所有负样本的二次复杂度问题,从而将“多选一”的分类问题转换为二分类问题。

目标函数对比

对比学习通常采用 DP 来加快训练速度,单个正样本计算的时候,需要通过 All-Gather 操作来获取所有其他设备上的嵌入,并且该过程需要构建一个批量大小二次方的相似度矩阵,这无疑是非常耗时且占用显存的。因此,作者根据 Sigmoid 函数的特性,提出了一种内存高效、速度快且数值稳定的分布式计算方法:

Sigmoid Graph

在上图中,只有黄色方块存储在内存中,分块实现可以总结为每个 GPU 的以下步骤:1)计算本地文本/图像的嵌入损失;2)从相邻 GPU 获取文本嵌入;3)使用本地图像和相邻文本嵌入计算损失;4)将新的损失累加到总损失中;5)重复步骤 2 直到所有相邻 GPU 完成文本嵌入的传递。

BLIP#

BLIP 是 Salesforce Research 在 2022 年提出的视觉语言预训练 (VLP) 框架,其引入了两种创新方法来解决现有 VLP 模型在理解/生成任务上的局限性以及 如何高效利用网页噪声图文对的问题

Captioning & Filtering - 提出数据集 “自举 (Bootstrapping)” 的方法,利用 “字幕器” 为网络图像生成合成描述,再通过“过滤器”剔除原始网络文本和合成文本中的噪声数据,以此来提升样本的整体质量;

Caption Filter

Multimodal Mixture of Encoder-Decoder/MED - 提出统一架构来切换单模态编码器、图像引导的文本编码器、图像引导的文本解码器,并联合优化三个目标:1)图文对比损失(ITC) - 对称 InfoNCE 损失,引入动量编码器 (EMA) 来生成伪标签,并通过图/文动态队列来扩充负样本规模;2)图文匹配损失(ITM) - 二分类任务,在融合后的图文对嵌入上添加分类头来判断正/负样本,采用难负样本挖掘 (Hard Negative Mining) 从批量中筛选正例类似样本优先训练,强化模型对细粒度图文差异的判别能力;3)语言建模损失(LM) - 以图像嵌入作为前缀输入给自回归文本解码器,通过交叉熵最大化下一个词元的预测概率。

BLIP 模型架构

BLIP‑2 通过在冻结的视觉编码器和大语言模型之间 引入两阶段预训练的轻量级模块 Q‑Former,以可学习的查询向量提取与文本相关的关键视觉嵌入,避免二次微调,大幅降低训练成本,实现跨模态理解与生成。

表示学习

表示学习阶段 - 联合优化三个目标:1)图文对比损失 (ITC) - 计算每一个视觉 Query 嵌入与 Text 嵌入的相似度,选取最高的一个作为图文相似度,并采用对比学习进行训练;2)图生文损失 (ITG) - 通过自注意力融合 Text 嵌入与提取的 Query 嵌入,使得 Q-Former 学习文本相关的视觉嵌入,并能够根据视觉嵌入生成相应文本;3)图文匹配损失 (ITM) - 将每个 Query 嵌入与 Text 嵌入融合后输入到二线性分类器中来判断是否匹配,并通过难负样本挖掘强化模型细粒度判别能力。

生成学习

生成学习阶段 - 在第一阶段训练完成后,Q-Former 已经具备了提取高质量视觉表示的能力,而该阶段训练 Q-Former 具备高质量的文本生成能力。首先将一阶段提取的视觉嵌入通过全连接层映射到文本嵌入相同维度一并传入大模型,目的是使得模块提取的视觉嵌入能被大模型读懂并用于生成相应的文本。

Flamingo#

Flamingo 是 Google 在 2022 年提出的视觉语言模型(VLM),其不仅能理解视觉信息并生成流畅的文本,且能通过 跨模态的少样本学习,使其能够适应全新的视觉语言任务。

Flamingo

感知重采样器 (Perceiver Resampler) - 解决高维视觉表征输入给语言模型导致的开销问题。其使用固定数量的“潜在查询嵌入”,通过交叉注意力机制去“查询”和“总结”视觉嵌入,将变长的视觉嵌入浓缩为定长。

门控交叉注意力单元 (Gated Cross-Attention-Dense) - 解决浓缩的视觉嵌入如何有效注入给语言模型的问题。其使用门控交叉注意力单元,该单元插入可训练的交叉注意力层使得模型在生成文本的时候可以参考图像内容。并且通过门控机制来保证训练初期的稳定性,让模型能够平滑地适应多模态输入。

该模型使用了注意力掩码来处理交错的图文序列,使得每一个文本 Token 在计算注意力时只会关注紧邻其前一张图片的视觉 Token。并且更早的图片已经通过交叉注意力融入到文本表示中,因此能够泛化到任意数量的视觉输入而不需要在训练中见过同等数量输入。

LLaVA#

LLaVA 是 Microsoft 在 2023 年提出的通过 指令微调 的方式来增强模型的零/少样本学习能力,从而实现端到端的多模态系统 (基于多模态输入来生成连贯的问答、描述、推理)。

LLaVA

预训练模态对齐 - 为语言模型训练一个的“模态对齐器”。只更新线形投影层,冻结视觉编码器和语言模型权重。对于图像 Xv\small X_v,随机采样一个问题 Xq\small X_q,要求助手简要描述图像,真实答案 Xa\small X_a 是原始标题。

端到端微调 - 只更新语言模型和线形投影层,冻结视觉编码器权重。将问题和上下文作为 XInstruct\small X_{\text{Instruct}},推理过程和答案作为 Xa\small X_a,进行单论对话微调。

指令跟随数据集构建过程 - 将带有 Caption 和 BBox 信息的 COCO 数据集提供给 GPT 让它输出三种指令数据,分别是对话数据、详细描述数据和复杂推理数据,形成 LLaVA-Instruct-158K 数据集。

Qwen-VL#

Qwen-VL 是 Alibaba 在 2023 年提出的大规模视觉语言模型(LVLM),其核心目标是构建一个能够统一理解图像、文本甚至更多模态输入的模型,以掌握真实世界应用中的多样化能力。

Qwen-VL

关注架构中的 “适配器”,其使用一组可训练 Query,通过单层交叉注意力模块来压缩视觉编码器输出的视觉嵌入,并引入 2D 绝对位置编码来保留图像位置信息。并且通过三阶段训练之后的模型在细粒度识别、多语言 OCR、视觉定位等方面具备强大的能力。

Qwen2-VL

Qwen2-VL 旨在解决现有 LVLMs 中存在的固定输入尺寸、依赖 CLIP 风格视觉编码器的问题,提出了:1)Naive Dynamic Resolution - 将 ViT 结构中的绝对位置嵌入修改为 2D-RoPE,合并输出特征图上的 2x2 Visual Token 为 1 个,并添加 <|vision_start/end|> 特殊标记;2)M-RoPE - 将原始 1D-RoPE 分解为时间、宽度和高度三个部分,并为不同的模态数据分配不同的位置 ID 组合。

高效训练技术#

3D 并行训练#

3D 并行

数据并行 (Data Parallelism / DP) - 该方法将完整的模型参数和优化器状态同步至所有参与训练的设备,并将全局批次划分成多个小批次给每个设备,然后执行前向/反向传播计算梯度,通过 All-Reduce 操作对各设备计算后的梯度进行聚合,并确保所有计算设备基于统一的梯度进行更新。优点是实现简单,能有效扩展训练的吞吐量。缺点是每个设备都需要存储完整的模型参数、梯度和优化器状态,

流水线并行 (Pipeline Parallelism / PP) - 该方法将模型的不同层计算划分为多个阶段,并分配到不同的设备上,比如 24 层划分为 4 个阶段,每台设备处理 6 层。并且需要将输入的小批次进一步划分为微批次(Micro-Batch),当第一台设备的微批次的前向传播完成后,将中间值发送给第二台设备,当第二台设备开始处理第一个微批次的时候第一台设备开始处理第二个微批次,全部处理完成之后按相反的顺序进行反向传播。优点是降低了单台设备的显存占用,且通信开销较低。缺点是存在 “流水线气泡”,即流水线的启动和结束会存在设备空闲,导致部分计算资源浪费,因此有效进行模型切分是关键,需要保证计算的负载均衡。

张量并行 (Tensor Parallelism / TP) - 该方法将计算过程中的参数矩阵按列/行分块并分配到不同的设备上,然后并行地执行矩阵乘法,最后将结果合并。需要注意针对不同的算子类型采用不同的切分方法。优点是解决了单卡显存瓶颈问题。缺点是引入了大量的通信开销,因为每一层的计算需要多次合并操作,对带宽的要求较高,因此 TP 通常在节点内的多台设备上进行。

专家并行 (Expert Parallelism / EP) -

零冗余优化器 (ZeRO)#

该方法由 DeepSpeed 团队提出,旨在解决 DP 中的内存冗余问题,其通过 分片存储 策略,将模型参数、优化器状态和梯度分散到不同的设备上,从而减少单设备的显存需求。

  • ZeRO-1 - 将优化器状态平摊到每台设备上,而模型参数和梯度各自保留;
  • ZeRO-2 - 在 ZeRO-1 的基础上,将梯度也平摊到每台设备上;
  • ZeRO-3 - 在 ZeRO-2 的基础上,将模型参数也平摊到每台设备上。

激活重计算#

激活重计算也称为梯度检查点 (Gradient Checkpointing),该技术在前向计算的过程中保留部分激活值,在反向传播的过程当中重新激活需要的激活值,从而达到节约显存的目的。

混合精度训练#

混合精度训练指的是同时使用半精度浮点数 (2 个字节) 和单精度浮点数 (4 个字节) 进行运算,以实现显存开销减半、训练效率翻倍的效果。即在前向/反向传播中使用半精度计算,在参数更新的时候使用单精度计算。

常见的半精度浮点数表示方式为 FP16,包含 1 位符号位、5 位指数位、10 位尾数位。进一步 Google 研究人员开发出了 BF16,其包含 1 位符号位、8 位指数位、7 位尾数位,表示范围可以达到 103810^{38} 数量级,在模型训练中被广泛使用。

长上下文#

Advancing Transformer Architecture in Long-Context Large Language Models

幻觉#

Siren’s Song in the AI Ocean: A Survey on Hallucination in Large Language Models

评估#

Evaluating Large Language Models: A Comprehensive Survey

Credit#

大语言模型
https://k1tyoo.ink/blog/dl/llm
Author K1tyoo
Published at January 14, 2025