Co-training 最早在 1998 年提出, 是基于分歧的方法, 其假设每个数据可以由不同的视图(View)表示, 不同视图可以训练出不同的分类器, 利用这些分类器对无标签样本进行分类, 再挑选最自信的无标签样本加入训练集中. 这种多视图的方法需要满足两个假设:
不过该假设非常强, 大多现实数据无法满足此假设, 或很难划分出冗余的视图. 于是便有了其他协同训练的变种: 由多视图转变为多学习器. 例如 Co-forest 等, 核心思想为在一个视图上训练多个不同的学习器, 这些学习器之间存在一定的差异. 另外也有方法通过去构建多个充分独立的视图模型来近似 Co-training 假设, 如 Deep Co-training 等.
blog 文章传送门:
定义一个实例空间 X = X 1 × X 2 X=X_1 \times X_2 X=X1×X2, 其中 X 1 X_1 X1, X 2 X_2 X2 对应于同一实例的两个不同"视图". Co-training 算法流程如下:
COREG 既不假设有两个视图, 也不假设使用不同的学习算法. 在这里, 回归器 h 1 h_1 h1 和 h 2 h_2 h2 都采用 k k k-NN 算法. 不过这两个 k k k-NN 回归器通过用不同的距离度量或不同的 k k k 值来实例化, 借此来实现多样性. 在学习过程中, 每个回归器都为另一个回归器标记未标记示例.
选择 k k k-NN 回归器理由如下:
Democratic Co-Learning 也是采用单视图多学习器的策略, 像是民主投票, 以多数票的形式进行数据挑选.
定义 L \mathbf{L} L 为标记数据集, U \mathbf{U} U 为无标记数据集, A 1 , … , A n A_1,\dots,A_n A1,…,An 为分类器, 每个分类器对 U \mathbf{U} U 中的未标记数据 x x x 预测一个类别 c i ∈ C = { c 1 , … , c r } c_i \in \mathcal{C}=\{c_1,\dots,c_r\} ci∈C={c1,…,cr}, 并令 c k c_k ck 表示多数分类器预测一致的结果(将这些分类器的集合称为多数团体(Majoritty Group)). 将这些结果加入到 L \mathbf{L} L 中, 然后继续进行训练, 直到满足没有可挑选的未标记数据为止. Democratic Co-Learning 算法如下图所示:
初始阶段, 初始化模型:
majority prediction
.民主优先采样阶段, 选择未标记示例给专家标记, 并加入对应训练集:
评估阶段, 评估将 L i ′ \mathbf{L_i}' Li′ 添加到 L i \mathbf{L_i} Li 中是否提升准确率:
重复以上操作直到 L 1 , ⋯ L n \mathbf{L}_1,\dotsm\mathbf{L}_n L1,⋯Ln 不再变化为止. 最终通过 Combine 函数返回一组分类器.
CoBCReg 的思想与 Democratic Co-Learning 非常类似, CoBCReg 中使用了一个预测器委员会来预测未标记的示例.
CoBCReg 算法如下所示:
其中 SelectRelevantExamples 算法如下:
Co-Training 假设 D = S ∪ U \mathcal{D}=\mathcal{S} \cup \mathcal{U} D=S∪U 中的每个数据 x x x 有两个视图, 即 x = ( v 1 , v 2 ) x = (v_1, v_2) x=(v1,v2), 每个视图 v i v_i vi 都足以学习一个有效的模型. 其中 S \mathcal{S} S, U \mathcal{U} U 分别表示标记数据集和未标记数据集. 给定 D \mathcal{D} D 的分布 X \mathcal{X} X, Co-Training 假设表示如下:
f ( x ) = f 1 ( v 1 ) = f 2 ( v 2 ) , ∀ x = ( v 1 , v 2 ) ∼ X f(x)=f_1(v_1)=f_2(v_2),\forall x=(v_1,v_2) \sim\mathcal{X} f(x)=f1(v1)=f2(v2),∀x=(v1,v2)∼X
在 Deep Co-training 中, v 1 ( x ) v_1(x) v1(x) 和 v 2 ( x ) v_2(x) v2(x) 是 x x x 在最终全连接层 f i ( ⋅ ) f_i(·) fi(⋅) 之前的卷积表示. 在标记数据集 S \mathcal{S} S 上的标准交叉熵损失函数定义为:
L s u p ( x , y ) = H ( y , f 1 ( v 1 ( x ) ) ) + H ( y , f 2 ( v 2 ( x ) ) ) \mathcal{L}_{\mathrm{sup}}(x,y)=H(y,f_1(v_1(x)))+H(y,f_2(v_2(x))) Lsup(x,y)=H(y,f1(v1(x)))+H(y,f2(v2(x)))
其中 H ( p , q ) H(p,q) H(p,q) 表示交叉熵. 而对于未标记数据集 U \mathcal{U} U, 基于 Co-Training 假设, 期望 f 1 ( v 1 ( x ) ) f_1(v_1(x)) f1(v1(x)) 和 f 2 ( v 2 ( x ) ) f_2(v_2(x)) f2(v2(x)) 有相似的预测, 使用 JS 散度来进行 f 1 ( v 1 ( x ) ) f_1(v_1(x)) f1(v1(x)) 和 f 2 ( v 2 ( x ) ) f_2(v_2(x)) f2(v2(x)) 之间的相似性度量, 损失函数定义如下:
L c o t ( x ) = H ( 1 2 ( f 1 ( v 1 ( x ) ) + f 2 ( v 2 ( x ) ) ) ) − 1 2 ( H ( f 1 ( v 1 ( x ) ) ) + H ( f 2 ( v 2 ( x ) ) ) ) \mathcal{L}_{\mathrm{cot}}(x)=H(\frac{1}{2}(f_1(v_1(x))+f_2(v_2(x))))-\frac{1}{2}(H(f_1(v_1(x)))+H(f_2(v_2(x)))) Lcot(x)=H(21(f1(v1(x))+f2(v2(x))))−21(H(f1(v1(x)))+H(f2(v2(x))))
其中 H ( p ) H(p) H(p) 表示 p p p 的熵.
利用 g ( x ) g(x) g(x) 从 D \mathcal{D} D 中生成对抗样本数据集 D ′ \mathcal{D}' D′, 在 D ′ \mathcal{D}' D′ 中 f 1 ( v 1 ( g ( x ) ) ) ≠ f 2 ( v 2 ( g ( x ) ) ) f_1(v_1(g(x))) \neq f_2(v_2(g(x))) f1(v1(g(x)))=f2(v2(g(x))). 希望 g ( x ) g(x) g(x) 与 x x x 之间足够小, 以便于对抗样本还能保持自然的图像特征. 不过当 g ( x ) − x g(x)-x g(x)−x 很小时, 有很大概率会出现 f 1 ( v 1 ( g ( x ) ) = f 1 ( v 1 ( x ) ) f_1(v_1(g(x))=f_1(v_1(x)) f1(v1(g(x))=f1(v1(x)) 和 f 2 ( v 2 ( g ( x ) ) = f 2 ( v 2 ( x ) ) f_2(v_2(g(x))=f_2(v_2(x)) f2(v2(g(x))=f2(v2(x)), 这就与我们的想法违背. 即希望当 f 1 ( v 1 ( g ( x ) ) = f 1 ( v 1 ( x ) ) f_1(v_1(g(x))=f_1(v_1(x)) f1(v1(g(x))=f1(v1(x)) 出现时, 需满足 f 2 ( v 2 ( g ( x ) ) ≠ f 2 ( v 2 ( x ) ) f_2(v_2(g(x))\neq f_2(v_2(x)) f2(v2(g(x))=f2(v2(x)). 通过交叉熵来训练网络 f 1 f_1 f1, f 2 f_2 f2, 使得可以抵抗相互的对抗示例:
L d i f ( x ) = H ( f 1 ( v 1 ( x ) ) , f 2 ( v 2 ( g 1 ( x ) ) ) ) + H ( f 1 ( v 1 ( g 2 ( x ) ) ) , f 2 ( v 2 ( x ) ) ) \mathcal{L}_{\mathrm{dif}}(x)=H(f_1(v_1(x)), f_2(v_2(g_1(x))))+H(f_1(v_1(g_2(x))), f_2(v_2(x))) Ldif(x)=H(f1(v1(x)),f2(v2(g1(x))))+H(f1(v1(g2(x))),f2(v2(x)))
最终的损失函数定义为:
L = E ( x , y ) ∈ S L s u p ( x , y ) + λ c o t E x ∈ U L c o t ( x ) + λ d i f E x ∈ D L d i f ( x ) \mathcal{L}=\mathbb{E}_{(x,y)\in\mathcal{S}}\mathcal{L}_{\mathrm{sup}}(x,y)+\lambda_{\mathrm{cot}}\mathbb{E}_{x\in\mathcal{U}}\mathcal{L}_{\mathrm{cot}}(x)+\lambda_{\mathrm{dif}}\mathbb{E}_{x\in\mathcal{D}}\mathcal{L}_{\mathrm{dif}}(x) L=E(x,y)∈SLsup(x,y)+λcotEx∈ULcot(x)+λdifEx∈DLdif(x)
Tri-training 核心思想简述如下: 假设除了分类器 h 1 h_1 h1 和 h 2 h_2 h2 之外, 利用标记数据再训练了一个分类器 h 3 h_3 h3. 那么, 对于任何分类器, 只要其他两个分类器同意这个示例的标签, 则可以将其标记起来, 而分类器标记的置信度不需要明确测量. 例如, 如果 h 2 h_2 h2 和 h 3 h_3 h3 同意示例 x x x 的标记结果, 则可以将标记 x x x 加入到 h 1 h_1 h1 中. 其具体算法如下:
首先利用 Bootstrap 重采样, 从有标签数据集 L L L 里采样三个子数据集 S i S_i Si, S j S_j Sj, S k S_k Sk. 利用三个子数据集训练三个基分类器 h i h_i hi, h j h_j hj, h k h_k hk. 并初始化 e i ′ = 0.5 e_i'=0.5 ei′=0.5, l i ′ = 0 l_i'=0 li′=0. 这里 e i ′ e_i' ei′ 表示 h j & h k h_j \& h_k hj&hk 的分类错误率的上界, 即 h j h_j hj 和 h k h_k hk 组合得出的假设的错误率. l i ′ l_i' li′ 用作与挑选的未标记示例集 L i L_i Li 的大小做比较.
接着迭代每个分类器, 首先, 初始化挑选数据集 L i = ∅ L_i=\empty Li=∅; 使用 MeasureError 函数计算 e i e_i ei; 初始化分类器 h i h_i hi 的更新标志 u p d a t e i = F A L S E update_i=FALSE updatei=FALSE.
当满足 e i < e i ′ e_i < e_i' ei<ei′ 时, 对于分类器 h i h_i hi, 使用另外两个分类器预测所有未标注数据集, 挑选出其中预测结果相同的样本, 作为新的有标签数据 ( x , h j ( x ) ) (x,h_j(x)) (x,hj(x)), 并加入到分类器 h i h_i hi 的训练集 L i L_i Li 中. 当 l i ′ = 0 l_i'=0 li′=0 时(即刚初始化, h i h_i hi 还没经过训练进行更新), 通过下式计算 l i ′ l_i' li′:
l i ′ = ⌊ e i e i ′ − e i + 1 ⌋ l_i'=\lfloor\frac{e_i}{e_i'-e_i}+1\rfloor li′=⌊ei′−eiei+1⌋
当 l i ′ < ∣ L i ∣ l_i' < \vert L_i\vert li′<∣Li∣ 时, 如果 e i ∣ L i ∣ < e i ′ l i ′ e_i\vert L_i\vert < e_i'l_i' ei∣Li∣<ei′li′, 则表示分类器 h i h_i hi 已更新: u p d a t e i = T r u e update_i=True updatei=True, 如果 l i ′ > e i e i ′ − e i l_i'>\frac{e_i}{e_i'-e_i} li′>ei′−eiei, 则通过函数 Subsample 从 L i L_i Li 中随机选择 ∣ L i ∣ − ⌈ e i e i ′ − e i + 1 ⌉ \vert L_i\vert-\lceil \frac{e_i}{e_i'-e_i}+1\rceil ∣Li∣−⌈ei′−eiei+1⌉ 个示例删除, 同时更新 u p d a t e i = T r u e update_i=True updatei=True.
迭代完成后, 检查每个分类器的更新状态, 如果分类器 i i i 已更新, 则将与之对应的 L i L_i Li 加入到 L L L 中, 利用扩增的数据集 L L L 更新分类器 i i i, 同时用 e i e_i ei 更新 e i ′ e_i' ei′, ∣ L ∣ \vert L\vert ∣L∣ 更新 l i ′ l_i' li′.
重复上述分类器迭代过程, 直到每个分类器不在变化为止. 最终得到三个训练完成的分类器, 通过 arg max y ∈ l a b e l ∑ h i ( x ) = y 1 \argmax_{y\in label} \sum_{h_i(x)=y}1 y∈labelargmax∑hi(x)=y1 来预测结果, 即投票原则.
带分歧的 Tri-training 只对 Tri-training 进行简单改动, 如下所示:
非常容易理解, 如果分类器 c j c_j cj 和 c k c_k ck 都同意对数据 x x x 的预测, 但 c i c_i ci 不同意, 就可以自然的认为 x x x 是 c i c_i ci 的弱点. 并希望通过 x x x 来加强 c i c_i ci.
Tri-net 的训练过程如下图:
Tri-net 的第一步是生成三个多样的模型. Tri-net 由一个共享模型 M S M_S MS 和另外三个不同的模型 M 1 M_1 M1, M 2 M_2 M2 和 M 3 M_3 M3 组成. 为了得到三个准确多样的模型, 使用 Output Smearing 来生成三个不同的标记数据集: L o s 1 \mathcal{L}^1_{os} Los1, L o s 2 \mathcal{L}^2_{os} Los2 和 L o s 3 \mathcal{L}^3_{os} Los3. 在三个数据集上同时训练 M S M_S MS, M 1 M_1 M1, M 2 M_2 M2 和 M 3 M_3 M3. 网络结构如下:
和 tri-training 思想一样, 如果两个模型对未标记示例的预测达成一致, 并且预测可靠且稳定, 则将这个具有伪标签示例加入到第三个模型的训练集中. 然后用增强的训练集细化第三个模型. 由于模型之间相互挑选增加了训练集, 所以三个模型会越来越相似. 为了解决这个问题, 对标记数据上的模型进行微调, 以在某些特定轮次中增加它们之间的多样性. 整个训练过程如下所示:
同 Tri-Training, 首先从标记数据集 L L L 中用 bootstrap 采样获得三个不同的数据集 S i S_i Si, S j S_j Sj, S k S_k Sk, 这样做的目的是增加多样性, 然后分别训练三个分类器 m i m_i mi, m j m_j mj, m k m_k mk. 对于未标记数据集 U U U 中的示例 x x x, 每个分类器对其的预测结果分别为 c i c_i ci, c j c_j cj, c k c_k ck, 以及对应的概率 p i ( c i ∣ x ) p_i(c_i\vert x) pi(ci∣x), p j ( c j ∣ x ) p_j(c_j\vert x) pj(cj∣x), p k ( c k ∣ x ) p_k(c_k\vert x) pk(ck∣x).
与原始 Tri-Training 中为 x x x 分配多数投票标签的策略不同, 在 Teacher-Student 中, 从师生的角度对学习任务进行建模. 在迭代过程中, 如果 p j ( c j ∣ x ) p_j(c_j\vert x) pj(cj∣x), p k ( c k ∣ x ) p_k(c_k\vert x) pk(ck∣x) 同时大于 teacher 的阈值 τ t \tau_t τt, 则将 m j m_j mj, m k m_k mk 视作 teacher, 如果另一个分类器 m i m_i mi 的预测概率小于 student 的阈值 τ s \tau_s τs, 则将其视为 student. 未标记样本 x x x 只有在被判别为可被教导(Teachable)后才会被分配一个标签. 选择 Teachable 样本的算法如下所示:
其标准如下: