32.1 基于分歧的方法:协同训练与多视图学习
与生成式方法、半监督SVM、图半监督学习等基于单学习器利用未标记数据的方式不同,基于分歧的方法 (disagreement-based methods) 使用多学习器,学习器之间的"分歧"对未标记数据的利用至关重要。"协同训练"(co-training)[Blum and Mitchell,1998]是此类方法的重要代表,它最初也被看作"多视图学习"(multi-view learning)的代表。
在现实应用中,一个数据对象往往同时拥有多个"++属性集++ "(attributeset),每个属性集构成一个"++视图++ "(view)。例如对于一部电影来说,它拥有多个属性集:图像信息对应的属性集、声音信息对应的属性集、字幕信息对应的属性集 ... 因此,一个电影片段可表示为样本(<x1, x2, ...>, y),其中xi是样本对应视图i中的属性而得的属性向量 (例如,x1为图像视图中的属性向量,x2为声音视图中的属性向量),y是标记。++(<x1, x2, ...>, y)这样的数据就是多视图数据 <xi 对应学习器 hi>++。
令Y1表示从图像视图(x1)判别的标记空间,Y2表示从声音视图(x2)判别的标记空间 ... 假设不同视图具有"相容性"(compatibility),即每个视图对应的标记空间是一致的:Y=Y1=Y2=...,例如Y=Y1=Y2={爱情片, 文艺片},而不能是Y1={爱情片, 文艺片}而Y2={爱情片, 动作片}。并且,在"相容性"基础上,不同视图信息的"互补性"会给学习器的构建带来很多便利。
协同训练正是很好地利用了多视图的"相容互补性"。假设数据拥有2个充分(sufficient)且条件独立的视图(属性集),一个简单的办法利用未标记数据:
-
在每个视图(属性集)上基于有标记样本分别训练出一个分类器;
-
++每个分类器分别挑选自己"最有把握的"(分类置信度最高的)未标记样本赋予伪标记,并将伪标记样本 提供给另一个分类器 作为新增的有标记样本再去训练更新;++
-
不断迭代这个"互相学习、共同进步"的过程,直到两个分类器都不再发生变化,或达到预先设定的迭代轮数为止。
注意,分类器在每轮学习中都对所有未标记样本进行分类置信度的考察,会有很大的计算开销,因此在算法中使用未标记样本缓冲池[Blum and Mitchell,1998]。
分类置信度的计算因分类器的学习算法而异,例如若使用朴素贝叶斯分类器,可将后验概率转化为分类置信度;若使用SVM,可将间隔大小转化为分类置信度。
协同训练过程虽简单,但研究表明,尽管视图(属性集)的条件独立性在现实任务中通常很难满足,协同训练仍可有效地提升弱分类器的性能 [周志华,2013]。
32.1.2 协同训练算法
算法的流程与解读如下:
有标记样本集 Dl={(<xi1, xi2, ...>,yi) | i = 1, 2, ... l} <(xi, yi)代表一个样本,xij 代表样本 xi 对应视图 j 的那部分属性向量>
未标记样本集 Du={<xi1, xi2, ...> | i=l+1, l+2, ..., l+u} <同理>
缓冲池大小 s
每轮挑选的正例个数 p
每轮挑选的反例个数 n
分类器 hj 基学习算法 fj
从Du中随机抽取s个未标记样本构成++缓冲池Ds++ ,Du=Du\Ds
Dlj={(xij, yi) | (xi, yi) ∈ Dl} <同理,Dlj 代表有标记样本集 Dl 中对应视图 j 的那部分属性向量集>
Dsj={xij | xi ∈ Ds} <同理>
for t=1, 2, ..., T do
for j=1, 2, ... do
fj(Dlj) → hj
<对应每个视图j,基于对应视图 j 的那部分有标记样本 Dlj 和基学习算法 fj,分别训练对应的分类器 hj>end for
if hj 均未发生改变 then break - 输出
else for j=1, 2 (为例) do
考察hj在Dsj上预测结果的分类置信度:
挑选p个正例置信度最高的样本,得到伪标记正例 Dp(3-j)={(xi(3-j), +1) | xi ∈ Dp}
挑选n个反例置信度最高的样本,得到伪标记反例 Dn(3-j)={(xi(3-j), -1) | xi ∈ Dn}
<Dp(3-j), Dn(3-j) 即提供给另一个分类器(对应另一个视图) 作为新增的有标记训练样本,分别为正例和反例>Ds = Ds\(Dp∪Dn) <整个样本从Ds中去除>
Dl(3-j) = Dl(3-j) ∪ Dp(3-j) ∪ Dn(3-j) <将新增样本并入对应视图j的分类器hj 它的有标记训练样本Dlj'中>
end for
再从Du中随机抽取|j|*(p+n)个未标记样本加入Ds,
end for t=1, 2, ..., T
输出:分类器 hj
基于分歧的方法只需采用合适的基学习器,就能较少受到++++模型假设、损失函数非凸性和数据规模问题++++的影响,学习方法简单有效、理论基础相对坚实、适用范围较为广泛。
协同训练算法本身是为多属性集数据而设计的,此后出现了一些能在++++单属性集++++ 数据上使用的变体算法,它们++++或是使用不同的学习算法++++ [Goldman and Zhou,2000]、++++数据采样++++ [Zhou and Li,2005b]、++++参数设置++++ [Zhou and Li,2005a]++++产生不同的学习器++++ - ++++事实上此类算法无需数据拥有多视图,仅需弱学习器之间具有显著的分歧(或差异),即可通过相互提供伪标记样本的方式有效提升泛化性能[++++周志华,2013]。不同视图、不同算法、不同数据采样、不同参数设置等,都是产生学习器差异的渠道,而非必备条件。
32.2 半监督聚类
半监督聚类 (semi-supervised clustering)是利用额外的监督信息获得更好的聚类效果,聚类任务的监督信息大致有两种类型:
第一种类型是"必连"(must-link)与"勿连"(cannot-link)约束,前者是指样本必属于同一个簇,后者是指样本必不属于同一个簇;
第二种类型是少量的有标记样本。
32.2.1 约束k均值算法
约束k均值(Constrained k-means)算法[Wagstaff et al.,2001]是利用第一类监督信息的代表。
给定样本集D={x1, x2, ..., xm}以及"必连"关系集合 Ml 和"勿连"关系集合 Cl,(xi,xj)∈Ml表示xi与xj必须属于同簇,(xi,xj)∈Cl表示xi与xj必不属于同簇。
此算法是K均值算法的扩展,算法流程如下:
令聚类簇数为k
从D中随机选取k个样本作为初始中心(均值)向量 {μ1, μ2, ..., μk}
repeat
Cj = ∅ (j ∈ {1,2,...,k}) <中心向量μj更新之后,将Cj清空,重新归纳隶属关系>
for i = 1, 2, ..., m do
计算样本xi与各中心(均值)向量μj之间的距离:dij = ||xi-μj||2
K = {1, 2, ..., k}
is_merged = false
while not is_merged do
基于K找出与样本xi距离最近的μj - 簇:r = argmin(j∈K) dij
检测将xi划入聚类簇Cr是否会违背Ml与Cl中的约束 - is_voilated
if not is_voilated then Cr = Cr ∪ {xi},is_merged = true
else K = K\r if K = ∅ then break and return Error
end while when is_merged=true - next xi
end for i = 1, 2, ..., m
μj = [Σ(x∈Cj)x] / |Cj|
until μj 均未发生变化
输出:簇划分{C1, C2, ..., Ck}
32.2.2 约束种子k均值算法
第二类监督信息是将少量有标记样本作为"种子",使用它们初始化k个聚类簇的中心,并在聚类簇迭代更新过程中不改变种子样本的簇隶属关系。
约束种子k均值(Constrained Seeds k-means)算法[Basu et al.,2002],算法流程如下:
样本集D={x1, x2, ..., xm}
包含少量有标记样本S = ∪(j=1,k)Sj
聚类簇数为k
for j = 1, 2, ..., k do
μj = [Σ(x∈Sj)x] / |Sj| <以有标记样本Sj 初始化 其对应簇的均值(中心)μj>
end for
repeat
Cj = ∅ (j ∈ {1,2,...,k}) <中心向量μj更新之后,将Cj清空,重新归纳隶属关系>
for j = 1, 2, ..., k do
Cj = Cj ∪ Sj
end for
for xi ∈ D\S do
计算样本xi与各均值(中心)向量μj (1≤j≤k) 之间的距离:dij = ||xi-μj||2
找出与样本xi距离最近的μj - 簇:r = argmin(j∈K) dij
将样本xi划入相应的簇:Cr = Cr ∪ {xi}
end for
μj = [Σ(x∈Cj)x] / |Cj|
until μj 均未发生变化
输出:簇划分{C1, C2, ..., Ck}