机器学习10 -- 半监督学习 Semi-supervised Learning

1 为什么要做半监督学习

有监督机器学习已经在很多领域证明了它的有效性,比如ImageNet图像分类任务,深度学习模型早在2017年,准确率就已经超过了人类。机器学习被认为是一门数据驱动的学科,数据分为两部分,data和label。通常情况下,data是比较容易获取的,而label需要标注,要珍贵很多。比如对于图像分类任务,网络上有成千上万的图片数据,但他们大多数都是没有label标注的。

通常情况下,我们可以进行一小部分数据的标注,形成有监督数据,然后再利用好其他未标注数据。这种方法称为半监督学习。半监督学习的价值在于

  1. 大大降低了机器学习模型对于标注数据的依赖,特别是项目处于冷启动的时候。
  2. 未标注数据的分布,能提供很多信息,对模型迭代有指导意义,即使他们是unlabeled
  3. 未标注数据大多数情况下很容易获取,数据量很大。质量不够,数量来凑。利用得当,也能产生很大价值。

2 半监督方法

2.1 self-training 自学习

self-training的大体流程如下

  1. 利用labeled data训练一个模型,训练方法没有任何限制
  2. 利用训练好的模型,对unlabled data进行predict,得到标注,称为pseudo label
  3. 从pseudo label中选取一些样本,放入labelled data中。选取方法也是自定义的,比如可以放入置信度比较高
  4. 重新训练模型,然后继续迭代。

这里要注意的是,pseudo label必须使用hard label,不能是soft label。什么是hard label呢。我们设想一个二分类任务,某个样本通过模型predict后,概率分布为[0.8, 0.2]。[0.8, 0.2]即为soft label,[1, 0]则为hard label。为什么不能使用soft label呢?因为在self-training下,soft label是模型predict出来的,你再用它作为label,模型则什么东西都学不到,模型参数原封不动。因此我们必须使用hard label

image.png

2.2 Entropy-based Regularization 熵正则

还有一种充分利用unlabeled data的方法,就是entropy-based regularization。它的思想是,模型对data的predict的概率分布,尽量集中在某一个类别上,在模型区分度高,效果好。这个也是make sense的。设想一下,如果model的predict,在每个类别上的概率,都是相同的,则此时无法确定样本的类别。故我们的模型predict的概率分布,必须尽量在某一个类别上。

image.png

那么用什么来衡量概率分布是否集中在某一个类别上呢。那就是entropy熵。表达式如下。熵越小则代表概率分布越集中。

image.png

那现在问题就很简单了,我们半监督学习的目标,包括两个

  1. labeled data上,模型loss要尽量小。比如分类任务的cross-entropy
  2. unlabeled data上,entropy要尽量小,使得概率分布尽量集中

那么目标函数就可以改为优化上面两项,表达式如下

image.png

可见,unlabeled data对机器学习模型还是很有价值的。

2.3 聚类

还有一种利用相似度来使用unlabeled data的方法。计算某个unlabeled data和所有labeled data的相似度,和谁最接近,就使用谁的类别。这种方法看似make sense,其实有很大问题。原因在于相似不代表类别相同。如下图

image.png

中间的数字2,和最右边的3更相似,但其实它应该和最左边的2,是同一个类别。半监督学习中不能直接使用相似度,那是不是代表它就没啥用武之地了呢。答案是否定的。设想一下,当数据量很大时,我们会有很多种不同形态的样本点,通过它们的传导,可以使得它们位于同一个稠密区间内,即使某两个样本相似度不高。我们可以将同一个稠密区间的样本,归类到一个类别中。那怎么得到这个稠密区间呢?那当然是采用聚类了。

采用聚类算法来实现半监督学习的步骤为

  1. 对所有数据进行聚类,个人感觉DBScan、HDBScan这些基于密度的聚类算法比较有效。
  2. 同一个聚类的,认为具有同一个类别。利用labeled data获取cluster的类别,从而得到该cluster内unlabeled data的类别。
  3. 利用这些有监督数据训练模型

这种方法的关键点在于,聚类的同质性。一般来说,想做到同一个cluster内的数据,都属于同一个类别,还是很难的。聚类一般包括两步,先对样本embedding为向量并计算两两距离,然后利用聚类算法(比如kmeans、HDBScan、optics、谱聚类等)进行聚类。个人认为embedding更重要一些。

image.png

另外,通过聚类算法,也可以验证标注的准确率。对属于同一cluster,但label不同的数据,可以重新进行打标。从而减少标注噪声。

2.4 Graph-based Approach 图方法

之前引入聚类,来利用unlabeled data。其实我们还可以利用graph来实现数据之间的连接。数据之间的关系,有时候比较容易获取,比如网页链接间的跳转、商品点击的前后顺序、论文引用关系等。利用数据间的关系,结合K近邻等算法,可以将离散的数据构建为一张graph图。每个数据为图的节点,数据间关系为图的边。边可以有权重。

image.png

连通在一起的节点,就被认为属于同一个类别。由其中的labeled data节点,就可以知道它们所属的类别。这个方法的关键在于

  1. 图构建的准确率,包括节点连接关系和边的权重
  2. 数据量要足够大,否则可能因为缺失了某些节点,导致某个graph连接不起来

3 总结

半监督学习对于数据利用效率还是相当有用的,特别是在冷启动环节。结合主动学习、标注噪声学习、小样本学习,可以大大降低标注成本,加快模型迭代上线时间。

猜你喜欢

转载自blog.csdn.net/u013510838/article/details/108539697