semi-supervised 经典假设-2:Smoothness Assumption
半监督学习的第一个假设是 非黑即白,进阶版是未必非黑即白,也差不多,基于这个假设我们有了算法 self-training(hard-label) 和 entropy-based regularization。
半监督学习的第二个知名假设是 近朱者赤,近墨者黑。
不精确的说法:
Assumption: "similar" x has the same y.
精确的说法:
- x is not uniform.
- if x1 and x2 are close in a high density region, y1 and y2 are the same.
解释下上面这句话的意思:
如果 x 的分布是不平均的,有些地方很集中,某些地方很分散。如果两个 x 样本,x1 x2 在一个高密度区域内很近的话,那么他们的标签应该一样。
一言以蔽之,相近一个必须的前提是:这两个点必须经过一个稠密区间相连。 connected by high density region.
形象一点该如何理解 稠密区间 呢?也就是一个样本和另一个样本之间存在连续的渐进变换的很多样本,那么就说明两者之间存在稠密区间。
举例说明:
1 <====> 11 <-------> 15
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ___, 15
<====>
表示这里有很多渐变的无标数据点
<------->
表示这里几乎没有无标数据点
- 只有 1 和 15 是带标数据,其他都是无标数据。
我们如何判断无标数据 11 的标签?
‘1’ 和 ‘11’ 之间存在稠密区间,则两者的label应该是一样的。‘11’ 和 ‘15’ 之间不存在稠密区间。
这招在文档分类中,作用颇大。Classify astronomy vs. Travel articles.我们做文档分类是基于文档的vocabulary是否存在较大重叠,但是由于人类使用的词汇是如此的多,不同的人对同一个意思会使用不同的词汇去表达,所以文档之间的单词重叠的非常少,这时候就可以借助high density region的假设,只要两个文档之间(一个带标一个无标)存在连续的渐变的很多文档,就可以判断两个数据点具有相同的标签。
天文:文档1 = [asteroid, bright]
_ :文档2 = [bright,comet]
_ :文档3 = [comet,year]
_ :文档4 = [year,zodiac]
文档1 与 文档2 标签一致;
文档2 与 文档3 标签一致;
文档3 与 文档4 标签一致;
所以
文档1 与 文档4 标签一致;
平滑假设下的 smei-supervised 算法框架
一,构建 pseudo 数据集阶段
- 获取 pseudo labels of unlabeled dataset by smoothness assumption and labeled dataset
- 将 pseudo label 当做真实 label, 完成数据集构建
二,supervised learning 算法阶段
- function set
- loss function
- minimize (2) to get the best function from (1)
一,构建 pseudo 数据集阶段
平滑度假设下的 pseudo label 获取算法1:cluster and then label
- 首先不论带标还是不带标,都当做无标数据点做 clustering。
- 做完之后,看每个 cluster 中哪种label的数据点最多,这个 cluster 的所有点就属于这个label。
注意:clustering then label, 这个方法未必会有用啊,只有在你可以把同一个类 cluster 在一起的时候才有可能有用,如果是图像分类并且用 pixel 做clustering,就非常苦难,基于像素的距离做 clustering 本身就不太可能把同一类 cluster 在一起(同一个 class 可能在像素级别很不像,比如数字识别中像‘1’的‘4’和像‘9’的‘4’;不同 class 可能像素级别很像‘1’和‘4’,‘9’和‘4’),这第一步误差就这么大(各种分类的数据点混在一起),第二步不论怎么搞都不可能有太好的准确率。
所以,如果要用这个 cluster then label 算法的话,你的 cluster 要非常强,也就是第一步的准确率要足够高。一般使用 deep autoencoder 中间的 code 做 cluster,而不是像素。
平滑度假设下的 pseudo label 获取算法2:graph-based approach
cluster, then label
是一种比较直觉的做法,另一种做法是通过引入 graph structure 来做。用 graph structure 来表达 connected by a high density path 这件事。
把数据集映射成一个 graph, 每个数据都是图中的一个点。你要做的就是定义并计算两两之间的 similarity,这个similarity就是 graph 中两点之间的边(连线)。
构建graph之后:
- 相连 --- 同类
- 不连 --- 不同类
但是 similarity 也就是 “边” 很多时候不是那么明显的可以定义出来。如果是网页分类,那么网页之间的连接可以看做是一种similarity(医疗的网页应该不会连接到游戏网页),这很直觉。论文分类,论文的索引也可以用在“边”。但更多时候,你需要自己去定义。
算法2 该如何构图
graph construction: 该如何构造一张图呢?
一, define the similarity \(s(x_i, x_j)\) between xi and xj.
(可以基于像素或者更高阶的方法是用 deep autoencoder 来做相似度),李宏毅教授推荐使用 RBF function 定义相似度:
\(s(x_i, x_j) = exp(-\gamma||x_i - x_j||^2)\)
如果想使用欧几里得距离衡量相似度,最好使用 RBF function 作为 similarity function. 为什么呢?因为RBF是一个衰减很快的函数,只要 xi xj 距离稍微远一点相似度就急剧下降。只有具备这种性质,你才能构造出较好的 cluster,他虽然不能保证同簇的相似度高,但至少可以保证不同簇的相似度一定较低(跨簇的距离更大一些的话)。
二, add edge
方法1: 可以使用 KNN 建立“边”,每个点都与相似度最近的 K 个点相连: \(|V_{x_i->[x_j]_{j=1}^K}| = argmax_{D'\subset{D}, |D'|=K}s(x_i, x_j)\)
方法2: 可以使用 e-Neighborhood 方法建立“边”,所有与 xi 相似度大于 e 的数据点都与 xi 建立连接。
三,edge weightedge
可以带有权重,他可以与相似度成正比。
graph-based approach 方法的核心精神是标签传染:
graph 中的带标节点会依据“边”来传递自己的“标”,而且会一直“传染”下去。
graph-based approach 方法的核心缺点是数据量必须够大:
基于图的传染机制,如果数据不够多,没收集到位,那么本来相连的图由于数据量不够就可能断连,一旦断连就没法传染了。
二,supervised learning 算法阶段
- function set --- defined by DNN
- loss function --- defined below
- optimize: train DNN
我们基于以下认知和观察,来定义 loss functin 用以衡量 DNN 训练出的模型的好坏:
是否可以直接使用 cross-entropy,不加任何“佐料”?
pseudo labels 是在近朱者赤近墨者黑的假设下产生的,不管产生的算法是什么,他都可以看成是一个函数,这个函数是如此特殊他就像是ground truth function(监督学习下,我们不知道的那个f) 一样产生了我们以为真实的标签,所以,我们需要做的是去逼近这样的函数
我们能做的是,通过 loss function 来“诱导”优化器往这个特殊的函数去优化。
我们像产生 pseudo labels 的算法那样利用数据集 x 的距离模拟 density 来增加限制,但我们可以通过对标签来近似这种限制,我们可以看到同一个类的标签之间差距很小,类和类之间的标签差距很大,但是(构造 pseudo label 时用到的边的weight)同类数据点的边的weight很大,而不同类的数据点的边的weight很小。我们设置两点之间的标签差值乘以两点之间的边的权重作为限制, 希望他不要太大,以此来近似同类标签数据是高密度的这件事,虽然这是一种普杀式的限制 --- 他同样会限制类间标签的差异,但是考虑不同类两点的边权重很小,相乘之后影响较少,这种方法还是可以接受的。
\(S = \frac{1}{2}\sum_{i,j}w_{i,j}(y_i - y_j)^2\)
这个值越小,说明越平滑。
进一步化简这个公式,用矩阵的形式书写(引入 Graph Laplacian):
把带标和无标的(预测)标签拼在一起,形成一个长向量:
\(\vec{y} = [...y_i, ..., y_j...]^T\)
\(S = \frac{1}{2}\sum_{i,j}w_{i,j}(y_i - y_j)^2 = \vec{y}^TL\vec{y}\)
L: (R+U) * (R+U) matrix
L 可以写成两个矩阵相减:
\(L = D - W\)
- W 是两两节点之间的“边”的权重矩阵
- D 是把 W 矩阵每行值相加放在对角线上,其余设为0.形成的矩阵。
现在把这个 smoothness 公式与loss-fn 统合起来,形成一个新的代价函数:
\(L(\Theta) = \sum_{x^r}C(y^r, \hat{y}^r) + \lambdaS\)
这个 \(\lambdaS\) 有点像是一个正则项,你不仅仅要调整data 让那些 label data 与真正的 label 越接近越好,同时还要做到你预测的标签(包括代标数据和无标数据)要足够平滑。
在 DNN 中 smoothness 的计算不一定是在 output layer 哪里才计算,而是在任何隐含层都可以(就像 L2 正则项可以加载任何层一样,keras API)可以从某一层输出接触一个 embedding layer 保证这个 embedding layer 是 smooth 的即可, 也可以完全套用 L2 的模式 --- 在每一个隐含层都加入这个正则项,要求每一层的输出都是 smooth 的。
J.Weston, F.Ratle, "Deep learning via semi-supervised embedding," ICML, 2008
注意事项1: 两个 similarity
上面的算法框架中出现过两次 similarity 公式:
- 第一次在产生 pseudo 数据集部分的 graph-based 算法中。
- 第二次在监督式方法训练部分的 定义 loss function 中。
其中产生 pseudo 数据集部分,‘similarity’ 是 “similarity of x” --- 计算两个点之间的距离(eg,RBF function)以此作为是否连线两点的依据,而距离作为边的权重。
而在训练模型的部分,‘similarity’ 是 ‘similarity of y’ 我们用 y 之间的距离不宜过大来近似 'similarity of x'