数据投毒检测:在训练前拦住恶意样本

当模型团队把一批训练数据送进流水线时,很少有人会先问一句:这批数据可信吗?数据投毒(data poisoning)正是利用这一点——攻击者在模型训练之前,悄悄往训练集里掺入精心构造的恶意样本,使训出的模型在正常输入上表现如常,却在攻击者选定的输入上出错或被控。它的危险之处在于,危害发生在训练阶段,而爆发点在部署之后,传统针对推理阶段的防御几乎拦截不到。本文面向关注训练数据供应链安全的工程师与研究者,系统梳理投毒攻击的类型、训练前的检测思路、供应链治理手段,以及它如何与「投毒防御」构成互补的两道防线。

需要事先声明:下文对所有攻击方式只做概念与机理描述,不提供任何可复现的攻击载荷或具体触发器构造方法,目的是帮助防御方建立对手画像,而非教人攻击。

一、投毒攻击的类型

理解攻击面是布防的前提。无论手法如何翻新,投毒大体可以归入以下三类机理,区别主要在「攻击者想让模型学到什么」。

标签翻转

标签翻转(label flipping)是最朴素的投毒形式:攻击者不改输入内容,只把一部分样本的真实标签改成错误标签。例如把「猫」标成「狗」,或在垃圾邮件分类任务里把正常邮件标成垃圾。它的目标是让模型的决策边界在局部被「带偏」,从而降低整体准确率或在特定类别上系统性失效。这类攻击不需要任何触发器,但它对数据比例敏感——掺得太多容易被离群统计量发现,掺得太少又难以改变模型行为。

后门触发

后门触发(backdoor trigger)是更具隐蔽性的投毒。攻击者在少量训练样本上叠加一个特定的触发图案(如图片角落的固定纹样、文本里的特定短语),并把它们的标签改成攻击者指定的目标类。模型训练后,在正常样本上完全正常;但只要输入里出现这个触发图案,模型就会按攻击者意图输出目标类。BadNets(Gu、Dolan-Gavitt、Garg,2017/2019,arXiv:1708.06733)是最早系统揭示这类「机器学习模型供应链漏洞」的工作之一,论文用路标分类器演示了:在停止标志上贴特定贴纸,模型会把停止标志误判为限速标志,且后门在后续微调其他任务时仍能残留。该文献属于本文已核验来源。后门触发之所以难防,是因为它不影响模型在干净数据上的指标,常规验证集几乎测不出来。

梯度下毒

梯度下毒(gradient-based / optimization-based poisoning)走的是更「算计」的路线。攻击者把投毒样本构造建模为一个优化问题:寻找一组训练点,使得模型在学到这些点后,在验证分布或特定测试点上的损失被最大化,或者在参数空间里留下可被后续利用的脆弱性。这类方法通常假设攻击者能探知部分训练流程或梯度信息,构造成本高于前两类,但造成的损害也更定向、更难以靠简单清洗消除。SVM 投毒(Biggio et al., 2012)是这一方向的早期代表,讨论细节本文标记为待核实,建议读者直接查阅原论文。

二、为什么要在训练前检测

投毒检测存在两个时间窗:训练前(对原始数据进行筛查)与训练后(对训出的模型做后门扫描)。训练前检测的优势是成本低、可逆、不会让污染固化进权重。一旦恶意样本已经进入训练,要证明模型被影响、再定位并补救,代价远高于在数据入库前把它们挑出来。因此,把检测前置到「数据进入流水线之前」,是供应链安全的第一道闸门,也是本文聚焦的视角。

与此同时,训练前检测也有局限:它依赖我们能拿到、能检查原始训练数据。当模型来自预训练权重、第三方数据集或外包训练服务时,我们往往拿不到完整的可检查数据,这时就需要配合训练后防御(即 data-poisoning-defense 的主题)。两者不是替代关系,而是互补关系,第五节会专门展开。

三、检测思路

训练前检测的核心假设是:投毒样本在统计、表征或来源上,与正常样本存在可观测的差异。下面四类思路从不同角度逼近这个差异。

离群点检测

离群点检测(outlier detection)是最直接的切入点。投毒样本要么是少数、要么带有异常特征分布,于是可以用无监督或半监督方法给每条样本打一个「异常分数」,超过阈值的进入人工复核。常用手段包括隔离森林、局部离群因子、基于马氏距离的稳健统计,以及自编码器重建误差。它的好处是不需要已知攻击标签,对标签翻转类攻击尤其敏感;弱点是面对与正常数据高度相似的后门样本时,单一离群分数容易被淹没。

def flag_outliers(embeddings, iso_forest, score_cut=0.5):
    # 用隔离森林给每条样本一个异常分数,分数越低越可疑
    scores = iso_forest.decision_function(embeddings)
    suspicious = [i for i, s in enumerate(scores) if s < score_cut]
    return suspicious  # 返回疑似投毒样本索引,交人工复核而非直接删除

激活聚类

激活聚类(activation clustering)针对后门样本「聚成一小簇」的特性。思路是:把样本送进一个参考模型(或待清洗模型的前几层),取最后一层激活作为表征,再做聚类。后门样本因为共享同一个触发图案,其激活往往聚成一个占比异常小的簇。找到这个簇,就能把候选投毒样本成批挑出。Chen 等人 2019 年提出的 Activation Clustering 是该思路的代表,本文标记为待核实,建议直接查阅原论文以确认实现细节。

def activation_clustering(activations, k=2):
    # 对最后一层激活做 KMeans,后门样本常聚成占比很小的一簇
    model = KMeans(n_clusters=k, random_state=42)
    labels = model.fit_predict(activations)
    sizes = np.bincount(labels)
    # 找出占比异常小的簇,作为候选投毒簇进入下一步验证
    small = [c for c, n in enumerate(sizes) if n < 0.05 * len(labels)]
    return small

特征与统计异常

特征与统计异常(feature / statistical anomaly)检测不依赖聚类,而是直接刻画数据分布。例如:统计每个标签下的特征均值差异,标签翻转会令某些类的特征中心偏移;检查样本来源的元数据分布(采集时间、设备、上传者)是否出现不自然的集中;用稳健协方差估计寻找激活空间里的异常方向。Spectral Signatures(Tran、Li、Madry,2018,NeurIPS,arXiv:1811.00636)是这一方向的经典工作,它对最后一层激活的协方差做奇异值分解,发现所有已知后门攻击都会在谱上留下可检测的「签名」,从而把投毒样本当作离群点剔除。该文献属于本文已核验来源。这类方法对后门尤其有效,但对高度适配当前数据集的定制化攻击,需要不断更新参考统计量。

def spectral_signature(activations, top_k=1):
    # 对激活协方差做 SVD,取最大奇异值对应的方向作为可疑签名
    cov = np.cov(activations, rowvar=False)
    u, s, _ = np.linalg.svd(cov)
    direction = u[:, :top_k]
    # 投影分数高的样本更可能是投毒点,按分数排序后人工抽检
    proj = activations @ direction
    return proj

数据溯源与清洗

数据溯源与清洗(provenance & cleaning)从「这条数据从哪来、是否可信」入手,而非只看数据本身。它包括:记录每条样本的提供者、采集渠道、入库批次与版本;对来源可疑的批次做隔离与重点审查;建立可回滚的入库记录,一旦某批次被证实污染,能快速定位并剔除受影响的样本。溯源本身不识别攻击,但它让前面三类检测的结果可落地——知道「哪些样本属于同一可疑批次」,能把零星可疑点连成可处置的事件。配合数据集卡片(Dataset Cards,Gebru et al., 2021)记录数据来源与局限的做法,本文标记为待核实,建议查阅原文。

四、训练数据供应链治理

检测是「事中」手段,治理是「事前」手段。把供应链治理做扎实,能从根上减少投毒进入流水线的机会。NIST AI 风险管理框架(AI RMF 1.0,2023-01-26 发布,DOI 10.6028/NIST.AI.100-1)把可信 AI 拆成治理、映射、测量、管理四个功能,其中「治理」与「测量」恰好对应本文的权责流程与数据校验。该框架属于本文已核验来源。OWASP 把训练数据投毒单列为其 LLM Top 10 的 LLM03(Training Data Poisoning),指出被篡改的训练数据会损害模型的安全性、准确性与伦理表现,该条目也属于本文已核验来源。结合这两份框架,治理可落到三件具体的事。

来源可信

来源可信要求训练数据尽量来自经过审核的渠道:自采数据走审批流程,第三方数据集核实发布方身份与口碑,外包训练服务在合同里约定数据审查义务。对关键数据集,优先选择提供签名、提供来源声明的发布方,并保留来源凭证以备审计。来源可信不是「绝对安全」,而是让每一次入库都可归因、可追责。

哈希校验

哈希校验是最基础的完整性控制。数据集发布方通常会公布文件的哈希值(如 SHA-256),下载或入库时用本地计算值与之比对,不一致则拒绝入库。它防的是传输与存储过程中的篡改、替换,也能在多次流转后确认「这份数据和发布方那份是同一份」。哈希不防「发布方自己投毒」,所以它是供应链治理的一环,而非检测的全部。

import hashlib

def sha256_of_file(path):
    # 分块读取,避免大文件一次性占满内存
    h = hashlib.sha256()
    with open(path, "rb") as f:
        for chunk in iter(lambda: f.read(8192), b""):
            h.update(chunk)
    return h.hexdigest()

def verify_dataset(path, expected):
    # 对照发布方公布的哈希值,不一致则拒绝入库
    return sha256_of_file(path) == expected

可复现采样

可复现采样保证「同样的原始数据、同样的随机种子,得到同样的训练切分」。它让实验结果可被他人重现,也让污染事件可被精准回放:当某个模型被怀疑受投毒影响,固定种子的采样能帮你稳定地复现训练过程、隔离可疑子集。可复现采样不是检测攻击,但它让检测与归因变得可控、可沟通。

import numpy as np

def reproducible_split(samples, seed=20240817, ratio=0.9):
    # 固定随机种子,保证每次训练切分结果一致、可复现
    rng = np.random.default_rng(seed)
    idx = rng.permutation(len(samples))
    cut = int(len(samples) * ratio)
    return idx[:cut], idx[cut:]

五、与投毒防御的互补关系

检测与防御常被混为一谈,但二者分工清晰。本文讲的「数据投毒检测」聚焦训练前:在恶意样本进入模型之前,用离群、聚类、统计与溯源把它找出来、挡下来。而「data-poisoning-defense(投毒防御)」则覆盖更宽的战线:包括训练时的稳健学习(如稳健统计、裁剪损失、差分隐私式约束)、训练后的后门扫描与模型修复、以及部署时的异常监控。一句话概括二者的关系——检测负责「别让脏数据进锅」,防御负责「进了锅也能尽量减少毒性、出锅后还能查」。

在实践里,二者必须配合使用:只做检测,遇到拿不到原始数据的预训练权重或外包训练就失守;只做防御,等于默认脏数据已经进锅,成本高且无法根除。推荐的分层是:上游用供应链治理压低投毒概率,中游用训练前检测拦截可检查的数据,下游用训练后防御兜底那些检查不到的环节。NIST AI RMF 的「治理-映射-测量-管理」循环,正好为这条分层链路提供了持续的改进框架。

小结

数据投毒的可怕之处,在于危害埋在训练阶段、爆发在部署之后。应对它的第一原则,是把防线前移到训练之前。先建立对手画像:标签翻转、后门触发、梯度下毒三类机理,理解其原理但不复现其载荷。再用四类检测思路逼近差异:离群点检测抓少数异常,激活聚类揪出后门小簇,特征与统计异常刻画分布偏移,数据溯源与清洗让发现可落地、可回滚。同时用供应链治理从源头压低风险:来源可信让入库可归因,哈希校验守住完整性,可复现采样让污染可回放。最后记住,训练前检测与投毒防御是互补而非替代——前者拦在锅外,后者兜底锅内与出锅后,二者叠加才构成完整的供应链安全。

参考与延伸阅读

  • NIST (2023). AI Risk Management Framework (AI RMF 1.0). 发布于 2023-01-26,DOI 10.6028/NIST.AI.100-1。已核验。主页:https://www.nist.gov/itl/ai-risk-management-framework
  • OWASP (2023/2025). OWASP Top 10 for Large Language Model Applications,其中 LLM03 为 Training Data Poisoning。已核验。存档页:https://owasp.org/www-project-top-10-for-large-language-model-applications/
  • Gu, T., Dolan-Gavitt, B., Garg, S. (2019). BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain. arXiv:1708.06733. https://arxiv.org/abs/1708.06733 已核验。
  • Tran, B., Li, J., Madry, A. (2018). Spectral Signatures in Backdoor Attacks. NeurIPS 2018,arXiv:1811.00636. https://arxiv.org/abs/1811.00636 已核验。
  • Chen, B., Carvalho, W., Baracaldo, N., et al. (2019). Detecting Backdoor Attacks on Deep Neural Networks by Activation Clustering. 待核实,建议直接查阅原论文确认细节。
  • Biggio, B., Nelson, B., Laskov, P. (2012). Poisoning Attacks against Support Vector Machines. 待核实,作为梯度/优化式投毒的早期代表,建议查阅原文。
  • Gebru, T., Morgenstern, J., Vecchione, B., et al. (2021). Datasheets for Datasets. 待核实,数据溯源与卡片化记录的参考实践。
  • 姊妹篇:data-poisoning-defense(投毒防御),讲训练时稳健学习与训练后后门扫描,与本篇互补。
本文累计阅读