跳到主要内容

持续微调而不污染数据:生产流水线指南

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数运行持续微调的团队都以同样的方式发现了污染问题:每周评估指标持续提升,团队欢欣鼓舞,然后某个用户反馈模型"变差了"。一旦深入排查,你才意识到你的评估基准已经悄悄地泄漏到训练数据中好几个月了。每一个看起来像能力提升的指标,其实不过是记忆。

数字比直觉更糟糕。LLaMA 2 的 MMLU 样本中有超过 16% 被污染——其中 11% 属于严重污染(超过 80% 的词元重叠)。GPT-2 在被污染的基准上比干净基准的得分高出 15 个百分点。这不是边缘案例。在持续微调循环中,污染是默认结果,除非你从架构层面明确加以防范。

本文介绍从用户反馈中持续运行微调所需的生产工程——在不损害评估信号、不导致模型遗忘早期能力、不降解无人手动审核的安全属性的前提下实现这一目标。

为什么持续微调不同于一次性训练

在一次性训练中,污染预防相对简单:在训练开始前划分测试集,训练期间绝不触碰,最后评估一次。时间边界清晰。

持续微调从三个方面打破了这一模型。

首先,你的评估基准是静态的,但训练数据是实时流。随着用户交互的积累,某个训练样本与评估样本相似的概率单调递增。如果你的用户规模足够大、时间跨度足够长,你最终一定会看到与保留样本高度相似的内容出现在训练集中。

其次,反馈循环会产生自我强化的错误。如果模型以某种风格回答问题,用户认可了这个答案,这次交互就成为训练信号。但如果模型以系统性的方式犯错——比如幻构了某个统计数字而用户没有察觉——你现在训练的就是充满信心的错误答案。除非你专门针对该失效模式设计了评估,否则评估指标不会捕捉到这一问题。

第三,安全对齐在迭代之间会逐渐退化。仅需 10 个精心设计的对抗样本,就足以破解 GPT-3.5 Turbo 的安全护栏。即使是 50—100 个完全良性的样本,也可能在恶意软件和经济伤害等类别中降低对齐程度。当你在每次迭代之间不进行人工审核的情况下持续运行微调时,安全退化是一种无声积累的风险。

数据路由架构

污染预防的基础是训练数据流和评估数据流之间严格的物理隔离。这两个流水线绝不能共享状态。

架构如下:所有用户交互首先经过一个分类网关。网关的任务是将每次交互路由到两个地方之一——训练流水线或评估流量桶。评估流量经过质量审核采样,用于更新保留指标;它绝不触碰微调数据集。

在训练流水线内,每个新增样本在写入训练存储之前都需经过污染检查。该检查基于哈希的近似重复检测,对照评估样本注册表进行比对。如果某个训练样本与任何评估样本过于相似——以 5-gram 的 Jaccard 相似度衡量——该样本将被丢弃。

评估基准本身存储在一个独立的、只可追加的存储中,并设有访问控制。规则很简单:微调循环中的任何组件都不能读取它。基准会定期更新,但只能通过受控流程进行,该流程会在接受新基准样本之前,显式检查其是否已存在于训练数据中。

有一个实现细节非常重要:路由用户流量的网关必须与微调作业运行在独立的代码路径上。如果同一个服务既读取路由网关又向训练存储写入,你就制造了一条通过共享状态引入污染的路径。应使用具有严格读写分离的特征存储抽象。

规模化污染检测

基于 MinHash 和局部敏感哈希(LSH)的哈希去重是在规模化场景下检测近似重复的实用工具。该方法将每个文档转换为字符 n-gram 的集合,应用 N 个哈希函数生成签名,然后使用 LSH 分桶来找出 Jaccard 相似度较高的候选对。

实际性能在生产中足够可用:10 万个文档可在普通硬件上四分钟内完成去重。在万亿词元规模下,使用并行滚动多项式哈希的 GPU 加速变体可在数小时内完成处理。对于大多数持续微调工作负载,更简单的 CPU 实现的速度足以使其成为实时摄取流水线的一部分,而无需作为批处理作业运行。

需要调整的关键参数是相似度阈值。阈值过低会产生误报——因为样本与评估样本表面相似而被丢弃的合法训练样本。阈值过高则会漏掉改写后的污染内容。对于大多数应用,5-gram 相似度超过 0.8 Jaccard 相似度是一个合理的起点。

除哈希检测之外,还有一类方法关注模型内部。其中最稳健的(DICE——检测分布内污染)通过测量污染样本与未污染样本在隐藏状态之间的欧氏距离,识别模型中对给定数据最敏感的层。在这些内部表示上训练的小型分类器,在真实污染场景下可达到 99.5—99.9 的 AUROC,预测污染与实际基准虚高之间的 R² 为 0.61—0.75。其局限性在于,你需要已知的污染样本来训练分类器——它更适合事后审计而非实时过滤。

防止灾难性遗忘

与污染相对的失效模式是灾难性遗忘:模型在目标任务上改进的同时,其他所有任务上的表现同步退化。当微调数据的分布相对于模型原始训练分布较窄时,这种情况尤为常见。

最可靠的缓解措施是回放缓冲区。思路很简单:维护一个存储先前训练轮次样本的库,并将这些样本混入每个新的微调批次。棘手之处在于,当缓冲区容量有限时,该保留哪些样本。

加载中…
Let's stay in touch and Follow me for more thoughts and updates