What is self-training?
- 在监督学习中,模型都是需要有一个大量的有标签的数据集进行拟合,通常数据成本、人力成本都很高。而现实生活中,无标签的样本的收集相对就很容易很多。因此,近年来,利用大量的无标签样本和少量的有标签样本的半监督学习备受关注。
- Self-training 是最简单的半监督方法之一,其主要思想是找到一种方法,用未标记的数据集来扩充已标记的数据集。
ICML 2013:The Simple and EfficientSemi-Supervised Learning Method for Deep Neural Networks[3]
在样本及其珍贵的金融、医疗图像、安全等领域,伪标签学习是一把锋利的匕首,简单而有效。算法流程如下:
-
首先,利用已标记的数据来训练一个好的模型,然后使用这个模型对未标记的数据进行标记。 -
然后,进行伪标签的生成,因为我们知道,已训练好的模型对未标记数据的所有预测都不可能都是好的,因此对于经典的 Self-training,通常是使用分数阈值(confidence score)过滤部分预测,以选择出未标记数据的预测标签的一个子集。 -
其次,将生成的伪标签与原始的标记数据相结合,并在合并后数据上进行联合训练。 -
整个过程可以重复 n 次,直到达到收敛。 Self-training 最大的问题在就在于伪标签非常的 noisy,会使得模型朝着错误的方向发展。以下文章大多数都是为了解决这个问题。
cvpr 2020: Self-Training With Noisy Student Improves ImageNet Classification[1]
Google AI 提出了一种受 Knowledge Distillation 启发的半监督方法“Noisy Student”。
模型的训练过程如下述算法所示:
-
首先使用部分标签样本训练一个教师网络; -
使用教师网络在未标注数据集上进行预测,softmax 输出结果是概率分布,一般称为称为 soft label,其只给出每个类别的 score,而非指定为具体某个类别,而 hard label 就是 one-hot 形式的取 max 后的结果,并且实验证明软标签更好一些;生成无标签样本的伪标签; -
使用上述标签样本和伪标签样本分别训练学生网络(过程中会加入“噪声”); -
将学生网络作为新的教师网络,重复步骤2。
- 本文中的学生网络也有两个小tricks:数据过滤和数据平衡。具体地说,数据过滤用来过滤教师模型中置信度不高的图像,这些图像被叫作域外图像。由于ImageNet中的所有类都有相似数量的标记图像,所以我们还需要平衡每个类的未标记图像的数量。
- teacher 和 student 模型架构可以相同也可以不同,但是要想使噪音学生模型学习的好,模型容量必须足够大,以拟合大量的无标注数据集。这里使用的是基准模型,即第一次的 teacher model 是 EfficentNet-B7,而 student model 是一个更大的模型,并逐渐增大直到 EfficientNet-L2。
- 对学生加 noisy,可以确保 student model 的任务更难完成,而不仅仅是学习 teacher model 的知识,这也是 Noisy 能够带来提升的一个原因。
本文虽然性能提升很大,但是模型的训练时间确实非常之长。
cvpr 2021: CReST: A Class-Rebalancing Self-Training Framework for Imbalanced Semi-Supervised Learning[2]
文章的出发点在于,我们通常认为样本少的类表现效果不好,但是这只是部分正确,从下图中我们可以看到,对于样本数目非常少的点,他只是 recall 非常的差,但是 precision 却出乎意料的高。这个发现促使我们去寻找一种方法来提升他的 recall。
文章就提出了这样一种框架,与传统工作不同,我们对打上伪标签的数据根据类别多少来进行采样。
采取了简单的,从有标签样本中进行估计。对于一个被预测为 的 unlabelled 数据,它会被加入下一轮的训练集
这种做法有两个好处:1)因为 minority class 的预测精度都很高,因此将他们加入训练集合风险比较小;2)minority class 样本数目本来就少,对模型更加重要。
文章还引入了 progressive distribution align-ment 的方法进一步提升模型能力,但是这不是他的主要贡献。
kaggle比赛使用半监督可以提高性能
Step 1:将有标签部分数据分为两份:训练集和测试集,并训练出最优的 model1
Step 2:用训练好的 model 1 对一批未标记图像(测试集)进行预测,制作伪标签的过程中可以使用 Noisy Student 的方法,即通过图像翻折、旋转、缩放等对图像进行扩增,以此提升我们制作的伪标签的准确度,然后对预测的标签进行筛选选择大于预测阈值的标签作为伪标签。
Step 3:最后将有标签的数据(训练集)和伪标签的数据(测试集)一起进行 finetune model 1,通过验证集选取 best model。
- 阈值的选取,当图像中目标较多的情况下选取的阈值应该要小一些这样可以避免较多的假负例,反之在目标少的情况选择的阈值应大一些,还有一个比较有效的方法是利用在训练集上训练好的模型通过滑动阈值(自动逐个尝试)先搜索出模型在验证集上取得较好效果的预测阈值,再通过微调这个阈值测试出最适合制作伪标签的阈值。
Reference
[1] https://zhuanlan.zhihu.com/p/107901537 [2] https://www.sohu.com/a/454689217_500659 [3] https://www.jiqizhixin.com/articles/2020-08-03-6
|