文章目录
一.什么是半监督学习
在现实中,所谓的数据是很多的,例如图片数据,随处拍都会有很多,然而所谓的有标签的数据,最开始都是要由人来定义的,因此有标签数据集其实也是比较珍贵的。而半监督学习总的来说,顾名思义,半监督意味着做训练的时候,既使用了有标签数据,又使用了没有标签的数据。要注意,如果我们这样做了,一般来说没有标签的数据都是远大于有标签的数据的,否则如果有标签数据更多的话,那直接忽略掉没有标签的数据可能会有更好的效果。
因此我们可以定义为如下问题:有
R
R
R个有标签数据
{
(
x
r
,
y
r
)
}
r
=
1
R
\{(x^r,y^r)\}_{r=1}^R
{(xr,yr)}r=1R和
U
U
U个无标签数据
{
(
x
u
)
}
u
=
R
R
+
U
\{(x^u)\}_{u=R}^{R+U}
{(xu)}u=RR+U,我们去利用这些数据来做与有
R
+
U
R+U
R+U个有标签数据相同的事情。
根据测试集是否也在这些训练中的无标签数据中,我们将问题分为了在其中的transductive learning和不在其中的inductive learning,显然前者效果会更好毕竟对应的
x
x
x值已知。
下面开始主要介绍应用于不同问题的半监督学习方法。
二.分类问题生成模型中的EM算法
首先回到我们最开始的二分类问题,现在有
R
R
R个有标签数据
{
(
x
r
,
y
r
)
}
r
=
1
R
\{(x^r,y^r)\}_{r=1}^R
{(xr,yr)}r=1R和
U
U
U个无标签数据
{
(
x
u
)
}
u
=
R
R
+
U
\{(x^u)\}_{u=R}^{R+U}
{(xu)}u=RR+U,其中
y
r
y^r
yr为类别
C
1
C_1
C1或
C
2
C_2
C2。如果我们继续使用生成模型的思想进行分类,我们还是要去使用极大似然估计来找到所有的参数
θ
\theta
θ,其中包括了
μ
1
,
μ
2
,
Σ
\mu_1,\mu_2,\Sigma
μ1,μ2,Σ。
我们对分类的概率进行根据极大似然估计,得到
L
(
x
1
,
x
2
,
.
.
.
,
x
R
,
x
R
+
1
,
.
.
.
x
R
+
U
,
θ
)
=
∏
i
=
1
R
P
θ
(
x
i
,
y
i
)
∏
j
=
R
+
1
R
+
U
P
θ
(
x
j
)
L(x^1,x^2,...,x^R,x^{R+1},...x^{R+U},\theta)=\prod_{i=1}^R P_\theta(x^i,y^i)\prod _{j=R+1}^{R+U}P_\theta(x^j)
L(x1,x2,...,xR,xR+1,...xR+U,θ)=i=1∏RPθ(xi,yi)j=R+1∏R+UPθ(xj) 取对数,得到
l
n
L
=
∑
x
r
l
o
g
(
P
(
y
r
)
P
(
x
r
∣
y
r
)
)
+
∑
x
u
l
o
g
(
P
(
x
u
)
)
lnL=\sum_{x^r}log(P(y^r)P(x^r|y^r))+\sum_{x^u}log(P(x^u))
lnL=xr∑log(P(yr)P(xr∣yr))+xu∑log(P(xu)) 我们不知道这些没有标签的数据的分类情况,因此无法拆解成条件概率;因此这里我们使用一个假设:如果我们知道了这个数据有k的几率在第一类,1-k的几率在第二类,我们就把这个数据看成k个标签为第一类的有标签数据和1-k个标签为第二类的有标签数据。上述假设其实是很符合人类思维的,因此我们就可以上式的无标签数据用全概率公式拆解:即
P
(
x
u
)
=
P
(
C
1
x
u
)
+
P
(
C
2
x
u
)
P(x^u)=P(C_1x^u)+P(C_2x^u)
P(xu)=P(C1xu)+P(C2xu)
从而有
l
n
L
=
∑
x
r
l
o
g
(
P
(
y
r
)
P
(
x
r
∣
y
r
)
)
+
∑
x
u
l
o
g
(
P
(
C
1
)
P
(
x
u
∣
C
1
)
+
P
(
C
2
)
P
(
x
u
∣
C
2
)
)
lnL=\sum_{x^r}log(P(y^r)P(x^r|y^r))+\sum_{x^u}log(P(C_1)P(x^u|C_1)+P(C_2)P(x^u|C_2))
lnL=xr∑log(P(yr)P(xr∣yr))+xu∑log(P(C1)P(xu∣C1)+P(C2)P(xu∣C2)) 然而尴尬的是,对于这个后验概率我们确实可以计算出来,但这里的
P
(
C
1
)
=
k
+
∑
x
u
P
(
C
1
∣
x
u
)
R
+
U
\large P(C_1)=\frac{k+\sum_{x^u}P(C_1|x^u)}{R+U}
P(C1)=R+Uk+∑xuP(C1∣xu)其中
k
k
k为有标签数据中属于类别
C
1
C_1
C1的数据个数,然而表达式中的
P
(
C
1
∣
x
u
)
P(C_1|x^u)
P(C1∣xu)恰好是我们需要求的。也就是我们上面的式子中存在着用自己求自己的现象,或者说这是个隐函数表达式。但是我们不用慌,虽然出现了这种情况,但是在这循环求解的过程中其他的部分也在改变,因此我们完全可以用迭代的方法去求解:在每次迭代的时候,第一步将
P
(
C
1
∣
x
u
)
P(C_1|x^u)
P(C1∣xu)和
P
(
C
1
)
P(C_1)
P(C1)等先验概率按照上次迭代的结果作为固定值,这样就完全成为最初全部有标签分类的情况了,被称为E阶段;第二步使用MLE表达式求极大值来进行参数更新,被称为M阶段。合起来就是著名的EM算法,当然EM算法不止可以用在这个问题上,但是原理都是相同的。
如果要使用迭代法,还要证明迭代法的收敛性。这里可以更广义的证明EM算法是局部收敛的,最后的结果依赖于初值的选择。具体证明可见统计学习方法笔记专栏。
因此迭代步骤如下图所示。参数的更新表达式与之前的普通二分类相同,具体推导略;一般来说最开始参数的选择就是仅使用全部有标签数据进行二分类得到的选择,相对来说最靠谱一些(当然全选择0也可以得到收敛的解,但别忘了只是局部收敛,总的来说还是尽量让初值比较靠谱最好)。
在这个生成模型中,这样显然是有用的。但是我们可以想象一下,我们可以不用在乎模型整体的情况,而是用神经网络这种判别模型直接计算出分界线。然而在一个神经网络中,如果我们这样做的话,我们先通过有表浅数据做了一定的训练,之后我们对这些没有标签的数据做预测,这时如果我们像上面说的一样,就将预测的结果作为分类的结果,那我们就会发现,我们无法利用这些无标签数据进行梯度下降来优化参数,因为现在得到的就是这个预测值!在把这个预测值带回去根本没有损失值,哪里来的梯度呢?
因此这种方法在神经网络这种判别模型中毫无意义,我们需要想新的办法。
三.基于低密度分离的分类
使用这类方法的前提是,我们基于一个普遍假设:每个类别的分界线是比较清楚的,分界线附近点的密度是很低的。当然,这个假设普遍来说是有道理的,在绝大多数情况下也是成立的。
1.自我学习
根据以上思想,再加上为了解决前文中EM算法在NN中不会产生梯度的瓶颈,这种算法呼之欲出。其实内容十分简单,就是我们选取一些没有标签的值,根据预测的值,我们直接给它标签。例如根据预测,某个值属于第一类的概率是0.9。我们就直接把它分到第一类,变成这个概率是1,就产生了
y
y
y和
y
^
\hat y
y^,从而这个没有标签的值就变为了有标签的值,以及产生了梯度,对后续的求解有了影响。
这种方法对任何的分类问题都有效果,但是在回归问题中显然没有效果,因为同样是造成了将数值确定下来没有增加任何的损失值,无法于梯度下降。
2.基于信息熵的正则化
在上面的自我学习中,我们并没有定义如何选择没有标签的点来转化成有标签的点,这就导致了算法比较粗糙。根据理论,我们更会觉得离各个边界比较远的点相对更可靠。因此我们可以将原先的损失函数中,对无标签数据的损失值就定义为是来计算对应的与边界的距离值。我们知道信息熵的大小十分切合的描述了这点,因此我们就可以定义信息熵做为对应的损失值。因此结果如下图所示,其中那个5是分类数量,实际应用中有不同的取值;由于式子长得像这是个正则化项,因此名字也来源于此;
λ
\lambda
λ为一个超参数,可以自己设置。
3.半监督SVM
没想到方法如此粗暴,就是枚举所有没有标签的点的所有情况,然后对每种情况建立SVM,最后的目标是找到一个最合理的SVM。
当然,很多时候没有标签的点太多了,这样做仿佛成为了一个np-hard问题。实际上可以用分块,还有启发式搜索加入等策略来进行,相当于是一些近似算法,但总之实用性远不如上一种。
四.基于平滑假设的分类
这类的方法基于以下假设:数据分布不均匀,数据密集的地方,相近的数据的
y
y
y值应该相同。思想上其实有点类似于基于密度的聚类。
这种假设对下面这章张图出现的情况的处理尤其有效:最右面这个2在像素上确实和3很接近,但是它在一个数据密集的靠边缘的部分,这个密集的区域都是数字2,那么它就会被识别成数字2。
1.基于聚类的分类方式
最简单的方式就是使用聚类,然后让我们的类别多一些,一般是以有标签的点为聚类中心。聚类完之后,我们把一类中无标签的数据加上其中有标签数据的标签。
但这样做显然有很多缺点:没有很好的提取到特征,分类的类别数量不好确定,太少了可能导致一类中有不同类别的有标签数据太多了可能导致一类中根本就没有有标签数据…
因此实际上很少用这种方式。
2.基于图的分类方式
其实是对上一种方式的改进,使用的思想还是类似聚类中的RBSCAN算法。总的来说我们可以把所有的输入(每个输入是一个向量)来看做是图上的节点,然后定义相连的边和权重,之后把没有标签的数据的标签当作参数,定义一种可以说明图的平滑度的表达式,最后综合优化有标签数据的标签和平滑度即可。
下面我们就一步步处理细节。
(1).定义节点
理论上我们当然是可以完全不用在乎输入的向量的情况,直接把这个向量作为一个个节点。但是这样做的问题就是,没有关注到每个输入之间的特征相似度。因为后面的步骤我们是要使用特征相似度来定义边和权重等等的,所以定义节点的时候挖掘特征是十分必要的。
因此这里要用一个无监督学习的embedding类算法来进行特征抽取,再作为节点,各个节点记为
x
i
x_i
xi
(2).定义边和权重
存在着边意味着有联系,而权重的大小就说明着联系的大小。有很多种定义边的方法,例如每个点都与和自己相似度最高的k个点相连,或者每个点都与和自己相似度超过一定比例的点相连等等。至于相似度的计算,使用向量的余弦相似度即可。
而对于权重,当然我们知道是越相似权重就越大,但是如何去定义它们之间的函数关系呢?一般常用的是指数模型,这样一是体现了高斯分布的思想,二是使得距离比较远的点联系会负指数级别的暴跌,保证了不会出现影响。因此就是如下的式子,其中
γ
\gamma
γ是一个可以自选的参数,从而也简化了余弦相似度模型,就仅仅是和几何距离有一个指数衰减的关系了。
(3).定义图的平滑度
我们经过上面的步骤得到了我们想要的图,现在就要定量的去分析图的平滑程度了,因为根据我们的假设图的平滑度应该是越小越好。
**(当然这个函数也是人为设定的)**我们定义图中每对点的不平滑度与权重成正比(所以没有边相连就是0);与结果的差异程度成正比。因此我们就有了如下的式子,注意这个是不论是否是有标签数据的,因为我们的无标签数据现在我们就是假设了标签,成为了待优化的参数;这里
y
y
y也使用平方差是因为我们最后的预测也是一个比例,况且我们需要使用梯度下降来优化,因此我们不能是直接把所谓的预测的结果不同类就直接都当作1。就比如一个预测是(0.8,0.2),另一个预测是(0.2,0.8),最后我们定义类别是前一个会是第一类而后一个会是第二类,但我们计算平滑度的时候还是按照
2
∗
(
0.8
−
0.2
)
2
=
0.72
2*(0.8-0.2)^2=0.72
2∗(0.8−0.2)2=0.72来计算。
特别的,上述的S可以拆解成
y
T
L
y
y^TLy
yTLy的形式,其中矩阵
L
L
L称作是拉普拉斯矩阵,等于
D
−
W
D-W
D−W,其中D是一个对角阵,
D
i
i
D_{ii}
Dii表示与点
i
i
i的边的总权重;W是一个对角元素为0的对称矩阵,
W
i
j
W_{ij}
Wij表示点
i
i
i与点
j
j
j的边的权重。
(4).综合考虑
既然平滑度已经找出表达式了,那我们就综合平滑度还有有标签数据分类的效果来综合考虑即可,因此表达式如下图所示,可见这种思想又是十分类似于正则化,把平滑度作为了正则化项。