半监督学习
什么是半监督学习?
大家知道在监督学习里,有一大堆的训练数据(由input和output对组成)。例如上图所示\(x^r\)是一张图片,\(y^r\)是类别的label。
半监督学习是说,在label数据上面,有另外一组unlabeled的数据,写成\(x^u\) (只有input没有output),有\(U\)笔ublabeled的数据。
通常做半监督学习的时候,我们常见的情景是ublabeled的数量远大于labeled的数量(\(U >> R\))。
半监督学习可以分成两种:
- 一种叫做转换学习,ublabeled 数据就是testing set,使用的是testing set的特征。
- 另一种是归纳学习,不考虑testing set,学习model的时候不使用testing set。
unlabeled数据作为testing set,不是相当于用到了未来数据吗?
用了label 才算是用了未来数据,用了testing set的特征就不算是使用了未来数据。例如图片,testing set的图片特征是可以用的,但是不能用label。
什么时候使用转换学习或者归纳学习?
看testing set是不是给你了,在一些比赛里,testing set给你了,那么就可以使用转换学习。但在真正的应用中,一般是没有testing set的,这时候就只能做归纳学习。
为什么使用半监督学习?
缺有lable的数据,比如图片,收集图片很容易,但是标注label很困难。半监督学习利用未标注数据做一些事。
对人类来说,可能也是一直在做半监督学习,比如小孩子会从父母那边做一些监督学习,看到一条狗,问父亲是什么,父亲说是狗。之后小孩子会看到其他东西,有狗有猫,没有人会告诉他这些动物是什么,需要自己学出来。
为什么半监督学习有用?
假设现在做分类任务,建一个猫和狗的分类器。有一大堆猫和狗的图片,这些图片没有label。
假设只考虑有label的猫和狗图片,要画一个边界,把猫和狗训练数据集分开,可能会画一条如上图所示的红色竖线。假如未标注数据的分布如上图灰色点,可能会影响你的决定。未标注数据虽然只告诉我们input,但它们的分布可以告诉我们一些信息。
比如加入灰色点后,你会把边界画成红色斜线。
半监督学习使用未标注数据的方式,往往伴随着一些假设,所以有没有用取决于假设符不符合实际。你可能觉得左下的灰点是猫,但是可能是狗,因为两张图片的背景看起来很像。
生成模型与半监督学习
这边要讲4件事:
- 第一个是在生成模型的时候,怎么使用半监督学习
- 然后会讲两个通用的假设,一个是低密度分离假设
- 一个是平滑度假设
- 最后讲半监督学习还有的一招,找一个好的代表
在生成模型中为什么使用半监督学习?
在监督学习中,有一堆用来训练的样本,你知道它们分别属于类别1,还是类别2。
- 会去估算类别1和类别2的先验概率\(P(C_1),P(C_2)\) 。
- 然后计算类条件概率\(P(x|C_1),P(x|C_2)\) ,假设\(P(x|C_i)\)服从一个高斯分布。
假设类别1的数据是从均值为\(\mu_1\),协方差为\(\Sigma\)的分布中取出来的,而类别2的数据是从均值为\(\mu_2\),协方差也为\(\Sigma\)的分布中取出来的(之前讲过共享协方差,效果会好一点)。
然后可以计算后验概率\(P(C_1|x)\) ,决定一个决策边界在哪里。
如果今天有一些未标注数据,如上图绿点,那仍然假设均值和方差是\(\mu_1,\mu_2,\Sigma\)显然不合理。
如上图左下所示,\(\Sigma\)应该比较接近圆圈(蓝色圆圈),也许在类1采样的时候有问题,所以采样到奇怪的分布(蓝色椭圆)。如上图右下,类2的\(\mu_2\)不应该在橙色椭圆内,而应该在更下面。
这样会使先验概率受到影响,本来两个分布,正例数据是一样多,但是加入未标注数据之后,你可能会觉得类2的正例数据更多(先验概率就更大)。总之加入未标注数据后,会影响对均值和协方差的估测,继而影响类条件概率,最后影响了你的决策边界。
怎么做半监督学习?
初始化一组参数,如果是二分类任务,就是初始化类1和类2的先验概率、均值和协方差,可以随机初始化,用已经有标注的数据估测,统称为\(\theta\)
- step1:根据已有的\(\theta\) 可以计算每一笔未标注数据的后验概率(属于类1 的概率)
- step2:根据step1的后验概率更新模型,update的式子非常直觉
\(\large P(C_1)=\frac{N_1+\sum\limits_{x^u}P(C_1|x^u)}{N}\),\(\large \mu^1=\frac{1}{N_1}\sum\limits_{x^r\in C_1}x^r+\frac{1}{\sum\limits_{x^u}P(C_1|x^u)}\sum\limits_{x^u}P(C_1|x^u)x^u\)
先验概率更新公式:
- \(\large \frac{N_1}{N}\)是没有未标注数据的时候的先验概率(\(N_1\)是被标注为\(C_1\)的样本),\(\large \sum\limits_{x^u}P(C_1|x^u)\)是未标注数据告诉我们的\(C_1\)出现的次数(所有未标注数据为\(C_1\)的后验概率之和),属于\(C_1\)还是\(C_2\)是根据概率来的,不是硬设计的。得到\(C_1\)受未标注数据影响的先验概率\(P(C_1)\) 。
均值更新公式:
- 不考虑未标注数据时,\(\mu_1\) 就是所有属于\(C_1\)的标注数据的平均。加入未标注数据后,就加上未标注数据的后验概率权重和。如果未标注数据偏向\(C_1\),那对\(C_1\)的影响就大一点,反之则小一点。对\(C_2\)来说,计算方式是一样的。
接下来,返回step1 。有了新的model之后(新的\(\theta\)),\(P_{\theta}(C_1|x^u)\)会不一样,那在step2,model算出来也会不一样,接下来再返回step1更新概率......
理论上上述方法会收敛,但是初始值会影响最后收敛的结果。事实上,step1就是E步,step2就是M步。
上述算法背后的理论是什么?
原来只有标注数据的时候,目标是最大化一个似然函数,那么给定\(\theta\),每一笔训练数据的似然函数值是可以计算的(\(=P_{\theta}(x^r|\hat{y}^r)P(\hat{y}^r)\) ),然后把所有的似然函数值相加,就是总的似然函数值,然后找\(\theta\)最大化。\(\theta\)有显式解,求最大值点(导数为0)。
现在加入未标注数据后,我们不知道未标注数据来自哪一个类别,那么未标注数据出现的概率就是和\(C_1\)的联合概率+和\(C_2\)的联合概率(相当于是\(\sum\limits_{C}P(x^u,C^i)\) 。接下来目标就是最大化\(P_{\theta}(x^u)\),但是\(P_{\theta}(x^u)\)的式子是非凸的,所以使用EM算法求解。
假设一:低密度分离
这个世界是非黑即白的,什么是非黑即白?
假设现在有一大堆的data,有标注数据,有非标注数据,在两个类别之间会有一个明显的鸿沟。给一些标注数据,可以把边界分在上图右边的线,也可以把边界分在上图左边的线。但是考虑非标注数据,那么左边的边界会好一点,在边界处,两个类别的密度是低的(不会出现data)。
self-training
低密度分离最代表性、最简单的方法是self-training,非常直觉。
我们有一些标注数据,和一些未标注数据。接下来:
-
从标注数据训练一个model \(f^*\) (用DNN,deep、shallow还是其他机器学习的方法都可以)
-
根据\(f^*\) 标注未标注数据,丢入\(x^u\),得到\(y^u\) ,\(\{(x^u,y^u)\}_{u=l}^{R+U}\)叫做伪标签数据
-
接下来,从伪标签数据集移除一些数据加到标注数据集(移除哪些数据需要自己决定,设计一些启发式的规则,或者给权重,有些数据的标签比较确定,那就给大的权重)
-
有了更多的标注数据之后,回头再去训练model \(f^*\)
self-training在回归上有用吗?
回归是output一个数值,通过\(f^*\)得到\(\{x^u,y^u\}\),加到训练数据集里再训练\(f^*\) ,不会影响到\(f^*\),从均方误差角度思考,\(y^u\)就是在\(f^*\)上,距离为0。
可能觉得self-training很像是刚才生成模型里面用的EM算法,唯一的差别是在做self-training的时候,用的是硬标签,生成模型里用的是软标签(概率)。在做self-training的时候,会强制分配一个数据属于某一个类别,在生成模型里,使用的是后验概率,部分属于类1,部分属于类2。
那哪一个比较好?
我们考虑使用神经网络,从标注数据学习到一组参数\(\theta^*\),一笔未标注数据通过\(f^*\) ,得到分类概率\(\begin{bmatrix} 0.7\\0.3 \\ \end{bmatrix}\)。
- 如果是硬标签,就直接分为类1,\(x^u\)的新target为\(\begin{bmatrix} 1\\0 \\ \end{bmatrix}\)。
- 如果是软标签,0.7的概率属于类1,0.3的概率属于类2,\(x^u\)的新target为\(\begin{bmatrix} 0.7\\0.3 \\ \end{bmatrix}\)。
软标签没有用,如果使用的target为\(\begin{bmatrix} 0.7\\0.3 \\ \end{bmatrix}\),意味着参数不变。必须使用硬标签。
使用硬标签意味着什么?
用硬标签的时候,用的就是低密度分离的概念。得到的概率\(\begin{bmatrix} 0.7\\0.3 \\ \end{bmatrix}\)意味着为类1的概率高,但是在非黑即白的世界看来,就是等于类1。
Entropy-based Regularization(基于熵的正则化)
熵:一个事件的不确定程度
Entropy-based Regularization(基于熵的正则化)是self-training的进阶版,self-training里用概率划分类别,可能觉得比较武断,那就可以用Entropy-based的这个方法。
Entropy-based是说,如果使用神经网络,output是一个分布,我们不去限制output具体属于哪一个类别,而是假设分布很集中(非黑即白的世界)。假设做5类别的分类的model:
- 类别1的概率为1,其他类别概率为0,那就是好的
- 类别5的概率为1,其他类别概率为0,那也是好的
- 所有类别的概率很平均,那就是不好的,不符合低密度分离的假设(非黑即白)
怎么用数值的方法评估分布是集中还是不集中?
使用熵,分布的熵告诉你集中还是不集中。式子如上图右上,每个类别的概率*log(每个类别的概率),再对类别个数求和取负数。
- 第一个分布,熵为0,分布集中
- 第二个分布,熵也为0,分布集中
- 第三个分布,熵为\(\large 5*-(\frac{1}{5}ln(\frac{1}{5}))=ln(5)\) ,分布比较散
我们希望model的output在标注集上正确,在未标注集上的熵越小越好。
- 根据这个目标,重新设计损失函数。原来只是希望model在标注集上的output和label距离越近越好,用交叉熵来评估它们之间的距离。
- 现在在原来的基础上,加上未标注集的output分布的熵。
- 然后在未标注集部分乘上一个权重,来表明偏向标注部分还是未标注部分。
上图右下的损失函数可以算微分,那就使用梯度下降最小化这个损失函数,迭代求解参数。加入未标注部分,作用就类似于正则化(在原来损失函数后加一个L1正则或者L2正则),这里则加入一个未标注集熵来防止过拟合,所以称之为基于熵的正则化。
Semi-supervised SVM(半监督SVM)
我们知道SVM是找边界,给你两个类别的数据,SVM找一个边界,这个边界一方面要有最大的间隔(让两个class分的越开越好),一方面要有最小的分类错误。
假设现在有一些未标注数据,半监督SVM会穷举所有可能的label。
例如上图左边,有四笔未标注数据,每笔数据既可以属于class1,也可以属于class2,可能的情况如上图右边所示(有很多可能,这里没画完)。然后对每个可能的结果,都去做一个SVM,边界如上图红色线。然后再去找让间隔最大,错误最小的那一种结果。在例子里可能是黑色框这种结果。
穷举所有方法运算量很大啊?
在上图reference里,提出了一个近似方法,基本精神是一开始有一些label,然后每次改一笔未标注数据的label,看看能不能让目标函数变大,变大就改。
假设二:平滑度假设
精神是近朱者赤近墨者黑。
假设:相似的\(x\)有相似的\(\hat{y}\)
这个假设听起来没有什么,而且光有这个假设是不精确的,因为给model(不是很深)相似的\(x\),output本来就是差不多的。
更精确的假设:
\(x\)的分布是不平均的,在某些地方很集中,在某些地方又很分散。如果今天\(x_1\)和\(x_2\)在一个高密度的区域很相似的话,\(\hat{y}^1\)和\(\hat{y}^2\)才会很像。
什么叫在高密度区域下呢?
意思是说可以用高密度的路径做连接
举个例子,假设数据的分布如上图右边所示,像一个血轮眼。现在有3笔数据\(x^1,x^2,x^3\),考虑粗略的假设(\(x\)像\(\hat{y}\)像),会说\(\hat{y}^2\)和\(\hat{y}^3\)比较像,\(\hat{y}^1\)和\(\hat{y}^2\)比较不像。
但是平滑度假设不是这样,更精确的假设是说,“像”要两个数据中间为高密度区域下,比如\(x^1\)和\(x^2\)中间是一个高密度区域(\(x^1\)和\(x^2\)由一个高密度区域连接),有很多数据(中间想成平原地带,地势平坦,人烟很多),而\(x^2\)和\(x^3\)之间数据稀少(中间想成一座山,人烟稀少),那么走平原会比走山容易,\(x^2\)走到\(x^1\)更容易(更相似)。
为什么会有高密度区域假设?
因为在真实情况下,这个假设成立的可能性很高。
我们考虑手写数字识别的例子,有两个2一个3,如果计算像素点相似度的话,可能上图右边的2和3更像。但是从所有数据中看,左边的2到右边的2中间会有很多连续的形态。所以根据平滑度假设,左边的2和右边的2更像,因为右边的2和3之间没有过渡的形态。
看人脸识别也是一样的,比如左脸像和右脸像差很多,两个人的左脸像计算像素点相似度的话,可能比同一个人的两张侧脸像更高。但是如果收集到足够多的未标注数据,会找到两个侧脸像的很多过渡形态,根据高密度区域假设,这两张侧脸像就是同一个人。
高密度区域假设,在文件上非常有用,假如现在要区分天文学和旅游的文章。
天文学的文章会出现asteroid、bright,而旅游的文章会出现yellowstone、zion。如果未标注文章和标注文章的词语有重叠,那可以很容易分类。但真实情况情况是,未标注文章和标注文章可能没有任何词语重叠,因为世界上的词语太多了,一篇文章词汇不会很多,每篇文章的词语是非常稀疏的。
但是收集到够多的数据的话,就可以说上图\(d_1、d_5\)像,\(d_5、d_6\)像,传播下去就可以说\(d_1、d_3\)是一类,\(d_2、d_4\)是一类。
聚类、然后标注
如何实践平滑度假设?
最简单的方法是聚类、然后标记。
假如数据分布如上图,橙色是class 1,绿色是class 2,蓝色是未标注数据。接下来做聚类,可能把所有数据分成3个簇。在簇1里,class 1的label最多,那簇1里所有数据标记为class 1,同样的簇2和簇3都标记为class 2。把标记后的数据拿去learn就结束了。
这个方式不一定有用,因为要求簇正确,这个方法有效的假设是同一个class的东西聚集在一起。但是在图像里要把同一个class的东西聚集在一起没有那么容易。之前深度学习讲过,不同class的图像可能会很像,同一个class可能会不像,只用像素点做聚类,结果八成是不好的。没办法把同一个class的数据聚集在一起,那未标注数据就没有用。
所以要有用,就要有一个好的方法来描述一张图像,比如用Deep Autoencoder抽特征,然后再做聚类。
基于图的方法
上面是比较直觉的方法。另一个方法是引入图结构,来表达通过高密度路径进行连接这件事情。
把现在所有的数据点都建成一个图,每个数据点就是图上的一个点,想办法计算它们之间的奇点,想办法把它们之间的边建出来。
所谓的高密度路径的意思是说,如果有两个点,在图上是相连的,那它们就是同一个class,如果没有相连,就算距离很近,也走不到。
如何构建图?
有些时候,图的表示可以很自然的得到。举例说网页的分类,你有记录网页和网页之间的超链接,那超链接就很自然的告诉你网页是怎么连接的。或者你要做的是论文的分类,论文和论文之间有引用的关系,这种引用的关系也是另外一种图的边,可以很自然地把这种图画出来。
当然有时候,需要自己想办法构建图
怎么自己想办法构建图?
其实的图的好坏对结果的影响是非常严重的,但是自己用什么方法做还是很启发的,用自己觉得合适的方式做就可以了。
通常的做法是:
-
先定义两个对象之间的相似度,比如图像可以是基于像素点的相似度(可能效果不好),也可以是基于自动编码器抽取出来的特征计算相似度(效果可能好一点)
-
定义完相似度后,就可以构建图了(添加边),图有很多种:
-
K近邻的图,现在有一大堆数据,可以计算数据与数据之间的相似度,然后设置k例如3,就是3个最相似的点相连
-
e-Neighborhood的图,只有相似度超过某个阈值的点才会相连
-
所谓的边也不是只有相连和不相连这两种选择,可以给边一些权重,让边跟两个数据点的相似度成正比。相似度可以用Gaussian Radial Basis Function来定义,\(s(x^i,x^j)=exp(-\gamma||x^i-x^j||^2)\)
怎么计算这个相似度?
可以先算\(x^i,x^j\)的欧式距离,乘以一个参数取负号,再取exp。取exp很有必要,在经验上最后效果比较好。因为取exp,下降速度很快,只有当\(x^i,x^j\)非常靠近时,奇点才会大,距离远一点奇点就会下降很快变得很小。这样才能制造如上图右下方所示的,两个距离近的橙色点有连接,绿色点和橙色点虽然距离也近,但是使用了exp导致只有很近很近的点才有连接,即使远一点点就不会有连接了,有这样的机制才能避免跨海沟的连接(橙色点和绿色点连接)。
基于图的方法精神是,如果现在在图上面有一些标注数据,比如上图左上方,已经知道了蓝色圈的数据属于class 1,那么跟他们有相连的数据点属于class 1的概率也会上升。每一笔数据会去影响它的邻居。
光会影响邻居还不够,因为有连接说明本来就很像,那很像的input ,output本来也就很像。这种方法真正的精髓是,class是会传递的,虽然一个点没有与标注数据直接相连,但是有连接路径,那么class 1就会随着边传递。
例如上图右上方,所有数据点构建成一个图(理想的例子),然后有一个蓝色点属于class 1,一个红色点属于class 2。经过基于图的方法,蓝色点会传递,红色点也会传递,如上图右下方所示。
要让基于图的这种半监督学习方法有用的话,一个重要的原则是你的数据要多,如果数据不够多,例如上图所示,中间有断开,那信息就传递不过去。
之前是定性说一下怎么使用图,这里要说一下怎么定量使用图。
定量的使用方式是在这个图的结构上面定一个东西,叫做label的平滑度,来表明这个label有多符合平滑度假设。
怎么定平滑度?
看上图两个例子,这两个例子都有4个数据点,数据点之间连接的数字代表了边的权重。现在给两个例子的数据不同的label,左边例子的label是1,1,1,0,右边例子的label是0,1,1,0,那谁更平滑呢?
直观感觉就是左边例子更平滑,但我们需要定量描述。常见的方法是,考虑两两相连的点(不管有label还是没有label),在所有的配对上,计算label差值的平方,然后乘上权重 ,最后求和。
所以左边这个例子的S就是0.5,右边例子的S是3,S越小越平滑。
S可以稍微整理下,写成向量形式如上图。
把\(\large y\)串成一个向量,\(\large y\)包括标注数据和未标注数据,所以有\(R+U\)维。
\(L\)是\((R+U)\times(R+U)\)的矩阵,叫做图拉普拉斯,\(L\)的定义是\(D-W\),\(W\)是两两数据点之间的权重,\(D\)是\(W\)每行值之和(放在对角线)。
现在可以用 \({\bf{y^T}}L{\bf{y}}\) 来评估现在得到的label有多平滑,式子里面的\({\bf{y}}\)是label的值,取决于神经网络的参数。那么如果要把平滑度考虑到神经网络里时,就是在原来的损失函数里加上\(\lambda S\)(\(\lambda\)是某一个想要调的参数)。\(\lambda S\)像一个正则化项,在调整参数时,不只是让标注数据的output跟真正的label越近越好,同时还要让output的label在标注数据和未标注数据上符合平滑度假设。平滑度假设由\(S\)衡量。
不一定要在output上计算平滑度,在深度神经网络里,可以把平滑度计算放在网络的任何地方。你可以假设你的output是平滑度,也可以把某个隐藏层乘上一些别的transform,它也要平滑,也可以要求每个隐藏层的output都是平滑的。
Better Representation
精神是:
我们观察到的世界其实是比较复杂的,在背后有一些比较简单的向量,比较简单的东西在操控这个复杂的世界。那只要看透假象,直指核心,就可以让学习变得比较容易。
例如上图右方剪胡子,胡子的变化是很复杂的,但是胡子受头操控,头的变化是有限的。所以胡子是观测,而头就是Better Representation。