跳到主要内容

那个把你唯一的硬样本也顺便带走的近似去重过滤器

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的去重步骤报告显示语料库缩减了 28%,训练运行提前六小时结束。评估数值持平甚至略有提升。没人去查看被删除内容的 diff。三周后,客服开始因为一类模型曾经能处理、现在却完全搞砸的退款反转工单进行告警。有 11 条训练数据涉及该特定模式。其中 9 条消失了——它们被合并为一个单一的代表样本,保留了最简洁、最干净的措辞,却丢弃了那些模型实际从中学习如何缓和情绪的、语带敌意的复杂变体。你的去重流水线造成了这一切,而你的评估并没有捕捉到它,因为在构建评估集时,这些例子已经从用于采样评估集的训练集中消失了。

这是关于去重作为一个流水线步骤让我感到困扰的失效模式:它表现为数据清洗,实际上却是分布编辑。删除样板文件的完全重复是清洗。通过相似度阈值删除近重复项则是一种包装成清洗的采样决策。阈值决定了训练分布中哪些切片能存活下来,而最容易丢失的切片正是你起初样本最少的那些——根据定义,这些样本通常是你为了覆盖率而非样本数量而保留的。

相关文献的声音比目前的讨论更加响亮。2022 年那篇最初的《去重训练数据让语言模型更好》(Deduplicating Training Data Makes Language Models Better)的研究衡量了完全重复和近似重复,并发现了真实的收益,这一结果被泛化为一条民间法则:去重越多越好。SemDeDup 进一步推行了这一做法——通过语义相似度删除 50% 的 LAION 数据,保留性能,有时还能提高 OOD(分布外)表现——这成了一种默认选择。随后,FairDeDup 研究了在视觉语言语料库上运行 SemDeDup 时子组指标的变化,发现保留了聚合准确率的同一套流水线却降低了性别偏见和肤色相关的指标。同样的算法,同样的数据,不同的评分视角,得出了相反的结论。这个差距正是生产团队不断受挫的地方。

去重是选择,而非清洗

值得替换的心智模型是:去重删除了冗余副本,而模型不受影响,因为它已经掌握了信息。这个说法对于样板文本的完全重复是成立的。但一旦你的相似度函数判定两个看起来 0.82 相似的例子是“相同的”,这个模型就崩塌了。

近重复过滤对你的数据集施加了一种等价关系,然后每个等价类只保留一个代表。这个句子里埋藏了两个设计决策。第一个是什么算作相同——你的 shingling、你的 MinHash 分桶、你的嵌入模型、你的相似度阈值。第二个是哪个代表能存活——最短的、最长的、簇中心位置的、时间戳最早的,还是质量评分最高的。这两个决策都不是中立的,而且都不会像架构变更或损失函数变更那样得到严格的审查。

让你深受其害的这种不对称性在于:高频模式主导了它们自己的簇,并以数千种变体存活下来;而稀有模式则紧密地聚集在一两个例子周围,存活率为零。去重后,数据集在聚合 Token 计数上看起来很平衡,但在长尾覆盖率上却比以前更加失衡。这种性能倒退在评估中不会显现,直到生产流量中出现了那个失去代表样本的数据切片。

稀有切片究竟存在于何处

去重流水线并非故意针对稀有切片。针对它们是真实数据集中稀有切片形态的结构性后果。一些模式反复出现:

  • 紧密聚集的措辞。 残障人士访问投诉、可访问性工具的 Bug 报告、监管披露澄清。这些话题词汇有限,报告方式相似,在相似度函数看来就像是重复的。占据主导地位的解释存活了下来;区分性的变体被丢弃了。
  • 敌对或非标准语体。 从模型训练的角度来看,一句礼貌的“我想申请退款”和一句愤怒的“把钱还给我”在行为上是截然不同的——缓和情绪的行为是从后者而非前者中学习的。一个基于名词短语词汇重叠的去重流水线会欣然将它们合并。
  • 方言、语码转换和音译。 混合脚本输入和方言变体在进入系统时被预处理归一化,因此会针对标准形式被去重合并。对于那些输入内容带有噪声的用户,模型失去了它原本需要的噪声输入鲁棒性。
  • 时间间隔的重复。 同样的故障报告分别在 3 月、6 月和 10 月出现。一个通过内容哈希丢弃并忽略时间戳的去重流水线会丢失重复出现的信号——即这是一个慢性问题,而非一次性事件——而这恰恰是模型需要用来进行升级(escalate)处理的信号。
  • 正样本附近的硬负样本。 在排序和分类中,最有用的例子是那些“差一点就中”的样本:看起来像正类,实际上是负类。基于相似度的去重会欣然合并这两个簇,从而让你失去了模型用来学习边界的对比信息。
  • 标注者分歧。 两个标注员看到同一个提示词并给出了不同的标签,因为它确实存在歧义。去重只保留一个。模型现在学到的是数据集具有比实际更高的确定性,并在人类认为有歧义的情况下产生了错误的校准。

这些都不是罕见的特例。它们是每一个从真实用户那里收集到的真实数据集中的长尾。

评估集在撒谎,因为它来自相同的分布

对于“去重是否安全”的通常回答是“评估结果是全绿的”。这就是工作流中悄然失效的部分。如果你在去重之前从相同的语料库中采样评估集,在训练集上运行去重,并在评估集上评分,那么你测试的切片可能在训练集中也被过度代表了。如果你在去重之后采样评估集,那么你测试的分布与训练分布完全一致,缺失的切片也完全相同。

无论哪种方式,评估报告反映的都是去重后留给你的内容,而不是生产环境流量会发送的内容。你丢失的切片正是这两个集合中都不再代表的切片。如果一个评估集的处理方式与训练集如出一辙,那么“全绿”的评估结果并不是真正的通过,而是一种同义反复。

解决方法并不隐晦,但由于过程足够繁琐,很少有团队会去做。你需要一个在去重之前采样的评估集,并根据你关注的切片进行分层——这些切片必须是显式列出的,而不是隐式的——并且你需要对这些切片分别进行评分。一个去重流水线即使丢弃了 28% 的语料库,只要在评估集上保持相同的每个切片召回率,就是合格的。但如果一个去重流水线丢弃了 28% 的语料库,维持了总体准确率,却让某个切片的得分从 84% 暴跌至 41%,这就是失败模式,而如果不进行细分切片的评分,你根本无法察觉。

去重流水线应该告诉你什么

去重的输出通常是一个单一数字——处理前的语料库大小、处理后的语料库大小、减少的百分比。而你真正需要的信息是关于被删除内容的直方图。

一个值得在生产环境中运行的去重流水线应该输出:

  • 簇大小分布(Cluster size distribution)。 有多少大小为 1 的簇(无近重复项,保留)、大小为 2–10 的簇、以及大小 100+ 的簇。大簇通常是样板内容(boilerplate)聚集的地方。小簇则是长尾数据所在。如果一个流水线压缩小簇的速度与大簇一样快,那么它在长尾数据上就过度校正了。
  • 每个切片的保留率(Per-slice retention rate)。 提前定义好你的切片——按主题、按来源、按语言、按用户群组、按情感,或者按你所在领域真正关心的任何维度——并报告每个切片的保留率。如果某个切片从 1,200 个样本锐减到 18 个,在发布该语料库之前,你需要进行人工审查。
  • 代表性选择审计(Representative-choice audit)。 当一个簇被压缩为一个样本时,记录保留了哪一个以及为什么。在一个敌对语气的簇中随机抽查“保留的代表是最短的一个”,就足以发现那个将礼貌性训练进模型的 bug,而实际上该模型的使用者并非都那么礼貌。
  • 与上一个语料库的差异比对(Diff against the previous corpus)。 用本季度的设置对上季度的数据运行相同的去重逻辑,并报告切片级别的增量。将阈值从 0.85 调整到 0.80 听起来改动很小,但它可能会让每个切片的保留率变动 30 个百分点。

如果你的去重步骤不产生这些报告,它就在做你看不见的采样决策,这意味着你无法审查它们,这也就意味着下一次退化将看起来像是模型退化而不是数据退化,导致错误的团队会花费一周时间去追查它。

将去重视为建模决策,而非卫生琐事

想要加大去重力度的直觉是正确的——将同样的样本训练一百次所浪费的计算资源是实实在在的,而且 2022 年最初的研究结果也是真实的。错误在于将“去重越多越好”视为一种可以随阈值灵敏度扩展的免费午餐。事实并非如此。在某些情况下,去重是“卫生清洁”——针对模板化文本的精确匹配和极近匹配。而在另一种情况下,去重是“选择”——针对行为截然不同的样本进行语义嵌入(semantic-embedding)聚类。这两种情况之间的过渡地带,正是团队设置阈值的地方,因为那里的计算节省看起来非常可观。但这也就是长尾数据开始消失的地方。

一些在实践中行之有效的模式:针对分布的头部和尾部运行不同的去重策略——样板内容可以被彻底压缩,但稀有切片的样本则不行。在合并时保留频率计数,这样模型即使只被喂入一个副本,仍然可以学到这种模式是常见的。审慎地选择代表性样本,而不是默认让“最短”或“第一个”胜出——对于敌对语气的簇,你想要的是那个敌对语气的样本,而不是在礼貌性改写中幸存下来的那个。将阈值作为一个可调的超参数,并使用能对稀有切片召回率进行评分的评估方案,而不是盲目采用某篇针对不同目标、在不同分布上训练的论文中的默认值。

还有一条最需要纪律的原则:当你修复了一个追踪到缺失切片的生产退化时,不要只是修补评估集。要修补移除该切片的去重策略,并添加一个回归测试,以防止该策略再次移除相同形态的样本。修补评估集只能保住一个切片,而修补策略能保住接下来十个你还没收到的告警。

抹除你唯一规范边缘案例(canonical edge case)的去重步骤,并不是 MinHash 或 SemDeDup 的 bug。这是一种关于去重用途的范畴错误(category error)。当你的去重流水线开始输出每个切片的保留报告之日——即由人工签字确认哪些切片允许被压缩之日——就是它不再是隐性能力退化,而成为一个可审查决策之时。流水线并没有变得更聪明,你只是不再让它自己给自己评分了。

References:Let's stay in touch and Follow me for more thoughts and updates