半监督学习:Π model
第二个算法Temporal Ensembling for Semi-Supervised Learning
,它提出了一个Π model
以及Temporal ensembling
的方法。
算法理论
Π model
读作pi model
但实际上代表着模型有着双输入,其示意图如下所示,对于无标签数据\(x_i\)经过两次不同的随机变换后再使用相同模型(模型的dropout
也是不同的)的到两个输出\(z_i,\tilde{z}_i\),由于样本是相同的,因此两次输出的概率分布间应该尽可能相同,计算两个输出概率的l2 loss
并乘上warmup
系数,因为在训练刚开始我们希望带标签样本的分类损失权重更大些。
Π model
感觉非常简单,实际上是如pseudo label
一样,考虑到了熵的正则化,但他的做法比pseudo label
的更加高明一些,模型为何一定要知道无标签的样本的实际标签呢?直接利用两个同类样本间概率分布的相似度损失,提升模型的一致性;同时利用少量的带标签数据指导模型分类,over~
Temporal ensembling
Temporal ensembling
时序组合模型,是针对Π model
的优化,我们分析了Π model
所做的两件事情,1)利用扰动样本学习一致性;2)利用有标签样本学习分类。在Π model
中,\(z_i,\tilde{z}_i\)都是来自同一迭代时间内产生的两次结果,但实际上并没有必要,因为首先这样一个step
就要推理两次模型,而且只在一个batch
生成的概率分布偶然性较大,所以使用时序组合模型,\(\tilde{z}_i\)来自上个迭代周期产生的结果,\(z_i\)来自当前迭代时间内产生的结果,也就是比较了两次不同时间内产生的概率分布。在时序组合模型中,一个step
只执行一次,那么相比于Π model
,它就有了两倍的加速。同时这个\(\tilde{z}_i\)是历史\(z_i\)的加权和。这样做的好处是能够保留历史信息,消除扰动和稳定当前值。
这个做法就很像上一篇pseudo label
最后,有的人发现一个epoch
去打伪标签效果好于每个batch
都打伪标签一样。
代码
这里只有Π model
的代码,比较好理解。
hwc = [self.dataset.height, self.dataset.width, self.dataset.colors] |
测试结果
使用默认参数以及cifar10中250张标注样本训练128个epoch,得到测试集准确率如下,和pseudo label
差不多:
"last01": 48.75, |