训练数据权限如何随流水线变换传播
文章指出,数据集上的许可证标签无法表达去重、关联、重采样和混合后的使用权限。作者提出借鉴安全污点追踪,让权限约束随数据变换传播,并明确关联操作的权限合并语义。
文章指出,数据集上的许可证标签无法表达去重、关联、重采样和混合后的使用权限。作者提出借鉴安全污点追踪,让权限约束随数据变换传播,并明确关联操作的权限合并语义。
太长不看(TL;DR)——大多数 AI 数据治理把许可和同意视为数据集的属性,而不是处理数据的流水线操作的属性。去重、关联、重采样和混合等步骤,会悄然改变一条记录实际被允许的用途,而几乎没有工具跟踪这些变化。解决办法可以借鉴安全领域:让权利约束像污点一样,在每一次转换中传播,并明确定义关联操作的语义,而不是给最终产物贴上一个许可标签。
问问大多数 ML 团队如何处理训练数据的使用权,你得到的答案通常停留在数据集层面:这个语料库采用 CC-BY,那个采用专有许可,另一个“已获准用于商业用途”。许可只是存储桶上的一个标签,或数据目录中的一行记录。这看起来像是在做治理,实际上并不是,因为标签描述的是来源,而不是数据进入模型之前经历了什么。
问题在于,数据流水线中几乎每一种有实际意义的操作,都会改变一条记录在法律和伦理层面被允许的用途,而主流治理工具没有一种会跟踪这种变化。数据血缘图能告诉你一行数据从哪里来,却无法告诉你:在生成如今训练分片中这行数据的转换过程中,原本附着在它上面的权利约束是否依然有效。
可以把许可或用户授予的同意,理解为附着在记录上的一个谓词:“这段文本可以用于商业模型训练”,或者“这位用户的数据只能用于其选择加入的产品”。对于记录的原始形态,这个谓词为真。但只要你转换了记录,这个谓词是否仍然成立,就成了一个有待回答的问题,不能想当然。
去重是最直观的例子。你有两份来自不同来源、几乎相同的文档,其中一份采用宽松许可,另一份则不是。标准去重流程会保留一份、丢弃另一份,通常根据抓取时间的新旧、文档长度等启发式规则来选择。生成的这一行数据,不再保留任何信息,表明某个受限来源也曾提供过这份内容。如果审计人员之后问:“训练集中是否混入了许可受限的内容?”诚实的回答只能是:我们无法判断,因为去重把权利历史压缩进了一条代表性记录,而它恰好只是凭借一个与权利无关的启发式规则胜出。
关联操作也是如此。你用第二张表中的元数据来丰富一条训练样本,而第二张表的使用条款更宽松。那么,关联后的记录应该继承更严格的条款、更宽松的条款,还是必须同时满足两者?几乎没有流水线会在任何地方明确编码这项决策。它就这样隐式发生了,成为某人为完全不同的目的写下的一条 LEFT JOIN 的副作用。
混合的影响最深远,因为这一步没有回头路。你构建了一份训练混合数据,其中包含获许可的语料、抓取的语料,以及某个模型生成的合成语料,而这个模型本身也是用混合数据训练的。梯度一旦混合,就无法再拆开。模型在这份混合数据上训练之后,你无法指着任何一个产物说:“这部分参数子空间来自获许可的数据,所以没问题;那部分来自抓取的数据,所以有问题。”原本在行级别可以回答的权利问题,到了权重层面就无法回答了。这才是机器遗忘难以处理删除请求的真正原因:请求本身很精确,但它所作用的对象,已经无法再按同样的精度定位。
几十年前,安全工程就通过污点跟踪解决了一个类似的问题:将不可信输入标记为被污染,让污点沿着所有接触它的操作传播,并在被污染数据可能造成损害的边界上,执行阻断或净化。AI 训练的数据权利治理也需要同样的模型:按操作类型定义传播规则,而不是假定这些问题不存在。
具体来说,每一种流水线操作都需要明确的权利传播语义,而不能只有数据转换语义:
过滤 / 选择(Filter / select):权利约束原样传播,因为保留下来的行,是原本就携带权利谓词的记录的未修改副本。
过滤 / 选择(Filter / select):权利约束原样传播,因为保留下来的行,是原本就携带权利谓词的记录的未修改副本。
关联(Join):权利约束按交集传播。关联后的记录,只能用于两个输入谓词都允许的用途。如果一边规定“仅限研究”,另一边规定“允许商用”,结果就是“仅限研究”,没有商量余地,无论下游工程师把哪张表视为“主要”来源。
关联(Join):权利约束按交集传播。关联后的记录,只能用于两个输入谓词都允许的用途。如果一边规定“仅限研究”,另一边规定“允许商用”,结果就是“仅限研究”,没有商量余地,无论下游工程师把哪张表视为“主要”来源。
去重 / 并集(Dedup / union):权利约束应以保留历史的并集方式传播,而不是悄悄丢弃。当你把两条近似重复的记录合并成一条时,保留下来的记录,需要携带所有参与合并的记录中最严格的谓词,而不是启发式规则碰巧保留下来的那条记录的谓词。
去重 / 并集(Dedup / union):权利约束应以保留历史的并集方式传播,而不是悄悄丢弃。当你把两条近似重复的记录合并成一条时,保留下来的记录,需要携带所有参与合并的记录中最严格的谓词,而不是启发式规则碰巧保留下来的那条记录的谓词。
聚合 / 重采样(Aggregation / resampling):在这一步,你往往需要阻断,而不是继续传播。如果某个重采样步骤为了平衡类别频率,提高了某个许可受限数据簇的权重,那么你改变的不只是数据分布,还改变了流入训练过程的受限内容的实际用量。这需要一项策略决策,而不是自动放行。
聚合 / 重采样(Aggregation / resampling):在这一步,你往往需要阻断,而不是继续传播。如果某个重采样步骤为了平衡类别频率,提高了某个许可受限数据簇的权重,那么你改变的不只是数据分布,还改变了流入训练过程的受限内容的实际用量。这需要一项策略决策,而不是自动放行。
合成生成(Synthetic generation):采取保守原则,输出默认继承生成模型训练数据的权利约束,直到有人能拿出证据证明应当另作处理。仅仅因为合成数据是“新文本”,就认为它不受任何权利约束,这是当前最常见的数据治理失误,而且方向完全反了。生成这些内容的模型,其数据分布总是从某些东西中学来的。
合成生成(Synthetic generation):采取保守原则,输出默认继承生成模型训练数据的权利约束,直到有人能拿出证据证明应当另作处理。仅仅因为合成数据是“新文本”,就认为它不受任何权利约束,这是当前最常见的数据治理失误,而且方向完全反了。生成这些内容的模型,其数据分布总是从某些东西中学来的。
没有这些明确的语义,每条流水线每运行一次,都在隐式作出治理决策,而且没有任何人批准过。编写去重逻辑的人,在毫不知情的情况下,就作出了涉及隐私和许可的决定。这就是如今大多数 AI 团队所谓“数据治理”项目的真实状态:策略写在文档里,执行却无处落地,两者之间的空白,全由流水线代码碰巧产生的行为填补。
传统数据治理有一条 AI 训练所没有的退路:通常,你可以在事后重新运行查询、重新生成报告,或者隐去某个字段,因为使用这些数据的系统会实时读取数据仓库。训练数据则不同。它只被消费一次,以一种破坏原有形态的方式融入一组权重;而事后纠正问题所需的血缘轨迹,很少能在训练结束后,仍以可定位的形式保留下来。
这也是为什么“我们在摄取时过滤一下就行了”并不够。摄取时过滤能处理显而易见的情况——一开始就不让受限来源的存储桶进入流水线。但面对更隐蔽的情况,它就无能为力了:受限内容通过获准使用的来源合法进入流水线,随后又在到达训练器之前,与其他数据混合、去重或重采样,导致其实际权利状态发生变化。泄漏不在入口,而在内部管道。
如果你正在为 AI 训练数据构建或采购治理工具,该问的不是“它能不能给数据集打上许可标签”,而是:“对于最终训练分片中的任意一行,它能否告诉我,生成这一行的所有涉及权利的操作构成了怎样的完整链条,以及其中是否有操作违反了我定义的传播规则?”这要求你在操作层面,而不是数据集层面,为流水线加入监测机制——每一次关联、去重、过滤和重采样,都要在产生数据转换事件的同时,产生一个权利传播事件。
这比在数据目录中加一个许可标签,需要更多工程投入。但也只有这样,才能真正应对删除请求、审计或许可争议,因为它回答了真正重要的问题:不是这份数据从哪里来,而是它在变成模型权重的过程中,所附带的权利约束发生了什么变化。
如需进一步采取行动,你可以考虑屏蔽此人和/或举报滥用行为。