深度学习的强大很大程度是由大量标记的数据带来,但想要推广到各个领域实际使用,就得解决可获取标记数据有限的问题。为此大家探索了很多减少标记开销的路子:1. 主动学习:我只标有价值的样本;2.半监督学习:没标注的这一堆数据我也想用;3.自监督学习:我能不能左右互搏?4. 排列组合:主动半监督,主动自监督,自监督半监督,全都要!
半监督学习的路子包括基于图的半监督学习方法,构建一致性约束的方法和基于伪标签的方法。这里就主要结合三篇来说说大家怎么理解用伪标签做半监督学习的。
早期的伪标签半监督学习工作。Dong-Hyun Lee[1]说我们直接拿任务模型的预测来做伪标签,下一轮接着训练吧。这个操作相当于我们在损失函数里加了熵正则项(entropy regularization),能迫使预测的各个类重叠程度更低。这个技巧也在后来的 MixMatch 中成为熵最小。但这方法坑就坑,大量引入了错误的伪标签,在迭代训练中误差被层层累积,所以效果也差强人意。
这是 ICLR 2021的一篇文章[2],作者认为直接用任务模型预测给出的后验概率来选伪标签不行是因为深度网络输出的后验概率预测没配准,网络过于自信了。换句话说,深度网络预测的后验概率不能真实反应预测的准确度。
这就导致了,我们本来想选准确率高于 70% 的样本,用这些样本的的预测标签来训练模型,但由于深度网络过度自信,我们选预测概率高于 0.7 的样本,实际这些样本的准确率可能 50% 不到,这就引入了大量的错误伪标签,再经过半监督训练的迭代传播,整个训练精度就没啥提升。
所以作者引入了模型配准的技巧,一个是通过温度系数直接先缩放,另一个是加入不确定度来配合预测信度选择可信的伪样本(这个不确定度可以来自于 dropout 或者数据扩展,文章自己的实验显示 dropout 效果好)。
下图是文章用于说明不确定度与模型预测概率的配准程度有关,不确定度低时,模型的预测概率更可能时良好配准的,也就是说,不确定度低,模型的预测概率可以更好的反应预测的准确度。所以直接结合不确定度和预测信度就能选到可靠的伪标签用于迭代训练模型了。
这是 AAAI 2021 的一篇文章[3],作者从 Self-paced Learning 的角度来设计伪样本选取的策略,并用以解释为什么基于伪样本的半监督学习能生效。课程学习中,主张我们以先易后难的顺序给模型输入训练样本,能帮助模型获取更好的收敛特性。self-paced 这支直接让学生自学,用任务模型对各个样本的损失来表示该样本的学习难度。
这篇伪标签的半监督学习,也就按这个思路来搞,在每次迭代选模型预测信度最高的一部分做为伪样本训练,然后逐渐增大选中的比例,直至扩展到所有样本都用于模型训练。半监督学习算法如下图。作者也根据课程学习生效的证明方式来解释了为啥这么选训练有效,这里也简单贴一张图。
一致性正则是除伪标签之外,半监督学习里的另一个常用操作。它做的假设是,如果我们对输入做一定的扰动,模型预测应该相似。这个假设和自监督学习里的非常类似,特别是只用正对做对比学习的一系列自监督学习算法(simsiam,byol 等)。
他们也用相似的网络结构,微微不一样的地方是,在半监督学习里,我们对比模型的任务预测结果,也就是分类或者分割预测结果,而自监督学习里我们完全没有标签,也没啥所谓的“下游任务”,所以就直接对比输出的特征的相似度(严格来说是加了预测头的输出特征的相似度)。
一致性正则通常由两个分支组成,每个分支分别处理施加了不同扰动的样本,然后设置损失函数,让两支的预测相互接近。这里面会出现两个问题,一个是自监督里面经常提到的找到没意义的解,trivial solution。比如这两个分支网络对所有的样本都预测成同一类,这时候,完全满足一致性损失,但丝毫没用。
当然在半监督训练中,这个问题相对来说没有在自监督训练里严重。因为,半监督训练总是存在一部分的标注样本,有一部分的正确约束。而在大多数的半监督算法里,来自标注样本的损失权重通常是设置的和无标注的样本的损失权重在同一量级。也就是实际上增大了标注样本约束的效力。
第二个问题是伪标签的正确性和覆盖率的问题。因为用做伪标签的模型预测不完全正确,所以我们往往会选到一些错的伪标签来训练网络,而这些错的伪标签又会加剧模型下次预测时犯错的概率,从而影响到整个半监督训练的精度。这个问题通常称作确认偏置。所以,我们想要提高选到的伪标签的正确率,会设置一个信度阈值来选择可靠的伪标签。
但是,这又有俩问题,一个是阈值增加,选到的伪标签会变少,还会引发类不平衡问题,另一个是深度模型的预测信度并没有配准,也就是模型预测最大概率是 0.95,通常对应的不是 95% 的准确率,所以信度筛不准。尽管这个问题还没有很好的解决方法,但现在广泛使用的方法通过一些设置来削弱了这个问题带来的影响。下面分别介绍俩个方法,FixMatch 和 ConMatch。
Fixmatch 的方法比较简单,两个分支,分别输入强度不同的扰动,一个弱,一个强。从直觉上来讲,模型对弱扰动的输入应该预测的更好,那就用这一分支的预测来产生伪标签。这样既保证了伪标签不要错的离谱,也利用了强扰动带给模型带来更好的效果。
在 ConMatch 里,作者觉得我们应该学学自监督的操作,两个分支都有强扰动,但这么搞的话,我们又怕引入大量错的伪标签。所以他加了两个操作,一个是原来是俩分支,一弱一强,现在我搞三个一弱两强。那每组一弱一强之间就能产生一个和 fixmatch 类似的损失,而两强之间我们也搞一个损失,毕竟我们都算出来三个分支的输出了,不两两组合算损失,显得有点浪费。
那在两支都是强扰动的情况下,我们就需要确定伪标签怎么设。ConMatch 的思路也很简单,两个方向的损失我都要,但加上一个可靠性权重。而哪个伪标签可靠就看哪一支的预测和弱支的预测更接近。具体说就是用算强支和弱支预测的交叉熵,用他的倒数归一化之后来做权重,见 ep(1-3)。
说完一致性损失怎么加之后,就剩下扰动从哪来这个问题了。俩个思路一个是基于图像基本变化的组合,比如 RandAug[3],CTAug 之类的,另一个就是用对抗训练来产生,如 VAT[4]。
基础的图像变化操作:自动曝光,亮度,色彩,对比度,锐度,均衡化(Equalize),色调分离(Posterize),过曝?(Solarize,看起来有点负片那效果),旋转,平移,加上 Cutout 也就是扣去一块。每次在这些个操作里选 M 个,然后每种随机一个变换强度 N,组合起来就叫 RandAug(M,N),这也是现在半监督算法里用的最多的一种。
大概思路相当于在设置的扰动变化幅度范围内,选一个能带来最大损失的方向来生成变换。设置的扰动变化幅度保证了别变太大,直接变了一类。这个方法现在基本用的不太多了,这里也就不详细写了。感兴趣的盆友可以看看这篇 VAT。
正如前面的文章所介绍,半监督训练的方法通常是通过给无标签的数据打上一个伪标签,不管用软标签、硬标签;是直接用模型本身的预测,还是模型历史集成的预测,这些伪标签总归是有噪声的。用这些有噪声的标签来训练模型,又会加强这种噪声,有点正反馈的感觉,所以怎么减弱这些错误伪标签带来的影响就很重要了。
伪标签的偏差,指的是模型学到的决策边界和真实的决策边界之间的差异,当然我们可以用模型预测精度来表示这种偏差有多大。在分析具体什么因素对半监督训练中伪标签的偏差会产生影响之前,这篇文章首先确定了,这种偏差是确定性的,也就是不随选取的随机种子不同,产生不同的伪标签偏差。
1. 标注数据偏差(data bias):特别是在标注样本数量较少时,由于选取的不同的标注样本距离真实的决策边界距离不同,产生的伪标签偏差。
2. 预训练表示偏差(model bias):不同的预训练任务,可能会关注数据不同的方面,反映到特征空间就是数据与真实的决策边界之间有不同的距离,当然也造成伪标签的偏差。
3. 自训练算法偏差(training bias):在经过不同的自训练算法训练后,模型对不同的类的预测精度往往也会发生变化。在之前流行的半监督算法 fixmatch 类的,通过预先对所有类给定一个相同的阈值来选伪标签的方式,会产生尤为明显的偏差。即多数类精度提升,少数类精度降低。这是由于这类自训练算法本身的缺陷导致的。
具体来说,这篇文章给了两个改进点来减小伪标签的偏差。第一个设计是分开伪标签的生成和利用,从而减弱训练偏差,第二个设计是优化最坏情况,从而减弱数据偏差和模型偏差。
之前的半监督学习框架,伪标签的生成和利用都是同一个网络头来产生的,那就可能会造成误差的放大,也就是错误的伪标签被选中,然后用来训练之后又再次加强了这个错误。那这篇文章给的方法就是把生成伪标签和利用伪标签这两部分独立开。
如下图,只用无噪的标注数据来训练一个分类头,用来产生伪标签,而单独加上一个 agent head,用伪标签训练来改善特征学习。从而减弱之前架构生成和利用伪标签高度耦合带来的误差放大的问题。ps., 感觉上仍然没法完全不受影响,边界错的伪标签带来有问题的特征空间,单一个只用标注数据训的分类头也很难缓解的了。
感觉这部分设计是这篇文章最妙的地方。上一个设计,感觉上是我给定一个特征空间,通过训练一个清洁的分类头来产生更好的决策边界,但特征空间本身由错误伪标签引起的混淆是没法解决的。而这个设计,就用来优化特征空间了。
文章给出的方法是定义一个最坏的情况,也就是对某个特征空间,分类器能完全正确的预测标注数据,但会预测尽可能多的无标注数据,当然我们这里不知道无标注数据的标签,所以用当前模型产生的伪标签来代替。这步用公式表达的话就是下图:
这么说完,可能还是感觉比较云山雾罩,作者又给出了一张示意图(见下图)来说明,左边是学到的决策边界,中间是找到的在这种特征空间下最差的分类器,右边是通过优化特征生成器来改善出现最差情况时的损失。也就是,我们除了正常的半监督损失来引导特征提取器,我们也同时希望,这个特征提取器能对分类头可能出现的错误有一定的鲁棒性。
这个设计让分类头不再会轻易的带来很多错误的伪标签,特别是那些靠经分类边界的无标注样本,迫使他们远离决策边界,从而减少可能产生错误伪标签的机会。
这篇文章主要是针对打伪标签过程中,不同类的差异带来的问题。文章观察到即使我们给半监督训练算法类平衡的标注数据,随着逐渐训练,伪标签也会变得不平衡。针对这个问题,文章用因果推断的手段设计自适应去偏的伪标签生成机制,以及一个自适应的边缘损失。
模型对样本的预测,受到样本和模型自身偏差的影响。模型自身偏差可能指模型本身倾向于把大部分的样本预测做几个主体类。那我们想知道单独由这个样本本身引起的预测(也就是直接原因,direct effect),就做需要做一个 counterfactual 推理。因果图如下:
但在实际训练的时候,如果每一步生成伪标签都需要计算模型自身的偏差的话,计算开销太大。因此,这篇文章采取了近似方法,叫做 ACDE(approximated controlled direct effect),这个近似方法假设模型的偏差不会急剧变化,因此可以用动量更新的结果来做因果图右侧的估计。最终得到的计算式如下,感觉上就变成,模型对这个样本预测成这一类的概率相比动量平均结果增大的部分,再拿来生成伪标签。
加入边界损失的出发点其实和上面介绍的那篇 debiased 类似,都是因为错误的伪标签更可能出现在决策边界附近,分类器产生的类间混淆导致的。那么我们让类之间的距离变大就能缓解一些,上文是用优化最坏情况来做的,而这篇文章通过自适应的边缘损失来做。具体损失形式如下:
用这个损失来代替对无标注样本计算的交叉熵损失(看起来这个损失的形式很像L2-Constrained Softmax Loss[3])。实际上,相当于根据不同类的预测概率来计算一个自适应的边界,当样本属于多数类时,通过自适应边界来减少对损失,从而达到让多数类(dominant class)不要压制其他类的效果。
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算