基于这个规律,Decoupling和BBN提出了两种不同的解决方案,又因为Decoupling的方案更简单,实验更丰富,所以我这里优先介绍Decoupling方法。Decoupling将长尾分类模型的学习分为了两步。第一步,先不作任何再均衡,而是直接像传统的分类一样,利用原始数据学习一个分类模型(包含特征提取的backbone + 一个全连接分类器)。第二步,将第一步学习的模型中的特征提取backbone的参数固定(不再学习),然后单独接上一个分类器(可以是不同于第一步的分类器),对分类器进行class-balanced sampling学习。此外,作者还发现全连接分类器的weight的norm和对应类别的样本数正相关,也就是说样本数越多的类,weight的模更大,这也就导致最终分类时大类的分数(logits)更高(对头部类的过拟合)。所以第二步的分类器为归一化分类器,文章中有两种较好的设计:1) , 2) 。其中2利用了fixed第一步分类权重 ,对每个类学习了一个加权参数 。Decoupling的核心在于图片特征的分布和类别分布其实不耦合,所以学习backbone的特征提取时不应该用类别的分布去重采样(re-sampling),而应该直接利用原始的数据分布。2. BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition,CVPR 2020链接:https://arxiv.org/abs/1912.02413代码:https://github.com/Megvii-Nanjing/BBNBBN的核心idea和Decoupling其实是一样的。正因为两个人同时发现了同样的规律,更证明了这个规律的通用性和可靠性。关于上文的规律,BBN做了更详细的分析:这个图说明,长尾分类的最佳组合来自于:利用Cross-Entropy Loss和原始数据学出来的backbone + 利用Re-sampling学出来的分类器。和Decoupling的区别在于,BBN将模型两步的学习步骤合并至一个双分支模型。该模型的双分支共享参数,一个分支利用原始数据学习,另一个分支利用重采样学习,然后对这两个分支进行动态加权( )。这样随着 权重的改变,就实现了自然而然地从stage-one到state-two的过渡。3. Dynamic Curriculum Learning for Imbalanced Data Classification,ICCV 2019链接:https://arxiv.org/abs/1901.06783课程学习(Curriculum Learning)是一种模拟人类学习过程的训练策略,旨在从简到难。先用简单的样本学习出一个比较好的初始模型,再学习复杂样本,从而达到一个更优的解。这篇文章的详细分析可以看知乎文章https://zhuanlan.zhihu.com/p/74166778根据原文的总结,该框架包括两个level的课程学习方案:1)Sampling Scheduler:调整训练集的数据分布,将采样数据集的样本分布从原先的不平衡调整到后期的平衡状态;2)Loss Scheduler:调整两个Loss(分类Loss和度量学习Loss)的权重,从一开始倾向于拉大不同类目之间特征的距离(度量学习Loss),到后期倾向于对特征做分类(分类Loss)。
重加权(re-weighting)相关
4. Class-Balanced Loss Based on Effective Number of Samples,CVPR 2019链接:https://arxiv.org/abs/1901.05555代码:https://github.com/richardaecn/class-balanced-loss这篇文章的核心理念在于,随着样本数量的增加,每个样本带来的收益是显著递减的。所以作者通过理论推导,得到了一个更优的重加权权重的设计,从而取得更好的长尾分类效果。实现上,该方法在Cross-Entropy Loss中对图片根据所属类给予 的权重,其中 代表有效样本数, , 是类别总样本, 则可以看作类别的唯一原型数(unique prototypes)。5. Learning Imbalanced Datasets with Label-Distribution-Aware Margin Loss,NIPS 2019链接:https://arxiv.org/abs/1906.07413代码:https://github.com/kaidic/LDAM-DRW这篇文章首先设计了一个如下的非典型的重加权loss。其中C是常数, 是各类别的样本数。其次,该文章设计了一个两步的训练方法。第一步只利用LDAM loss训练,第二步利用LDAM loss再额外加上传统的re-weighting权重 ,进一步优化尾部类。这也可以看做规律1的侧面体现。6. Rethinking Class-Balanced Methods for Long-Tailed Visual Recognition from a Domain Adaptation Perspective, CVPR 2020链接:https://arxiv.org/abs/2003.10780这篇文章对loss的加权分为两项:其一,用上面Class-Balanced Loss Based on Effective Number of Samples的weight作为 ,同时,其二,提出了一个条件权重(conditional weight, )。而条件权重的学习,则需要再利用Meta-Learning去内部迭代,优化其在一个balanced开发集上的结果。总的来说,idea挺好,但实现上是个偏复杂的方法。由于Meta-Learning的内部迭代,训练也将更费时间费显存。7. Remix: Rebalanced Mixup,Arxiv Preprint 2020链接:https://arxiv.org/abs/2007.03943Mixup是一个这两年常用的数据增强方法,简单来说就是对两个sample的input image和one-hot label做线性插值,得到一个新数据。实现起来看似简单,但是却非常有效,因为他自带一个很强的约束,就是样本之间的差异变化是线性的,从而优化了特征学习和分类边界。而Remix其实就是将类别插值的时候,往少样本类的方向偏移了一点,给了小样本更大的 。
迁移学习(transfer learning)相关
8. Deep Representation Learning on Long-tailed Data: A Learnable Embedding Augmentation Perspective,CVPR 2020链接:https://arxiv.org/abs/2002.10826详细分析可以看作者知乎原文(https://zhuanlan.zhihu.com/p/112248291)。简单来说,长尾分布中因为尾部样本缺乏,无法支撑一个较好的分类边界,这篇工作在尾部的样本周围创造了一些虚拟样本,形成一个特征区域而非原先的特征点,即特征云(feature cloud)。而如何从特征点生成特征云,则利用的头部数据的分布。图例如下:9. Learning From Multiple Experts: Self-paced Knowledge Distillation for Long-tailed Classification,ECCV 2020链接:https://arxiv.org/abs/2001.01536暂且归为迁移学习类。作者发现在一个长尾分布的数据集中,如果我们取一个更均衡的子集来训练,其结果反而比利用完整的数据集效果更好。所以原文利用多个子集来训练更均衡的专家模型来指导一个unified学生模型。10. Large-Scale Long-Tailed Recognition in an Open World,CVPR 2019链接:https://arxiv.org/abs/1904.05160代码:https://github.com/zhmiao/OpenLongTailRecognition-OLTR该方法学习一组动态的元向量(dynamic meta-embedding)来将头部的视觉信息知识迁移给尾部类别使用。这组动态元向量之所以可以迁移视觉知识,因为他不仅结合了直接的视觉特征,同时也利用了一组关联的记忆特征(memory feature)。这组记忆特征允许尾部类别通过相似度利用相关的头部信息。
其他
此外最近刚看到一个有意思的paper:Rethinking the Value of Labels for Improving Class-Imbalanced Learning, Arxiv Preprint 2020,就是关于如何利用半监督和自监督来解决类别不均衡的问题,因为既然数据的标注难免会遇到类别不均衡的问题,那么如果不利用或少利用类别信息,是否可以解决长尾/不均衡分布问题呢?有兴趣的同学可以去看下原文(https://arxiv.org/abs/2006.07529),我还没细看。因为图片级别的数据易于生成或收集,baseline模型也简单,目前主要的长尾分布研究都集中在图片分类领域。不过随着去年Facebook发布的LVIS(Large Vocabulary Instance Segmentation)数据集(https://arxiv.org/abs/1908.03195),越来越多的人也开始关注起了Instance级别的长尾分布分布问题(物体检测和实例分割),我会在下一节更新这方面的工作。