To Balance or Not to Balance? 一个简单有效的长尾任务训练方法

教育   2025-01-12 15:42   江苏  

来自:SimpleAI and ...

最近看一篇知名的论文,其中引用了一篇不知名的论文,但是标题很有吸引力:To Balance or Not to Balance: A Simple-yet-Effective Approach for Learning with Long-Tailed Distributions. 遂忍不住点开看了看,发现还挺有意思的,方法简洁而有说服力,做的实验也算丰富,感觉很容易在其他场景进行尝试。对此简单总结一下分享出来。

这已经是一篇来自2019年的老文章了,也只是挂在了Arxiv,不知道是不是投稿没中,至今也只有24个引用。不过引用量这事儿非常看时机和宣传,所以只要我自己读起来有启发,就是好文章。

LLM所有细分方向群+ACL25/ICML25/NAACL25投稿群->LLM所有细分领域群、投稿群从这里进入!

背景和动机

这篇文章主要针对图像识别任务中的长尾问题,即有很多药分类的类别,但是各类别的数量分布非常不均匀,有的样本特别多有的特别少。如果直接一通学的话,模型就会被那些 head classes 给主导,那些 tail classes 则不见天日。

常见的解决办法,就是调整一下采样(re-sampling)或者权重(re-weighting),让那些 tail samples 多被关注一点。但是这又有另一个副作用:小类别容易过拟合,而大类别容易因表示不足而欠拟合。

具体方法

针对这种两难的境地,这篇论文提出一种简洁的方法:把模型分成 feature extractor 和 classier 两部分,前者应更侧重于学一个好的表示,后者才应该去操心长尾问题。

因此二者采用不同的训练策略:对于整体的 feature extractor + classier,采用 class-balanced-sampling(CBS)这种经典的应对长尾问题的采样策略来训练,然后为了弥补 feature extractor 在这个过程中的表示学习不足的问题,额外增加一个使用原分布采样(regular-random-sampling,RRS)的训练目标。

说的很有道理,但这种思路要怎么实现呢?作者想到的方法是——多任务学习。就可以很容易地实现这种思路。

具体来说,我们可以接两个 classifiers 在feature extractor后面,classifier1就用CBS方法训练,classifier2就用RRS方法训练,最后两个loss加起来一起优化。

除此之外,作者发现,既然都多任务学习了,再额外加一个自监督学习的任务,只会更好,所以最终的训练框架如下图所示,一个feature extractor后面接了三个分类头:

这里的自监督任务,就是对图片进行旋转,然后让模型预测图片旋转的角度,一个早期经典的CV领域的自监督任务。

算法伪代码如下:

在每一个step的时候,基于两种采样方式,产生两个不同的batch,分别交给两个不同的classifiers去学,自监督的那部分,则使用两个共同的batch。

关于三个loss的权重,作者最佳的方案是:0.5 : 1 : 1.

实验

这个图展示了不同的采样方式下,head / tail classes的loss情况。可见,常规采样(所谓的RRS)下,确实小类别基本学不到啥,loss不怎么降,主要学的就是大类别;而使用公平采样(所谓的CBS)的话,小类别一下子就学的很好,但是大类别只能学到之前的一半水平。这就是前面提到的副作用。

最终的对比实验结果,我就只贴一张图示意一下了,总之就是俺们的方法虽然简单但确实牛,超越了许多复杂的pre-sota方法:

另外还有些消融实验,结论如下:

  • 只使用CBS+RRS的两任务学习,就已经超越了pre-sota了,加上自监督任务是锦上添花;
  • 把辅助任务,用这种多任务学习的方式来训练(joint training),比变成分阶段训练(stage-wise training)更好;
  • 这个自监督学习的方式,比变成数据增强的方式更好。

以上就是一个简单的总结了,是我喜欢的“大道至简”的工作。



备注:昵称-学校/公司-方向/会议(eg.ACL),进入技术/投稿群


id:DLNLPer,记得备注呦

深度学习自然语言处理
一个热衷于深度学习与NLP前沿技术的平台,期待在知识的殿堂与你相遇~
 最新文章