来自:SimpleAI and ...
最近看一篇知名的论文,其中引用了一篇不知名的论文,但是标题很有吸引力:To Balance or Not to Balance: A Simple-yet-Effective Approach for Learning with Long-Tailed Distributions. 遂忍不住点开看了看,发现还挺有意思的,方法简洁而有说服力,做的实验也算丰富,感觉很容易在其他场景进行尝试。对此简单总结一下分享出来。
这已经是一篇来自2019年的老文章了,也只是挂在了Arxiv,不知道是不是投稿没中,至今也只有24个引用。不过引用量这事儿非常看时机和宣传,所以只要我自己读起来有启发,就是好文章。
背景和动机
这篇文章主要针对图像识别任务中的长尾问题,即有很多药分类的类别,但是各类别的数量分布非常不均匀,有的样本特别多有的特别少。如果直接一通学的话,模型就会被那些 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)更好; 这个自监督学习的方式,比变成数据增强的方式更好。
以上就是一个简单的总结了,是我喜欢的“大道至简”的工作。