恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

深度迁移学习五大自适应方法:从MMD到伪标签的实战解析

  • 首页
  • 资讯中心
  • /
  • 深度迁移学习五大自适应方法:从MMD到伪标签的实战解析

相关资讯

算法面试必考指针题:双指针、快慢指针、滑动窗口与链表操作攻略 2026/10/19 13:09:36
开源代码审查工具实战:用LLM Agent和Git钩子实现自动化代码审查 2026/10/19 13:04:36
端到端自动驾驶深度解析:从模块化到数据驱动的新范式 2026/10/19 13:04:36

最新资讯

Reactor与Epoll实战:深入理解高并发网络编程核心机制
三体系审核条款落地指南:从PPT大纲到合并内审检查表
AI公式导出全攻略:从图片到可编辑LaTeX/Word公式
SpringBoot+Vue+MySQL档案管理系统设计与实现:前后端分离毕业设计完整指南
ctfshow web1 解题全流程:从查看源代码到信息收集入门
本地大模型落地:从工作流编排到API调用的完整实战

今日推荐

OpenCowork 实测:支持本地文件、飞书机器人的 Windows AI 助手(只需配置 Token)
GPT-6 Sol 与 Luna 怎么选?Chat、Work、Codex 版本差异与 TaoToken 接入实测
openclaw.net 集成 ElBruno.MempalaceNet 记忆系统:把 MCP 配置改到 TaoToken 的完整实践

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

深度迁移学习五大自适应方法:从MMD到伪标签的实战解析

发布时间:2026/10/19 13:09:36
深度迁移学习五大自适应方法:从MMD到伪标签的实战解析 1. 一个让我开始研究深度网络自适应的真实问题同模型换产线就失效去年我在做某工业质检项目的模型迁移时碰到了一个特别反直觉的现象同一个卷积网络在A产线采集的数据上训练验证集准确率已经做到95%以上结果一换到B产线准确率直接掉到70%出头。训练曲线没有任何异常模型没有过拟合到单条产线但换个拍摄角度、换个零件批次性能就是不受控制地往下掉。反复排查之后我把目光从“数据质量问题”转到了“分布差异”上。这类问题正是深度迁移学习里深度网络自适应这一分支最擅长处理的事情源域有足够的标签目标域只有一堆没有标注的数据模型不能重新训练也不希望花人力重新标注就靠各种自适应策略让网络自己往目标域方向调整。这篇文章打算把五种最核心、也最容易被混为一谈的方法放在一起讲清楚。如果你正在做的项目正好有这种“训练环境和部署环境不是同一个分布”的苦恼或者你在准备相关方向的研究、想把迁移学习里常用的自适应套路彻底弄明白这篇内容会是一个比较完整的参考。五种方法分别是基于核距离的MMD对齐、梯度反转对抗、批归一化统计量替换、二阶协方差对齐、以及伪标签自训练。它们解决的其实是同一个矛盾既要保留源域上学到的判别信息又要抹平源域与目标域之间的差异。1.1 那两周我到底遇到了什么我当时的初始方案很常规把A产线采集的图像做完标注训练一个分类网络A产线自己的测试集已经做到95%以上。到了B产线我首先怀疑的是图像采集不一致于是统一了分辨率、亮度、对比度结果只涨了两三个点。接着我试了在B产线少量有标签数据上做微调效果是上来了但老板说B产线每一批零件都可能有新规格不可能每次都标注几十上百张图去微调。真正让我意识到这是“域偏移”问题是在我随机抽了A和B两条产线各几百张图用同一个网络提取特征之后。我原本以为它们会混在一起结果可视化之后两团特征隔得非常远。那个瞬间我才反应过来原来网络从来没有“学会”跨产线工作。模型在源域学到的决策边界搬到一个分布偏移的目标域上边界自然就失效了。这种情况下最理想的技术路线就是无监督域自适应源域有标签、目标域无标签利用目标域的大量无标注数据参与训练或推理时的调整。深度网络自适应指的就是让网络结构本身去适配目标域而不是简单地在数据层面做增强或者重新训练一个新模型。我后来对比了很多方法发现绝大多数实用路线都可以归到下面这五类里。1.2 域偏移与无监督域自适应的基本设定先统一一下术语后面讲方法才不会乱。我们把有大量标签的数据所在的环境叫源域把没标签但实际要部署的环境叫目标域。算法的目标通常是使用源域数据训练得到的模型在目标域数据上取得尽量高的准确率。整个过程中目标域的真实标签不参与训练因此叫“无监督”域自适应。域偏移可能来自很多方面光照条件、相机型号、背景环境、物体形态、噪声水平、说话人或者文本风格。偏移程度也有轻有重有时只是统计量层面的平移缩放有时是整个特征空间的结构性变化。不同方法对这两种偏移的敏感度完全不同这也是为什么不能随便拿一个方法就去套所有场景。很多人在实际项目中会问我不直接用目标域数据做微调吗如果你只有几十张目标域标注微调确实最直接。但在工业质检、医学影像、自动驾驶这些场景里目标域的数据往往量大且分散标注成本极高。无监督域自适应的意义在于它用“源域标签目标域无标签数据”就能完成适配。下面五种方法本质上都是在这个设定下做文章。1.3 五种方法的共同博弈保留判别信息抹平域差异如果只盯着“抹平域差异”看问题会变得很简单直接让源域和目标域的特征强行一样不就行了但这样做的副作用是灾难性的。当你把两个域的特征强行拉到同一个位置网络原本学到的类别边界也可能被一并压平结果源域准确率掉一截目标域也没好到哪去。这种现象在迁移学习里叫负迁移是所有自适应方法都要提防的事情。所以每一种方法的内在结构都是一场拔河一边是分类损失要求特征保留足够的判别信息另一边是域对齐损失要求特征降低域之间的可区分性。DAN用MMD直接度量特征分布距离DANN用域判别器来博弈AdaBN用BN统计量做轻量替换CORAL用二阶协方差对齐伪标签方法则用目标域高置信样本反过来微调决策边界。理解了这个共同主线再看下面的具体方法就不会觉得它们是孤立的技巧。2. 方法一DAN与MK-MMD——让两个特征分布直接互“感受”对方先讲最经典、也最适合做baseline的一类基于最大均值差异MMDMaximum Mean Discrepancy的特征对齐方法。这类方法在深度迁移学习中的代表性结构就是DANDeep Adaptation Network核心思想一句话就能说清把源域和目标域的特征取出来算一个分布距离然后把这个距离作为损失的一部分让网络在训练时不断缩小它。2.1 MMD的数学直觉分布差异如何被算成距离MMD想回答的问题很简单给定两个样本集合它们的底层分布到底像不像最朴素的做法是直接比较均值比如源域特征均值是[1, 0]目标域特征均值是[1, 0.1]觉得差不多。但这太粗糙了均值完全相同的两个分布形状可能差很多。MMD的改进在于先把样本通过一个核函数映射到一个高维空间在高维空间里再比较均值。用大白话说你直接看两个人像不像可能看走眼但把两个人从头到脚的各种细节都展开、在高维描述空间里比较就会靠谱很多。映射之后两个分布之间的差异可以写成$$MMD^2(P, Q) \mathbb{E}{x,x}[k(x, x)] \mathbb{E}{y,y}[k(y, y)] - 2\mathbb{E}_{x, y}[k(x, y)]$$其中$k$是核函数最常用的是高斯核$k(x, y) \exp(-\frac{|x-y|^2}{2\sigma^2})$。这个公式实操时就是计算四部分核函数值的期望不需要真的去构造那个高维映射所以实现起来并不复杂。MMD越小说明两个分布越接近为0时两个分布在高维空间里完全重合。当然高斯核里的$\sigma$选多少直接决定了“从哪个尺度看分布差异”。选太小每个样本之间的核值几乎都接近0距离失去意义选太大所有样本都长得一样距离也无法区分。这也是单核MMD很难调好的根本原因。2.2 DAN做法多层对应对齐DAN的解决方案是使用MK-MMD也就是多核最大均值差异。它的思路很直接与其纠结某一个$\sigma$不如同时使用一组不同尺度的高斯核比如把带宽覆盖从1到64的范围然后让网络自己学习每个核的权重。$$k_m(x, y) \sum_i \beta_i \exp\left(-\frac{|x-y|^2}{2\sigma_i^2}\right)$$在结构层面DAN也不是只对齐最后一层特征。它会选取骨干网络中的多个层分别在这些层的输出上计算MMD再把所有MMD加起来。原因很简单靠近输入的层保留了大量纹理、边缘信息靠近输出的层更偏向语义信息。如果你只对齐最后一层前面层里的域差异可能在下游像滚雪球一样被放大最终仍然限制最后一层特征的迁移效果。典型做法是取最后一个卷积块和最后几个全连接层的输出逐层加MMD约束总损失写成$$L L_{cls} \lambda \sum_l MK_MMD^2(z_s^l, z_t^l)$$分类损失只作用在源域有标签样本上MMD损失同时作用在源域和目标域特征上。$\lambda$用来平衡两个损失实践里通常从0开始逐步增大避免网络一开始因为对抗信号过强而放弃分类任务。2.3 实操经验核带宽、batch和负迁移跑DAN类方法时有三件事最容易出问题。第一是核带宽的默认值。我见过不少复现代码直接把带宽写死成[1, 2, 4, 8, 16, 32]如果你的特征经过了标准化这个范围确实能用但如果特征尺度差很多MMD可能几乎不产生梯度或者一上来就巨大。稳妥做法是先对特征做一次L2归一化或标准化再套多核列表。第二是batch size。MMD的估计方差和batch大小强相关batch只有16的时候两个域的MMD会被噪声淹没训练时损失曲线看起来在下降实际特征分布根本没有靠近。我个人的底线是32以上能到64更好。目标域样本不够凑batch时宁可多跑几步也把它凑够。第三是负迁移。MMD做的是整体分布对齐它不关心类别结构。如果源域和目标域的类别构成不完全一致或者某个类别在两个域里的特征差异明显不同强制全局对齐可能把猫的分布往狗的分布上拉。这也是后来出现JAN、CDAN这类“联合分布对齐”方法的原因。我的建议是使用DAN可以但务必同时监控源域准确率。如果源域准确率大幅下降大概率是负迁移要么降低$\lambda$要么换类级对齐方案。3. 方法二DANN梯度反转对抗——域判别器分不清反而对了如果说MMD是从“距离”入手那对抗式方法就是从“博弈”入手。代表结构是DANNDomain-Adversarial Neural Network也叫梯度反转网络。它把一个域判别器直接接在特征提取器后面通过让特征提取器和域判别器互相较劲最后得到一个“域不可区分”的特征表示。3.1 对抗博弈的链条整个结构里有两个关键角色。第一个是域判别器它接收特征判断这个特征来自源域还是目标域第二个是特征提取器它想让域判别器判断不出来。逻辑很直接如果特征提取器真的做到了说明它已经不再保留“我来自哪个域”的信息那么分类器在源域学到的决策边界就能更自然地用在目标域上。但这和普通GAN的对抗又不太一样。在GAN里生成器和判别器是两个独立网络在DANN里特征提取器同时服务分类器和域判别器它一方面要从源域数据里学分类一方面要向目标域数据对齐。最终的优化目标是一个带两个头的结构特征提取器 分类器负责源域分类特征提取器 域判别器负责让两个域混淆。这个设计最精彩的地方在于类别语义不会被完全破坏分类器还是会施加压力让特征保留与任务相关的判别结构。域判别器只负责把“域身份”从特征里剥离出去。两者叠加得到的是一个既保持判别力、又对域不敏感的特征空间。3.2 GRL的损失设计与会让人懵的实现细节DANN在实现上有一个非常反直觉的组件叫梯度反转层GRL。如果没有GRL网络会怎样你如果直接对域判别损失做反向传播特征提取器会往“让域判别器更容易区分”的方向更新因为它收到的梯度来自判别器而判别器希望把两类分得更清楚。为了把这种对抗关系反转过来GRL在前向传播时什么都不做输入是什么就输出什么但在反向传播时它会把来自域判别部分的梯度乘以一个负数。用伪代码表达就是这样class GradientReversal: def forward(self, x, lam): self.lam lam return x def backward(self, grad): return -self.lam * grad总损失表面上看是分类损失加域判别损失但因为在特征提取器的路径上插入了GRL实际梯度方向完全不同。域判别器正常更新特征提取器收到的是反向梯度于是不断朝“骗过域判别器”的方向走。刚开始接触这个实现时很多人会困惑为什么我明明加了一项域损失特征却越来越不像原来的样子答案就在GRL的符号翻转里。还有一个容易被忽略的细节是$\lambda$的调度。训练前期如果对抗系数太大特征提取器会尽快去“迷惑”域判别器但分类任务还没学好结果特征被搅成一团。DANN论文里常用的调度是让$\lambda$从0缓慢升到1每个iteration都更新。我自己常用的形式是$$\lambda \frac{2}{1 \exp(-10 \cdot p)} - 1$$其中$p$是当前训练进度比例。这样前几百步对抗压力很小分类器先把基本结构稳住后面再逐步加大混淆力度。3.3 训练不稳定是常态我踩过的三个坑第一个坑是域判别器太强。很多人会把域判别器做成一个又大又深的网络结果判别器几乎立刻收敛到100%准确特征提取器再怎么对抗都翻不了身目标域特征被折腾得又乱又差。我的经验是域判别器保持小而简单一两个隐层、每层几十到几百个神经元就够千万别在这边堆算力。这个做法听起来反直觉但在对抗式域自适应里特别管用。第二个坑是学习率不平衡。强对抗系统中特征提取器和域判别器的更新速度一旦失衡训练过程会震荡得很厉害。我看到过的“经典失败”是特征提取器已经过拟合源域分类任务把源域特征压成一个很窄的流形而域判别器还在试图把目标域特征往这个流形里拉结果目标域样本全被拉到源域类别边界之间分类器根本没法决策。解决方式之一是把特征提取器的学习率设得比域判别器略低或者在对抗损失上额外做梯度裁剪。第三个坑是过度混淆。DANN本质上是在做全局的域不可区分如果源域和目标域的类别先验分布差很多它同样会遇到和MMD一样的结构错位问题。后来的CDAN之所以改进明显是因为它不再只用原始特征做对抗而是把分类器输出的概率分布也拼接进域判别器让对抗过程知道当前样本属于哪一类。如果你面对的是分布差异很大、类别结构又比较复杂的任务建议直接从CDAN这类条件对抗出发而不是死磕基础的DANN。4. 方法三AdaBN——推理阶段只改统计量一招换域如果说前面两种方法都要“重新训练一部分网络”那AdaBN走的是完全相反的路训练结束之后几乎什么都不用学只要在推理阶段替换掉批量归一化层的统计量就能获得明显的自适应效果。这个方法轻量到什么程度我在不少场景里把它当作零成本baseline先跑一遍再看要不要上重的对齐方法。4.1 BN统计量为什么能当“域指纹”批量归一化Batch Normalization的公式相信大家都熟$$y \gamma \cdot \frac{x - \mu}{\sqrt{\sigma^2 \epsilon}} \beta$$训练时$\mu$和$\sigma$来自当前batch推理时则使用网络训练阶段累计下来的全局统计量。关键问题在于这个统计量和数据分布是强相关的。源域训练数据的颜色、光照、形态分布整体偏A网络每一层的$\mu$和$\sigma$就会往A的方向收敛一旦换成B域的数据同一层的神经元响应分布整体发生了平移或者缩放而统计量还停留在A归一化自然就偏了。AdaBN的核心洞察是我们不一定需要重新学习所有卷积权重只要让每一层的归一化统计量换成目标域的网络就能立刻适应很多统计层面的域偏移。你甚至可以把BN统计量想象成模型的“肤色”卷积权重是“骨架”。换域任务里很多时候骨架是通用的只是肤色需要换一换。4.2 实际操作路径与框架适配细节实现AdaBN的大致流程是这样的模型先用源域数据正常训练完保留所有权重和源域BN统计量然后将目标域无标签数据按batch送入网络把网络置于“会更新BN统计量”的前向模式让每一层用目标域batch计算出的$\mu$和$\sigma$覆盖原来的统计量最后再用这些更新后的统计量做推理。听上去很简单但框架里的坑不少。很多深度学习框架在eval模式下BN层会直接使用训练时保存的running统计量并不使用当前batch的统计量。如果你直接把模型切到推理模式去处理目标域数据那用的还是源域统计量等于没做AdaBN。解决方式有两种一是让模型保持在训练模式但关闭dropout等随机操作只走一遍目标域数据二是自己把BN统计量提取出来用目标域统计量手动替换。一个小技巧是如果你采用的是模式一切换的方式建议把BN的momentum临时设成1.0让当前batch的统计量直接覆盖历史累计值而不是做滑动平均。这样跑完一遍目标域数据网络里存的就基本是目标域统计量了。跑完之后再切回eval模式正常推理。4.3 能占便宜但别依赖能力边界在哪AdaBN到底适合什么样的场景从我的经验看它对付“统计层面的偏移”特别有效。比如同一个相机换了白平衡图像整体色偏变了同一个仓库换了照明亮度分布整体变了或者硬件批次不同导致传感器响应整体变化。这些情况下卷积权重确实不需要大改BN统计量一换准确率就能回来不少。但它也有明确的边界。如果域偏移不只是均值和方差的变化而是出现了类别层面的结构错位比如同样是手机A产线的手机都是正面朝上B产线的手机一半是背面朝上那AdaBN就无能为力了因为它根本改变不了决策边界的形状。另外目标域batch不能太小。BN统计量本身有估计方差batch太小会让统计量波动非常大反而比用源域统计量更差。我用AdaBN时目标域至少凑到32个样本以上最好覆盖到各类别的大致比例。5. 方法四深度CORAL——二阶协方差对齐捕捉特征关系漂移很多人在做过MMD和AdaBN之后会意识到一阶统计量均值和逐维度的方差能覆盖一部分偏移但特征维度之间还有“关系结构”会漂移。比如网络在中层输出的第5维和第18维在源域里相关性很高到了目标域突然变得不相关。这种变化用MMD度量不出来但用CORAL可以。5.1 CORAL在补MMD的什么空CORALCorrelation Alignment最早是一个浅层方法核心思想是让源域和目标域特征的协方差矩阵尽可能接近。MMD对比的是两个分布在高维核空间里的均值差异天然更关注“整体的位置”而CORAL对比的是二阶统计量也就是协方差天然更关注“特征内部的关系”。放在一个具体例子里理解源域图像普遍偏亮目标域图像普遍偏暗这主要是一阶统计量的差异MMD能很快抓住但如果源域里物体颜色和背景颜色有稳定的搭配关系目标域里这种搭配关系变了MMD往往看不到因为它计算的是两两样本之间的核距离而不是特征维度之间的关系。CORAL直接拿协方差矩阵出来比就是为了补这种结构层面的差异。深度CORAL的做法是把CORAL损失直接接到深度网络的特征提取层后让网络在训练时不光最小化分类损失还最小化源域与目标域协方差的差异。5.2 深度CORAL损失计算与实现注意点假设源域特征矩阵为$X_s$目标域特征矩阵为$X_t$每行是一个样本。先做中心化得到$X_s^c$和$X_t^c$再计算协方差矩阵$$C_s \frac{1}{n_s - 1}(X_s^c)^T X_s^c$$$$C_t \frac{1}{n_t - 1}(X_t^c)^T X_t^c$$损失就是两个协方差矩阵的Frobenius范数平方$$L_{coral} \frac{1}{4d^2} |C_s - C_t|_F^2$$其中$d$是特征维度。除以$4d^2$是为了把损失尺度控制在一个相对稳定的范围内防止协方差数值太大压倒分类损失。实际写起来几乎是“翻译一遍公式”的工作量核心计算可以用类似这样的逻辑完成def coral_loss(x_s, x_t): d x_s.size(1) x_s_c x_s - x_s.mean(dim0, keepdimTrue) x_t_c x_t - x_t.mean(dim0, keepdimTrue) cov_s (x_s_c.t() x_s_c) / (x_s.size(0) - 1) cov_t (x_t_c.t() x_t_c) / (x_t.size(0) - 1) return ((cov_s - cov_t) ** 2).sum() / (4.0 * d * d)这里有两个实现注意点。一是center操作要在batch维度上做不能把整个特征矩阵的全局均值当成所有维度的均值。二是batch同样不能太小二阶统计量的估计方差比一阶统计量还大batch只有16时协方差矩阵往往噪声极大。再一个容易被忽视的问题是特征维度如果嵌入层输出维度是4096甚至更高协方差矩阵就是4096乘4096内存和计算量都很可观。这时可以在协方差损失前先加一个线性投影层把维度压到256或512再做对齐效果通常不会差太多。5.3 我的使用感受稳定、省心但别忘记一阶项在实际使用中深度CORAL给我的最大感受是稳定。它没有对抗方法那种剧烈的振荡也没有MMD里的核带宽选择问题训练过程很像在普通分类任务上多加了一个平滑的分布约束。在很多中等规模的迁移任务上它的效果即使不是最好也一定不会是灾难。但要注意CORAL只对齐协方差不直接对齐均值。两个域如果整体均值也漂移了只做CORAL等于只解决了一半。我通常在CORAL损失之外再补一项简单的源域和目标域特征均值距离甚至直接用一个小权重把两者的均值差也压进去。这个做法没什么高深理论但在工程上能明显提升最终表现属于低成本高收益的补充。另外一个比较常见的误区是认为CORAL能替代AdaBN。它们解决的偏移尺度不一样。AdaBN作用于每一层的归一化统计量发生在网络内部CORAL作用于特征输出层附近发生在任务相关的表示上。两者完全不冲突我在实际项目里经常先加AdaBN处理低层统计偏移再在网络最后几层加CORAL做更高阶的对齐。6. 方法五伪标签自训练——用高置信目标样本做迭代精炼前面四种方法基本都在“特征空间”里做文章最后一种方法则回到了“标签”层面。伪标签自训练的思路非常朴素先用源域训练一个模型再用这个模型去预测目标域样本把其中置信度足够高的预测结果当作“伪标签”混入训练数据继续训练。看着像简单微调但在深度网络自适应里它扮演的角色比很多人以为的更重要。6.1 伪标签流程阈值、迭代、损失组合伪标签的标准流程可以分成四步。第一步用源域数据训练一个初始模型这个模型可以用上面任何一种方法增强也可以什么都不加直接训练。第二步用初始模型对目标域无标签数据做推理得到每个样本的类别概率。第三步按某种规则筛选出高置信度样本把预测类别作为伪标签。第四步把这些伪标签样本和源域有标签样本混合继续训练网络必要时重复多轮。阈值是最容易调也最容易出错的环节。阈值太松错误伪标签会污染训练阈值太紧能用的样本太少自适应效果有限。我自己的经验是在置信度阈值上第一轮用0.9以上比较安全如果你在第一轮就发现可用样本覆盖不到所有类别可以把阈值降到0.8但要配合更小的学习率。另一个更稳妥的做法是“按类别保留”每个类别选出预测概率最高的K个样本保证每个类都有伪标签可用也避免长尾类别被高置信度的头部类别淹没。损失组合上伪标签样本的损失可以和源域分类损失等权也可以加一个小于1的权重。我见过不少人把伪标签损失权重设成0.3到0.5之间训练稳定性比等权明显好一些。6.2 为什么它天然贴近“类级对齐”MMD和DANN在特征空间做的是全局分布对齐伪标签方法则很自然地进入“类别条件对齐”的层面。原因是伪标签在训练时会针对目标域的每一个具体样本产生交叉熵损失这个损失会推动网络把该样本的特征推向其所属类别的中心。也就是说目标域的猫样本会带着“猫”的伪标签把目标域猫特征往源域猫特征方向拉而不是像全局MMD那样把整个目标域云团往整个源域云团拉。这个区别在大类别先验不一致时尤其重要。举个例子源域有1000个狗样本、100个猫样本目标域却反过来有1000个猫样本、100个狗样本。全局MMD会努力让两个域的整体分布一致结果可能把大量目标域猫样本往源域的狗类别方向拉而伪标签自训练时置信度高的目标域猫样本带着猫的伪标签参与训练网络会尽量让它们靠近源域的猫类别。这就是为什么在实际项目里伪标签方法经常被放在特征对齐方法之后作为“收尾精炼”步骤先用DK方法把粗糙的域差异拉近再用伪标签把类别层面的错位一点点扭过来。6.3 确认偏差与类别覆盖问题伪标签方法最大的隐患是确认偏差网络一旦把某个错误预测当成了正确伪标签这个错误会在后续训练里不断被放大因为它看起来和正确样本一样参与了损失。我见过一个极端案例初始模型在某个类别上置信度很高但它实际是错的结果几轮自训练下来整个目标域的这个类别被带偏准确率反而比迭代前更低。化解方法主要有三种。第一提高置信度阈值尤其是迭代后期让网络只去学习它最有把握的样本。第二不使用硬标签而是把预测概率当作软标签这样即使某个类别的概率不是最高它的贡献也不会被完全截断。第三配合上面提到的按类别保留策略防止某个类别因为初始置信度普遍偏低而被完全剔除。类别覆盖问题同样值得重视。如果目标域某个类别在初始模型上很少被预测成高置信度这个类别的样本就会逐渐在训练中消失网络对它的适应性为零。所以每一轮伪标签筛选之后我都建议看一眼每个类别到底保留了多少样本。如果一个类别快被筛没了宁可给这个类别降阈值也不能让它彻底消失。很多人以为伪标签自训练只是一个简单的“预测-筛选-训练”循环真正做到位它其实需要大量的统计监控和阈值策略设计。7. 五种方法横向对比和我的真实选型顺序把这五种方法全部摆在一起看你会发现它们根本不在同一个层面MMD和CORAL是特征层面的距离度量DANN是网络结构上的对抗博弈AdaBN是推理阶段的统计量替换伪标签则是训练数据的标签扩展。它们可以互相替代也可以互相叠加。真正到项目里很少有人只用其中一种从头跑到尾。7.1 一张表看透差异方法对齐对象是否需要目标真标签额外训练量最适用场景主要风险DAN/MK-MMD特征整体分布否中整体统计分布偏移明显负迁移、类别错位DANN对抗特征域身份否高分布差异大但类别语义稳定训练不稳、过度混淆AdaBNBN统计量否极低光照、颜色、批次风格变化能力有限、依赖batchCORAL二阶协方差否低特征关系结构漂移只对齐二阶统计量伪标签自训练类别条件分布否中目标域类别已知、模型已达可用确认偏差、类别遗漏从实现成本角度排AdaBN几乎为零CORAL和DAN其次DANN最贵伪标签自训练的成本取决于你迭代几轮。效果上没有一个方法能通吃全部任务。我通常先做一个AdaBN看看统计量层面的自适应能不能解决80%的问题解决不了就上CORAL或DAN如果分布差异还是太大才考虑DANN/CDAN最后一定用伪标签自训练做一轮到两轮精炼。7.2 按你的数据条件挑第一方案如果你的目标域数据量很少比如只有几十张无标签图优先选AdaBN。它不需要训练对batch的敏感度虽然存在但几十张也能凑出统计量。反过来你非要在这点数据上又跑MMD又跑对抗损失噪声会大到基本失去意义。如果目标域数据量大且你有精力迭代调试那可以按“CORAL或DAN作为主体DANN作为进阶伪标签作为精炼”的路线走。具体选CORAL还是DAN可以在小验证集上快速对比。我个人经验是如果目标域和源域主要是亮度、颜色这类低层偏移CORAL和DAN差距不大如果是背景、角度、材质这类中层语义偏移DAN通常更敏感如果连类别语义都发生了部分变化那就应该直接考虑CDAN这类条件对抗方法。别忘了准备一个小的目标域验证集。即使是无监督域自适应你至少需要几十个目标域真正标签来确认哪个方法在你的数据上有效。没有这个验证集你会发现自己对着训练损失和主观判断根本不知道模型到底有没有适应目标域。7.3 我现在的最常用组合与最终提醒我最近一个项目的落地路线是这样的源域正常训练一个基础模型然后用AdaBN做推理时增强观察目标域准确率变化接着在网络最后两层加入CORAL损失做一轮端到端对齐训练最后用按类别保留的伪标签策略做两轮迭代精炼每轮结束后都检查每个类别的伪标签数量避免某个类被隐形淘汰。这套组合没有用到对抗方法但最终目标域准确率从71%提升到了88%左右而且整体调试成本不高。最后想认真提醒一句深度网络自适应不是魔法它只是在没有目标域标签的情况下把本来要花大量标注才能达成的效果用分布假设和结构约束换来了一部分。遇到域偏移时先别急着堆最新的方法把上面五种方法各自的边界搞清楚用一两个轻量方法快速摸底再决定要不要上复杂方案。多留几十个目标域样本做校验比任何复杂的损失函数都更能帮你确定下一步该怎么走。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号