
工业质检领域最近出现了一个有趣的矛盾一边是多模态大模型MLLM在视觉推理上表现出色另一边是产线真正需要的稳定、低延迟、高精度的异常检测模型大小和算力都严重受限。于是“蒸馏”成了热门话题把大模型的能力压缩到小模型里。但仔细看很多蒸馏方案你会发现它们还是在拿静态数据集做知识迁移到了工业异常检测这个场景里效果并不理想。ADOPD 这个名字全称是 Reference-Privileged On-Policy Distillation for MLLM-Based Industrial Anomaly Detection。单看这些词你可能觉得是一篇论文标题但它背后其实是一个很实际的问题当老师模型是多模态大模型、学生模型要跑到产线边缘设备上时知识到底应该怎么迁才能既保留大模型的判别能力又适应工业环境里复杂多变的产品和缺陷我的判断是ADOPD 的价值不在蒸馏这个动作本身而在它用 Reference-Privileged 和 On-Policy 这两个机制把蒸馏从“离线复制”变成了“在线适应”。这篇文章我会从问题出发拆解这几个关键词再落到实操路径和踩坑点上重点讲清楚它真正改变了什么、哪些环节最容易出问题。1. 为什么工业异常检测要提前用上 MLLM1.1 传统异常检测的瓶颈工业异常检测简单说就是在产品表面或内部找出不符合预期的区域。这个任务过去主要靠两种方式一类是基于统计和手工特征的算法比如求灰度直方图、找纹理差异另一类是基于卷积神经网络的监督模型比如用 ResNet 做分类、用 U-Net 做分割。这两类方法在固定产品、固定光照、固定缺陷形态的产线上表现尚可但一旦产品换型、工艺调整、新增缺陷类型就要重新标注数据、重新训练模型维护成本很高。难点还在于异常检测本身是高度不平衡的问题。正常样本数量极大异常样本少且形态多变很多缺陷甚至没有统一的视觉定义。传统监督模型对“没见过”的异常几乎无能为力而工业场景恰恰最需要捕捉“没见过”的问题比如划痕角度变化、压伤区域移动、纹理局部扭曲。这类问题经常被归为 few-shot anomaly detection但实际比 few-shot 更麻烦因为它不能用有限的异常类别去定义必须让模型具备某种“正常范式”的推理能力。1.2 MLLM 能把常识带进视觉判断多模态大模型的核心能力在于它不只做图像分类而是把图像视觉特征和语言语义对齐了。这样遇到一个“不正常”的区域它不是只输出一个正常/异常的标签而是能描述“这里有一条微弱弧线可能是压伤”或“这个区域纹理不均匀和周围相比灰度过高”。这种表达能力对工业质检很有吸引力因为产线上需要的不只是报警还要知道为什么报警、大概什么类别、严重程度如何方便人工复判和工艺追溯。但 MLLM 的落地瓶颈也很明显推理慢、显存占用大、在产线上很难实时跑。一个 7B 或 13B 参数的视觉语言模型在普通 GPU 上做单张图片推理往往需要几百毫秒甚至秒级这还只算模型计算不算预处理和后处理。而产线检测通常在毫秒级到几十毫秒级延迟要求完全不在一个量级。所以比较务实的做法不是把 MLLM 直接部署到产线而是用 MLLM 做标注、做难例挖掘、做训练信号再蒸馏出一个小模型去承担实战任务。这就引出了蒸馏的必要性。从工程经验看如果只是拿 MLLM 离线给一批图片打标签再用标签去训练一个小分类器这种做法也能跑通但瓶颈很明显小模型学到的只是 MLLM 给出的离散结论学不到 MLLM 在推理过程中对参考、对比、语义边界的把握。真正要传递的不是“这是什么类型”而是“什么样的情况类似于异常”参考信息和在线策略在这里就成了关键能力。2. Reference-Privileged特权信息到底在蒸馏里解决什么问题2.1 什么是参考特权信息在工业异常检测场景里Reference-Privileged 这个表述值得拆开看。Reference 是参考可以理解为一组正常样本或一块正常区域。Privileged 是特权意味着这部分信息只有训练阶段可用推理阶段不需要客户提供。就像学生在考试时不能带参考书但老师备课和出题时有一整套题库可以参考。放到蒸馏框架里参考特权信息的含义是这样的训练学生模型时除了给它输入图像和 MLLM 的输出还让它可以访问一个由正常样本构成的参考库或参考特征。这个参考库不是每次推理都要提供的它只在训练阶段帮助学生模型理解“正常分布的边界”。推理阶段学生模型只接当前待检图像靠自己的参数完成判断。这样做的好处是学生模型学到的不只是特征到标签的映射还学到了“如何用参考去判断一个区域是否偏离正常”。更进一步参考特权信息往往不是简单给几个图片路径而是一个特征级的参考集合。比如说从 MLLM 提取出来的正常区域语义特征或者一组正常样本的 embedding。学生模型在训练过程中会被要求生成自己的能力使它的特征输出和参考特征对齐或区分。这个过程等价于让模型学会了“对比”而不是“记背”。2.2 它和普通知识蒸馏的实质差异普通知识蒸馏是让老师模型的 logits 或 hidden states 作为软标签约束学生模型输出尽量接近老师。这个方案在分类任务和检测任务上都有不少验证但它不强调参考结构。学生模型是在同一种输入分布上模仿老师如果老师判断错了学生也会跟着错。参考特权信息则不同它相当于给蒸馏过程增加了一条“正常性”线索。学生模型在模仿老师输出之外还要学会从参考库中找到和当前输入最相似或最不相似的正常样本然后基于这种比对结果来判断异常。这样即使老师模型在某些难例上输出偏模糊学生模型也可以通过参考特征得到辅助信号降低对老师标签的依赖。在工业场景里这点尤其有价值。因为工业产品的正常形态通常是可以提前采集的而且相对稳定。构建一个正常参考库往往比收集大量缺陷样本容易得多。传统监督模型缺的是异常样本但参考特权信息恰恰不需要异常样本它只需要正常样本。这让整个数据准备成本低了很多。2.3 在工业异常检测中的具体用法用 ADOPD 的思路落地时参考特权信息可以在两个层面使用。第一个层面是输入级参考把一组正常样本和当前待检图一起送入学生模型或者先在特征层面做比对再输入融合结果。这个方案简单直观但要注意参考样本的数量不能太多否则会增加训练和推理的复杂度。通常一个类别准备几张到几十张代表性正常图就够了关键是这些图要覆盖正常形态的典型分布而不是随便从产线拿几张。第二个层面是特征级参考预先用 MLLM 或预训练视觉编码器提取正常样本的特征构建一个特征库训练时通过对比学习或度量学习的方式让学生模型的输出特征靠近正常特征库的中心、远离异常特征。这个方案更轻量也更适合边缘部署因为推理阶段只需要把学生模型的特征输出和一个固定阈值做比较不需要真的去做图像级别的检索。从实际效果看第二个层面的做法更容易稳定复现。因为特征级参考不依赖端到端的注意力融合而是通过损失函数把学生模型的特征空间约束到一个合理范围内训练过程相对可控。但不是说输入级参考就没用如果产品类别很少、正常形态很稳定输入级参考往往效果更直接。这里要特别提醒一点参考库的构建质量必须严格把关。参考库如果混入轻微瑕疵或者采集时光照不一致学生模型会把“光照变化”学成“异常”导致误报率上升。所以参考库的筛选和清洗和训练集一样重要不能随便拿几张图就完事。3. On-Policy Distillation为什么在线策略蒸馏更适合 MLLM3.1 从强化学习借来的术语要表达什么On-Policy 这个词来自强化学习本意是采样策略和目标策略一致。在蒸馏场景里它表达的意思可以理解为学生模型看到的数据分布和它实际部署时遇到的数据分布应当保持一致而不是只拿一个固定数据集来学习。传统的离线蒸馏过程是这样用老师模型在训练集上做推理提前把预测结果存下来然后让学生模型去拟合这些标签。训练集和推理分布若一致问题不大但工业产线的分布往往是漂移的光照变一点、产品换一个位置、缺陷形态变化训练数据和实际数据就可能出现明显偏差。离线蒸馏对学生模型来说就是在“过拟合训练集的软标签”到了线上遇到分布偏移表现很可能打折。On-Policy Distillation 的核心改变是学生模型不再只看一个固定训练集而是在训练过程中自己作为“采样器”去探索输入空间然后让老师模型针对这些输入生成及时的反馈。学生模型探索到的分布就是它未来实际遇到的分布。这样学生学到的是“在真实分布的每个局部区域如何判断”而不是“在某个固定数据集上记住老师的答案”。3.2 为什么这对 MLLM 蒸馏格外重要MLLM 在工业异常检测中的优势是开放语义但它生成的特征也容易受输入扰动的干扰。比如同一张图稍微旋转几度、改变亮度MLLM 的特征可能偏移很大。如果离线蒸馏只用有限几个固定视角学生模型根本无法覆盖真实产线中可能出现的大量角度、光照和位置变化。而 on-policy 的思路是让小模型在训练时不断改变输入呈现方式比如随机裁剪、旋转、亮度扰动、仿射变换甚至用对抗扰动去模拟边界情况。每产生一个新输入视角就去问老师模型这一视角下应该输出什么再让学生模型学习。这种方式相当于让老师模型的“知识”围绕学生模型的探索路径展开而不是围绕一个静态的标注集展开。学生模型在真实部署时会更稳健因为它已经通过自己的策略去覆盖了很多边界情况。但 on-policy 也意味着训练成本上升。因为老师模型要实时对学生产生的新视角做推理这个推理过程不能完全离线缓存。如果用的是 MLLM推理成本会更高。所以实际落地时要控制探索规模和采样频率不能让学生模型每个 step 都无限探索。一个常见的折中方案是先做少量离线蒸馏让学生模型具备基本能力再用 on-policy 在关键难例和合成扰动上进行精修。这样既能控制成本又能提升分布适应性。3.3 一个最小可复现的 on-policy 蒸馏伪流程如果你要复现这套思路不需要一开始就照搬到完整论文设置里。下面是一个最小流程适合先在几个类别上验证效果准备一个参考库每个正常类别收集 10 到 50 张代表性正常图提取特征后保存。准备一个学生模型初始权重可以使用在类似工业缺陷集上预训练过的视觉编码器或者自己用少量数据做初始训练。定义 on-policy 采样函数学生模型每训练若干步就对当前训练图像做一组随机扰动得到新的输入视角。调用老师模型MLLM生成软标签把扰动后的输入送到老师模型得到分类 logits 或特征描述用作学生模型的监督信号。在损失函数中加入参考特权约束让学生模型的输出特征和参考库的正常特征做对比约束特征空间在异常方向上偏离。反复迭代直至验证集精度稳定。这个流程不需要一上来就多任务并行先把单类正常样本跑通确认能成功检测到几个人工注入的缺陷再逐步扩展到多类产品。这样便于排查问题也便于判断蒸馏是否真的带来了增益。从工程经验看on-policy 蒸馏最容易出现的问题是“探索过度”。随机扰动如果太激进会把正常样本都扰动成看起来像异常的样子导致老师模型给出错误标签学生模型学乱。所以扰动幅度必须控制在产品正常形态范围内最好先对扰动后的图像做人工抽查确认没有破坏正常语义。4. ADOPD 的落地实践从环境准备到参数调优4.1 前置条件和环境准备ADOPD 这类方法对算力有硬性要求因为训练阶段需要同时跑 MLLM 老师模型和学生模型。如果你只有一张消费级显卡建议先不要追大尺寸的 MLLM可以考虑 3B 到 8B 之间的视觉语言模型。训练框架上PyTorch 和 HuggingFace Transformers 是常见基础环境也可以用 Lightning 加速开发。其他前置条件包括一个能代表正常分布的数据集不必太大但覆盖面要广。一个能模拟异常的测试集要么用真实缺陷图要么在正常图上注入人工缺陷。一个可用的老师模型接口或权重能接受图像输入并输出软标签或特征。一份固定的验证逻辑比如每轮训练后在同一批测试图上评估 AUC、F1 或误检率。在这些条件未齐备之前不建议直接跑完整流程。先把每个环节单独验证尤其是老师模型的输出格式和稳定性因为它决定了后续蒸馏质量。4.2 关键参数理解和调优顺序在 ADOPD 里参数设计会影响训练效率和最终性能。按重要性排序可以从以下几类入手参数类别关键参数常见取值范围调优建议探索强度扰动幅度、扰动概率幅度 0.05-0.3概率 0.3-0.7先小幅度低频次再看分布适应效果参考约束权重lambda_ref0.1-1.0先从小权重开始观察特征空间是否合理蒸馏损失温度temperature2-8温度越高软标签越平滑但噪点也可能被放大数据加载batch size、num_workersbatch 8-64、workers 4-16根据显卡显存和 CPU 能力平衡训练节奏学习率、epoch、warmuplr 1e-4-5e-4epoch 20-100小数据量下更依赖 lr 和 warmup可以先跑小模型验证调优顺序建议是先固定参考约束权重和温度调探索强度找到合适的扰动幅度后再调蒸馏损失和其他正则项。不要一上来就同时调多个参数否则很难判断是谁在起作用。4.3 一个训练中常见的脚本框架由于输入材料没有提供官方代码我这里给出一个通用训练流程的骨架帮你理解整体结构。真实落地时你要把它替换成自己的数据加载和模型定义。# 通用训练骨架需根据实际依赖调整 import torch import torch.nn as nn # student_model: 常规视觉模型如 ResNet、Vision Transformer # teacher_model: MLLM 模型支持图像嵌入和语义描述 # reference_loader: 加载正常参考库特征 def train_step(batch, reference_features): images, labels batch # 1. on-policy 探索给当前图像添加扰动 perturbed_images, pert_params apply_perturbation(images) # 2. 老师模型生成软标签 with torch.no_grad(): teacher_output teacher_model(perturbed_images) # 3. 学生模型前向 student_out student_model(perturbed_images) # 4. 蒸馏损失 loss_distill distill_loss(student_out, teacher_output, temperature) # 5. 参考特权损失让学生特征靠近正常参考 loss_ref reference_contrast_loss(student_out, reference_features) # 6. 联合优化 loss loss_distill lambda_ref * loss_ref loss.backward() optimizer.step()这段代码的意图非常清晰每一步训练都通过扰动生成新分布老师模型实时提供标签同时参考特征约束学生模型的特征空间。这个流程把 Reference-Privileged 和 On-Policy 两个概念融合在了一个训练循环里。4.4 线上推理时的部署建议训练结束后推理阶段应完全去掉老师模型和参考库。学生模型只需接收待检图像输出异常分数或掩码。为了提升线上效率可以做以下优化将图像预处理固定为标准尺寸避免动态 resize 造成特征偏移。使用 TensorRT、ONNX Runtime 或模型量化压缩学生模型。在批次推理时设定 batch size 上限避免显存溢出。保留一个简单的后处理模块将模型输出映射为产线可用的报警信号。这个阶段还要特别注意推理时的输入分布必须和 on-policy 训练时的扰动分布接近不能训练时加了很多旋转扰动线上却完全没有旋转场景。如果实际场景变化不大训练时的探索强度可以适当降低让模型更专注于稳定特征。5. 最容易翻车的五个地方与排查链路5.1 训练时正常一到线上误报率飙升这是最典型的场景。原因往往不是模型训练失败而是训练分布和线上分布不一致。常见诱因包括参考库采集时有轻微污渍、光照条件不同、训练时扰动幅度过大导致模型把正常形态学歪了。排查顺序上先检查参考库质量再检查老师模型的软标签是否在异常样本上出现了偏差最后检查学生模型的可视化特征看看它到底在关注什么区域。建议把线上采集到的图片日志定期回流到验证集模型发布前先做小规模灰度测试。这类问题很难在训练阶段完全消除必须靠持续监测和迭代。5.2 学生模型特征崩坏所有图片都报异常这种情况往往出在参考特权损失权重设置过大。lambda_ref 太大学生模型会过度压缩特征空间导致正常样本和轻微噪声都被推到远离参考中心的区域。处理方法是降低 lambda_ref同时检查参考特征库是否需要降维或聚类避免参考特征过于碎片化。5.3 老师模型输出不稳定同一张图多次推断结果不同MLLM 在生成式推理时往往有随机性如果没有固定 seed 或设置 temperature0软标签可能不稳定。这会让蒸馏训练出现剧烈波动。排查链路是先固定老师模型的推理参数再检查输入图像的预处理是否一致最后确认 teacher forward 是否被放在 eval 模式下。如果还不稳定再考虑对老师模型做多次采样取平均或按语义聚合得到软标签。5.4 训练速度慢到无法接受on-policy 蒸馏的瓶颈在于每步都要让老师模型推理。如果数据集较大这个方法会在时间成本上爆炸。优化思路有三个方向一是老师模型先对基础样本做离线缓存只对扰动样本做在线推理二是降低扰动采样频率比如每隔几个 step 做一次 on-policy三是将老师模型蒸馏成一个小一些的中间模型再用中间模型做在线指导以减少性能消耗。这个方法适合先用小规模数据验证效果确认方向正确后再谈规模化。否则很容易卡在训练成本上反而忽略了算法效果本身。5.5 日志、指标和版本管理缺失迭代无从下手很多项目初期只关注训练和最终精度没有记录训练时的参数组合、参考库版本、老师模型版本和扰动方法。到了后面效果变差根本不知道是哪个变量引起的。工业项目里模型实验记录比模型本身更值钱因为只有完整记录才能支撑快速复现和线上对比。建议从一开始就采用轻量实验管理方式记录数据版本、参数配置、实验备注和指标曲线。这样即使一次训练走了弯路也能快速找到原因。6. 这套方法真正改变了什么ADOPD 这个方向放在工业异常检测里本质是一次知识传递方式的调整。传统蒸馏关心的是“让学生模型更像老师”但在工业场景里这个目标不完全合适因为老师模型的可解释性和语义能力很难直接复制。更好的目标是“让学生模型能利用参考信息以在线探索的方式建立自己的判断边界”。参考特权信息带来了数据层面的杠杆你不需要很多异常样本只需要一批高质量的正常样本就能实现异常判断。这对工业领域意义重大因为异常样本永远是稀缺的、变化的、不完整的。多个产品线换型时你只需要重新准备正常参考库而不是重新标注大量缺陷数据。这会切实降低产线模型维护的边际成本。on-policy 机制则解决了分布漂移问题。它让学生模型在训练时就能面对和未来部署相似的输入变化从而获得更强的鲁棒性。虽然训练成本更高但从长期运维角度看模型上线后的返工率和误报率下降整体成本并不一定更高。值得注意的是这类方法不是一个“一劳永逸”的方案。它依赖一个质量可靠的 MLLM 老师模型依赖参考库的准确覆盖依赖训练过程中对扰动强度的合理控制。如果这三块没有做好学生模型再训练也无法稳定。甚至在极端情况下老师模型自身的幻觉和不确定性会被放大到学生模型里导致更严重的错误。我的建议是如果团队刚开始接触这个方向不要追求把模型规模做大也不要急着一次跑通完整工业链路。更好的一条路径是先用一个小规模数据集搭建一个最小可运行流程验证 on-policy 蒸馏是否真的带来了分布泛化能力验证参考库约束是否真的降低了误检率再逐步扩展到更复杂的产线场景。无论论文标题多复杂最终还是要落到“模型在线上能不能稳定跑、问题出现时能不能快速定位”这些基本工程命题上。ADOPD 真正值得关注的不是它把蒸馏这个动作做得多花哨而是它把“参考”和“在线适应”两个概念引入了工业异常检测的蒸馏框架让知识迁移不再是一次性的离线复制而是持续贴近真实分布的学习过程。对长期做工业视觉落地的人来说这个思路比模型本身更有迁移价值。