半监督学习

在监督学习中,通常训练数据有input \(x^r\), 也有output \(\hat{y}^r\)。
但是在实际情况下,数据不难收集,但做数据的标记需要花费很大的功夫。
所以半监督学习,就是利用了很多没有标记的数据\(x^u\),通常U >> R。
transductive learning: unlabeled data就是testing data,
inductive learning: 不用这些unlabeled data做testing data.
其实人的学习过程也是一个半监督的学习过程,小时候有爸妈教,长大点需要自己学。

kaggle完成李宏毅深度学习作业详细步骤_sed

半监督学习中,虽然unlabeled data不会提供直接的训练样本,但它的input的分布可以帮助分类更好地划分边界。
但是semi-supervised learning使用unlabel的方式往往伴随着一些假设,其实semi-supervised learning有没有用,是取决于你这个假设符不符合实际/精不精确。

kaggle完成李宏毅深度学习作业详细步骤_相似度_02

课程框架

kaggle完成李宏毅深度学习作业详细步骤_sed_03

生成模型

监督生成模型

监督学习的情况下,如何用生成模型做分类。

kaggle完成李宏毅深度学习作业详细步骤_数据_04

半监督生成模型

有了unlabeled data之后,分类的分界线就不一样了,需要重新算。

kaggle完成李宏毅深度学习作业详细步骤_数据_05

计算方法就是EM算法,在计算的过程中用上unlabeled data C1的后验概率。
最终结果会收敛,但跟gradient descent一样,初始值的选取会影响最终收敛的结果。

kaggle完成李宏毅深度学习作业详细步骤_数据_06

用labeled data计算最大似然,计算出来的是闭式解(解析解)。
用labeled和unlabeled data计算的话需要迭代计算。

kaggle完成李宏毅深度学习作业详细步骤_sed_07

假设1:Low-desity Separation

假设两类之间有明确的分界线。

kaggle完成李宏毅深度学习作业详细步骤_相似度_08

自学习:self-training

先用监督学习得到一个模型,然后用这个模型预测unlabeled data,然后这些unlabeled data就有了pseudo-label。
然后再把其中一些unlabeled data添加到labeled data中,再去训练模型。
这里,1,怎么选取unlabeled data可以有很多方式,2,不同的data可以赋予权重。

在做regression时是不能用这一招的,主要因为把unlabeled data加入到训练数据中,\(f*\)

kaggle完成李宏毅深度学习作业详细步骤_相似度_09

在做self-training的时候,用的是hard label;在做generative mode时,用的是soft model。
soft这个方法是没有用的,一定要用hard label。因为本来输出就是0.7和0.3,目标又设成0.7和0.3,相当于自己证明自己,所以没用。
但我们用hard label 是什么意思呢?我们用hard label的时候,就是用low-density separation的概念。

kaggle完成李宏毅深度学习作业详细步骤_sed_10

基于熵的正则化

如果是neural network,这个output distribution一定要是很集中。
如果分布很均匀的话,是不好的,不符合low-density separation的假设。
label data的部分,计算交叉熵,unlabel data的部分,你会加上每一笔unlabel data的output distribution的entropy,那你会希望这些unlabel data的entropy越小越好。
中间会乘上一个weight,来调节两者的比重。
在训练的时候,用GD来一直minimize。unlabel data的角色就很像regularization,所以它被称之为entropy-based regulariztion。
之前我们说regularization是在原来的loss function后面加一个惩罚项(L2,L1),让它不要overfitting;现在加上根据unlabel data得到的entropy 来让它不要overfitting。

kaggle完成李宏毅深度学习作业详细步骤_相似度_11

半监督SVM

SVM做的事情就是:给你两个class的data,找一个boundary,这个boundary一方面要做有最大的margin(最大margin就是让这两个class分的越开越好)同时也要有最小的分类的错误。
穷举所有的unlabel data label,这是非常多的事情。这篇paper提出了一个approximate的方法,基本精神是:
一开始得到一些label,然后你每次改一笔unlabel data,看可不可以让margin变大,变大了就改一下。

kaggle完成李宏毅深度学习作业详细步骤_数据_12

假设二:Smoothness Assumption

kaggle完成李宏毅深度学习作业详细步骤_sed_13

Smoothness Assumption的假设是这样的,你的相似是要透过一个high density region。

kaggle完成李宏毅深度学习作业详细步骤_相似度_14

比如,手写数字识别,以及人脸识别的应用。

kaggle完成李宏毅深度学习作业详细步骤_数据_15

以及文本相似性的传播。

kaggle完成李宏毅深度学习作业详细步骤_sed_16

如何实践这个smoothness assumption,最简单的方法是cluster and then label。
之前讲过说,为什么要用deep learning,不同class可能会长的很像,也有可能长的不像,你单纯只有pixel来做class,你结果是会坏掉的。
如果你要让class and then label这个方法有用,你的class要很强。你要用很好的方法来描述image,我们自己试的时候我们会用deep autoendcoder,用这个来提取特征,然后再进行聚类。

kaggle完成李宏毅深度学习作业详细步骤_数据_17

基于图的方法

图表示通常更自然一些,比如网页之间的链接,paper之间的引用。

kaggle完成李宏毅深度学习作业详细步骤_sed_18

通常你要定义怎样计算 \(x^i,x^j\) 的相似度,影像的话可以用pixel来算相似度,但是performance不太好。用auto-encoder算相似度可能表现就会比较好。
算完相似度就可以建graph,有K Nearest Neighbor,e-Neighborhood,后者的话,e不止有相连或者不相连两种,还可以加上权重,最好是用Gaussian Radial Basis function来计算。
这里用exponential的话,每一个点只能与非常近的点离,它跟稍微远一点就不连了。

kaggle完成李宏毅深度学习作业详细步骤_相似度_19

如果相似只是近邻之间的,那么是没有用的,因为本身算相似就会得到这样的结果。
基于图的方法,最重要的是,相似可以传递。同时要求数据量要大,否则传播过程中会断掉。

kaggle完成李宏毅深度学习作业详细步骤_数据_20

定量描述相似性,可以用边的权重来表示,然后计算。所以左边的连接图要比右边的更加smooth。

kaggle完成李宏毅深度学习作业详细步骤_sed_21

计算可以做矩阵分解,这个y是label,这个label的值也就是neural network output的值,是取决于neural parameters,L叫做Graph Laplacian。
这个L的定义是:两个matrix相减(L=D-W)。W就是你把这些data point两两之间weight connection建成一个matrix,D是你把w的每组row合起来。
如果是deep neural network的话,可以把smothness放在network任何地方。

kaggle完成李宏毅深度学习作业详细步骤_sed_22

Better Representation

最后一个方法是:Better Representation,这个方法的精神是:“去无存青,化繁为简”,等到unsupervised的时候再讲。
它的精神是这样子的:我们观察到的世界其实是很复杂的,我们在我们观察到的世界背后其实是有一些比较简单的东西在操控着我们这个复杂的世界,所以你只要能看透这个世界的假象,直指它的核心的话就可以让训练变得容易。