文章目录
让学习器不依赖外界交互、自动地利用未标记样本来提升学习性能,就是半监督学习(semi-supervised learning)。利用未标记样本学习主要有
主动学习
和
半监督学习
,其中半监督学校主要包括
“纯半监督学习” 和
“直推学习”。
主动学习: 先拿有标记的样本训练一个模型,然后拿这个模型去未标记的数据上验证,这个验证需要引入专家知识,以尽量少的“查询”来获取尽量好的性能。
纯半监督学习: 假定数据集中的未标记样本不是带预测的数据,是基于“开放世界”的假设,希望学习到的模型适用于未观察到的数据。
直推学习: 假定学习过程中所考虑到的未标记样本恰好是待测数据,希望在这些未标记的样本上后的较好的泛化误差。

1. 生成式方法
生成式方法(generative methods)是直接基于生成式模型的方法。此类方法假设所有数据(无论是否有标记)都是由同一个潜在的模型" 生成"的。
给定样本x,其真实类别标记为
y
∈
Y
y∈Y
y∈Y,其中$Y = {1 , 2,… , N} $为所有可能的类别.假设样本由高斯混合模型生成,且每个类别对应一个高斯混合成分。换言之,数据样本是基于如下概率密度生成:
p
(
x
)
=
∑
i
=
1
N
α
i
⋅
p
(
x
∣
μ
i
,
Σ
i
)
p(x) = \sum_{i=1}^{N}\alpha_i·p(x|{\mu_i, \Sigma_i})
p(x)=i=1∑Nαi⋅p(x∣μi,Σi)
这里在前一篇的从零开始-Machine Learning学习笔记(26)-聚类一文中,有做过关于高斯混合聚类的笔记,里面涉及到的知识和这里一致。如果给定有标记的样本集合
D
l
D_l
Dl和无标记的样本集合
D
u
D_u
Du,则用极大似然法来估计高斯混合模型的参数有:
L
L
(
D
l
⋃
D
u
)
=
∑
(
x
i
,
y
i
)
∈
D
l
l
n
(
∑
i
=
1
N
α
i
p
(
x
j
∣
μ
i
,
Σ
i
)
p
(
y
j
∣
Θ
=
i
,
x
j
)
)
+
∑
x
j
∈
D
u
l
n
(
∑
i
=
1
N
α
i
p
(
x
j
∣
μ
i
,
Σ
i
)
)
LL(D_l \bigcup D_u) = \sum_{(x_i,y_i)∈D_l}ln(\sum_{i=1}^{N}\alpha_ip(x_j|{\mu_i,\Sigma_i})p(y_j|{\Theta=i,x_j}))+\sum_{x_j∈D_u}ln(\sum_{i=1}^{N}\alpha_ip(x_j|{\mu_i,\Sigma_i}))
LL(Dl⋃Du)=(xi,yi)∈Dl∑ln(i=1∑Nαip(xj∣μi,Σi)p(yj∣Θ=i,xj))+xj∈Du∑ln(i=1∑Nαip(xj∣μi,Σi))
前一项是基于有标记数据的监督项,后一项是居于未标记数据的无监督项,采用EM算法进行求解:
E步: 根据当前模型参数计算未标记样本
x
j
x_j
xj属于各高斯混合成分概率:
γ
j
i
=
α
i
P
(
x
j
∣
μ
i
,
Σ
i
)
∑
l
=
1
k
α
l
P
(
x
j
∣
μ
l
,
Σ
l
)
\gamma_{ji}=\frac{\alpha_iP(x_j|{\mu_i, \Sigma_i})}{\sum_{l=1}^{k}\alpha_lP(x_j|{\mu_l,\Sigma_l})}
γji=∑l=1kαlP(xj∣μl,Σl)αiP(xj∣μi,Σi)
M步: 基于
γ
j
i
\gamma_{ji}
γji更新模型参数:
μ
i
=
1
∑
x
j
∈
D
u
γ
j
i
+
l
i
(
∑
x
j
∈
D
u
γ
j
i
x
j
+
∑
(
x
j
,
y
j
)
∈
D
l
∧
y
i
=
i
x
j
)
Σ
i
=
1
∑
x
j
∈
D
u
γ
j
i
+
l
i
(
∑
x
j
∈
D
u
γ
j
i
(
x
j
−
μ
i
)
(
x
j
−
μ
i
)
T
+
∑
(
x
j
,
y
j
)
∈
D
l
∧
y
i
=
i
(
x
j
−
μ
i
)
(
x
j
−
μ
i
)
T
)
α
i
=
1
m
(
∑
x
j
∈
D
u
γ
j
i
+
l
i
)
\mu_i = \frac{1}{\sum_{x_j∈D_u}\gamma_{ji}+l_i}(\sum_{x_j∈D_u}\gamma_{ji}x_j+\sum_{(x_j,y_j)∈D_l\wedge y_i=i}x_j)\\ \Sigma_i = \frac{1}{\sum_{x_j∈D_u}\gamma_{ji}+l_i}(\sum_{x_j∈D_u}\gamma_{ji}(x_j-\mu_i)(x_j-\mu_i)^T+\sum_{(x_j,y_j)∈D_l\wedge y_i=i}(x_j-\mu_i)(x_j-\mu_i)^T) \\ \alpha_i = \frac{1}{m}(\sum_{x_j∈D_u}\gamma_{ji}+l_i)
μi=∑xj∈Duγji+li1(xj∈Du∑γjixj+(xj,yj)∈Dl∧yi=i∑xj)Σi=∑xj∈Duγji+li1(xj∈Du∑γji(xj−μi)(xj−μi)T+(xj,yj)∈Dl∧yi=i∑(xj−μi)(xj−μi)T)αi=m1(xj∈Du∑γji+li)
2. 半监督SVM(Semi-Supervised Support Vector Machine, S3VM)
在考虑未标记样本后,S3VM试图找到能将两类有标记样本分开,且穿过数据低密度区域的划分超平面。其中S3VM中最著名的就是TSVM(Transductive Support Vector Machine),是一种针对于二分类问题的学习方法。TSVM试图考虑对未标记样本进行各种可能的标记指派(label assignment),即尝试将每个未标记样本分别作为正例或反例,然后在所有这些结果中, 寻求一个在所有样本(包括有标记样本和进行了标记指派的未标记样本)上间隔最大化的划分超平面。一旦划分超平面得以确定,未标记样本的最终标记指派就是其预测结果。

TSVM算法如下所示:

将其总结为如下的几个步骤:
[1]:初始化折中参数
C
u
<
<
C
l
C_u << C_l
Cu<<Cl;
[2]:用有标记的样本集训练一个SVM;使用这个SVM,对未标记的样本集进行预测;
[3]:进入循环;基于两个数据集,和参数
C
u
C_u
Cu、
C
l
C_l
Cl求解上面的优化问题;
[4]:任意选择标记相反且很可能被错误分类的两个样本(就是
ξ
i
+
ξ
j
>
2
\xi_i+\xi_j > 2
ξi+ξj>2),交换两者标记并重新求解优化问题;
[5]:更新
C
u
=
m
i
n
(
2
C
u
,
C
l
)
C_u=min(2C_u,C_l)
Cu=min(2Cu,Cl),逐步增大
C
u
C_u
Cu,直到
C
u
=
C
l
C_u =C_l
Cu=Cl
这种方式每次计算,开销非常大,目前有很多高效的求解方法:如基于图核函数梯度下降的LDS、基于标记均值估计的S3VM。
3. 图半监督学习
给定一个数据集,我们可将其映射为一个图,数据集中每个样本对应于图中一个结点,若两个样本之间的相似度很高(或相关性很强),则对应的结点之间存在一条边,边的"强度" (strength) 正比于样本之间的相似度(或相关性) 。我们可将有标记样本所对应的结点想象为染过色,而未标记样本所对应的结点尚未染色。于是,半监督学习就对应于"颜色"在图上扩散或传播的过程.由于一个图对应了一个矩阵,这就使得我们能基于矩阵运算来进行半监督学习算法的推导与分析。
3.1 针对于二分类问题的标记传播
对于给定的已标记的样本集
D
l
D_l
Dl和未标记的集合
D
u
D_u
Du,可以先基于
D
l
∪
D
u
D_l \cup D_u
Dl∪Du构建一个图G = (V,E),其中节点集为V={x1,x2,…,xl,xl+1,xl+2,…,xl+u},而边集E则可以表示为一个亲和矩阵,且常基于高斯函数定义:
W
i
j
=
{
e
x
p
(
−
∣
∣
x
i
−
x
j
∣
∣
2
2
2
σ
2
)
,
if
i
≠
j
0
,
otherwise
W_{ij} = \begin{cases}exp(\frac{-||x_i-x_j||_2^2}{2\sigma^2}), & \text {if $i\neq j$ } \\ 0, & \text{otherwise} \end{cases}
Wij={exp(2σ2−∣∣xi−xj∣∣22),0,if i̸=j otherwise
假设基于图G可以学得一个实值函数f(x),通过f(x)可以对样本进行分类
y
i
=
s
i
g
n
(
f
(
x
i
)
)
,
其
中
y
i
∈
{
−
1
,
1
}
y_i=sign(f(x_i)),其中y_i∈\{-1,1\}
yi=sign(f(xi)),其中yi∈{−1,1},于是可以定义个关于f的能量函数:

【其中D是一个对角函数,其对角值为W的每列元素的和。】
对于f来说,要使得其值最小,必然有
∂
E
(
f
)
∂
f
=
(
D
−
W
)
f
=
0
\frac{\partial E(f)}{\partial f} = (D-W)f = 0
∂f∂E(f)=(D−W)f=0,但是这个不好求解,于是我们将D和W分别从第l行和第l列将其分开,f也从l行分开,于是有:
f
=
(
f
l
,
f
u
)
D
=
[
D
l
l
D
l
u
D
u
l
D
u
u
]
W
=
[
W
l
l
W
l
u
W
u
l
W
u
u
]
f = (f_l,f_u)\\ D = \begin{bmatrix} D_{ll} & D_{lu} \\ D_{ul} & D_{uu} \\ \end{bmatrix} \\ W = \begin{bmatrix} W_{ll} & W_{lu} \\ W_{ul} & W_{uu} \\ \end{bmatrix} \\
f=(fl,fu)D=[DllDulDluDuu]W=[WllWulWluWuu]
将分块的矩阵带入能量函数,对
f
u
f_u
fu求偏导数即可求出对
f
u
f_u
fu对未标记的样本进行预测公式:

3.2 针对于多分类问题的标记传播
构造一个非负的标记矩阵
F
=
(
F
1
T
,
F
2
T
,
.
.
.
,
F
l
+
u
T
)
F=(F_1^T,F_2^T,...,F_{l+u}^T)
F=(F1T,F2T,...,Fl+uT),这其实是一个(l+u)行,列为标记类别数Y的矩阵,类似于聚类中聚类簇,但是分类规则跟聚类簇还不太一样,其分类规则为:
y
i
=
arg
max
1
≤
j
≤
∣
Y
∣
F
i
j
y_i = \arg \max_{1 \leq j \leq |Y|}F_{ij}
yi=argmax1≤j≤∣Y∣Fij,最后是以查询的方式,查找最大的F对应的j。求解F有以下的迭代规则:
1.初始化F:
F
(
0
)
=
Y
i
j
=
{
1
,
if
(
1
≤
i
≤
l
)
∧
(
y
i
=
j
)
0
,
otherwise
F(0)=Y_{ij}=\begin{cases}1, & \text {if $(1 \leq i \leq l) \wedge (y_i=j)$ } \\ 0, & \text{otherwise} \end{cases}
F(0)=Yij={1,0,if (1≤i≤l)∧(yi=j) otherwise
2.构造迭代式:
首先基于W构造一个标记传播矩阵:
S
=
D
1
2
W
D
−
1
2
S = D^{\frac{1}{2}} W D^{-\frac{1}{2}}
S=D21WD−21,其中
D
−
1
2
=
d
i
a
g
(
1
d
1
,
1
d
2
,
.
.
.
,
1
d
l
+
u
)
D^{-\frac{1}{2}}=diag(\frac{1}{\sqrt{d_1}}, \frac{1}{\sqrt{d_2}},..., \frac{1}{\sqrt{d_{l+u}}})
D−21=diag(d11,d21,...,dl+u1),于是有迭代式:
KaTeX parse error: Expected 'EOF', got '\alphaSF' at position 11: F(t+1) = \̲a̲l̲p̲h̲a̲S̲F̲(t)+(1-\alpha)Y…
算法描述如下:

图半监督学习方法在概念上非常清晰,且易于通过对所涉矩阵运算的分析来探索算法性质;但是其缺陷也非常明显:1.存储开销大;2.对于新的未知样本需要重新进行计算。
4. 基于分歧的方法
基于分歧的方法(disagreement-based methods)使用多学习器,而学习器之间的"分歧"(disagreement)对未标记数据的利用至关重要。“协同训练”(co-training)是基于分歧的方法的代表,它最初是针对"多视图" (multi-view)数据设计的,因此也被看作"多视图学习" (multi-view learning) 的代表。
所谓“多视图”其实就是一个数据对象同时拥有多个属性集合,比如一个电影有画面集、声音集、字幕集等,通过这些集合都可以对电影进行分类,但是这些特征不能进行独立的组合。
"假设数据拥有两个充分(sufficient)且条件独立视图,"充分"是指每个视图都包含足以产生最优学习器的信息,"条件独立"则是指在给运类别标记条件下两个视图独立。在此情形下,可用一个简单的办法来利用未标记数据:
1.首先在每个视图上基于有标记样本分别训练出一个分类器,然后让每个分类器分别去挑选自己"最有把握的"未标记样本赋予伪标记;
2.将伪标记样本提供给另一个分类器作为新增的有标记样本用于训练更新
3.这个"互相学习、共同进步"的过程不断迭代进行,直到两个分类器都不再发生变化,或达到预先设定的迭代轮数为止。
其算法描述如下所示:

基于分歧的方法只需采用合适的基学习器,就能较少受到模型假设、损失函数非凸性和数据规模问题的影响,学习方法简单有效、理论基础相对坚实、适用范围较为广泛.为了使用此类方法,市能生成具有显著分歧、性能尚可的多个学习器,但当有标记样本很少,尤其是数据不具有多视图时,要做到这一点并不容易,需有巧妙的设计。
5. 半监督聚类(Semi-supervised clustering)
聚类是典型的无监督学习,但是在现实中,对于聚类任务加入一些额外的监督信息可以获得更好的聚类效果,这就是半监督学习。聚类任务中可以获得的监督信息无非就两种:
一种是“必连”和“勿连”:
必连: 表示两个样本必属于同一个聚类簇;
勿连: 表示两个样本必不属于同一聚类簇;
另一种是:少量的有标记的样本
5.1 约束K均值算法(Constrainted k-means)
如果我们拿到的监督信息是第一种“必连”和“勿连”的信息,意思就是说,在聚类之前,我们已经提前知道了哪几个样本一定是同一类的,哪些样本一定不是同一类别的。基于这个信息,我们可以通过约束k-means来进行半监督聚类:

其算法思路可以用一下语言来描述:
[1]:确定必连约束集合M,勿连约束集合C,聚类簇的数量,随机选取k个样本作为初始均值向量;
[2]:进入循环,初始化k个空簇;
[3]:对于每一个训练样本,计算其与每个均值向量的距离,找出距离最小的簇,检测将该样本划入聚类簇中是否会违反M与C的约束;
[4]:如果不违反约束,将该样本划入到对应的簇中,并开始下一个样本的计算;如果冲突,则取出下一个距离最小的簇,进行判断是否违反约束;
[5]:更新均值向量;
[6]:判断均值向量是否全部被更新了,如果否,则返回第2步,继续循环;否则推出循环,得到最终的簇划分。
5.2 约束种子k均值算法(Constrained Seed k-means)
如果我们拿到的监督信息是第二种:有少量的已标记样本。一般我们直接将它们作为“种子”,即用他们来初始化k-means的k个聚类中心,并且在聚类簇迭代更新过程中不改变种子样本的簇隶属关系。其算法描述如下:

其算法思路可以用一下语言来描述:
[1]:确定聚类簇数k;
[2]:用有标记的样本初始化簇中心,即同标记的样本求均值;
[3]:进入循环;
[4]:用有标记的样本初始化k个簇;即将未标记的样本与已标记的样本进行比较,两者属性的取值一样的,将未标记的样本划入到对应的簇中;
[5]:对于尚未划分的训练集样本,计算每个样本与均值向量之间的距离,选取最短的距离对应的簇,将该样本划分到该簇之中;
[6]:更新均值向量;
[7]:判断均值向量是否去全被更新,如果为否,则返回步骤3继续循环;如果是,则退出循环得到最终的簇划分。
半监督的学习方法中一般会同时存在已标记的样本和未标记的样本,我们在本章中或利用两种组合,进行监督学习;也可以使用两组配合进行非监督学习。总之就是尽量利用我们已拥有的数据。这不经让我想起了从零开始-Machine Learning学习笔记(23) - 决策树总结章节中所提到的关于缺省值的处理,也是尽可能的利用我们已拿到的样本。真的是非常有意思!