半监督学习
我们之前已经学习了监督学习(包括各种分类和回归的方法)以及无监督学习(主要是聚类方法),监督学习要求我们的样本集都是带标记的,而无监督学习可以处理无标记的数据集。但在现实中,我们遇到的情况往往是两者的折衷,即仅有部分数据是带标记的,另一部分数据是不带标记的。
那么此时我们应该如何处理呢?如果仅使用带标记或不带标记的样本,则一方面会造成部分数据的浪费,另一方面由于所使用的数据量较小,我们训练得到的模型可能效果并不是很好。因此我们很自然的想法就是找到一种合适的方法将两部分数据都利用起来。
1、主动学习
有一种称为“主动学习”的方法是这样操作的:首先仅用有标记样本训练一个模型,然后通过一定的算法查询最有用的未标记样本,并交由专家进行标记,然后用查询到的样本训练分类模型来提高模型的精确度。
那么,什么样的样本是有用的呢?即查询函数查询的是什么样的样本呢?在各种主动学习方法中,查询函数的设计最常用的策略是:不确定性准则(uncertainty)和差异性准则(diversity)。
对于不确定性,我们可以借助信息熵的概念来进行理解。我们知道信息熵是衡量信息量的概念,也是衡量不确定性的概念。信息熵越大,就代表不确定性越大,包含的信息量也就越丰富。事实上,有些基于不确定性的主动学习查询函数就是使用了信息熵来设计的,比如熵值装袋查询(Entropy query-by-bagging)。所以,不确定性策略就是要想方设法地找出不确定性高的样本,因为这些样本所包含的丰富信息量,对我们训练模型来说就是有用的。
那么差异性怎么来理解呢?之前说到或查询函数每次迭代中查询一个或者一批样本。我们当然希望所查询的样本提供的信息是全面的,各个样本提供的信息不重复不冗余,即样本之间具有一定的差异性。在每轮迭代抽取单个信息量最大的样本加入训练集的情况下,每一轮迭代中模型都被重新训练,以新获得的知识去参与对样本不确定性的评估可以有效地避免数据冗余。但是如果每次迭代查询一批样本,那么就应该想办法来保证样本的差异性,避免数据冗余。
但是主动学习的问题是,我们依旧需要专家参与样本的标记,我们所做的只是尽可能减少向专家查询的次数而已,这对于较大的数据集或没有专家的情况来说是有局限性的。
有没有一种方法可以不与专家进行交互,即不借助“外力”就能使用无标记的数据来提高模型的泛化性能呢?答案是肯定的。
2、半监督学习
由上述介绍我们知道,无标记样本可以提高泛化性能的关键是其包含关于样本分布的信息(隐含假设是无标记样本和有标记样本是从相同的数据分布当中独立抽样得到的)。
不难看出,我们对无标记信息反映出的数据分布信息进行利用时,世界上大体思路和方法与之前的聚类相同,下一步也是关键的一步是如何将有标记数据和无标记数据有机结合在一起,同时发挥两者的作用。
2.1、生成式方法
上面就是高斯混合生成式模型。我们看到关键的式子是(13.2),式子的前半部分表示已知样本属于第个高斯分布的时候其标记为的概率,这部分显然需要我们知道样本的标记(即使用有标记样本),而式子的后半部分表示给定样本,其属于第个高斯分布的概率,这是不需要利用样本的标记的。
通俗地讲,前半部分独立出来看其实就是给定一些有标记的样本点并已知这些样本点属于一个高斯分布,接下来我们只需要用最大似然法即可求解此高斯分布的未知参数。后半部分独立出来则是一个聚类问题,即平面上撒了一些点,已知这些点是从一个混合高斯分布生成的,现在已知一个样本点的特征,要求出其是各个高斯分布生成的概率,这其实是一个后验概率。
EM算法其实和k-means很类似,首先随机初始化各个高斯分布的均值和协方差阵(M step),然后根据设定的参数计算各个样本点属于各个高斯分布的概率(E step),和k-means不同的是这里并不把样本点划入特定的高斯分布,而是一种基于概率的“软划分”。接下来,为了使模型更好的拟合样本点,我们基于这些样本属于各个高斯分布的概率重新估计参数(就相当于k-means中重新计算簇的中心点)(M step),然后依次进行下去直至收敛。
和聚类中的高斯混合模型不同,这里的生成式模型在M step用到了有标记的样本,从上图(13.6)~(13.8)可以看到,相比无标记样本项,有标记样本项其实相当于将取为1。也就是说无标记样本属于第个高斯成分的概率为,而有标记样本)属于第个高斯成分的概率为1,因此有标记样本的权重大于无标记样本,可以在确定各高斯成分参数的时候发挥更重要的作用。
另外,由(13.6)~(13.8)最前面的系数也可以看到,对于那些无标记样本我们其实就是把它属于某个高斯成分的概率当作把它视作的样本数目了。通俗来说,样本有的概率属于第个高斯成分,因此计算第个高斯成分的均值和方差时就把看作个样本。
将上述的高斯混合模型换成其它的混合专家模型或朴素贝叶斯模型就得到了其它生成式半监督模型。需要注意的是,我们的模型假设必须是准确的,生成式模型才能产生好的效果,也就是说我们必须有充足的领域知识来对数据的分布做出判断,否则在错误的分布假设下利用无标记样本反而会降低模型的泛化性能,这是十分糟糕的。
2.2、半监督SVM
TSVM的思想通俗来讲就是首先仅利用有标记样本训练一个SVM模型,并运用此模型对无标记样本进行标记。此时我们就拥有全部样本的标记了。运用所有样本训练一个SVM找到一个新的超平面。
但是我们之前对无标记样本所做的标记其实是“伪标记”,因此我们接下来还要对超平面进行修正。修正的方式是每次找两个满足下列条件的点:
- 两个点都属于原来的无标记样本
- 两个点属于不同类
- 两个点突破margin限制的距离加起来比较大(也就是更可能分类错误)
找到所有满足条件的点对,交换每个点对的标记,并增加无标记样本的权重,重新求解SVM。这一步起到的作用就是假设很可能分错的无标记样本确实分错了,将之修正后加大无标记样本的权重就可以使得这部分修正的样本在之后的学习过程中再次被错分的可能性减小。
重复此过程,最终当有标记样本和无标记样本权重相同时停止,此时就得到了修正后的SVM,即TSVM的结果。
2.3、图半监督学习
虽然西瓜书上这部分的公式推导看起来十分吓人,但图半监督学习的大体思想其实并不难。简单来说,分为以下几步:
- 将各样本点构建成一个完全图,两点之间的边的权重与其距离呈负相关(从而度量了样本之间的相似度)。
- 将分类规则对应的映射记为(),定义关于的能量函数(其实相当于误差项),然后通过数学推导求解使得能量函数最小的。
2.4、基于分歧的方法
可以看到,协同训练的算法流程还是很有趣的,基于不同视图分别训练多个学习器,然后让各个学习器都找最有把握的无标记样本进行标记,并喂给其它学习器提升性能。
这在现实中的场景就好像有多个专家在共同解决一个问题,他们都基于自己掌握的信息得出结论,他们不懂别人的专业领域知识,但是他们可以根据自己的知识对自己最有把握的样本贴标签并展示给别人(大家用的标签都是一样的,这就是相容性),为别人提供更多的样本来学习,最终大家互帮互助共同解决难题。
2.5、半监督聚类
基于第一种类型的半监督聚类方法的代表是约束k-means。其实相比无监督的k-means算法,约束k-means只是增加了一个对必连和勿连的检查过程。具体说来,算法的流程大概如下:随机选取k个点作为初始均值点,然后对每个样本,寻找距离其最近的均值点,检查把这个样本点划入最近均值点对应的类会不会违反必连和勿连条件(比如若x1与x2必连,x1划入了1类,此时距离x2最近的簇是2类,这就违反了必连条件;若x1与x2勿连,x1划入了1类,此时距离x2最近的簇是1类,这就违反了勿连条件),若违反,则去掉这个均值点,找剩余均值点中距离最近的,依次进行,若所有的k个簇都被去掉(即此样本点不能划入任何一个簇),则返回异常。
基于第二种类型的半监督聚类方法的代表是约束种子k-means。这种方法对有标记样本的使用更为直接,直接使用属于同一类的有标记样本的均值作为对应簇中心的初始化值,然后进行k-means,并在此过程中保证有标记样本不被分到与其类不同的其它簇。