晨光侦探社的档案室里堆着几百份“无头案”——每份卷宗里既有厚厚的口供文字,也有现场照片,唯独缺结论。老社长只给两位新侦探留下五份已经侦破的旧案卷做参考。艾米擅长从文字里找破绽,雷欧擅长从照片里寻线索。两人很快发现一个诀窍:当艾米对某份口供的判断有十足把握时,把这个判断告诉雷欧,雷欧再去翻照片验证,往往能拼出真相;反过来,雷欧从照片里发现的可疑模式,艾米也能在口供里找到印证。于是两人约定:每天各自翻卷,遇到把握极大的判断就写成便签递给对方。几个月后,两人破案速度越来越快——这,就是 Co-training(协同训练)的核心直觉:两个各有所长的“视角”互相教学,用大量没有结论的悬案(未标注数据)壮大彼此的破案能力。
在标注数据稀缺的工业场景中,Co-training 让你用少量昂贵标注撬动海量无标注数据,是半监督学习最经典的实践武器,值得每位 AI 工程师掌握。
目录
可视化演示
展示双分类器多视图互标注协同训练流程和与Self-training的准确率对比,通过滑块调节学习率参数。
本节配有交互动效(进入视口后自动加载,约 3KB)。
协同训练:双分类器互标注 分类器A在视图V1上预测高置信样本 分类器B在视图V2上交叉标注 A→B: high_conf(A,V1) → train(B) 两个独立视图互补式扩大标注集。
多视图假设——为什么两只眼睛看得比一只清楚
晨光侦探社的两位侦探从五份旧案卷起步。艾米埋头逐字分析口供的措辞,雷欧专注比对现场照片的细节,两人看同一批悬案却得出不同角度的猜测。艾米的“文本直觉”与雷欧的“图像直觉”互不重叠,却都指向同一个真相——这就是多视角的美妙之处。
在机器学习里,一个样本可以被拆成几组特征,每组特征称为一个“视图”(view)。一张商品图片,颜色直方图是一个视图,纹理轮廓描述是另一个视图;一篇网页,正文词频与链接锚文本也是两个视图。Co-training 依赖的“多视图假设”有两条:一是每个视图都足以独立学习一个还不错的分类器(充分性),二是在给定真实类别 y 的条件下,两个视图的条件分布互不干扰(条件独立)。充分保证“单干也能干”,独立保证“合作不会重复犯错”。
正是“充分但独立”这两个性质,让两个分类器可以放心地把自己的判断教给对方。
- 认识符号x^(1) 是第一个视图的特征向量(例如网页正文的词频向量),x^(2) 是第二个视图的特征向量(例如锚文本词频向量),y 是样本的真实类别标签。
- 条件分布P(x^(1)|y) 表示当类别确定后,观察到这个视角特征的概率。好比“知道嫌疑人是惯偷后,其口供中出现特定措辞的概率”。
- 条件独立连乘若在给定 y 时两个视图互不影响,联合概率等于两条件概率相乘。这意味着艾米的口供分析与雷欧的照片分析在“已知真相”的框架下互不干扰、各给各的证据。
协同训练流程——互教互学的四步舞
老社长给两位侦探定下规矩:每天上午各自研究旧案卷,下午各自翻新卷宗;若谁对某个卷宗的判断有十足把握,就把结论写在便签上塞进对方的信箱。几个月后,两人都发现自己的破案面扩大了不少。
这就是 Co-training 的迭代流程,一共四步。第一步:两个模型分别用各自的视图在少量标注数据上训练,得到起步分类器。第二步:分别对未标注样本池 U 做预测。第三步:每个模型筛出自己最自信的 k 个样本,即高置信度样本。第四步:把这些样本连同自己的预测标签(伪标签)喂给对方模型,重新训练,回到第二步循环。注意伪标签是“交叉”给的:A 选的样本送给 B 训练,B 选的样本送给 A 训练。
四步循环不断把未标注数据“转正”为训练燃料,模型越学越强。
- 模型 A 的预测分布P_A(y'|x^(1)) 是模型 A 只看视图 1 时,认为样本 x 属于类别 y' 的概率,对应“艾米的口供直觉”。
- 取最大概率max 表示把所有候选类别的概率比一遍,选出最有把握的那个。艾米只把“最有底”的嫌疑对象写进便签。
- 阈值过滤> τ 意味着最大概率超过信心门槛(例如 0.8)才会被选中,避免把模棱两可的猜测传出去。
置信度筛选——只把十成把握的线索传出去
艾米深知乱传消息的代价:如果她把三成把握的猜测也塞给雷欧,雷欧拿着错误方向去翻照片,只会浪费时间,甚至被带进沟里。所以她给自己定下规矩:只有读口供读到“十拿九稳”时才写便签。
置信度筛选是 Co-training 的质量闸门。实现上有两种常见做法:一种是固定阈值 τ,要求 max_y P(y|x) > τ 才采纳;另一种是每轮取概率最高的 top-k 个样本。前者质量可控但每轮数量不定,后者每轮数量固定但质量会波动。工程上常把两者结合:既设阈值又限数量,保证每一轮都能稳定注入新样本且噪声受限。
阈值 τ 越高,伪标签越干净,但每轮可用样本越少;调参时需要在“质”与“量”之间找平衡。
- argmax 选标签argmax 在候选类别中挑出让概率最大的那个 y,作为模型 A 给出的伪标签,代表“艾米的最终结论”。
- 写出伪标签符号ŷ_A(x) 是 A 给样本 x 打的预测标签,它将被当作真实标签跟随样本进入 B 的训练集。
- 门槛条件P_A(ŷ_A(x)|x^(1)) > τ 表示“A 对这份口供的判断概率高于门槛”,相当于艾米必须达到“十拿九稳”才分享。
- 组合约束两式合起来说明:只有既被 argmax 选为最可能、又超过置信度阈值 τ 的样本才能进入交换清单。
对比自训练——一个人闭门造车的陷阱
假如艾米不找雷欧,而是一个人闷头翻卷宗,她会怎么做?她把自己最有把握的结论直接归档为“已破案”,再拿这些结论当作新卷宗的参考。这听起来合理,却有个致命问题:她的判断依据只有口供文本,若口供本身存在系统性偏差(比如某个地区的措辞总显得可疑),她越自信,偏差就被复制得越狠——错误越滚越大。
这正是 Self-training(自训练)的毛病:单模型用自己的伪标签扩充自己的训练集,初始错误会随迭代累积放大。Co-training 之所以强,在于两个条件独立的视图互相标注:A 的错误通常不会恰好被 B 复现,B 看到的特征可以暴露 A 的盲区。Blum 与 Mitchell 的理论证明,在视图充分且条件独立、且两视图弱分类器错误率小于 1/2 的前提下,Co-training 的平均错误率随迭代呈指数级下降,而不是像自训练那样线性恶化。
这就是“两个人交叉印证”优于“一个人闭门造车”的数学直觉。
- 初始误差 εε 是两视图分类器的初始错误率,定理要求 ε < 1/2,即比随机猜测略强。好比两位侦探的直觉底子不能太差。
- 衰减因子 ηη 是每轮误差的缩水系数,0 < η < 1 表示错误在概率意义上逐轮收缩。两个独立视角互相纠偏,是收缩的根源。
- 误差指数下降第 t 轮整体误差被压制到 ε·η^t。指数级下降意味着几轮之后,联合分类器的错误率已经非常接近零。
文本协同应用——从“口供”到网页正文
艾米最熟悉的战场是文字。想象一位内容平台运营,要用机器学习自动给海量未分类网页打上“科技/体育/财经”的标签。网页天然有两个视角:正文内容是“口供”,指向该页面的超链接锚文本则是“别人对它的描述”。某个页面被大量用“划时代旗舰手机”作锚文本链接,正文里却通篇讲芯片参数——两个视角互补信息非常丰富。
实践中,正文词频向量和锚文本词频向量分别训练两个朴素贝叶斯或逻辑回归分类器,便组成 Co-training 的双视图。两者初始只需几百个已标注网页,配合几十万未标注网页进行协同训练,分类准确率往往显著超过只用正文的单视角模型。
锚文本稀疏时可以让模型 B 退化为简单的规则热启动,再逐步让数据说话。
- 词频向量w 是一篇网页的词频向量,w_i 是第 i 个词(例如“手机”“评测”)在文中出现的次数,构成文本视图。
- 贝叶斯分解后验概率 P(y|w) 正比于类先验 P(y) 与各词条件概率的连乘,这是朴素贝叶斯文本分类的核心公式。
- 双视图落地正文视图与锚文本视图各用一套这样的分类器,Co-training 让它们互相标注,分类器越滚越准。
图像协同应用——颜色与形状的联合侦破
雷欧的战场是图像。在工业质检中,一台相机每天拍下数万张零件照片,但真正有标注的缺陷照片只有几十张——因为缺陷标注需要质检老师傅逐张划线框选,贵且慢。幸运的是,一张照片天生可以拆成两个视图:颜色直方图捕捉“色偏、氧化、污渍”这类颜色异常,边缘方向直方图与形状轮廓描述捕捉“划痕、形变”这类结构异常。
一个基于颜色直方图的分类器(视图 A)和基于形状特征的分类器(视图 B)构成 Co-training:A 对某些缺陷照片极有把握(如严重色差),B 对其他缺陷极有把握(如轮廓变形),二者互相把高置信缺陷样本连同类别伪标签喂给对方,让两个模型都逐步拥有“双重视野”。
颜色与形状之间天然低相关,恰好满足 Co-training 需要的条件独立性。
- 颜色分箱bin(I_p) 表示把像素 p 的 RGB 值映射到颜色直方图的第 c 个桶,如“红色区间”。
- 指示函数计数1[条件] 在条件成立时取 1、否则取 0;对全图所有像素求和,统计落入第 c 桶的像素个数。
- 归一化直方图除以像素总数 N,得到第 c 桶的颜色占比,所有桶组成整图的颜色直方图特征,供视图 A 分类使用。
半监督价值——五份旧案撬动五百份悬案
老社长说:“仓库里有五百份悬案,我只有能力给你审五份,剩下的要靠你们自己相互成就。”这正是半监督学习的写照:标注数据稀缺昂贵,未标注数据量大廉价。Co-training 的价值在于搭起一条从廉价数据到训练信号的管道——每轮两个模型各新增 k 个高置信伪标签样本,t 轮后累计新增 2k·t 个,远超最初的 L 个标注。
当 U≫L 时,Co-training 的杠杆效应特别明显:标注数据决定起点,未标注数据决定增长曲线。医疗影像、法律文书、工业质检这类“专家标注一小时只能标几十条”的行业,Co-training 可以把模型性能从“勉强可用”推高到“接近全监督”,而标注成本几乎不变。
标注是“火种”,伪标签是“燃料”,Co-training 让火种点燃整片燃料库。
- 每轮增量2k 表示每一轮两个模型一共从无标注池中挑出 2k 个高置信样本(各 k 个)转为伪标签。
- 累计规模t 轮后累计伪标签样本数 |S^(t)| = 2k·t,随轮次线性增长。
- 杠杆条件U≫L 表示无标注样本远多于标注样本,伪标签池才有足够大的扩展空间。
实践要点——别让两个视角“穿一条裤子”
两位侦探合作久了,渐渐发现一个规律:但凡他们开始参考对方的口头禅办案(比如艾米也开始说“我觉得这张照片不太对劲”),破案率反而下降。因为两人如果越来越像,交叉验证就失去了意义。Co-training 的工程实践也有几条铁律。
第一,视角必须充分且低冗余。特征选择时应避免两个视图高度相关——比如“正文的前半段”和“正文的后半段”就不算好视图,正确做法是“正文文字”与“链接锚文本”这种来源不同的视角。第二,基分类器不宜过强也不宜过弱:过强导致在少量标注上过拟合,过弱导致筛选出的置信度不可靠。第三,置信度阈值与每轮数量 k 要配合验证集调参。第四,防止噪声累积:早期高置信伪标签通常可靠,后期模型可能在低置信区域也表现出过度自信,需要监测伪标签分布。
好的 Co-training 项目,最终常会用这种方式把两个视角的模型融合为更强的单分类器。
- 加权投票将两个视图模型的概率分布按权重 λ 线性叠加,λ ∈ [0,1]。
- 权重含义λ 接近 1 表示更信任视图 A,接近 0 表示更信任视图 B;在验证集上搜索最优 λ 即可。
- 最终决策argmax 取出加权分布中概率最大的类别,作为两个视角商量后的共同结论。
AI 应用场景
网页主题分类(文本双视角)
阶段:半监督学习 / 数据标注增强
解决的问题:内容平台的网页分类需要大量人工标注,标注成本高、时效性差。传统有监督方案要攒够几万条标注才能上线,冷启动慢。Co-training 只需几百条标注,配合海量未标注网页即可启动,且正文与锚文本两个视角天然解耦,无需额外工程采集成本。
具体案例:某资讯 APP 后台每天新增百万篇未分类文章,只有 1 万篇带人工标签(体育 / 科技 / 财经等)。算法工程师用“正文词频 + 链接锚文本词频”构造双视图,初始各用 500 条标注训练两个朴素贝叶斯分类器,在 50 万未标注文章上跑 Co-training 30 轮,分类准确率从 78% 提升到 89%,接近全监督基线,而标注成本几乎为零。
工业零件表面缺陷检测(图像双视角)
阶段:计算机视觉 / 数据标注增强
解决的问题:缺陷样本稀少且缺陷形态各异,专家标注一张缺陷图需要几十秒,成本极高。Co-training 把一张图的颜色与形状拆成两个视图:颜色视图对色差、氧化、污渍敏感;形状视图对划痕、形变、缺损敏感。两者初始用少量标注即可互相教学,把无标注的合格品与缺陷混存数据利用起来。
具体案例:某汽车零部件厂积累了 12 万张无标注零件照片,只有 300 张有缺陷标注。工程师提取颜色直方图与边缘方向直方图作为双视图,用逻辑回归基分类器跑 Co-training,迭代 25 轮后缺陷召回率从 61% 提升到 84%,误检率仅上升 1.2%,避免了人工标注数十万级数据。
Python 演示
import numpy as npfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score def make_data(n=800, seed=42): rng = np.random.RandomState(seed) y = rng.randint(0, 2, size=n) # 视角1(文本): 2个特征, 依赖标签 x1 = np.c_[y + rng.normal(0, 0.5, n), 1 - y + rng.normal(0, 0.5, n)] # 视角2(图像): 2个特征, 依赖标签的方式不同 x2 = np.c_[y * 1.5 + rng.normal(0, 0.6, n), y * 0.5 + rng.normal(0, 0.6, n)] return x1, x2, y def cotrain(x1, x2, y, label_num=10, pool_num=400, rounds=30, k=5, seed=0): rng = np.random.RandomState(seed) idx = np.arange(len(y)) rng.shuffle(idx) labeled = idx[:label_num] pool = idx[label_num:label_num + pool_num] test = idx[label_num + pool_num:] model_a = LogisticRegression() model_b = LogisticRegression() model_a.fit(x1[labeled], y[labeled]) model_b.fit(x2[labeled], y[labeled]) for _ in range(rounds): if len(pool) == 0: break p_a = model_a.predict_proba(x1[pool]) p_b = model_b.predict_proba(x2[pool]) # 每个模型挑置信度最高的 k 个未标注样本 top_a = pool[np.argsort(p_a.max(axis=1))[-k:]] top_b = pool[np.argsort(p_b.max(axis=1))[-k:]] # 各自给选中的样本打伪标签 pseudo_a = model_a.predict(x1[top_a]) pseudo_b = model_b.predict(x2[top_b]) # 交叉互喂: A选的样本给B训练, B选的样本给A训练 model_b.fit(np.vstack([x2[labeled], x2[top_a]]), np.r_[y[labeled], pseudo_a]) model_a.fit(np.vstack([x1[labeled], x1[top_b]]), np.r_[y[labeled], pseudo_b]) # 已使用的样本移出未标注池 pool = np.setdiff1d(pool, np.r_[top_a, top_b]) acc_a = accuracy_score(y[test], model_a.predict(x1[test])) acc_b = accuracy_score(y[test], model_b.predict(x2[test])) return acc_a, acc_b if __name__ == "__main__": x1, x2, y = make_data() acc_a, acc_b = cotrain(x1, x2, y) print("模型A(文本视角)准确率: {:.3f}".format(acc_a)) print("模型B(图像视角)准确率: {:.3f}".format(acc_b))
model_a.fit(x1[labeled], y[labeled])用少量标注样本在视角1上训练模型A,代表“艾米从五份旧案卷学口供直觉”。p_a = model_a.predict_proba(x1[pool])让模型A对未标注池预测类别概率,对应“翻新卷宗找方向”。top_a = pool[np.argsort(p_a.max(axis=1))[-k:]]按最大概率排序取最后 k 个索引,即筛出 A 最有把握的样本。pseudo_a = model_a.predict(x1[top_a])A 给选中的样本打上伪标签,相当于艾米在便签上写出嫌疑对象。model_b.fit(np.vstack([x2[labeled], x2[top_a]]), np.r_[y[labeled], pseudo_a])关键一步:A 选的样本连同伪标签加入 B 的训练集,交叉互喂。pool = np.setdiff1d(pool, np.r_[top_a, top_b])把两模型都用过的样本移出未标注池,避免重复挑选造成噪声累积。
常见误区
误区Co-training 就是多训练几个模型,谁的预测结果好就听谁的,跟随机森林投票差不多。
正解Co-training 的核心不是“投票”,而是“不同视角互相标注”。如果两个模型用同一份特征,它们会犯高度相似的错误,交换伪标签无法纠偏。真正的 Co-training 要求两个视图来自数据的不同侧面(正文 vs 锚文本、颜色 vs 形状),错误不相关,互学才有意义。
为何常见:多数人先接触集成学习,习惯了“多个模型 + 投票”的框架,误以为 Co-training 只是换个随机种子多训一个模型。
误区A 模型选出高置信样本后,自然应该把这些样本加入 A 自己的训练集继续提升。
正解Co-training 的关键动作是“交叉”:A 挑出的样本打上 A 的伪标签,加入 B 的训练集;B 挑出的样本加入 A 的训练集。如果 A 用自己的高置信样本扩自己,就退化成了 Self-training,失去双视角纠偏能力。
为何常见:直觉上“自己最懂自己”,初学者往往不习惯“把好东西给对方”这种反直觉设计。
误区阈值 τ 越高,伪标签越干净,所以干脆设到 0.99,模型肯定越学越好。
正解阈值过高会导致每轮几乎选不出样本,训练停滞;阈值过低则噪声涌入,模型被带偏。工程中通常设 τ 在 0.7~0.9,并搭配每轮固定 k 个 top 样本,保证“每轮都有新燃料且噪声受控”。
为何常见:只看到“高质量伪标签”的好处,忽略了“数量”也是迭代的必要条件,质与量需要平衡。
误区两个视图越相似,描述的是同一事物,结果应该越一致越可靠。
正解视图高度相关时,Co-training 退化接近 Self-training,错误模式重复出现;视图需要“互补且条件独立”——各自足以学习目标,同时错误不相关。例如“同一个分类器不同层的输出”就不是好的双视图。
为何常见:生活直觉里“统一战线”常被当作好事,但在交叉验证机制中,冗余视角反而破坏了互纠偏的根基。
面试题
Q1. Co-training 属于哪种机器学习范式?
- A.监督学习
- B.无监督学习
- C.半监督学习← 正确答案
- D.迁移学习
答案:C。Co-training 同时使用少量标注数据和大量未标注数据,正是半监督学习的典型范式。监督学习只用标注数据,无监督学习完全不用标签,迁移学习强调跨任务/域迁移,均不符合。
Q2. Co-training 中“多视图”指的是什么?
- A.多个摄像头采集数据
- B.同一数据的不同特征子集← 正确答案
- C.多次重复训练模型
- D.多张图片拼接输入
答案:B。多视图指同一批样本可以拆成几组相互独立又各自充分的特征,比如网页的正文词频与锚文本词频,或图像的颜色直方图与形状轮廓。和摄像头数量无关。
Q3. Co-training 中两个模型的训练数据有何不同?
- A.使用相同特征但标签不同
- B.使用不同特征子集但共享标签← 正确答案
- C.使用完全独立的数据集
- D.只有第二个模型使用标签
答案:B。两个模型各用一个特征视图(不同特征子集),但预测目标都是同一个标签 y。数据样本相同,只是特征的“看角度”不同,这正是多视图假设的体现。
Q4. 模型 A 筛选出的高置信样本应如何使用?
- A.直接丢弃避免噪声
- B.打上 A 的伪标签加入 B 的训练集← 正确答案
- C.打上 A 的伪标签加入 A 的训练集
- D.交由人工标注后使用
答案:B。Co-training 的核心动作是交叉互喂:A 的伪标签给 B 训练,B 的伪标签给 A 训练。加回自己训练集就退化成 Self-training;丢弃或人工标注则浪费了自动学习的价值。
Q5. 置信度阈值 τ 在 Co-training 中的主要作用是什么?
- A.加快模型收敛速度
- B.过滤低质量伪标签噪声← 正确答案
- C.防止梯度消失问题
- D.对输入数据做增广
答案:B。τ 是伪标签质量的闸门,只让预测概率超过阈值的样本进入交换。阈值过低会让噪声伪标签污染对方模型,过高则导致样本枯竭。它与收敛速度、梯度、增广无关。
Q6. 网页分类任务中,哪一组特征适合构成 Co-training 的双视图?
- A.正文内容与链接锚文本← 正确答案
- B.正文标题与正文摘要
- C.页面颜色与页面字号
- D.图片数量与图片大小
答案:A。正文内容与链接锚文本来源不同且互补,是经典的网页双视图。正文标题与摘要高度重合,不是独立视图;颜色字号等属于样式信息,与语义分类关联弱。
Q7. 以下哪些特征组合适合构成图像 Co-training 的双视图?
- A.颜色直方图← 正确答案
- B.形状轮廓描述子← 正确答案
- C.图像文件名称
- D.纹理特征← 正确答案
答案:ABD。颜色直方图、形状轮廓、纹理特征分别刻画图像的不同侧面,彼此独立且都有分类判别力,是合格的双视图。文件名与图像内容无关,不能作为有意义的视图。
Q8. 在 Blum-Mitchell 的 Co-training 理论分析中,若两个视图在标签下条件独立,且各视图弱分类器错误率均小于 1/2,则随着迭代,联合分类器错误率的变化趋势是?
- A.指数级趋近于零← 正确答案
- B.按 1/t 的速率线性下降
- C.收敛到某个固定正值
- D.先降后升无法稳定
答案:A。定理保证在“视图充分且条件独立 + 弱分类器错误率小于 1/2”前提下,Co-training 的错误率 err_t ≤ ε·η^t,即指数级趋近于零。这是 Co-training 优于 Self-training 误差累积的关键理论支撑。
Q9. 一次完整的 Co-training 迭代包含哪些步骤?
- A.两个模型分别在各自视图上训练← 正确答案
- B.各模型对未标注样本做预测← 正确答案
- C.筛选高置信度样本并打伪标签← 正确答案
- D.将所有未标注样本加入对方训练集
答案:ABC。前三步是标准流程:各自训练、预测未标注、筛选高置信度打伪标签。第四步错在“所有”——只有高置信度样本才会被选中交换,未标注样本不能无差别加入训练集。
Q10. 相比 Self-training,Co-training 的优势体现在哪些方面?
- A.双视角交叉验证可纠偏← 正确答案
- B.缓解伪标签错误放大← 正确答案
- C.完全不需要标注数据
- D.充分利用多源互补信息← 正确答案
答案:ABD。Co-training 用两个条件独立视图互相标注,错误不相关,因此能纠正单视角的系统性偏差、抑制错误放大,并利用多源信息。但它仍需要少量标注数据启动,不是“零标注”。