上周读了几篇关于如何处理noisy label的论文,这里记录一下对于论文Deep Self-Learning From Noisy Labels的一些理解以及自己的代码实现。
文中主要提出了一个矫正noisy label的方法,以及如果利用这些矫正过的标签。从上图可以看出,整个流程分为两个部分,上半部分其实就是普通的分类网络,网络结构任意,只是在计算loss时,同时计算了原始label的loss以及下半部分矫正过的label的loss。文章的重点在下半部分,即如果矫正noisy label。
作者通过相似性评测计算,为每个类别选出了若干个prototypes,然后再计算所有数据和这些prototypes的相似性均值,与哪一类的值小,说明越接近那一类,则将label改成那一类。在计算相似性上,作者没有使用常用的距离来算,而是使用了cosine来算相似性。
为了为每个类别选出具有代表性的而他们之间又有一定差异的prototypes,作者又使用了一个不是很复杂的trick,具体可以参考论文描述。
作者上边的这个矫正noisy label的操作,其实相当于对数据做了一次聚类,只是将聚类相似性计算换成了cosine,并且选出了多个prototypes,即多个中心点。
从论文的结果看效果还不错,作者分别手动生成了不等比例的symmetric和asymmetric的noisy label进行测试。由于作者没有开源代码,而且网上也没找到其他人的实现,刚好我对这方面也比较熟悉,所以自己动手复现了一下。
我自己测试集使用的是fashion-mnist,分别进行了symmetric测试和asymmetric测试,发现结果不够稳定。对于symmetric的效果比较明显,而对于asymmetric noisy label的处理基本无效。而且我又尝试了一下对于聚类结果的label再用此算法矫正,发现结果很平稳,没有下降,也没有提升,基本无效。
比较失望,先将代码公布一下,有不完善的地方,欢迎交流指正。
https://github.com/sarsbug/SMP