参考特权与在策略蒸馏:MLLM工业异常检测的轻量化落地方法

发布时间:2026/8/29 10:40:51
参考特权与在策略蒸馏:MLLM工业异常检测的轻量化落地方法 工业异常检测Industrial Anomaly Detection这几年经历了好几轮技术迭代最早是传统 CV 阈值和手工特征后来变成全监督的 CNN 检测器再到无监督重建和特征嵌入方法。最近两年多模态大语言模型MLLM开始进入这个领域看起来“什么都能说、什么都懂一点”的大模型应该能解决工业缺陷那些长尾问题。但真放到产线上又会撞上成本、延时和输出稳定性这三座大山。ADOPD 这个题目从命名上就能拆出两个关键词Reference-Privileged参考特权和 On-Policy Distillation在策略蒸馏。它要解决的核心问题很明确如何把一个具备“参考特权”的 MLLM 教师模型在训练过程中以在线方式蒸馏给一个轻量级学生模型让学生模型在部署时没有特权信息、算力也更少的情况下仍然保持接近教师的工业异常检测能力。这篇文章我把它的技术动机、概念拆解、训练流程、评估方法、工业落地问题一次讲清楚。文章里不会出现模糊的“跳分式结论”而是尽量把每个设计选择背后“为什么”讲透。这样哪怕你手上没有原论文的完整代码也能理解这种“参考特权 在策略蒸馏”的方法论并把它迁移到自己的项目里。1. 工业异常检测与 MLLM 的现实矛盾1.1 异常检测的本质难点工业异常检测和通用图像分类最大的不同在于缺陷不是“一类”东西而是一堆无法穷举的意外。一块 PCB 板可能有刮痕、露铜、少件、错件、桥连、脏污一个电池表面可能有划伤、凹陷、凸点、压痕。传统全监督检测器要求你把每个缺陷类都标注足够样本但产线实际情况是新型缺陷随时出现标注成本极高换一个产品型号就可能全部重来。这也是为什么无监督/自监督异常检测能流行起来。它的典型思路是只在正常样本上训练让模型学会“正常长什么样”然后在测试时计算与正常分布的偏离程度偏离大的区域就是可疑异常。这种思路解决了“缺陷样本稀缺”的问题却带来了另一个问题正常样本模式稍微变化误报率就飙高。不同产线、不同光源、不同角度都会改变“正常”的分布。所以工业异常检测真正难的地方不是把某个公开数据集刷到高分而是解决持续变化、样本不均衡、领域差距这三个问题。1.2 MLLM 介入后的新机会和新问题MLLM 之所以被引入异常检测是因为它具备三样传统模型没有的能力语义理解不仅判断“有没有异常”还能用自然语言描述“哪个区域、什么问题”。零样本/少样本泛化通过提示词就能适配新产品不用每个型号都重新训练。多模态对齐把图像特征和文本描述对齐更容易融合参考信息和领域知识。举个例子你在提示词中告诉 MLLM“这是锂电池外壳表面注意划伤和凹坑”模型能按照这个先验来回答问题。传统 CNN 模型就没有这么灵活的表达通道。但真正把 MLLM 推到产线上问题立刻出现推理延迟高。大模型生成文本是一个 token 一个 token 来的工业检测往往要求单张图几十毫秒内出结果MLLM 很难满足。输出不稳定。同一个输入大模型可能给出不同描述没法像传统分类器那样输出固定的异常分数。部署成本高。多个检测工位都要上大模型GPU 显存和算力开销很大。难迭代。产线换型后要改提示词、重新验证工程链路很繁琐。于是自然想到一个方案用 MLLM 作为教师模型训练一个轻量学生模型。教师模型负责“教”学生模型负责“在产线上跑”。1.3 为什么蒸馏是绕不开的方向知识蒸馏Knowledge DistillationKD不是新概念。传统做法是提前用教师模型在大规模数据上推理把输出保存下来再作为离线标签训练学生模型。但这种方式在工业异常检测场景里有一个天然问题异常数据分布变化太快离线缓存的数据很快会过期。更关键的是MLLM 教师本身带有“参考信息”和“推理能力”如果只抽取最后一层 logits学生的学不到教师“为什么这样判断”的过程。于是需要更细致的蒸馏方式不仅蒸馏分类结果还要蒸馏特征表示、语义描述、异常定位图不仅用离线数据还要在训练过程中持续从当前数据分布里获取教师反馈。这就引出了 ADOPD 中的两个核心概念参考特权与在策略蒸馏。2. ADOPD 核心概念拆解开始讲方法之前必须把三个关键词拆干净。如果不理解概念后面看伪代码也容易一头雾水。2.1 第一层知识蒸馏蒸馏本质上是把一个容量大、能力强的模型教师学到知识迁移到容量小、推理快的模型学生上。在 ADOPD 场景中教师是 MLLM输入更丰富的多模态信息输出异常判断和语义解释。学生是轻量级多模态模型或小规模视觉语言模型部署时只拿到受限输入但需要产生接近教师的输出。蒸馏不是简单复制输出。工业异常检测中教师输出的信息类型很多异常分类/回归分数这张图有没有异常、异常程度多少。异常定位图像素级或区域级的异常掩码。语义描述异常类型、颜色、形状、位置等文本描述。特征表示教师中间层的特征能够提供更丰富的监督信号。ADOPD 的蒸馏目标大概率是上述多维度对齐而不是单一输出对齐。因为只有多维度对齐学生才能在未来遇到新型缺陷时具备泛化能力。2.2 第二层在策略在策略On-Policy这个概念来自强化学习。在强化学习中在策略是指“用当前策略产生的数据来更新当前策略”。与之相对的是离线/异策略即用旧策略或固定数据集中的数据来更新模型。放到 ADOPD 的蒸馏场景里可以这样理解离线蒸馏提前用教师在一批固定数据上生成标签和特征保存到磁盘再离线训练学生。缺点是教师反馈与学生的当前学习进度无关。在策略蒸馏训练学生模型的过程中每个 batch 都实时将当前输入送入教师模型由教师在线生成监督信号然后立刻监督学生模型的这一轮更新。在策略的关键价值在于它让教师始终针对“学生当前正在学习的样本和当前分布”进行指导。工业场景中数据分布会随着产线、环境、产品型号变化在策略方式能更好地覆盖这些动态变化。当然在策略蒸馏的代价也很明显每个训练步都要跑一次教师模型训练成本显著高于离线蒸馏。所以工程实现上往往需要教师模型做梯度截断、批量推理、甚至缓存热启动来缓解开销。2.3 第三层参考特权参考特权这个词可以拆成两个部分参考信息和特权信息。参考信息比较容易理解在工业异常检测中给出一些正常样本或已知缺陷样例作为参考能帮助模型判断当前样本偏离了多少。比如 MVTech AD 这类数据集中很多方法会使用“参考正常样本”来辅助判断。让模型带着参考图像去对比当前图像往往能提升少样本异常检测的效果。特权信息则来自一个经典理论框架Learning Using Privileged Information特权信息学习LUPI。意思是训练阶段可以给教师模型提供一些额外信息这些信息在测试/部署阶段学生模型拿不到。教师借助这些额外信息学到了更好的决策边界然后通过蒸馏把知识传递给学生学生虽然拿不到特权信息但保留了这个决策边界的好处。结合 MLLM 工业异常检测参考特权可以表现为以下几种形式教师可以看到同一产品型号的正常参考图学生部署时只能看当前单张待检图像。教师可以拿到详尽的缺陷类型描述、产品工艺文档、历史缺陷报告学生部署时只有一句通用提示词。教师可以访问昂贵的视觉特征比如更大分辨率、多尺度融合学生部署时受限于硬件只能处理较小分辨率。本质上参考特权就是让教师“见多识广”学生在部署时无法享受同样条件但通过蒸馏获得了教师从特权信息中提炼出的判断能力。2.4 三者组合的真正价值把三层组合起来ADOPD 的逻辑链条就清晰了参考特权解决了“教师教什么”的问题教师有更多参考信息能给出更稳定、更准确的判断。在策略解决了“教师什么时候教”的问题教师针对当前训练分布持续在线监督减少训练和部署分布不一致。蒸馏解决了“学生怎么学”的问题学生从教师的输出、特征和语义描述中学习而不是从零训练一个难以泛化的小模型。所以它不是简单地把大模型输出存下来做离线训练而是一种面向动态工业数据分布、带着信息增强的在线蒸馏范式。3. ADOPD 与现有方案的关键差异这一节把 ADOPD 和几类常见方案放到一起做对比方便你判断它到底解决什么问题。3.1 与标准离线蒸馏的差异标准离线蒸馏的流程是准备一批静态训练数据。用教师模型跑一遍保存输出logits、特征图或文本。用这些离线标签训练学生模型。优点是实现简单教师只需推理一次训练成本可控。缺点是静态数据无法覆盖产线新增缺陷。教师反馈是固定的无法根据学生模型的当前弱点自适应调整。当训练数据的分布与部署数据分布不一致时学生学到的知识容易失效。ADOPD 选择在策略蒸馏意味着教师和学生处在同一个训练循环里教师每次看到的都是学生当前正在学习的样本。这样学生无法“偷懒”——它不能再去拟合一个固定输出而必须跟随教师在线给出的最新信号。3.2 与普通在线蒸馏的差异如果在策略蒸馏只是“在线”那和普通在线蒸馏有什么区别区别主要在于“参考特权”的引入。普通在线蒸馏中教师和学生通常使用相同的输入。而在 ADOPD 中教师和学生输入是有差异的教师可以拿到参考图、完整文本描述、更多上下文信息学生只能拿到简化后的输入。这带来两个好处学生和教师输入不同反而能让学生逐步学会“即使我看不到参考图也能根据教师教授的知识判断异常”。教师利用特权信息给出更高质量的教学信号避免教师自己也判断错导致错误信号被学生放大。这就像师傅带徒弟师傅可以看图纸、材料、过往案例徒弟只能在现场直接面对工件。师傅教得好徒弟虽然没有图纸也能凭经验做出判断。3.3 一张表格看清差异对比维度标准离线蒸馏普通在线蒸馏ADOPD 思路教师输入与部署输入相同与部署输入相同训练时使用参考特权信息学生输入与部署输入相同与部署输入相同与部署输入相同受限监督信号生成时机离线缓存在线实时在线实时是否根据学生状态调整否是是适合动态工业分布一般较好较好训练成本低高高且教师还要处理特权输入从表里可以直观看到ADOPD 是一种“投入更大训练成本换取部署端更强泛化能力”的方法。它更适合对误检率要求高、产品换型频繁、缺陷类型多样的工业异常检测场景。4. 训练流程与伪代码示例这一节不要求你复现原论文而是从方法论角度给出一个可参考的伪代码框架。你可以根据实际场景去替换模型结构和数据形式。4.1 数据组织方案为了实现参考特权数据读取环节必须同时提供当前图像image待检测的样本。参考图像reference_images正常样本或历史缺陷样本数量可以是一个或多个。参考文本reference_text当前产品型号、缺陷类型描述、检测要求等。标签label当前样本是否异常以及异常区域标注如果有。注意学生模型训练时不需要直接学习 reference 信息对应的输入表示。真正消费参考信息的是教师模型。学生的目标是学会教师给出的最终判断和中间特征。4.2 教师端持有参考特权教师模型的输入不是单张图而是“当前图 参考图 参考文本”组成的多模态上下文。这样教师可以更稳定地判断当前图的异常情况。伪代码如下def build_teacher_prompt(reference_text, product_type): # 参考文本中可以包含产品工艺信息、常见缺陷描述、检测规则 prompt ( f你是一名工业质检专家当前检测的产品类型是{product_type}。\n f参考信息{reference_text}\n 请判断检测图像是否存在异常。如果存在请给出异常区域坐标、 异常类别和置信度。 ) return prompt教师收到的参考图像会与当前图像拼接成多图输入。模型结构层面需要支持多图像输入和文本提示输入这也是 MLLM 天然具备的能力。4.3 学生端只拿到当前样本学生模型部署时通常只能拿到当前图像和一个相对固定的提示词。为了让训练和部署一致学生端在训练时也只用当前图像作为输入而不是把参考图也塞给学生。这一点非常关键。如果训练时学生也用了参考图部署时却拿不到参考图模型精度会断崖式下跌。ADOPD 的“参考特权”设计本质上就是在训练阶段刻意不把参考信息暴露给学生从而保证部署一致性。4.4 伪代码ADOPD 训练循环下面是一个简化的 PyTorch 风格伪代码只用于说明主流程。def train_adopd(cfg): # 教师多模态大语言模型固定参数不参与梯度更新 teacher load_teacher_mllm(cfg.teacher_model) teacher.eval() # 学生轻量级多模态模型参与梯度更新 student load_student_model(cfg.student_model) student.train() train_loader build_dataloader(cfg.data_root, cfg.batch_size) for step, batch in enumerate(train_loader): # 当前样本、参考图、参考文本、标签 image batch[image].to(cfg.device) reference_images batch[reference_images].to(cfg.device) reference_text batch[reference_text] label batch[label].to(cfg.device) # 1. 教师在线推理使用参考特权 with torch.no_grad(): teacher_output teacher.generate( current_imageimage, reference_imagesreference_images, text_promptbuild_teacher_prompt(reference_text, batch[product_type]) ) # teacher_output 可能包含异常分数、预测掩码、语义嵌入 # 2. 学生在线推理只用当前图像 student_output student.forward( imageimage, text_prompt判断这张工业图像是否异常并给出区域。 ) # 3. 在策略蒸馏损失 loss distillation_loss(student_output, teacher_output, cfg.loss_weight) # 4. 只更新学生 optimizer.zero_grad() loss.backward() optimizer.step() if step % cfg.log_interval 0: log_metrics(step, loss, student_output, teacher_output)4.5 伪代码蒸馏损失函数蒸馏损失至少需要覆盖异常分数、语义特征和定位掩码三个层面def distillation_loss(student_output, teacher_output, weight): loss 0.0 # 1. 异常分数对齐 if anomaly_score in teacher_output: score_loss F.kl_div( student_output[anomaly_score].log(), teacher_output[anomaly_score].softmax(dim-1), reductionbatchmean ) loss weight.get(score, 0.5) * score_loss # 2. 语义特征对齐 if semantic_embedding in teacher_output: feat_loss 1.0 - F.cosine_similarity( student_output[semantic_embedding], teacher_output[semantic_embedding], dim-1 ).mean() loss weight.get(feat, 0.3) * feat_loss # 3. 异常定位掩码对齐 if pred_mask in teacher_output: mask_loss dice_loss( student_output[pred_mask], teacher_output[pred_mask] ) loss weight.get(mask, 0.2) * mask_loss return loss这里的核心思想是工业异常检测不能只看最终分数还要让学生在特征层面和像素层面都逼近教师。这样当新缺陷出现时学生的特征表达仍然能产生正确的偏离判断。4.6 部署推理阶段部署时学生模型只接受当前图像和一个轻量提示词不再需要教师和参考图def infer(student, image, devicecuda): prompt 判断这张工业图像是否异常。如果异常输出异常区域坐标。 result student.generate(imageimage.to(device), text_promptprompt) return parse_result(result)这个阶段的价值在于部署端省去了 MLLM 的大模型推理开销运行速度更快也更容易量化、剪枝、编译成工业级部署格式。5. 实验设计与评估验证写研究方法类文章一定要讲清楚实验设计和评估方法。对于 ADOPD 这类方法如果只刷一个分类 AUC评价是不完整的。5.1 数据集建议工业异常检测方向常用公开数据集包括MVTec AD包含 15 类工业对象和纹理是异常检测最常用的基准。VisA包含 12 类对象结构和光照多样性更复杂。BTAD工业装配场景数据。私有产线数据如果做工程落地私有数据往往比公开数据更能说明问题。建议做法是先在 MVTec AD 或 VisA 上验证方法可行性再在私有产线数据上验证“参考特权 在策略蒸馏”是否真的能提升换型后的泛化能力。5.2 评估指标异常检测任务至少要关注四类指标指标说明关注点AUC-ROC区分异常和正常样本的能力分类整体能力F1 / Precision / Recall特定阈值下的检测效果实际产线使用效果Pixel-level AUC / IOU异常区域定位准确度定位能力误报率FPR正常样本被误报为异常的比例工业场景最关键工业场景中误报率往往比召回率更敏感。一个误报会导致产线停线返工实际损失很大。所以评估 ADOPD 时不能只看 AUC 高不高还要看低误报率下召回率的稳定性。5.3 消融实验应该怎么做要验证 ADOPD 设计的有效性建议至少拆出这几组消融去掉参考特权教师只使用当前图像放弃参考图保留在策略蒸馏。去掉在策略教师先离线生成标签再用离线标签训练学生保留参考特权。去掉蒸馏学生直接从零训练不经过教师指导。完整 ADOPD保留参考特权和在策略蒸馏。通过这四组对比才能判断“参考特权”和“在策略”分别贡献了多少提升以及是否存在协同效应。另外还要测试不同模型规模的组合MLLM 教师是否真的无法被同等规模学生直接替代学生模型到底可以压缩到什么程度而不损失精度。6. 工业落地难点与工程化注意事项论文里跑通一套方法离产线稳定运行还有很大距离。ADOPD 在工业落地时至少要面对以下难点。6.1 部署端的推理实时性蒸馏后的学生模型虽然比 MLLM 轻很多但仍然是多模态模型。如果学生也是视觉 Transformer 文本解码器的结构推理延迟仍然可能超过 100ms。工业视觉系统通常要求单图处理在 100ms 以内有些高速产线甚至要求更低。所以蒸馏完成后还需要进一步做模型量化和推理加速。可以考虑的优化方向将视觉编码器替换为更轻量的 backbone。将文本解码器裁剪为只输出固定格式的短序列。使用 TensorRT、ONNX Runtime、OpenVINO 等推理框架优化。如果检测任务可以退化为异常分数输出可以在蒸馏后使用线性头代替文本生成。6.2 数据传输与存储在策略蒸馏需要在线调用教师模型这在研究环境没问题但产线环境需要注意数据边界产线图像可能包含客户隐私或内部工艺信息不能随便传到外部大模型服务。如果需要私有化部署教师模型需要准备足够的 GPU 资源。训练数据和产线数据要做好隔离和权限管理。在生产环境做任何数据回流、模型训练、参数更新前都要先确认数据合规和授权并在测试环境验证完整流程。6.3 模型更新与回滚工业异常检测中产品换型意味着数据分布变化此时可以通过在策略蒸馏快速更新学生模型而不需要每换一个型号就训练一个大模型。但在策略蒸馏的线上更新有一个风险如果某段时间教师模型本身输出不稳定或者参考信息配置有误学生模型可能学到错误知识。因此建议保留多个历史版本的学生模型。每次更新先在小批次验证集上对比新旧模型。设定自动回滚机制如果新模型误报率超过阈值自动切回旧版本。对教师模型的输出加入可靠性校验比如低置信度样本不参与蒸馏。6.4 提示词与参考信息管理参考特权中参考文本不是固定不变的。不同产品、不同检测工位、不同工艺阶段参考文本都不同。工程上需要把提示词和参考信息做成配置化而不是写死在代码里。推荐用配置文件或数据库维护# product_profile.yaml product_type: battery_shell detection_rules: - type: scratch description: 表面划伤呈线性长度大于1mm记为缺陷 - type: dent description: 凹坑直径大于0.5mm记为缺陷 reference_images: normal_path: /data/reference/normal/ defect_path: /data/reference/defect/这样每次产品换型只要更新配置和参考图库不需要改训练代码就能让教师模型快速适应新指令。7. 常见误区与排查思路在实际复现和落地过程中很容易踩到下面这些坑。这里整理成排查表方便后续对照。问题现象可能原因排查方式解决方案学生模型效果远差于教师学生输入与教师输入不一致训练时给学生也塞了参考图检查训练和推理时学生输入的数据流保证学生训练和部署输入完全一致在策略蒸馏训练成本过高每个 batch 都实时调用教师模型检查教师推理耗时占总训练耗时比例教师批量推理、梯度截断、多卡并行蒸馏损失不下降教师输出不稳定或参考信息质量差打印教师输出的 logits 和文本结果先人工检查教师输出质量再开始蒸馏误报率偏高学生只学到分数对齐没学到特征和定位信息检查损失权重是否忽略了 mask 损失增加定位对齐损失权重模型换型后崩坏静态提示词和参考信息没有随产品切换检查推理服务的配置加载逻辑将提示词和参考信息配置化为产品档案训练和部署效果不一致训练时用了数据增强部署时没同步对比训练和部署图像预处理流程统一预处理代码保证数据分布一致教师模型输出异常文本提示词太长、参考信息矛盾查看教师完整输入和输出日志精简提示词增加参考信息一致性校验这里尤其要注意第一行。很多人在实现“参考特权”时错误地让学生在训练时也使用了参考图导致部署精度大幅下降。参考特权只能是教师享有学生必须模拟真实部署输入。8. 最佳实践与工程建议下面这些建议适合准备把 ADOPD 方法论落地到项目里的团队。8.1 设计层面明确学生模型的部署约束。先确定到底能接收什么输入、算力上限是多少、延迟要求是多少再反推学生模型结构。教师在训练时看到的参考信息要覆盖足够的正常样本差异不要只用几张固定的正常照片。否则学生会把“静态参考”学成“记忆特定样本”泛化性能下降。蒸馏损失不要只对齐最终输出。异常分数、特征嵌入、定位掩码三个层面最好都覆盖但可以通过损失权重调节不同任务的重要性。在策略蒸馏过程中建议周期性在验证集上评估学生模型观察教师在线反馈是否逐渐降低 loss避免训练后期过拟合教师噪声。8.2 工程层面使用配置文件管理所有超参数包括损失权重、参考图数量、批大小、学习率、训练轮数。训练过程中记录教师输出的可靠性指标比如置信度并加入日志分析。教师如果频繁输出低置信度结果说明参考配置可能存在问题。训练代码和部署代码不要分离成两套完全不同的逻辑。最好通过同一个配置入口保证数据预处理和提示词模板在训练、验证、部署阶段完全一致。生产环境的数据回流、模型更新、版本回滚要有明确流程。先用旧版本模型 新数据做影子测试再逐步灰度切换。尊重最小权限原则模型训练和数据访问只开放给必要角色私有数据不能泄露给外部服务。8.3 给团队协作的建议ADOPD 这类方案实际上是“研究 工程”结合的产物不是一个人能独立搞定的。建议团队至少包含算法工程师负责教师模型选型、蒸馏方案设计、损失函数调优。数据工程师负责参考图库、产线数据回流、标注数据管理。部署工程师负责模型转换、推理优化、产线集成、回滚机制。如果只是个人学习不用追求完整产线可以先跑通伪代码流程在 MVTec AD 上把“参考特权教师 在线蒸馏学生”的最小实验做出来。9. 总结与后续学习方向ADOPD 的核心价值不是发明了一个全新的网络结构而是提供了一套明确的训练范式让持有参考特权的 MLLM 教师在训练过程中以在策略方式指导学生模型最终在部署端实现又快又稳的工业异常检测。回头看我们需要理解三个关键点参考特权是教师特有的优势学生不能依赖它否则部署不一致会带来精度崩塌。在策略蒸馏的核心是教师监督与学生当前学习进度同步让蒸馏过程适应动态数据分布。蒸馏损失需要同时覆盖分数、特征、定位等多层次信息才能把 MLLM 的语义理解能力真正迁移给学生。如果你接下来想做更深入的实践可以参考这样的路线先基于公开数据集实现“普通在线蒸馏”学生模型作为基线。给教师模型接入参考图和参考文本观察蒸馏效果是否提升。逐步去掉教师特权输入验证学生模型是否仍然保持竞争力。把学生模型量化并部署到端侧对比实际延迟和精度。这套路线不仅适用于工业异常检测也适用于其他受限于推理成本的多模态下游任务。理解了参考特权与在策略蒸馏的本质你就掌握了迁移这类方法的设计思路。