李宏毅《机器学习》笔记:12.半监督学习
【参考文章】
笔记:https://blog.csdn.net/oldmao_2001/article/details/91285039
生成模式:https://blog.csdn.net/wistonty11/article/details/120365719
EM算法:https://zhuanlan.zhihu.com/p/40991784
文章目录
2021.10.22
LeeML-Notes(2017):P23
<--------感谢评论、答疑、指正!--------->
<--------【疑问1处】--------->
1. 关于半监督学习
1.1 定义
-
监督学习
( x r , y ^ r ) r = 1 R {(x^r,\hat{y}^r)}_{r=1}^R (xr,y^r)r=1R
- 一个R个数据
- 从r=1开始,到R个结束都有一对 ( x r , y ^ r ) (x^r,\hat{y}^r) (xr,y^r)
- y ^ \hat{y} y^是标签
-
非监督学习
( x r , y ^ r ) r = 1 R , ( x u ) u = R R + U {(x^r,\hat{y}^r)}_{r=1}^R,{(x^u)}_{u=R}^{R+U} (xr,y^r)r=1R,(xu)u=RR+U
- 有一小部分数据1~R是有标签的
- 一大部分数据R~U+R 是没标签的
- 通常U>>R
1.2 分类
根据我们在训练模型有没有使用到testing data的数据部分,可分为:Transductive learning、Inductive learning。
用哪种方法要取决于比赛或者应用有没有把test set放出来。
-
Transductive learning
训练的过程中使用了testing data的feature(不看label)
-
Inductive learning
训练的过程中没有使用了testing data的feature(不看label)
1.3 半监督学习原因
- 现实中,收集数据很容易,收集有标签的数据很难,也就是大部分数据都是没标签的
- 我们如果只用非常少量的有标签的数据来进行训练模型,那么对大量没标签数据进行了浪费。
2. 半监督生成式模型(Semi-Supervised Generative Model)
生成模式是从概率分布统计的角度来分析的,详看【10.4-10.5】:https://blog.csdn.net/wistonty11/article/details/120365719
2.1 步骤

-
第一步:先初始化参数
- 我们通常用有标签的数据进行初始化
- 初始化过程参考【10.4-10.5】
- 参数统称θ
-
第二步:计算 P θ ( C 1 ∣ x u ) P_θ(C_1|x^u) Pθ(C1∣xu)
- 已知有标签数据,属于C1的概率P(C1),和属于C2的概率P(C2)
- 我们想要求出: P θ ( C 1 ∣ x u ) P_θ(C_1|x^u) Pθ(C1∣xu) ①【概率理解法】 一个数据 成为C1累概率;②【份数理解发】这个数据成1份,他有多少份属于C1
-
第三步:更新概率分布 P ( C 1 ) , P ( C 2 ) , μ 1 , μ 2 , ∑ P(C_1),P(C_2),μ_1,μ_2,∑ P(C1),P(C2),μ1,μ2,∑

- ①我们按份数理解 P θ ( C 1 ∣ x u ) P_θ(C_1|x^u) Pθ(C1∣xu),则1表示所有的无标签的数据属于C1类一共多少个;
- ②就是更新后属于C1类的概率
- 按概率来理解 P θ ( C 1 ∣ x u ) P_θ(C_1|x^u) Pθ(C1∣xu),说有的概率x数据大小/个数,③④⑤算下来是无标识数据的期望
- 更新μ1(期望)= 有标签数据的期望 + 没标签数据的期望
2.2 计算过程(EM算法)
两枚材质不同的硬币,中正面朝上的概率分别为 P(C1),P(C2)
① 第一步:初始化阶段
-
我们当初始化出来,P(C1)=0.2, P(C2)=0.7
-
现在有5笔不知道分类的数据:

② 第二步 【E】 :计算 P θ ( C 1 ∣ x u ) P_θ(C_1|x^u) Pθ(C1∣xu)
-
对于第一组实验(3正面2反面),结果A、B硬币得到的概率
如果是A硬币得到这个结果的概率为: 0. 2 3 ∗ 0. 8 2 = 0.00512 0.2^3*0.8^2=0.00512 0.23∗0.82=0.00512
如果是B硬币得到这个结果的概率为: 0. 7 3 ∗ 0. 3 2 = 0.03087 0.7^3*0.3^2=0.03087 0.73∗0.32=0.03087- A硬币得到的概率 P θ ( C 1 ∣ x u ) P_θ(C_1|x^u) Pθ(C1∣xu)=0.00512/(0.00512+0.03087)=0.14;
- B硬币得到的概率 P θ ( C 2 ∣ x u ) P_θ(C_2|x^u) Pθ(C2∣xu)=0.03087/(0.00512+0.03087)=0.86;
-
整个5组实验的A,B投掷概率如下:

③ 第三步 【M】 :更新概率分布 P ( C 1 ) , P ( C 2 ) , μ 1 , μ 2 , ∑ P(C_1),P(C_2),μ_1,μ_2,∑ P(C1),P(C2),μ1,μ2,∑
依然以第一组实验来举例子:3正2反中,如果是A硬币投掷的结果:0.14 X 3=0.42个正面和0.14 x 2=0.28个反面;如果是B硬币投掷的结果:0.86 x 3=2.58个正面和0.86 x 2=1.72个反面。
5组实验的期望 如下表:
由上表的数据:
- P ( C 1 ) = 4.22 / ( 4.22 + 7.98 ) = 0.35 P(C1)=4.22/(4.22+7.98)=0.35 P(C1)=4.22/(4.22+7.98)=0.35
- P ( C 2 ) = 6.78 / ( 6.78 + 6.02 ) = 0.5296875 P(C2)=6.78/(6.78+6.02)=0.5296875 P(C2)=6.78/(6.78+6.02)=0.5296875
这一步中,我们根据E步中求出的A硬币、B硬币概率分布,依据最大似然概率法则去估计P(C1),P(C2),被称作M步。
④ 第四步:循环迭代【E】步【M】步
- 直到P(C1),P(C2)不再更新为止。
2.3 效果
【只看监督学习的模型】

【加入大量无标签数据Decision Boundary调整后】

2.4 可行性原因

【只有监督学习的过程】
- 假设我们有原来的label data的时候,我们要做的事情是maximum likehood
- 把所有的 log likehood加起来就是log total loss
- 去maximum
【半监督学习的过程】
- nlabel data我们并不知道它是来自哪一个class
- 所以class1,class2都有可能
- 把在C1,C2上产生可能性通通合起来,就是这笔unlabel data产生的几率。
3. 第一种假设:Low-density Separation Assumption

按照“非黑即白”的思路,假设类别之间的boundary周围的data是很少的,即假设不同类别数据之间应该有1个很明显的boundary。
3.1 Self-training
最简单的基于Low-density Separation假设的半监督学习是Self-training。
【思路】
① 使用有标签的数据训练1个模型 f ∗ f^* f∗,模型类型和训练方式没有限制,神经网络、深或浅、其它机器学习方法等等都可以
② 使用模型 f ∗ f^* f∗生成未标注数据的伪标签(Pseudo-label),即 y u = f ∗ ( x u ) y^u=f^*(x^u) yu=f∗(xu)
③ 取出一部分未标注数据和它生成的伪标签,将它们添加到有标签数据中,然后回到步骤1,去训练f*
在做regression时是不能用这一招的,主要因为把unlabeled data加入到训练数据中,f∗
并不会受影响
【未标注数据的伪标签(Pseudo-label)有两个处理方式:一软一硬】

① 上软下硬,Self-training使用hard label。
因为非黑即白区分比较清楚,用硬标签可以增加模型信心,更好的训练模型。
②生成模型使用soft label,即假定某个无标签样本有一定概率属于某类别(也可以理解为一个样本可以按照后验概率划分成多个部分,不同部分属于不同类别)
生成模型使用了soft label,它生成的伪标签在分类任务中是没有用的。因为把某个无标签样本(通过soft label生成伪标签)丢进模型重新训练模型,模型参数根本不会发生变化。
3.2 Entropy-based Regularization
- 该方法是Self-training的进阶版。
Self-training中使用的hard label还是有些武断和激进,Entropy-based Regularization对此进行了改进。
在使用神经网络进行分类时,
y
u
=
f
θ
∗
∗
(
x
u
)
y^u=f^*_{\theta^*}(x^u)
yu=fθ∗∗(xu),其中
y
u
y^u
yu是1个one-hot编码。在unlabel data上的entropy越小越好

-
最后改进的损失函数L LL就是分两部分,一部分是标记数据输出与label之间的交叉熵,另一部分是非标记数据的熵然后乘上浪打惩罚因子。目标是最小化L
-
①②好于③,因为通过交叉熵,①②为0,③为ln5
3.3 半监督SVM
由于SVM后面还会讲,这里就先简单讲下,传统SVM有两个条件:
- 分类后要有最大的margin,也就是两个分类分得越开越好;
- 同时要有最小的分类错误。这个是判断模型好好坏的基础

- 如上图所示,左边有四个未标记的数据,SVM会穷举这四个数据所有可能的分类(右边列举了三个例子),然后对各种可能都计算分类;
- 然后去找刚才穷举的情况里面那个情况最能满足传统SVM的两个条件,以上图为例,黑框那个模型分类表现得最好。
- 实作的时候如果未标签数据很多,穷举方式效率太低,那么可以采用approximate的方法,就是一次弄一个unlabelled data进行,然后改变它的分类,看分界的变化,然后确定分类。
4. 第二种假设:Smoothness Assumption
近朱者赤,近墨者黑:假设是这样子的,如果x是相似的,那label y就要相似

- x的分布是不平均的,它在某些地方是很集中,某些地方又很分散。
- 可以用high density path做connection。如上图,X1,X2相对于x3,它们中间有一个high density region,那么y1,y2就很像
【假设原因】
① 数字识别
图中的左边的2相当于x 1,中间的2相当于x 2,右边的3相当于x 3 。
② 人脸识别
左右两张脸的图片对于电脑而且实际上是不一样,但是如果收集够多的data,那么就会找到两张脸的过渡形态,从而得到两张脸一样的结论。
③ 文件分类
4.1 聚类和标记 Cluster and then Label
很简单的方法,就是通过聚类来进行unlabelled data的划分:

- 橙色是class1,绿色是class2,蓝色是unlabel data
- 你可能分成三个cluster,,然后把这些data拿去learn就结束了
- 但是这个方法不一定有用。如果你今天要做cluster label,cluster要很强,也就是数据要很集中处理的很好。因为这一招work的假设就是不同class cluster在一起。可是在image里面,把不同class cluster在一起是没有那么容易的
- 这个方法在图像分类上不好,可以想象,如果是根据pixel来进行聚类的效果。正确的方法是先用deep autoencoder抽取feature,然后再clustering。
4.2 基于图的方法 Graph-based

-
就是把数据变成图中的点,如果两个点之间没有连接(就算距离很近),则认为它们没有在一个high density region
-
例如上图中的蓝色红红色点。图的建立一般都很nature,例如网页与网页可以有hyperlink连接,文章与文章可以有引用。当然有时候需要自己想办法建立图:-

-
计算相似度(这里注意:图像一般不用pixel算相似度,效果不好,一般用autoencoder抽feature来做相似度计算)
-
添加边建立图,可以用KNN或者e-Neighborhood(超过阈值e才建立边)来建立边
可以根据相似度确定边的权重: s ( x i , x j ) = e x p ( − γ ∣ ∣ x i − x j ∣ ∣ 2 ) s(x^i,x^j)=exp(-γ||x^i-x^j||^2) s(xi,xj)=exp(−γ∣∣xi−xj∣∣2)exp作用是大的尺度很大,大的拉大距离,小的缩小距离
【效果】
① 标记数据会影响他的邻居。如下图左边的x属于Class 1,它会使得和它相连的节点为Class 1的几率增加(看蓝色箭头)
② 第一点的特性会传递propagate。例如,右边那个节点没有直接连接到x,但是它为Class 1的几率也增加(②),这就是传递,为了充分说明这个,右下角边还给出具体传递的例子。

【缺点】
缺点就是要data足够多,例如右上角的由于没有收集到足够多的数据,导致数据之间的连接断开了
【定量使用这个graph】
smoothness的数字化:
两两相连节点(无论是否labeled)拿出来乘以权重乘以0.5,下图可以试着计算对比下结果,这个结果越小越好

- 如上图,左边分类情况好于右边,也就是x1更应该是Class 1;
- 把这个S公式改进一下:

- y串成一个向量(vector),由于y包含标签数据和未标签数据,所以这个vector的维度是有标签数据量+没标签数据量(R+U)
s = y T L y s=y^TLy s=yTLy - 中间的矩阵如上图所示,称为:
Graph Laplacian GNN之拉普拉斯矩阵,大小是:(R+U)x(R+U);如图,有标签没标签一共4个数据(U+R=4),所以L矩阵是4 x 4
L = D − W L=D-W L=D−W
W是权重矩阵,D是每横排相加【疑问:为啥是这样】

S与图是有关的的,在计算损失函数的时候相当于正则化项,可以在NN中的任意一层用。正则化的用途之前有讲的拉,就是平滑函数。
更多推荐




所有评论(0)