半监督学习|深度学习(李宏毅)(九)
一、介绍
- 什么是半监督学习
假设有以下数据,一部分是有标签的数据,另一部分是无标签的数据:
\left \{(x^{r},\hat{y}^{r})\right \}_{r=1}^{R},\left \{x^{u}\right \}_{u=R}^{R+U}
在实际情况下,一般无标签数据的量远大于有标签数据的量,即 U\gg R ,因为为数据进行标注是需要成本的。半监督学习使用大量的未标记数据,以及同时使用标记数据,来进行模式识别工作。
2. 半监督学习的分类
半监督学习可以分为transductive learning和inductive learning两种,他们的区别在于:
①transductive learning:未标注数据不是测试数据,我们不管 X_{te} ,而是想知道对 X_{un} 的效果怎么样;
②inductive learning:未标注数据是测试数据,也就是说训练集 D=\left \{X_{tr},y_{tr},X_{un}\right \} ,测试 X_{te} 。
3. 为什么半监督学习可能会有用
无标签数据虽然没有标签但是它的分布可能会提供一些有用的信息。在进行半监督学习时通常会伴随一些假设,半监督学习效果好不好往往取决于这些假设合不合理。
4. Outline
接下来将包含以下内容,其中包含两种假设:
二、生成模型的半监督学习
对于生成模型,如果再考虑进无标签数据就有可能影响模型的均值、方差以及决策边界。
可以使用EM算法对模型进行更新,该更新过程会收敛,最终获得新的生成模型,该过程的步骤如下:
首先初始化参数 \theta =\left \{P(C_{1}),P(C_{2}),\mu ^{1},\mu ^{2},\Sigma \right \} ,可以选择随机初始化,也可以选择使用标注数据初始化一个模型。
Step1(E步):计算未标注数据的后验概率 P_{\theta }(C_{1}|x_{u}) ;
Step2(M步):更新模型
P(C_{1})=\frac{N_{1}+\sum _{x^{u}}P(C_{1}|x^{u})}{N}\\ \mu _{1}=\frac{1}{N_{1}}\sum _{x^{r}\in C_{1}}x^{r}+\frac{\sum _{x^{u}}P(C_{1}|x^{u})x^{u}}{\sum _{x^{u}}P(C_{1}|x^{u})}\\ 同样地更新P(C_{2})、\mu _{2} 迭代执行上述步骤直到收敛。这里没有更新 \Sigma 的原因是 \Sigma 是共享的,并不影响迭代过程。
如果只有标注数据则只需要极大化以下对数似然函数即可求解,且有闭式解:
logL(\theta )=\sum _{x^{r}}logP_{\theta }(x^{r},\hat{y}^{r})=\sum _{x^{r}}logP_{\theta }(x^{r}|\hat{y}^{r})P(\hat{y}^{r})
如果考虑进未标注数据就要极大化以下对数似然函数:
logL(\theta )=\sum _{x^{r}}logP_{\theta }(x^{r},\hat{y}^{r})+\sum _{x^{u}}logP_{\theta }(x^{u})\\ 其中P_{\theta }(x^{u})=P_{\theta }(x^{u}|C_{1})P(C_{1})+P_{\theta }(x^{u}|C_{2})P(C_{2})
而极大化上式是没有闭式解的,因此需要迭代的方式来进行参数的更新,也就是说完成一次上述的E步和M步就会使对数似然函数增大一点,最终该方法会收敛。
三、低密度分离假设
- 简介
该假设是指在不同的类别的分解处几乎是没有数据的(低密度),也就是说不同类别之间有明显的分界的鸿沟,可以认为数据是“非黑即白”的。
在下图中两种分割方式虽然都能将标注数据100%地分开,但是如果考虑进未标注数据的话显然左边的线效果更好,因此未标注数据的作用就是挑选一条效果更好的分割线。
2. Self Training(自学习)
自学习是低密度假设最简单的方法,其主要步骤如下:
Step1:利用标注数据训练一个模型 f^{*} ,训练的方法不受限制;
Step2:将 f^{*} 应用到未标注数据上获得 \left \{(x^{u},\hat{y}^{u})\right \}_{u=1}^{U} ,也就是为未标注数据打上标签,叫做伪标签(Pseudo-label);
Step3:将未标注数据中的数据移出一部分作为标注数据,数据的选取标准可以自行设定,比如使用置信度或者权重等;
Step4:迭代执行上述过程指导全部数据被标注。
注意自学习的方法对回归任务是不适用的,因为将转换 f^{*} 标注的未标注数据而获得的标注数据对于更新模型没有帮助。
另外这里还有硬标签和软标签两个概念,在生成模型中我们使用软标签(即使用数据作为每一类的概率),而在自学习中使用的是硬标签(即强行根据设定的方法将未标注数据划归到某一类中)。
可以考虑在使用神经网络训练模型的自学习过程中,如下图所示,如果使用软标签则更新模型时新的标注数据不会起作用(因为已有模型已经可以输出软标签的结果),而使用硬标签就可以起到更新模型的效果:
3. Entropy-based Regularization
上面提到的使用硬标签的方式可能会让人觉得过于武断,这里的Entropy-based Regularization将介绍一种新的方式,同样地构建的模型输出一个与类别数量同样维度的向量,每个维度代表该样本属于该类的概率,即 y^{u}=f^{*}_{\theta^{*}}(x^{u}) ,这里的 y^{u} 是一个向量:
我们的目的是为了使得模型获得 x^{u} 作为输入时能输出下面展示的比较好的标签向量(第1、2种情况),也就是说要尽可能地使得输出的标签的数值集中在某一维度:
接着我们定义信息熵的概念,信息熵会告诉我们分布的集中程度,比较集中的分布就会有比较小的信息熵。在上图中,前两种情况的交叉熵就会比较小,而第三种情况的交叉熵就会比较大,交叉熵的计算公式如下:
E(y^u)=-\sum\limits_{m=1}^n y_m^u ln(y_m^u)
我们的目的是需要让标注数据的交叉熵和未标注数据的信息熵都要小,也就是说对于训练的模型来说要使得标注数据的预测正确且未标注数据的预测集中,因此我们使用以下损失函数:
L=\sum _{x^{r}}C(y^{r},\hat{y}^{r})+\lambda \sum _{x^{u}}E(y^u)
上式中 \lambda 可以用来调节哪一部分更重要,这一过程类似于正则化的过程,Entropy-based Regularization也因此而得名。
4. 概览:Semi-supervised SVM(半监督支持向量机)
半监督支持向量机的做法大体是对于未标注数据而言可以穷举其label所有可能的情况,然后对每一种情况训练一个SVM,训练的目标是:
①要有最大的margin,让这两个class分的越开越好;
②要有最小的分类错误。
如下图所示,在穷举训练的过程中挑选最大margin和最小error的模型,该模型对应的未标注数据的标签就是最好的情况:
这种方法的缺点就是对于很多的未标注数据穷举的方式几乎不可能完成,因此该方法的作者提供了一种approximate的方法,其基本精神是:一开始首先获得未标注数据的标签,然后改一笔数据的标签看看可不可以使上面提到的度量标准变得好一点,如果可以就保留该标签的变动。
四、平滑性假设
- 概念
如果未标注数据不是均匀分布的,则同样类别的数据之间应该会通过一块高密度区域连接在一起,比较精确的定义是:
① x 的分布是不均匀的;
②如果 x^{1} 和 x^{2} 在一个高密度区域上相距很近的话,那么 \hat{y}^{1} 和 \hat{y}^{2} 就应该是相同的。
在下图中虽然 x^{2} 和 x^{3} 的距离很近但是它们之间没有过渡的数据,因此它们的标签一般不相同,而 x^{1} 和 x^{2} 之间有一个高密度区域,所以它们的标签很可能相同。
2. 支持平滑性假设的一些例子
- 数字识别
在下图中,可能两个“2”看起来并不像而第二个“2”和“3”看起来更像一点,因此容易误分类。但如果数据中两个“2”之间有多个过渡形态,则可以利用平滑性假设将两个“2”正确分类到一起:
- 人脸识别
在人脸识别过程中也同理,因为两张人脸之间有逐渐过渡的状态,因此可以将同一个人的人脸识别出来:
- 文档分类
同一类别的文章可能会有专属的词汇,如果如下图某些词既出现在标注的文档里也出现在未标注的文档里,那么分类工作会变得容易些:
但是实际中往往不会出现重合的词汇,这是因为自然语言中的词汇是多种多样的,即使是同一类别的文章也可能不出现重合的词汇,如下图:
但是如果有足够多的未标注数据则可以根据词汇间的过渡关系进行正确的分类:
3. 平滑性假设的一种简单实现方法
一种简单的实现方法是聚类后标签(cluster and then label),这种方法是先将数据进行聚类然后根据平滑性假设获得数据的标签。
这种方法是很直观的,但是这种方法不一定会得到好的结果,因为它的假设是你可以把同一类的样本点聚类在一起,而这其实是不容易的。
举例来说,在图像分类中如果单纯地将图像按照像素的相似程度聚类到一起得到的效果一般会很差,需要设计一个较好的表示来描述图像(比如使用Deep AutoEncoder的方式来提取特征),这样的效果会好一些。
4. 基于图的方法
- 定性使用基于图的方法
使用图来表示数据与数据之间通过高密度区域相连会有很好的效果,有的数据之间建立图的关系是很自然的比如网页之间的链接关系或论文之间的引用关系。通过构建图可以直观地表示数据之间的连接关系:
构建图的具体方法是通过定义数据之间的相似性(similarity)来决定数据与数据之间是否有边(edge)相连,定义 s(x^{i},x^{j}) 可以衡量相似性。对于构建的数据之间的边,可以给边设置权重来表示数据之间相似性的强弱,这个权重应该是同 s(x^{i},x^{j}) 成正比的。
通常使用的 s(x^{i},x^{j}) 是径向基函数(RBF),其公式如下:
s(x^{i},x^{j})=exp(-\gamma \left \|x^{i}-x^{j} \right \|^{2})
通常需要自己去寻找相似性的度量方法,比如在图像处理中如果使用图像像素之间的接近程度作为相似性的度量标准往往效果不太好,但是如果使用Deep AutoEncoder获得的图像的特征来进行度量效果就会好一点。
可以看到该函数由于具有指数的关系,只有当 x^{i} 和 x^{j} 非常接近时才会有比较大的相似性,而稍微距离有点远就会使得相似性不高,由此避免了将下图中绿色点和红色点看做高相似性的情况的发生:
在有了相似性的度量标准后要有具体的方法来决定两个数据之间是否有边,有两种方法:
①K Nearest Neighbor:设定一个K值,将每个点与距离自己最近的前K个点相连;
②e-Neighborhood:将每个与距自己的距离小于e的点相连。
图的作用是使得标签可以在相连的其他样本之间传递,如下图所示,一个数据的类别将影响它的临近点。基于图的方法的基本精神是,在图上已经有一些标注数据,那么跟它们相连的样本,属于同一类的概率就会上升,每一笔数据都会去影响它的邻居。而图带来的最重要的好处是,这个影响是会随着边传递出去的,即使有些点并没有真的跟标注数据相连,也可以被传递到相应的属性:
- 定量使用基于图的方法
我们定义图的smooth值,并且我们希望使用训练的模型构建的图的smooth值越小越好。
我们通过以下公式定义图的平滑度(smoothness):
S=\frac{1}{2}\sum _{i,j}w_{i,j}(y^{i}-y^{j})^{2}
计算 S 要将所有数据点考虑在内,无论标注数据还是未标注数据,而且 S 越小平滑度就越高。下图为计算 S 的两个例子:
在上图中显然左边的更平滑。左边的图的特点是其环状的节点都是同样的标签,而右边的图的环状的节点的标签不同,因此可以看出我们的目的是使得构建的图的数据较集中的部分具备一致的标签,这也是使 S 尽可能要小的作用。
可以将 S 写成矩阵或向量相乘的形式:
S=\frac{1}{2}\sum _{i,j}w_{i,j}(y^{i}-y^{j})^{2}=y^{T}Ly
上式中 y 是 R+U 维的向量, y=\begin{bmatrix} \cdots & y^{i} & \cdots & y^{j} & \cdots \end{bmatrix}^{T} ;
L=D-W ,叫做Graph Laplacian,D和W计算方式如下,其中W相当于邻接矩阵, D 的对角线元素是该元素所在行的所有元素的和:
在模型训练过程中需要使用以下激活函数,将 S 作为一个正则化项,如此训练的模型才会越来越平滑:
L=\sum _{x^{r}}C(y^{r},\hat{y}^{r})+\lambda S
具体训练的时候,不一定只局限于模型的输出要smooth,可以对中间任意一个隐藏层加上smooth的限制:
五、Better Representation
这部分只做简单介绍,等到无监督学习的时候再具体介绍。Better Representation的精神是去芜存菁,化繁为简。Better Representation旨在寻找未标注数据的更好的表达。
举个例子,在神雕侠侣中,杨过要在三招之内剪掉樊一翁的胡子,胡子的变化是比较复杂的,但头的变化是有规律的,杨过看透了这一件事情就可以把胡子剪掉。在这个例子中,樊一翁的胡子就是original representation,而他的头就是你要找的better representation。