Browse this library

Chinese source article

2.4.1 · 大模型持续预训练与参数高效适配

预训练大模型上的持续学习分三层: 继续预训练 (学习率重新升温, 回放比例, 数据配比), 指令与任务的持续微调 (TRACE 基准, Continual-T0, 微调破坏安全对齐), 以及冻结骨干的参数高效方法 (L2P 提示池, O-LoRA, InfLoRA). 本文给出各论文的公式和表格数字, 并讨论 Task Arithmetic, TIES, DARE 等模型合并方法能替代顺序训练到什么程度.

View original Markdown ↗

3.5.1 继续预训练

预训练大模型上的持续学习主要有三条线: 继续预训练, 在指令与对齐数据上的持续微调, 冻结骨干的参数高效适配 (L2P, O-LoRA, InfLoRA). 另有一类做法不做顺序训练, 直接合并独立微调的模型. 第 1.1 篇第 4.2 节算过显存: 70B 模型仅 BF16 权重就是 140 GB, 混合精度 Adam 全量训练每参数约 16 字节. 资源之外, 大模型上的持续学习还有三点与传统设定不同.

  • 起点是一个已经学了大量知识的模型. 传统设定从随机初始化出发, 遗忘的对象是前几个任务; 大模型还可能遗忘预训练阶段获得的通用能力. 评测要覆盖通用能力, 不能只看序列里的任务.
  • 任务边界模糊. 继续预训练是连续的语料流, 指令微调的「任务」划分常常是人为的. 很多需要任务边界的方法 (第 2.1 篇的 EWC, SI) 不能直接使用.
  • 旧数据通常拿不到. 开源模型一般不公开预训练语料, 回放只能用分布相近的公开数据代替.

后面的讨论按更新范围分三层:继续预训练更新全部参数,数据是无标签语料;指令和任务的持续微调更新全部或部分参数,数据是有标签的指令;参数高效方法冻结骨干,只训练提示或低秩矩阵。三条路线汇合到模型合并与版本管理问题。

1. 继续预训练

学习率. 预训练的学习率通常衰减到峰值的一小部分. 在衰减后的学习率上继续训练, 模型几乎学不动新分布. Gupta et al. (2023) 用 Pythia 410M 研究这个问题: 先在 Pile 上训练 300B token, 再在 SlimPajama 上继续训练 297B token. 学习率先线性升温, 再余弦衰减, 峰值取 1.5×10−41.5\times10^{-4}, 3×10−43\times10^{-4}, 6×10−46\times10^{-4} 三档. 主要发现:

  • 重新升温先让 loss 上升. 升温阶段上游 (Pile) 和下游 (SlimPajama) 的 loss 都会先上升. 长期看, 升温后的模型在下游上超过从头训练的模型.
  • warmup 长度不重要. 对 297B token 的日程比较 0%, 0.5%, 1%, 2% 四种 warmup 比例, 结果差别很小.
  • 峰值决定适应与遗忘. 峰值越高, 下游适应越多, 上游遗忘也越多. 提高峰值会一致地抬高 Pile 上的最终 loss.
  • 从最新的 checkpoint 出发最好.

困惑度和 loss 是连续量, 比较时用「降低多少」或比值, 不用百分点. Code Llama (Rozière et al., 2023) 从 Llama 2 出发继续训练, 发现沿用 Llama 2 的原学习率效果最好: 7B 和 13B 为 3×10−43\times10^{-4}, 34B 和 70B 为 1.5×10−41.5\times10^{-4}. 这与微调阶段降学习率的惯例相反. Code Llama 初始阶段训练 500B token, 是 Llama 2 预训练 2T token 的四分之一, 更接近第二次预训练.

第二次预训练改动参数的幅度也接近预训练的量级. DARE 论文 (Yu et al., 2024) 给出了一个可以量化的差别: SFT 前后的参数差 (delta) 通常在 0.002 以内, 而经过继续预训练后可以很快达到 0.03 左右. 这时随机丢掉 delta 的 DARE 不再可用; 只丢掉 10% 的微调后参数 (预训练参数加 delta), 性能就会崩溃到接近零. 继续预训练对参数的改动比微调大一个数量级, 第 4 节的模型合并方法大多以「增量很小」为前提, 不能直接用在继续预训练得到的模型上. 回放与数据配比.

Ibrahim et al. (2024) 用 405M 模型先在 Pile 上训练 300B token, 再分别继续训练 SlimPajama (300B token, 弱分布偏移) 和德语 Common Crawl (200B token, 强分布偏移). 每次继续训练都重置优化器状态. 回放采用算力等价的方式: 回放的旧数据 token 从新数据预算中扣除, 总 token 数不变. 设新数据预算为 N1N_1 个 token, 回放比例为 ρ\rho, 则实际看到的新数据为 (1−ρ)N1(1-\rho)N_1, 旧数据为 ρN1\rho N_1. 强分布偏移下的最终验证 loss (论文 Table 2):

设置 Pile loss 德语 loss 平均
无回放 3.56 1.11 2.34
1% 回放 2.83 1.12 1.97
5% 回放 2.57 1.12 1.85
25% 回放 2.33 1.16 1.75
50% 回放 2.24 1.22 1.73
并集从头训练 (500B) 2.26 1.25 1.75

1% 回放就把 Pile loss 从 3.56 降到 2.83, 德语 loss 只从 1.11 升到 1.12. 回放到 25% 时平均 loss 与并集从头训练持平. 弱分布偏移下, 0.5% 回放把 Pile loss 从 2.44 降到 2.27, 5% 回放的平均 loss 为 2.37, 并集从头训练为 2.35. 论文据此给弱偏移选 5% 回放, 强偏移选 25%. 在已有 Pile 模型的基础上, 这样做的额外算力只有从头训练的一半 (弱偏移 300B 对 600B) 或 40% (强偏移 200B 对 500B). 这些数字的前提是回放的确实是原始的 Pile. 用替代语料时效果会打折扣, 需要自己测.

公开的继续预训练配方里也混着旧数据. Code Llama 初始阶段的数据中, 代码占 85%, 与代码相关的自然语言占 8%, 一般自然语言占 7%. 后两部分的作用之一就是回放, 保住自然语言能力. Code Llama - Python 在此基础上再训练 100B token, 配比为 Python 75%, 其他代码 10%, 与代码相关的自然语言 10%, 一般自然语言 5%: 每往专门方向走一步, 前一阶段的数据都以一定比例留在新阶段里. Instruct 阶段又混入 6% 的代码数据和 2% 的自然语言数据作为 rehearsal. 这些比例没有系统的消融, 与 Ibrahim et al. 的「强偏移约 25% 回放」处在同一量级.

回放的反面是新数据取多少. 知识随时间变化时, 继续预训练要处理的是「新事实替换旧事实」, 未变的那部分知识要不要再训一遍, 就是这里的回放问题. Jang et al. (2022) 的 TemporalWiki 比较相邻的英文 Wikipedia 快照, 只取变化的部分作为训练语料 (TWiki-Diffsets), 用对应的 Wikidata 快照构造评测集 (TWiki-Probes), 把事实分为未变和已变两类. 论文报告, 只在差异数据上做持续学习, 困惑度与在整个快照上训练相当或更好, 计算量少 12 倍. 数据规模可以说明这个差距从哪来: 论文用 2021 年 8 月到 12 月的月度快照, 每个 Wikipedia 快照约 630 万篇文章, 46 亿到 47 亿 token; 相邻两月的差分集约 30 万篇文章, 3.5 亿到 3.8 亿 token, 不到完整快照的十分之一. 第 3.2 篇在基准部分给出了探针的构造细节. 目标函数、token 混合与梯度冲突. 继续预训练仍然优化下一个 token 的负对数似然. 设语料域为 dd, 域采样权重为 αd\alpha_d, 有效 token 掩码为 mtm_t, 混合目标可以写成

Lmix(θ)=∑dαd Ex∼Dd[−∑tmtlog⁡pθ(xt∣x<t)],∑dαd=1.(1a)\mathcal L_{\mathrm{mix}}(\theta)=\sum_d\alpha_d\,\mathbb E_{x\sim\mathcal D_d}\left[-\sum_t m_t\log p_\theta(x_t\mid x_{<t})\right],\qquad \sum_d\alpha_d=1. \tag{1a}

αd\alpha_d 应对应实际进入损失的 token 比例, 不一定等于文档或样本的抽样比例. 长文档、截断、padding 和损失掩码都会改变有效贡献. 若按样本数混合而不核对有效 token, 标称的 5% 回放可能并不是梯度里的 5%. 算例一: 从 token 预算反推样本数. 一个训练步预算 1,000,000 个有效 token, 回放比例 ρ=5%\rho=5%, 则旧域应提供 50,000 token, 新域提供 950,000 token. 若旧样本平均有 500 个有效 token, 新样本平均有 1,000 个, 这一批约需 100 个旧样本与 950 个新样本. 此时旧样本占样本总数的 100/1050≈9.52%100/1050\approx9.52%, 却只占 token 的 5%. 反过来若机械地抽 5% 旧样本, 旧 token 占比会低于 5%. 所以配比记录至少要同时报告样本数、原始 token、有效 token 与总训练 token. 遗忘也可以从梯度局部解释. 记旧域和新域在当前位置的梯度为 goldg_{\mathrm{old}}、gnewg_{\mathrm{new}}, 混合梯度为

gmix=ρgold+(1−ρ)gnew.(1b)g_{\mathrm{mix}}=\rho g_{\mathrm{old}}+(1-\rho)g_{\mathrm{new}}. \tag{1b}

若 gold⊤gnew<0g_{\mathrm{old}}^\top g_{\mathrm{new}}<0, 沿新域梯度下降会在一阶近似下抬高旧域损失. 新语料很少出现旧域稀有 token 或旧上下文时, 它们没有校正梯度; 与新域共用的词表、注意力和前馈参数却仍被更新, 因而条件分布会漂移. 这比把遗忘描述成「旧知识被删掉」更准确.

取一个二维玩具例子, gold=(1,0)g_{\mathrm{old}}=(1,0), gnew=(−0.6,0.8)g_{\mathrm{new}}=(-0.6,0.8). 则 gold⊤gmix=−0.6+1.6ρg_{\mathrm{old}}^\top g_{\mathrm{mix}}=-0.6+1.6\rho. ρ=25%\rho=25% 时结果为 −0.2-0.2, 局部冲突仍在; 只有 ρ>37.5%\rho>37.5% 才变为正. 这个计算只说明回放比例取决于梯度几何, 不能用它推出真实模型需要 37.5% 回放. 同样, 旧域验证 loss 上升能证明分布拟合变差, 不能单独定位哪些事实丢失; loss 不变也不能证明问答、安全或指令遵循没有退化.

1.1. 指令与任务的持续微调

TRACE. Wang et al. (2023) 的 TRACE 是为对齐后的大模型设计的持续学习基准, 由 8 个数据集组成: 领域任务 ScienceQA, FOMC, MeetingBank; 多语言任务 C-STANCE (中文立场检测) 和 20Minuten (德语文本简化); 代码补全 Py150; 数学推理 NumGLUE 的两个子集. 每个任务采样 5000 条, 分类任务按类别均衡. 除了传统的持续学习指标, TRACE 增加了三个指标: General Ability Delta (通用能力的变化), Instruction Following Delta (指令遵循能力的变化), Safety Delta (安全性的变化). 论文的主要发现:

  • 在 TRACE 上依次训练后, 通用能力明显下降, 数学和推理最严重. Llama-2-Chat 13B 的 GSM8K 准确率从 28.8% 降到 2%.
  • 多语言能力反而普遍提高. Llama-2-Chat 7B 的 TydiQA F1 从 23.47 升到 33.23.
  • 全参数训练比 LoRA 更容易拟合目标任务, 通用能力的下降也更明显.
  • 指令遵循能力在持续学习后显著下降.

论文还提出 Reasoning-augmented Continual Learning (RCL): 训练时让模型先生成任务分析和推理过程. 论文报告这样做既提高了目标任务的表现, 也更好地保住了模型原有的能力. TRACE 的数据说明, 在大模型上只看序列内任务的平均准确率是不够的. 序列任务都学会了, GSM8K 却从 28.8% 掉到 2%, 这种遗忘只有在序列外的通用基准上才能看到. Continual-T0.

Scialom et al. (2022) 从 T0 3B 出发. T0 已经在 50 个数据集上做过多任务指令微调, 在 12 个未见数据集上有零样本能力. 他们在 T0 上依次学习 8 个新的生成任务 (连同之前的数据集共 70 个), 用回放防止遗忘: 每个旧训练任务取 100,000 条样本, 回放比例 rr 取 0, 0.25%, 1%, 1% 对应每个任务 1,000 条. 结果是在 1% 回放下, 模型几乎保持了旧数据集上的全部表现, 未见数据集上的零样本能力也得以保持. 论文还观察到, 模型能把学过的指令以训练中从未出现的方式组合起来. 论文把成功归因于自监督预训练. 这个结论与 Ibrahim et al. 的继续预训练实验一致: 对一个已经在大量数据上训练过的模型, 很少的回放就够了. 微调与安全对齐. Qi et al. (2023) 研究了微调对安全对齐的影响, 把风险分为三级:

  1. 显式有害样本: 用 10 条对抗设计的有害样本微调 GPT-3.5 Turbo, 通过 OpenAI 的接口花费不到 0.20 美元, 模型就会响应几乎所有有害指令.
  2. 身份转换数据: 微调数据不含有害内容, 但让模型总以肯定的前缀开头回答.
  3. 良性数据: 只用 Alpaca, Dolly, LLaVA-Visual-Instruct 这类常用的良性数据集微调, 安全对齐也会被削弱, 程度较轻.

论文认为第三种情况可能来自对初始对齐的灾难性遗忘, 也可能来自有用性与无害性之间的固有张力. 从持续学习的角度看, 安全对齐是模型的一项「旧能力」, 每次微调后都应当和其他能力一起评测. TRACE 的 Safety Delta 就是为此设计的. SFT 与继续预训练的边界.

两者都可能更新同一组参数, 两者的监督信号不同. 继续预训练对完整文档做因果语言建模, 主要改变领域词汇、事实、文体与条件分布; SFT 把输入组织成指令和回答, 通常只让回答 token 计入损失, 主要学习「收到这种请求时怎样作答」. 因而领域文档上的 loss 下降不能直接推出指令遵循提高, SFT 基准提高也不能证明模型已系统吸收领域知识.

常见流水线是先用领域原文继续预训练, 再用少量领域指令做 SFT. 前一阶段解决覆盖面, 后一阶段建立调用知识的交互格式. 若只有结构化问答而没有大规模原文, 任务更接近 SFT; 若训练数据是新闻、论文或代码仓库的连续文本, 即使最终服务某个任务, 仍属于继续预训练. 两阶段都可能损害旧能力和安全对齐, 不能因为第二阶段数据「良性」就省掉安全回归测试. 比较两者时还要固定 tokenizer、模板、有效 token 数与更新参数范围, 否则无法把收益归因于目标函数本身.

1.2. 冻结骨干的参数高效方法

记号与思路. LoRA (Hu et al., 2022) 冻结预训练权重 W0∈Rd×kW_0\in\mathbb{R}^{d\times k}, 只训练一个低秩增量:

W=W0+BA,B∈Rd×r, A∈Rr×k, r≪min⁡(d,k)(1)W = W_0 + BA, \qquad B\in\mathbb{R}^{d\times r},\ A\in\mathbb{R}^{r\times k},\ r\ll\min(d,k) \tag{1}

本文统一用这套记号: AA 是降维矩阵 (把输入从 kk 维投到 rr 维), BB 是升维矩阵. 注意 O-LoRA 和 InfLoRA 两篇论文的记号与此不同, 下文会逐一对应. 每个任务训练一组独立的 LoRA 或提示, 推理时按任务切换, 就是第 2.3 篇参数隔离在大模型上的形式. 每个任务的增量只有 r(d+k)r(d+k) 个参数, 存储不是问题. 问题回到两处: 推理阶段如何知道用哪一组 (路由), 以及如果多组同时生效, 它们之间如何不干扰. L2P 处理前者, O-LoRA 和 InfLoRA 处理后者. L2P: 提示池. Wang et al. (2022) 的 Learning to Prompt 冻结 ImageNet 预训练的 ViT-B/16, 维护一个提示池 P={P1,…,PM}\mathbf{P} = {P_1, \dots, P_M}, 每个提示 Pi∈RLp×DP_i\in\mathbb{R}^{L_p\times D} 配一个可学习的键 kik_i. 对输入 xx, 先用冻结的 ViT 算出查询特征 q(x)q(x) (取 [CLS] 的输出), 再按匹配函数 γ\gamma (余弦距离) 选出最近的 NN 个键:

Kx=arg min⁡{si}i=1N⊆[1,M] ∑i=1Nγ(q(x),ksi)(2)\mathbf{K}_x = \operatorname*{arg\,min}_{\{s_i\}_{i=1}^{N}\subseteq[1,M]}\ \sum_{i=1}^{N}\gamma\big(q(x), k_{s_i}\big) \tag{2}

对应的 NN 个提示拼在输入嵌入前面, 送入 ViT, 取提示位置输出的平均做分类. 训练目标是

min⁡P,K,ϕ L(gϕ(fravg(xp)),y)+λ∑si∈Kxγ(q(x),ksi)(3)\min_{\mathbf{P}, \mathbf{K}, \phi}\ \mathcal{L}\big(g_\phi(f_r^{\text{avg}}(x_p)), y\big) + \lambda\sum_{s_i\in\mathbf{K}_x}\gamma\big(q(x), k_{s_i}\big) \tag{3}

第一项是分类损失, gϕg_\phi 是分类头; 第二项把被选中的键拉向查询特征, 使相似的输入选中相同的提示. 论文还可以加一个选择频率的惩罚, 让不同任务倾向于使用不同的提示. L2P 不需要任务标识, 路由由键和查询的匹配决定. Split CIFAR-100 (10 个任务, 每个任务 10 类, Class-IL) 上取 M=10M=10, N=5N=5, Lp=5L_p=5, 新增参数 46,080 个, 约为骨干的 0.05%. 论文 Table 1 的结果 (平均准确率 / 遗忘, %):

方法 缓冲区 平均准确率 遗忘
FT-seq-frozen 0 17.72 59.09
FT-seq 0 33.61 86.87
EWC 0 47.01 33.27
LwF 0 60.69 27.77
L2P 0 83.83 7.63
ER 每类 10 67.87 -
DER++ 每类 10 61.06 -
L2P-R 每类 10 84.21 -
ER 每类 50 82.53 -
DER++ 每类 50 83.94 -
L2P-R 每类 50 86.31 5.83
上界 (联合训练) - 90.85 -

论文称对比方法在同一环境下实现. 不存样本的 L2P 与每类存 50 个样本的 ER 相当. 5-datasets 基准上 L2P 为 81.14%. 在 CORe50 的 Domain-IL 设定下, 不存样本的 L2P 为 78.33%, 低于每类存 50 个样本的 ER (80.10%), 上界为 82.15%; 在类别分布随时间平滑变化的 Gaussian scheduled CIFAR-100 (任务无关设定) 上, L2P 为 88.34%, 高于同设定下存样本的 ER (82.63%). O-LoRA. Wang et al. (2023) 的 O-LoRA 为第 tt 个任务新建一组 LoRA, 之前各组冻结. 论文的 LoRA 记号是 ΔW=AB\Delta W = AB, 其中 A∈Rd×rA\in\mathbb{R}^{d\times r} 是升维的一侧, 对应式 (1) 里的 BB. 论文假设 LoRA 的列空间能刻画任务的梯度子空间, 要求新旧任务的子空间正交:

Oi,t=Ai⊤At=0(4)O_{i,t} = A_i^\top A_t = 0 \tag{4}

用式 (1) 的记号, 就是 Bi⊤Bt=0B_i^\top B_t = 0. 训练目标在任务损失上加正交惩罚:

L=−∑(x,y)∈Dtlog⁡pΘ(y∣x)+λ1∑i=1t−1∑j,k∥Oi,t[j,k]∥2(5)\mathcal{L} = -\sum_{(x,y)\in\mathcal{D}_t}\log p_\Theta(y\mid x) + \lambda_1\sum_{i=1}^{t-1}\sum_{j,k}\big\|O_{i,t}[j,k]\big\|^2 \tag{5}

LoRA 只加在注意力的 WqW_q 和 WvW_v 上. 推理阶段所有 LoRA 组同时生效, 不需要任务标识. 实验用 T5-large, 两个基准: 标准 CL 基准 (AG News, Amazon, Yelp, DBpedia, Yahoo 五个文本分类任务, 3 种顺序) 和 15 任务的长序列 (再加 GLUE 的 4 个, SuperGLUE 的 5 个和 IMDB, 每个任务 1000 条训练样本), 结果取 3 次运行均值. 论文 Table 2 的平均准确率 (%):

方法 标准基准 (3 种顺序均值) 15 任务 (3 种顺序均值)
SeqFT (顺序全量微调) 28.5 7.4
SeqLoRA (一组 LoRA 顺序训练) 43.7 1.6
IncLoRA (每个任务新增 LoRA, 无约束) 66.4 61.2
Replay 57.8 54.2
EWC 50.3 45.1
LwF 52.3 46.9
L2P 60.7 56.1
LFPT5 72.7 69.2
O-LoRA 75.8 69.6
ProgPrompt 75.1 77.9
PerTaskFT (每个任务单独模型) 70.0 78.1
MTL (多任务联合, 上界) 80.0 76.5

IncLoRA 与 O-LoRA 的差距 (标准基准 9.4 个百分点, 15 任务 8.4 个百分点) 就是式 (4) 正交约束的贡献. ProgPrompt 在 15 任务上更高, 但它为每个任务存一个提示, 推理时用任务标识选择, 与 PerTaskFT 一样依赖任务标识. InfLoRA. Liang & Li (2024) 的 InfLoRA 全称 Interference-Free Low-Rank Adaptation. 它的记号是 Wt=Wt−1+AtBtW_t = W_{t-1} + A_tB_t, 其中 Bt∈Rr×dIB_t\in\mathbb{R}^{r\times d_I} 是降维矩阵, At∈RdO×rA_t\in\mathbb{R}^{d_O\times r} 是升维矩阵, 对应式 (1) 的 AA 和 BB.

1.3. InfLoRA 的无干扰子空间

InfLoRA 与 LoRA 的区别在于降维矩阵不训练. 学第 tt 个任务前, 先设计好 BtB_t 并冻结, 只训练 AtA_t (初始化为零). 论文证明, 只训练 AtA_t 等价于在 BtB_t 的行空间 span{b1t,…,brt}\mathrm{span}{b_1^t, \dots, b_r^t} 内微调预训练权重. 只要让这个子空间与旧任务的梯度正交, 新任务的更新就不会干扰旧任务. 这个等价关系可以直接推出来. 层的输出为 e=Wt−1h+AtBthe = W_{t-1}h + A_tB_th, 由链式法则, AtA_t 的梯度为

∂L∂At=∂L∂e h⊤Bt⊤(5a)\frac{\partial\mathcal{L}}{\partial A_t} = \frac{\partial\mathcal{L}}{\partial e}\, h^\top B_t^\top \tag{5a}

学习率为 η\eta 时 AtA_t 走一步, 等效权重的…10237 tokens truncated…二阶矩、全部清零以及短暂重热身. 为了分离状态影响, 五组实验应从同一参数 checkpoint 出发, 看到相同的批次顺序, 并按实际参数位移而非训练步数对齐. 若清零状态组在相同位移下仍更快遗忘, 原因…2 tokens truncated… tokens truncated…能帮助模型离开狭窄解, 但会让稀有旧域样本的影响波动很大; 大 batch 使混合比例更稳定, 却可能让每一步都呈现相似的平均方向. 若总 token 固定而 batch 扩大, 更新次数随之减少, 优化轨迹不可直接相比. 应至少给出每次更新中新旧域样本数量的分布, 并检查某些 batch 是否完全没有回放数据. 分层组批可保证每步都有旧域证据, 但它改变了自然采样的协方差结构; 随机混合更忠于语料分布, 却可能连续多步只见新域. 两种组批方式需要单独做消融.

参数高效方法的比较必须先对齐可训练容量. LoRA 的 rank 从 8 增到 64, 可训练参数、表达子空间和优化难度都改变; adapter 的瓶颈宽度、插入层数与非线性同样决定容量; 软提示长度则影响可用的连续控制向量数量. 只写「LoRA 对 adapter」没有意义. 可以固定总可训练参数, 再比较不同放置位置; 也可以固定放置位置, 扫描容量曲线. 前者回答哪种结构更会利用预算, 后者回答各方法随预算如何扩展. 若某方法只在参数更多时占优, 结论应归因于容量, 而非名称.

LoRA 中 ΔW=sBA\Delta W=sBA, rank 给出代数上限, 实际有效秩还取决于奇异值谱. 两个 rank 都是 64 的模块, 一个可能只有前六个奇异值显著, 另一个则均匀使用几十个方向. 训练后应报告奇异值累计能量、稳定秩和不同层的谱形状. 若不断到来的任务把能量挤进少数方向, 后续更新更容易发生干扰; 若强制正交使每个任务占据独立方向, 容量会随任务数快速耗尽. 正交约束的价值不能只看当前任务保持率, 还要观察第十个、第二十个任务到来时是否已经没有足够的新方向.

低秩模块放在哪一层往往比 rank 本身更关键. 注意力投影影响信息路由, MLP 投影影响特征变换, embedding 与输出头直接牵涉词形和词频. 领域术语主要变化时, 靠近输入与输出的层可能更敏感; 需要新推理过程时, 中高层的注意力与 MLP 更重要. 可以用逐层冻结、逐层单独注入和成组注入来估计边际贡献. 若只在输出投影训练就能提升闭卷事实题, 却不能改善改写与组合题, 说明模块可能在调答案偏置; 若中层模块能在多种表达下稳定提升, 更像是形成了可复用表征.

LoRA 的缩放系数与初始化也会改变比较. 由于 BA=(cB)(A/c)BA=(cB)(A/c), 矩阵分解存在尺度不唯一, 但优化器对两个因子的更新并不尺度不变. 一个因子零初始化、另一个随机初始化可让初始函数保持不变, 却使第一步只有一个因子获得有效梯度. 持续任务中若每次新建模块, 早期学习速度会被这种不对称影响; 若复用旧模块, 初始化问题又变成旧方向偏置. 验收应记录因子初始化、缩放规则、是否合并进底座和合并后的数值精度, 避免把实现细节造成的差异解释成持续学习规律.

adapter 的瓶颈不是免费的隔离层. 串行 adapter 改变每层残差路径, 即使底座冻结, 也会让所有输入经过新增变换; 并行 adapter 将增量加到原输出, 关闭模块时更容易恢复底座. 多任务共享同一个 adapter 会发生参数干扰, 为每个任务单独保存又需要路由器识别输入属于哪个域. 路由错误时, 模块本身再优秀也无法使用. 应分别报告理想路由、学习路由和无路由混合三种结果, 并给出错路由代价矩阵: 把法律请求送到医学模块、把通用对话送到代码模块, 各自损失多少. 平均路由准确率无法显示少数高风险错配.

软提示与前缀方法把更新放入输入侧, 参数量小, 却会占用上下文或注意力缓存. 提示长度为 mm 时, 每层前缀键值会增加与 mm 成正比的缓存和注意力计算. 训练比较若忽略这部分推理成本, 会得到不完整的资源前沿. 更重要的是, 提示依赖底座对提示向量的解释方式; 底座升级后, 即使隐藏维度没有改变, 同一向量也可能触发不同特征. 可用固定探针输入比较升级前后的中间激活、输出分布与注意力模式, 再决定是否只做线性映射、重新蒸馏提示, 或彻底重训.

模块迁移应以功能等价为目标, 不能只最小化参数距离. 设旧底座与模块组成教师 f0,+f_{0,+}, 新底座与待迁移模块组成学生 f1,+f_{1,+}. 在代表性输入 xx 上, 可以联合匹配输出分布、选定层表征和行为约束. 输出蒸馏保留可观察功能, 表征对齐帮助重建接口, 行为约束防止学生复制教师的错误. 数据必须覆盖模块擅长区、边界区和普通输入; 若只采擅长区, 迁移后可能对所有请求都过度调用专项行为. 还要保留一组教师本来不会的题, 确认学生的新增能力来自新底座, 迁移目标没有把它压回旧水平.

底座升级的四格实验可以进一步拆出责任. 旧底座加旧模块给出历史系统, 旧底座加新模块估计模块训练收益, 新底座加旧模块测接口漂移, 新底座加新模块给出最终系统. 若第四格优于第一格而第三格严重下降, 说明新模块确实修复了接口; 若第三格已经很好, 重新训练模块可能没有必要; 若第二格也下降, 则训练数据或模块目标发生了问题. 对每项能力计算四格差值, 还能区分底座主效应、模块主效应与二者交互项, 不必用一句「升级后效果更好」掩盖来源.

密封测试集与合并系数的选择过程保持隔离. 在开发集扫描 α\alpha, 找到多个任务加权分数最高的点, 再在同一批题上报告结果, 会把测试信息泄漏到配方. 数据预先分为合并开发集、门槛验证集和密封测试集. 开发集用于选系数与裁剪率, 验证集只判断是否越过接受门槛, 测试集在配方冻结后打开一次. 若任务很少而无法再切分, 可以使用嵌套交叉验证: 外层留出任务或数据切片, 内层选择合并参数, 汇总外层结果. 所有尝试次数也要记录, 因为扫描一千组系数与只试十组具有不同的过拟合机会.

任务向量合并还受底座一致性限制. 两个模型即使架构相同, 只要起始 checkpoint、词表顺序或权重重参数化不同, 坐标相加就可能失效. 合并前要校验每个张量的来源哈希、shape、参数名与 tokenizer; 对采用旋转或置换等价的网络, 必要时先做神经元匹配. 模型输出相近并不意味着参数坐标天然对齐. 尤其当一个分支经历全量持续预训练, 另一个只做轻量 SFT, 二者位移尺度差距很大, 直接平均容易让大位移支配. 按整体范数归一化也可能放大原本微弱但噪声很高的分支, 因而需要层级尺度与功能验证共同决定权重.

合并后的校准变化常被准确率遮住. 分类或选择题准确率相同, 置信度可能显著变高; 生成任务的答案仍对, 拒答边界却可能移动. 需要检查负对数似然、期望校准误差、选择性回答曲线和安全拒答率. 若合并提升了新域正确率, 却让错误答案更自信, 部署时的风险可能上升. 温度缩放只能修正整体置信度, 无法恢复被破坏的知识, 因此校准后还要看分组误差: 旧域、新域、冲突事实和分布外输入是否得到一致改善.

知识内化与检索增强应按信息生命周期分工. 稳定、频繁调用且允许写入参数的规律适合内化; 变化快、需要出处或有删除要求的事实更适合外部检索; 介于两者之间的能力可以先由模块承载, 积累足够证据后再蒸馏进底座. 一个简单决策量是单位请求的摊销成本: 参数更新有一次性训练与验证成本, 检索有持续的索引、查询和上下文成本, 模块还有版本与路由成本. 成本之外还要加入错误恢复时间. 外部文档写错可以替换索引, 合并进参数的错误往往需要反向编辑或重新训练, 这一差异在高变动领域比单次推理费用更重要.

闭卷测试也不能直接证明知识已经进入底座. 训练资料可能残留在提示模板、缓存、工具返回或评测预处理里. 应在无网络、无索引、清空会话状态的环境运行, 并检查请求日志中没有隐藏上下文. 随后做表达变换: 实体别名、问题倒置、多跳组合、否定条件和不同语言. 若模型只在原句附近成功, 得到的是表面记忆; 能把事实用于新的约束推理, 才说明知识具有一定可调用性. 即便如此, 也只能说在测试分布内观察到内化迹象, 不能推出任意场景都会稳定调用.

冲突知识需要测概率质量如何迁移. 对新旧两个答案分别计算条件概率或成对偏好, 在训练过程中观察质量从旧答案向新答案转移的曲线. 理想更新不会把与该实体相关的全部答案一起扰动. 可以加入邻近实体、同关系实体和同词形实体作为控制组, 估计影响半径. 如果只更新「甲公司的负责人」, 却连其他公司的负责人问题都发生系统偏移, 说明模型学到了过宽的词法关联. 对时间变化事实, 还应允许旧答案在历史条件下保留较高概率, 这比无条件压低旧答案更符合版本化知识.

删除与遗忘请求要区分「不再输出」和「内部不可恢复」. 通过提示约束压制答案, 只能改变表面行为; 移除 adapter 只删除模块中的增量; 从检索库删除文档也不影响已经写入底座的内容. 若目标是参数层遗忘, 应设计成员推断、提示绕过、改写查询和相关表征探针, 并与从未见过该数据的模型比较. 严格证明某条信息完全不存在通常做不到, 报告应改为在给定攻击集合与置信水平下没有检测到显著残留, 同时明确攻击能力边界.

统计判定要以独立训练运行为单位. 一次训练里的一万道题不是一万个独立的训练样本, 它们共享同一个 checkpoint. 题级 bootstrap 可估计评测抽样误差, 却不能代替跨随机种子的训练方差. 至少应同时给出种子间均值与区间、每个种子内部的题级区间, 并使用配对设计: 不同方法尽量共享初始模型、数据顺序和评测样本. 配对差值通常比两个独立均值更灵敏, 也能减少某个种子本来就容易的影响. 任务顺序是研究对象时, 则应把顺序作为更高层随机因素, 不能把同一顺序下的多个 checkpoint 当成独立重复.

多指标门槛还会带来多重选择问题. 若研究者查看几十个旧域、新域和安全指标, 再挑出有利的几个, 偶然波动很容易被包装成提升. 实验前应指定主指标、关键风险指标和探索指标. 主指标决定收益是否成立, 风险指标拥有否决权, 探索指标用于解释机制. 对大量子任务可报告经过校正的区间, 或先按能力族聚合再检验. 统计程序最终要让「接受该更新」对应一个事先可执行的判据, 形式显著却无法支持决策的结果没有多少价值.

可以把最终门槛写成可计算规则. 比如新域主指标相对基线至少提升三点, 百分之九十五置信下界仍大于一点; 旧域宏平均下降不超过一点, 任何高风险子集下降不超过两点; 安全违规率的置信上界不得高于既定阈值; 跨三个训练种子均保持方向一致. 候选若只满足平均条件而某一高风险域越界, 直接拒绝; 若区间过宽, 增加种子或样本, 而非取最有利的点估计. 门槛数值由业务风险决定, 但确定以后不能因某次候选「看起来很有希望」临时放宽.

回滚演练要在发布前真的执行一次. 全量更新需要恢复旧 checkpoint、优化器无关的推理配置、tokenizer 与服务路由; PEFT 更新要验证卸载模块后输出确实回到底座基线; 模型合并要能重新定位所有源向量和系数; 检索更新要恢复索引快照与文档权限. 回滚后的系统用固定金丝雀请求比对输出哈希或容差范围. 若参数已经合并而源增量没有保留, 所谓回滚只能加载整份旧模型, 存储与切换时间需要计入恢复目标.

每个发布候选应留下足以复算结论的最小档案: 基础模型与 tokenizer 哈希, 训练代码版本, 数据清单与许可状态, 各来源 token 和文档计数, 去重规则, 采样日程, 学习率与优化器状态处理, 随机种子, PEFT 插入位置与容量, 合并公式与系数搜索范围, 逐 checkpoint 指标, 失败运行, 统计脚本和回滚结果. 它让下一轮更新能够回答一个很具体的问题: 能力变化究竟来自新数据、训练路径、模块容量、合并选择还是评测波动. 持续学习的难处就在这里——每一轮都继承此前的选择; 只有证据链也随版本一起保存, 后来的改进才不会建立在无法解释的偶然结果上.

遗忘还应沿训练深度拆开观察. 对同一批旧域探针, 记录各层隐藏状态与原模型的中心核对齐度、线性探针可分性和最终输出变化. 底层表征相近而输出变差, 干扰可能集中在后部读出与决策边界; 中层已经明显漂移, 再靠输出校准通常救不回来. 这类诊断要使用与训练目标无关的探针, 并设置随机投影和未更新模型作为参照. 表征指标本身不能替代行为结果, 但能指导下一轮将回放放到哪些层、是否冻结 embedding、是否给某些投影单独降低学习率.

梯度冲突也可以在训练前小规模估计. 从新域与若干旧域各抽一批样本, 在相同参数点计算梯度余弦与范数比. 余弦长期为负的旧域是重点回放对象; 余弦接近零但范数远小于新域时, 它虽然方向不冲突, 仍会被新域更新淹没. 只看全模型余弦会抵消层间差异, 因此还要按注意力、MLP、归一化与输出头分组. 若冲突主要集中在少数层, 全局降低学习率会牺牲新域学习速度, 分层学习率、局部冻结或在这些层增加旧域批次更有针对性. 训练后的实际遗忘若与预估冲突完全无关, 说明一阶梯度几何不足以解释路径, 需要检查曲率与数据顺序.

曲率影响可以用局部损失切片理解. 沿新域更新方向 uu 和旧域敏感方向 vv 构造二维平面 θ+au+bv\theta+a u+b v, 测量新旧损失随 a,ba,b 的变化. 若新域下降方向立即让旧域损失陡升, 两个目标在当前位置存在尖锐权衡; 若附近有一条弯曲低损路径, 优化器与日程可能尚未找到它. 这种切片只覆盖局部平面, 不能证明高维空间没有更好的路径, 却能比较不同 replay 比例是否把模型带入更平坦的交汇区. 与参数范数相比, 损失切片直接展示位移的功能代价.

对参数模块还要测容量饱和的早期信号. 每轮任务后计算新增方向相对既有子空间的投影比例、模块输出范数和有效秩. 新方向几乎全部落入旧子空间, 同时新任务损失降不下去, 说明当前容量不够; 有效秩持续增长而保持率稳定, 说明模块仍在利用空余方向; 输出范数不断增大但有效秩不变, 则可能只是用幅度覆盖旧模块. 此时盲目增加训练步数会强化竞争, 更合理的选择是扩 rank、拆分路由模块或把稳定能力蒸馏回底座后释放模块容量.

线上灰度可以验证离线门槛没有覆盖的分布, 但灰度指标也需要因果对照. 将用户或请求稳定随机到旧版与候选版, 保持检索索引、解码参数和安全策略一致; 对长会话按会话而非单轮请求分桶, 防止同一上下文跨版本. 观察人工纠错率、任务完成率、拒答变化和严重事件, 同时按新域、旧域与未知域分层. 若候选版触发更多工具调用, 延迟和成功率变化可能来自工具链, 应进一步做模型版本与工具开关的二乘二对照. 灰度发现越界就按预演路径回滚, 而非继续收集到结果显著.

一轮更新结束后还应保留「没有采用的方案」. 失败方案记录预算、关键超参、失败指标和原因判断, 后续数据分布改变时可以重新检验, 也能避免团队反复踩同一个坑. 原因判断要和观察分开: 「旧域下降三点」是结果, 「回放不足」只是待验证解释. 下一轮通过提高回放、保持其他条件不变来验证; 若下降仍在, 再检查学习率、优化器状态和容量冲突. 这种逐轮排除让持续预训练从一次配方搜索变成可积累的研究过程.

参考文献

  1. Gupta, K., et al. (2023). Continual Pre-Training of Large Language Models: How to (re)warm your model?. arXiv:2308.04014.
  2. Ibrahim, A., et al. (2024). Simple and Scalable Strategies to Continually Pre-train Large Language Models. arXiv:2403.08763.
  3. Rozière, B., et al. (2023). Code Llama: Open Foundation Models for Code. arXiv:2308.12950.
  4. Jang, J., et al. (2022). TemporalWiki: A Lifelong Benchmark for Training and Evaluating Ever-Evolving Language Models. EMNLP 2022.
  5. Wang, X., et al. (2023). TRACE: A Comprehensive Benchmark for Continual Learning in Large Language Models. arXiv:2310.06762.
  6. Scialom, T., Chakrabarty, T., & Muresan, S. (2022). Fine-tuned Language Models are Continual Learners. EMNLP 2022.
  7. Qi, X., et al. (2023). Fine-tuning Aligned Language Models Compromises Safety, Even When Users Do Not Intend To!. ICLR 2024.
  8. Hu, E. J., et al. (2022). LoRA: Low-Rank Adaptation of Large Language Models. ICLR 2022.
  9. Wang, Z., et al. (2022). Learning to Prompt for Continual Learning. CVPR 2022.
  10. Wang, X., et al. (2023). Orthogonal Subspace Learning for Language Model Continual Learning. Findings of EMNLP 2023.
  11. Liang, Y.-S., & Li, W.-J. (2024). InfLoRA: Interference-Free Low-Rank Adaptation for Continual Learning. CVPR 2024.
  12. Ilharco, G., et al. (2023). Editing Models with Task Arithmetic. ICLR 2023.
  13. Yadav, P., Tam, D., Choshen, L., Raffel, C., & Bansal, M. (2023). TIES-Merging: Resolving Interference When Merging Models. NeurIPS 2023.
  14. Yu, L., Yu, B., Yu, H., Huang, F., & Li, Y. (2024). Language Models are Super Mario: Absorbing Abilities from Homologous Models as a Free Lunch. ICML 2024.