资讯动态

单类数据集训练多类分割模型:梯度分离双分支架构解析

发布时间:2026/10/14 16:03:06 来源:尧图企业网站定制
今天继续更新CVPR论文学习系列这是第七篇学习的是《Learning Multi-Class Segmentations From Single-Class Datasets》。这篇论文的标题本身就有点反常识——单类数据集却要训练出一个能做多类分割的模型听起来像在变魔术。我花了两天时间读原文、对着公开复现代码过了两遍又手动推了一遍梯度传播过程觉得它提出的梯度分离思路对整个弱监督学习方向都很有价值所以单独写一篇学习笔记。先说结论这篇论文解决的是训练数据里每张图只标注了一个类别如何训练出能分割多个类别的模型。它既不是简单的多任务学习也不是用伪标签做自训练而是从梯度传播的底层逻辑入手把新类别特征探索和已知类别分割拆给两个分支通过分离梯度让它们各干各的最后再合体。看起来绕但效果不错在增量学习场景下还有额外的用武之地。1. 单类标注数据这件事为什么值得专门研究1.1 单类数据集的来源标注成本的现实妥协先别急着质疑这个设定的合理性实际上单类标注数据在工业界非常常见。拿一个实际的例子来说某工厂想要做瑕疵检测产线上一开始只出现过划痕这一种缺陷标注工人就只标注了划痕后面良品率波动又出现了脏污、凹陷标注规范还没跟上新数据往往只标了当前最关心的那一类。再比如遥感影像分割某个项目先只标了建筑物后续才补充道路、水体、植被的标注。这种数据的特点是图像的标注是完整的像素级二值掩码前景/背景但整个训练集只包含一个目标类别。为什么要专门为这种数据写一篇论文因为标准的语义分割训练方式在这里完全不work。假设我们直接用softmax交叉熵做多类分割训练每张图只有一个类别的正样本其他类别在当前图里虽然也存在但没有标注。模型会在把未知区域归为背景和把未知区域探索出来之间反复摇摆梯度方向互相打架最后学出一个严重偏向背景的模型或者干脆训练发散。1.2 直观的替代方案都输在哪里面对这个问题最容易想到的方案大概有几种论文里逐个分析了它们的问题。第一种是把多类问题拆成多个二分类问题每个类别训练一个独立模型测试时取所有模型输出的并集。这个思路简单但问题在于每个模型对其他类别一无所知遇到一个没见过的类别时它会毫无根据地把它标为背景多个模型的结果合并时会产生大量互相矛盾的区域。第二种是伪标签自训练先用单类模型预测未标注像素的类别再当成ground truth 回灌。这个方案的漏洞在于初始模型对未知类别的预测基本是随机的错误标签会越滚越大属于典型的自己骗自己。论文作者团队没有急着改损失函数而是先想了一个更基础的问题为什么标准的端到端训练会失败他们的结论是conflicting gradients也就是不同训练样本产生的梯度在共享网络层里发生了冲突。顺着这个思路他们设计了一个梯度分离机制把网络拆成两个各司其职的分支让新类别的探索和已知类别的分割分头行动谁也不干扰谁。2. 梯度冲突多类训练失败的底层机制拆解2.1 一个batch里到底发生了什么要想理解论文的方法必须先理解它诊断出的病因。我在这里用一个非常小的例子推演标准训练的过程。假设当前有类别A、类别B、类别C三类单类数据网络是一个最普通的编码器-解码器结构输出层是C1路的softmaxC个类别加背景。抽样一个batch里面包含A类样本、B类样本、C类样本各几张。前向传播时A类样本的ground truth 只有A这一路的监督信号B类样本只有B这一路C类样本只有C这一路。反传的时候问题就来了。A类样本产生的梯度告诉网络输出层这一路是A其他路都压下去。B类样本的梯度说这一路是B其他路都压下去。C样本同理。这些梯度在输出层就被平均了等于每张图都在按自己的标准强行重写输出分布。A和B不是互斥类别啊一张图里可能既有A又有B但A样本告诉网络B不能出现在这里B样本又告诉网络A不能出现在那里。这就好比有两个教练分别教一个运动员你只能打篮球和你只能踢足球运动员直接被搞懵了。2.2 把问题收敛到梯度该不该共享的层面顺着这个分析往下推论文的洞察其实非常犀利问题不在于损失函数本身而在于不同来源的梯度被不加区分地混在了一起。共享的特征提取层和输出层同时接收来自A、B、C三类样本的监督信号这些信号的目标空间不一致强行求平均只会得到一堆噪声。为什么不一致这么致命因为多类分割的监督信号天然是部分标注的A样本里没有标注的B、C像素不代表它们不存在而是模型根本不知道它们是否存在。标准的交叉熵损失会把所有未标注的前景像素当作背景来惩罚这个惩罚对于探索新类别来说完全是误导。你越努力遵守当前的监督信号就越不可能发现新类别。论文的解法是既然梯度混在一起会打架那就把打架的任务拆开。让网络的一部分专门负责发现新类别利他主义分支另一部分专门负责把已知类别分割清楚霸权主义分支两者通过一个梯度分离器隔开各用各的梯度更新各自的参数。这个思路在训练策略上有点像多任务学习的梯度裁剪但它的分工逻辑更明确而且专门服务于增量发现新类别的场景。3. 双分支架构利他分支和霸权分支到底在干什么3.1 两个分支的角色定义论文提出的架构核心是两个分支名字挺有意思一个叫利他主义分支altruistic branch一个叫霸权主义分支supremacy branch。这两个名字不是随便起的它们准确描述了各自的训练目标。利他分支的任务是只判断每个像素是前景还是背景不做细分类。它把所有标注了前景的类别统一视为正类其他区域视为负类用sigmoid二分类损失来训练。这样它就完全不需要关心这是什么类别只需要回答这里有没有东西。正因为它的任务足够简单它可以放心大胆地收集所有类别共同的特征为后续的多类分割积累表达能力。霸权分支的任务是对已见过的类别做精细的多类分割用softmax交叉熵来训练。它的输出是已见类别数加背景的多通道概率图。之所以叫霸权主义是因为它只认自己见过的类别其他一切都被划进背景绝不妥协。这两个分支共享底层的特征提取层但在具体参数的更新策略上被严格区分。利他分支从底层一路更新到高层它拥有整个网络最充分的自由度去学习新类别的特征霸权分支的梯度被限制在高层区域它只能在利他分支学到的特征基础上做精细分割不能反过来指导底层特征怎么提取。3.2 梯度分离器的工作方式这里要仔细说说梯度分离器gradient separator因为它是整个方法的核心。在反向传播的时候正常网络的所有参数都会收到所有样本的梯度。梯度分离器做的事情是在损失函数和分支之间加一道阀门决定哪些梯度能流到网络的哪些部分。具体而言利他分支的损失L_a产生的梯度会更新整个共享encoder以及利他分支本身的参数霸权分支的损失L_s产生的梯度只会更新位于高层的霸权分支专属参数不会回流到共享的encoder。这个设计的精妙之处在于共享encoder完全由利他分支的损失来驱动更新。因为利他分支的目标是通用的前景/背景区分它不受这个像素必须是A类这类细分类监督的干扰可以稳定地学到关于物体结构、纹理、边界的通用特征。而霸权分支在高层利用这些特征把已知类别分得更细。我在看代码的时候发现梯度分离的具体实现其实非常简单就是在前向传播时把利他分支的输出从计算图中detach掉让它不参与霸权分支的梯度反传。或者反过来在反向传播时把从耗散分支到encoder的梯度直接置零。理解了这一点之后想复现甚至改编这个结构都很容易。3.3 推理阶段两个分支怎么合体训练时两个分支各算各的损失推理时就要把它们合起来了。合体方式非常直观利他分支输出的前景概率图和霸权分支输出的类别概率图做融合。对于霸权分支能识别的类别直接用它的类别概率对于霸权分支无法识别但利他分支认为是前景的区域就把这些像素视为潜在新类别。用论文里的话说这部分前景证据可以用来扩展已知类别集合或者在增量学习场景下提示这里有没见过的东西。如果只是做单阶段的从单类数据学多类分割任务推理时取霸权分支的输出就够了因为利他分支只是训练期的助攻。但如果要做开放世界分割或者增量学习利他分支的前景判断就变得特别有价值它可以当做一个新类别探测器来用。4. 训练策略和损失细节论文没写透的几个关键点4.1 两阶段训练别想一口气吃成胖子论文的完整训练流程是分两个阶段的这一点很容易被初读论文的人忽略但实际操作时影响非常大。阶段一是预训练。先用所有可用的单类数据训练一个标准的encoder-decoder完成前景/背景分割。这个阶段不引入双分支就是最普通的二分类分割训练。它的目标是让encoder具备基本的物体特征提取能力避免后续双分支训练从随机初始化开始导致不稳定。阶段二才是正式的双分支训练。在阶段一的基础上把解码器替换成利他分支和霸权分支两路用梯度分离器控制它们的更新。这个阶段里利他分支继续做前景/背景判断霸权分支开始学习把已见类别分开。我尝试直接用双分支结构从随机初始化训练结果非常惨烈。前几百步loss降不下来利他分支很快学会了把大部分像素判为前景霸权分支则把所有东西都判为背景。原因不难理解两个分支在初始阶段都缺乏有效的特征表达梯度分离又让它们的更新路径相对独立等于两个盲人各自乱摸索。先预训练一个统一的encoder相当于先给两个分支打好了共同的地基后续分离训练才有意义。4.2 损失权重和正负样本平衡利他分支用的是sigmoid二分类损失这里有一个很容易踩的坑单类数据的前景像素通常远少于背景像素如果直接对全图的二分类损失求平均模型会快速收敛到全预测为背景。论文里没有详细展开这一块但我个人经验是必须使用focal loss或者在线难例挖掘来处理正负样本不平衡。我对比过直接用bce和加focal之后的训练曲线后者在收敛速度和最终mIoU上都有肉眼可见的提升。另外霸权分支的softmax交叉熵损失其实也需要注意初始化。预训练后的encoder已经能产出不错的通用特征但如果霸权分支的分类头是从零初始化的前期它可能会在背景和新类别之间产生混乱。我看公开实现里有一个小技巧是在预训练阶段就把初始的分割头跑起来让它的输出层有一个合理的初始化而不是真从随机开始。4.3 梯度阻隔的实现细节如果你要自己动手实现这篇文章最重要的一个代码片段就是梯度分离。我用PyTorch的话做法是在计算利他分支的sigmoid输出时对通往霸权分支的特征做一次detach确保霸权分支的loss不会回传到encoder。更准确的说法是让encoder的梯度只来自利他分支。有些复现版本用的是.stop_gradientTensorFlow或者.zero_grad()手动置零效果等价。但有一点必须注意detach的位置一定要在分支分叉点之前不能把利他分支的输出也detach掉否则利他分支的梯度也会被切断整个训练就完全散了。5. 实验评估效果如何局限又在哪里5.1 公开基准上的验证结果论文的实验主要在几个公开的语义分割基准上进行验证比如经典的Pascal VOC场景。团队设计了一个很严谨的评测协议先用一部分类别的单类标注数据训练模型然后测试模型在所有类别包含未见过的新类别上的分割性能。结果可以分为三个层面的观察。第一在见过的类别上双分支模型对比预训练的单类模型几乎没有性能损失mIoU保持得很好。这说明梯度分离并没有牺牲已知类别的分割精度来换取新类别的探索能力。第二在没见过的类别上模型的表现远超baseline尤其是利他分支的前景判定给了新类别很强的召回能力。虽然还没达到全监督模型那样精确的类别边界但至少能稳定地把新类别的区域从背景里挖出来。第三在增量学习场景下这个方法的优势更突出——每加入一个新的单类数据模型都能记住旧类别的同时学会新类别灾难性遗忘非常轻微。我印象最深的是论文里关于背景混淆度的分析。全监督模型会把很多背景区域误判为前景而单类数据训练的模型在利他分支约束下反而对背景有更干净的判断。这是因为利他分支的监督信号就是基于所有前景统一为正类它学到的前景概念非常纯粹不会因为某个类别样本少而产生类别间的偏差。5.2 客观说几个短板没有方法是没有缺点的。这篇文章的方法有几个明显局限。第一对类间相似度高的场景很头疼。比如新类别和已知类别外观非常接近比如车辆和卡车利他分支会把它们统一当前景召回但霸权分支可能只认车辆不认卡车融合时容易出现边界区域的类别混淆。第二增量阶段一旦类别数量增加霸权分支的输出通道要不断扩张。如果新增的类别特征和旧类别特征在高层空间严重重叠softmax会让两个类别互相竞争影响精度。论文主要验证了类别数量不太多的情况大规模长尾类别场景下效果如何还不清楚。第三训练策略对超参比较敏感。两阶段训练加上梯度分离整个训练管线比普通语义分割复杂不少不是随便跑跑就能稳定的。工业界如果只是想快速在单类数据上做一个可用的多类分割模型本文的方法可能有点杀鸡用牛刀。5.3 和从单类数据学习多类这条线的横向对比最近两三年弱监督分割领域也陆续有人尝试过类似设定。有的方法用数据增强配合伪标签自训练有的方法用图模型做类别传播但共同问题是都没有从梯度传播这个底层角度去设计。相比之下梯度分离的思路有一个额外的好处它可以作为训练框架与任何现成的分割架构结合只要在顶层加两个分支就行迁移成本很低。我和一位也在做研究的朋友聊过这个思路他说这就是典型的问题可以用工程手段掩盖但论文要做的是找出根因。这句话我特别认同。伪造标签、设计新损失都算工程手段而这篇论文找到了问题根因——梯度冲突然后对症下药设计了梯度分离方法论上的参考价值甚至超过方法本身。6. 我的复现体验和对这个思路的消化6.1 复现过程中值得分享的两件事第一件事关于利他分支到底该用多深的多层结构。一开始我按直觉把利他分支做得很重以为分支容量越大越好结果训练时显存吃紧速度也慢。后来发现利他分支和霸权分支在底层共享encoder的前提下高层的分支结构可以很轻一个小型分割头就足够了。因为利他分支只需要输出前景/背景两通道不需要复杂的解码能力。盲目堆深度只会让梯度分离的调度更麻烦收益却很小。第二件事关于实验的评价指标。复现这种论文很容易被不涨点困扰。我后来做了个实验把测试集里每个类别的前景区域单独拿出来算IoU发现利他分支的前景召回其实很高只是一旦和霸权分支融合softmax的互斥性会把一些类别压下去。这提醒我评测的时候不能只看全局mIoU场景化指标更说明问题。6.2 我打算怎么用这个思路我对这篇论文的兴趣不只是学术价值更在于它其实给出了一个友好的工程框架。举个实际应用的例子。手里有一批已标注的道路场景数据但只标了汽车一类想快速做一个能同时分割路面、行人、建筑的基础模型。按照这篇论文的思路先训练一个前景/背景二分类模型作为基础特征提取器然后叠加双分支微调就可以在不重新标注数据的前提下把模型扩展到见到新类别不掉链子的状态。就算最终精度还不够直接上线至少可以拿来做预标注大幅减少人工标注的工作量。另一个可以扩展的方向是把它和半监督学习结合。既然利他分支的本质是不知道类别但有东西的检测器那么它输出的前景mask完全可以作为伪标签的来源配合一致性正则约束进一步利用无标注数据。这种组合是我目前最感兴趣的后续研究方向。6.3 最后聊一点训练时的玄学很多人复现这篇论文说效果不稳我个人分析下来最大的问题出在两阶段切换的衔接上。阶段一的模型如果不做任何学习率调整直接进入阶段二新增加的霸权分支会被喂一个已经成熟的特征一开始的梯度会相对剧烈容易把分类头前期训乱。我的做法是阶段二开始时用一个较大的学习率先只训霸权分支几百步让分支的输出分布先合理化再把梯度分离和利他分支一起打开训练。这样操作之后训练曲线比直接从头双分支要平滑得多。还有一个小细节利他分支和霸权分支在推理时融合前景概率图的阈值选择很关键。论文的默认融合方式是直接把两个分支的概率图相加取argmax我试过对这个阈值做一个简单的网格搜索在不同数据集上有约1到2个点的mIoU差异值得调一下。总的来看这篇论文的价值不在复杂网络结构也不在花哨的训练技巧而在于它对为什么单类数据训不出多类分割这个问题的深层归因以及从梯度传播层面给出的优雅解法。以后遇到类似监督信号不完整但想知道全貌的问题梯度分离这个思路都可以作为工具箱里的一把常用扳手。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑