内涵:半监督学习之Temporal Ensembling For Semi-supervised Learning

张开发
2026/4/10 9:10:03 15 分钟阅读

分享文章

内涵:半监督学习之Temporal Ensembling For Semi-supervised Learning
一、 引言这篇文章是ICLR2017的一篇文章是半监督学习领域的一篇经典文章以这篇文章作为进入半监督学习的一个切入点。在这篇文章中作者的将其工作描述为self-ensembling而具体来讲有两点1. Π model 2. temporal ensembling。We describe two ways to implement self-ensembling, Π-model和temporal ensembling.二、Π modelΠ model的思路来源比较直接就是我们如何去使用无标签数据来进行模型训练。思考这个问题先从有标签数据是如何学习来看对于有标签数据的使用过程是这样的我们已经获得了数据的标签我们可以轻易的通过网络的预测值和标签值构造一个损失函数通常为交叉熵损失函数或者最小平方误差损失函数。通过迭代训练不断的使该函数趋于一个更小的值。无标签数据之所以难以利用是因为按照我们上述传统的思路第一点没有就无法进行第二步从而无法进行第三步。但上述三步中第三步是目的第二部是关键而第一步没有就没有前提是我们第二部构造的损失函数可以不借鉴标签值。因此学者提出了一个一致性约束假设对于无标签数据模型或数据加一定扰动预测结果一致而这个约束就可以抽象为一个loss函数min(f(x)−f∗(x∗))min(f(x)-f^{*}(x^{*}))min(f(x)−f∗(x∗))注*代表数据或者模型经过扰动可以看到这个损失函数是没有涉及到标签值它只是要求我们预测两次并前后两次分别做了数据扰动和模型扰动。这个思想很直观而Πmodel正是这个思想的实现。在Πmodel的结构简图里面可以清楚的看到我们刚刚提到的几个要素数据扰动通过stochastic augmentation随机增强)来体现而模型扰动则通过network with dropout(随机dropout)来体现一致性Loss则对应于简图中的squared difference。除此之外有一个需要注意的点有标签loss和无标签loss的权重函数是一个随迭代次数变化的函数。前期会侧重于有标签Loss而后期则会慢慢往无标签Loss上偏移。更详细的流程可以参看下图。Πmodel的性能提升还是很明显的在SVHN数据集上的效果错误率相比benchmark全集为73257张标定500张从18.44%下降至6.65%全集的错误率为2.88%。在CIFAR-10数据集上相比benchmark全集为50000标定4000张从18.63%下降至12.36%全集错误率为6.05%。可以看到Πmodel还是有相当大的提升的在未标定标定比例为101的情形下可以达到全集提升的50%~75%以上的一个提升比例。但Πmodel也会带来一个缺点就是一个batch里面每张图片会前向处理两次而这会导致训练耗时的上升。文章中提到的另外一个创新点temporaral ensembling带来的一个好处可以弥补这种缺陷。二、Temporal ensembling如上所述Π model的引入事实上是一种非常直观的一致性假设的具体实现。在介绍Temporal ensembling是怎么做之前试着也尽量以一种更加容易接受的思想来引入该操作。再回到半监督学习一开始无标签的困境上来看我们在无标签的情形下除了可以通过一致性假设来构造损失函数我们还可以从原来的预测值-标签值的传统思路出发但我们这里是给无标签的数据一个伪标签。再来看这个公式min(f(x)−f∗(x∗))min(f(x)-f^{*}(x^{*}))min(f(x)−f∗(x∗))我们可以把Πmodel中一个batch里面两次预测中的一个作为另外一个的伪标签这个伪标签可能害怕它不准但抛开性能好坏这也算作是一种打伪标签的方式先接受这一点。而Temporal ensembling则是给我们一种能够更好的一种打伪标签的方式。这个就用到了ensembling learning集成学习的思想。本文称之为self-ensembling之所以self是因为不同的模型来自于自己只不过是不同epoch的模型具体的是通过滑动平均来将当前的伪标签值与之前的epoch的标签预测值都做一个投票只不过越靠近当前的epoch其权重会越大。结合了以往所有epoch得到的伪标签值显然是一个更好的打标签方式。而且它带来的一个好处是每一个batch不用同一张图片预测两次但是为了记录当前epoch下每一张测试图片对应的伪标签值需要一个N大小的空间来存储N对应于训练数据的大小。因此再计算复杂度和空间复杂度上算是典型的空间换时间吧。虽然作者将Π model也作为self-ensembling但总感觉两者的并无直接关联。Temporal ensembling则是一种直观的self-ensembling思想。但这个只是说法上的一种理解暂且搁置来看temporal ensembling的效果在SVHN数据集上相比Πmodel进一步提升了1.53%6.65%-5.12%在CIFAR-10数据集上相比Πmodel进一步提升了0.2%12.36%-12.16%。可以看到提升相对来讲并不明显。我认为这可以从以下两点理解第一点对于本身已经准确率80%甚至90%以上的模型再大范围的提高确实存在难度另外一方面对于无标签数据与有标签数据完全同源因此以有监督模型去给无标签数据打伪标签也会有90%左右的正确性相对而言这个伪标签的质量已经是不错的因此这种再集成可能效果就不明显了。但无论是从Temporal ensembling这种self-ensembling思想还是后面作者的一些辅助实验都应该相信在实际任务中Temporal ensembling还是有很大的潜力的。三、额外实验在作者已经证明了自己该篇论文的操作的效果之后又做了两个实验这两个实验还是很有意义的第一个实验更加贴近于实际工业界的应用场景并且显示出了Temporal ensembling的巨大潜力。而第二个实验则显示出本文的操作在抵御训练集中脏数据的意外收获。第一个实验作者使用了CIRAR-100数据集为例加入50倍的数据量的TINY Images随机抽样也即两者并无类别关联。竟然超越了CIRAR100全集有监督的性能。而且在该实验中Temporal ensembling贡献不小进一步提升了达到了2.17%个点显示了其潜力。这点可以理解为面对一个完全不同源甚至类别任务都不同的数据显然靠有监督模型打伪造标签质量欠佳在模型是臭皮匠的情形下此时集成学习的潜力就会展现的比较明显。另外一个有意义的点就是Tiny Image这个与主任务毫不相关的数据集竟然可以发挥如此功效但前提是量很大有50倍的数据加入。这里其实就表明了其实这篇文章始于半监督但终于了一种比较通用的正则化。也就是从某种意义上来讲半监督其本质可以作为一种正则化手段。如果在接受了半监督是一种通用的正则化手段那么接下来第二个实验就好理解了标准的监督学习如果数据集中脏数据会比较大则可能会越学越坏因为到了训练后期模型已经在强行拟合了。而对于半监督其正则化的效果可以有效的抵御这种过拟合。但是当然这个实验的现实意义不大因为不可能有那个训练集脏标签数据的比例能够达到20%甚至更多的程度。但可以通过这个实验可以放大半监督正则化的本质。再有就是可以从另外一个角度来看一种不太好的打为标签方式有20%打的错的此时就体现出了Temporal ensembling打标签的厉害之处。像论文的基础实验8895这种的准确率Temporal ensembling就体现的优势不大五、总结通过这篇文章其实对于一直以来做的都是监督学习的人来讲就可以了解到半监督的处理无标签数据问题的两种思想一致性正则化和打伪标签。从某种意义上这两者是相通的。如果从一致性正则化的角度很容易设计出例如Πmodel的技术框架如果从打伪标签的角度理解通过Temporal sembling则可以获得更好的标签。且原始模型的效果越差例如80%以下或者新加入的无标签数据与原始有标签数据之间的域gap越大Temporal sembling的潜力会发掘的更加彻底。其实这篇文章到最后会发现半监督更像一个通用的正则化手段它添加的数据甚至和原始问题完全不同也可以。这倒是一个很有意思的现象。最后的话就是一个半监督的实际使用问题了。半监督实际使用的时候极大可能发生在产业界它的情形很有可能是如下情形我已经有一个2w的数据训练的一个模型效果是85%但现场又采集了10w张新的数据数据标定的周期可能会比较长但客户催着要优化版本这个时候算法人员一个明智的选择是一边让标定人员标定着一边让模型半监督训练着如果半监督的提升效果只有1%那么即使这10w张全集标定完也不太可能达到产品90%的指标。此时就要即使调整策略一方面不要对这10W张数据报太多希望也即数据线可能基本饱和了当然你可以采集更多的数据保险起见在数据饱和的情况下你就可以大张旗鼓的去优化一些网络结构了比如attention结构、nonlocal结构等等。这其实是一个很有用的信息因为在数据未饱和的情况下如果去做一些网络优化可能会出现前期小数据量情况下一些网络结构确实有效但当标定的数据加上后数据量上来了这些网络结构就无效了。因此半监督可以用50~75%的全集效果来快速的估计数据是否达到饱和从而放心大胆的终止数据这条线开始问题的细分析以及一些更加精巧的网络结构的实验。这在产业界中其实是很有意义的一件事情。六、附录论文地址链接https://pan.baidu.com/s/1UdtSmi5HZfdgI4ao8QB9uQ提取码0naw代码地址https://github.com/s-laine/tempens

更多文章