Realistic Evaluation of Deep Simi-Supervised Learning Algorithms

正文索引 [隐藏]

最近要开始做深度半监督的实验了,偶然在网上看到了这篇文章,文章还没看几行就感觉戳中了自己之前做半监督实验的各种痛点。本文对于如何规范的比较半监督模型有一定的启发意义。

原文的 Github 地址:https://github.com/brain-research/realistic-ssl-evaluation

Motivation

半监督方法其实对于使用的标记、无标记数据、模型的参数以及应用到什么样的数据集上,其实都蛮敏感的。因为半监督方法能够成立,本质上是需要数据可以符合半监督方法内含的某种数据假设(平滑假设、低密度假设与流形假设),这本身对于数据就是敏感的。

正因为半监督方法的这种特殊性,各种算法在各种数据集与实验设定上可以打得有来有回。实验的种种可操作性,就让实验室与真实世界产生了非常大的隔阂,阻碍了半监督算法应用到实际的问题中去,因为实际问题的可操作性往往没有实验论文中那么大。

本文的动机就是想提出一种实验的方法论,让未来的科研工作者们能更加科学、完善地度量半监督学习方法,从而使其能在真实世界中更快落地。

Findings

文章总结了他们在进行半监督实验时的六点主要发现:

  • 当使用相同资源对超参数进行调整时,半监督算法和只是用标记数据的监督算法之间的性能隔阂小于文章的汇报
  • 大的分类模型使用少量标记数据与仔细选择的正则化后也可以达到非常不错的效果,这说明了我们比较 SSL 的时候,应当使用完全相同的内嵌模型。
  • 在某些设置下,迁移学习的性能也很不错,而且超过 SSL。
  • 在无标记数据与标记数据在类别分布上存在不同时,SSL 性能下降明显。
  • 不同的方法对于使用的标记与无标记数量有不同程度的敏感性。
  • 使用较小的验证集合调参数、选择模型是不可信的(同时,受制于问题设定,我们也没办法使用较大的验证集

Evaluation Tips

  1. 对于所有的模型使用相同的内嵌网络实现:同一种模型的不同实现之间还存在差异,比如使用什么样的优化器、参数初始化、数据预处理&增广方法等
  2. 对于比较的监督方法,也要使用相同的结构并且认真调参:因为半监督的意义就是在于使用无标记数据提升模型的性能,那么作为 Baseline 的监督学习性能得到充分测试。
  3. 和迁移学习进行比较:同样作为一种解决标记样本比较少的方法,如果可以打败潜移学习,则证明了半监督方法的实用性。
  4. 考虑类别分布不一致的情况:文中觉得标记数据难以获取,在某种程度上标记数据和容易获得的无标记数据可能会处于不同的类别分布,但是依旧保持一些联系。比如说,我们要区分狗A、狗B,现在有一个很小狗A与狗B的数据集,同时可以从网上爬取很多狗的图片,那么爬取的无标记数据类别分布同狗A、B一定有差异。
    这个问题,我觉得并不是所有情况下都是存在的,这其实是一个我们先获取无标记数据集再打标记还是先获取标记数据集再寻找无标记数据的问题。不过有一说一,评价的时候考虑这个问题,无疑将会提升 SSL 在真实问题中的易用性。
  5. 使用不同量的标记、无标记样本进行测试:针对不同的现实情况,这点也是合理的。
  6. 从实用的角度来看,SSL 方法不应该存在很大的验证集多模型进行选择和超参数调节,但是小的验证集得到的结果并不准确。

Experiments

Wide ResNet 28 – 2

所有模型均使用 Wide ResNet 28-2 作为骨干网络, 相对于 SSL 算法原论文中的那些 Resnet 参数量要更小一些。因为参数量有所区别,所以 Acc 不可以直接比较。

这是 WRN 原论文的作者的 Pytorch 实现地址:https://github.com/szagoruyko/wide-residual-networks/tree/master/pytorch

抄了一个 Wide-ResNet 的 Pytorch 实现:https://github.com/meliketoy/wide-resnet.pytorch/blob/master/networks/wide_resnet.py


WRN 结构

上图是 WRN 的结构,另外在每一个残差块中处理顺序相对比原本的 ResNet 从 conv-BN-ReLU 变成了 BN-ReLU-conv,WRN 文中说实验效果更好。因为网络结构不是讨论的重点,所以这里复现的时候直接照做。

在这篇文章中的 WRN 28-2 还有一些其他修改:

  • ReLU 替换成了 LeakyReLU
  • 代码实现中初始化从 kaiming_normal_ 变成了 random_normal_

参数细节

数据集使用了 Cifar-10 和 SVHN,数据预处理与增广的策略有些不同,详见:


数据处理

另外,不同的半监督学习方法有一些超参数,文章也给出了他们的相应使用值。复现是大部分使用了原文的参数值。


半监督方法超参数

Github 链接:https://github.com/WNJXYK/Deep-Semi-Supervised-Learning