首页 / 资讯中心 / 文章详情

半监督学习实战:低成本利用无标注数据提升模型性能

半监督学习实战:低成本利用无标注数据提升模型性能 ★ FEATURED ARTICLE
很多做机器学习项目的朋友都遇到过同一个尴尬业务方甩来几十万条数据但标注好的只有几千条。老板还催着上线标注公司报价按条算钱预算根本扛不住。这种时候“半监督学习”是我最常想到的解法——它核心就一句话用少量的标注数据配合大量的无标注数据把模型效果硬生生抬起来。这篇内容适合所有正在被标注成本卡住脖子的算法工程师、数据科学从业者也适合刚接触机器学习、想知道“不标注数据到底还能不能训练模型”的学习者。我最早接触半监督学习是在一个图像分类项目里当时只有不到5%的数据带标签用了半监督的伪标签方案后效果直接和全量标注模型拉到了同一个水平线。后来在文本分类、异常检测场景里又试了几种不同流派的方法踩过不少坑也总结出一些实操门道。这篇文章就把我这几年的实践心得整理一遍从核心思路、方法选择、代码实现到问题排查一次说透。1. 内容整体设计与思路拆解1.1 半监督学习到底解决什么问题先想清楚一个根本问题机器学习模型靠什么变强靠数据尤其是带标签的数据。但现实世界里带标签的数据是奢侈品。以我做过的一个文本分类需求为例客户那边积累了上千万条客服对话记录但只有几百条是人工标过类别的。让业务团队手工标注一个人一天能标三四百条就算快的标完还得复核一致性一个月下来也就上万条跟千万级的池子相比杯水车薪。半监督学习的设计思路就是针对这种“标注数据严重不足未标注数据堆积如山”的工况。它不要求你去把无标注数据全部标一遍而是让模型自己从无标注数据里挖信息。原理层面靠的是三个核心假设聚类假设、流形假设和低密度分离假设。聚类假设说大白话就是相似的样本大概率属于同一个类别。流形假设更进一层高维数据本身嵌入在一个低维流形上在流形上距离近的点标签也接近。低密度分离假设则指决策边界应该穿过数据分布密度最低的区域而不是从稠密区域硬生生切开。这三个假设是半监督学习的基石。做方案选型前我会先拿着这些假设去对照业务数据看数据是否满足。比如做图像分类同一物体的不同姿态、光照变化在特征空间里通常是连续的、聚类的适合用半监督。但有些场景我会直接劝退比如数据本身是随机噪声、类别边界本身模糊不清、或者标注错误率特别高那半监督不但帮不上忙还可能放大错误。1.2 和监督学习、无监督学习的定位差异很多人容易把半监督学习和无监督学习搞混但它们的目标完全不同。无监督学习是要在没有标签的情况下发现数据的内在结构比如聚类、降维、异常检测输出的是结构本身。半监督学习则目标明确——训练一个分类器或回归器只是额外利用无标注数据来提升效果。更准确地说半监督学习处于监督学习和无监督学习之间它跟监督学习一样要训练一个预测模型但训练数据里混入了大量没有标签的样本它跟无监督学习一样要处理无标签数据但最终目的不是探索结构而是服务下游预测任务。在工程上我会把常见的应用场景分成三类。第一类是标注数据极少比如几百到几千条但有海量无标注数据典型场景是冷启动的文本分类、图像分类。第二类是标注数据有一定量比如几万条但通过半监督还能再提几个点典型场景是推荐系统里的用户行为预测。第三类是标签噪声较大借助无标注数据的一致性约束来抑制过拟合。这里还涉及一个工程要提前想清楚的点半监督学习不是所有场景的万能药它要求无标注数据与标注数据来自同一分布。如果无标注数据混入了大量无关领域的样本模型会学偏甚至出现灾难性遗忘。做项目调研时我会抽一批无标注数据出来人工看一眼确认分布一致性这个步骤不能省。2. 核心细节解析与实操要点2.1 四种代表性方法的适用边界半监督学习发展了这么多年成熟的方法大致可以归成四类自训练Self-training、协同训练Co-training、半监督SVM和图半监督方法。每类方法的底层逻辑和适用场景差异很大选错了就是在错误的方向上硬跑。自训练是最朴素也最容易落地的一种。流程很简单先用标注数据训练一个模型然后拿这个模型给无标注数据打伪标签把置信度高的伪标签样本加入训练集再重新训练模型循环往复。它的优点是不需要对模型结构做任何改动PyTorch、TensorFlow里随便一个现成分类器都能直接套。缺点是典型的“自我强化”问题——模型一旦在某个错误上形成倾向伪标签会反复放大这个错误。协同训练是自训练的加强版前提是特征可以自然地分成两个独立视图。比如网页分类既可以看网页文本内容又可以看链接的锚文本再比如图像分类可以同时用RGB特征和纹理特征。两个视图各自训练一个分类器互相给无标注数据打伪标签取置信度高的样本加入对方的训练集互相纠偏。这个方法的实现门槛稍高需要业务特征确实存在可分割的多视图结构。半监督SVMS3VM的思路是同时最小化有标注数据的分类损失和无标注数据的低密度约束。它在小规模数据集上效果好但在大规模深度学习场景下基本跑不动因为S3VM的优化目标非凸求解复杂大数据量下计算量完全不可控。图半监督方法则把全部数据有标注和无标注作为图的节点根据样本相似度建边然后让标签沿着图结构传播。这类方法在小规模数据上很优雅Label Spreading、Label Propagation都是典型实现但扩展到百万级节点时图的构建和存储成本非常高工程上一般会先用K近邻图或锚点图做近似。2.2 深度学习时代的主流流派一致性正则化如果项目用的模型是深度神经网络上述四种经典方法往往不是最优选择。近几年深度学习领域的主流半监督方案几乎都绕不开一致性正则化Consistency Regularization这个思想。一致性正则化的核心逻辑非常直观对同一个样本做两次不同的数据增强模型对这两个增强版本的预测结果应该保持一致。如果预测不一致就说明模型还没有学到足够鲁棒的特征可以据此构造损失函数来约束模型。这个想法源自一个简单观察一个真正的分类器不应该被微小的扰动影响输出。基于这个思想衍生出了好几个知名方法。时间集成Temporal Ensemble维护模型在每个样本上的历史预测均值用当前预测与历史均值的差异作为一致性损失Mean Teacher则用教师模型权重是学生模型的滑动平均的输出作为学习目标MixMatch则更进一步把数据增强、伪标签和MixUp增强整合到一个框架里也是我最近两三个项目里用得最多的一套方案。实操时我最常推荐的组合是基础的一致性正则如Mean Teacher思想或FixMatch里的弱增强/强增强对比 伪标签筛选。这种组合的好处是兼顾了两种信号一致性约束让模型在无标注数据上学习到平滑的决策边界伪标签筛选则给高置信度样本一个明确的类别指向。3. 实操过程与核心环节实现3.1 Pseudo-Labeling的完整代码骨架先从最基础的自训练伪标签方案讲起因为它是最容易跑通、也最适合作为基线的方法。我下面给出一段可以直接改的伪代码骨架用PyTorch风格写里面的思路适用于分类任务。import torch from torch.utils.data import DataLoader, TensorDataset # 假设 labeled_loader 是有标注数据的加载器 # unlabeled_tensor 是全部无标注数据的特征张量 def train_self_training(model, labeled_loader, unlabeled_tensor, threshold0.95, epochs10, pseudo_rounds5): for round_idx in range(pseudo_rounds): # 第一步用当前标注数据训练模型 model.train() for epoch in range(epochs): for x_batch, y_batch in labeled_loader: optimizer.zero_grad() logits model(x_batch) loss criterion(logits, y_batch) loss.backward() optimizer.step() # 第二步对无标注数据做预测 model.eval() pseudo_data [] with torch.no_grad(): for i in range(0, len(unlabeled_tensor), batch_size): x_batch unlabeled_tensor[i:ibatch_size] probs torch.softmax(model(x_batch), dim-1) max_probs, preds torch.max(probs, dim-1) # 阈值筛选只取高置信度的伪标签 mask max_probs threshold pseudo_data.append((x_batch[mask], preds[mask])) # 第三步把伪标签样本合并进标注集 if len(pseudo_data) 0: print(fRound {round_idx}: no pseudo labels passed threshold) break pseudo_x torch.cat([px for px, _ in pseudo_data], dim0) pseudo_y torch.cat([py for _, py in pseudo_data], dim0) combined_dataset TensorDataset( torch.cat([labeled_x, pseudo_x], dim0), torch.cat([labeled_y, pseudo_y], dim0) ) labeled_loader DataLoader(combined_dataset, batch_sizebatch_size, shuffleTrue)注意几个关键的细节。阈值设定直接决定伪标签的质量建议从0.95起步宁可每轮加入的伪标签少一点也不要让错误标签混进来。伪标签轮数不需要太多3到5轮基本就收敛了跑太多轮反而容易让模型在错误方向上越陷越深。每轮训练epoch数也不需要太大我就是每轮跑10个epoch就换下一轮因为伪标签加入后模型会重新调整。3.2 用一致性正则化把效果再抬一截伪标签方案简单但上限有限。我用过最顺手、效果提升最明显的是Mean Teacher和FixMatch风格的组合方案。核心代码如下import torch import torch.nn.functional as F # 弱增强和强增强的生成逻辑 # 弱增强一般用 RandomHorizontalFlip/Shift 就可以 # 强增强需要 RandAugment 或 Cutout 这类更激进的操作 def train_consistency(model, teacher_model, labeled_loader, unlabeled_loader, lambda_c1.0, threshold0.95): # 对无标注数据 batch # x_weak 和 x_strong 分别是同一批无标注样本的弱增强和强增强版本 for x_labeled, y_labeled in labeled_loader: try: x_unlabeled_weak, x_unlabeled_strong next(unlabeled_iter) except StopIteration: unlabeled_iter iter(unlabeled_loader) x_unlabeled_weak, x_unlabeled_strong next(unlabeled_iter) # 有标注部分走正常监督损失 logits_labeled model(x_labeled) loss_sup F.cross_entropy(logits_labeled, y_labeled) # 无标注部分用教师模型对弱增强输出作为伪标签来源 with torch.no_grad(): teacher_probs torch.softmax(teacher_model(x_unlabeled_weak), dim-1) max_probs, pseudo_labels torch.max(teacher_probs, dim-1) # 无标注部分强增强的预测要和伪标签一致 logits_unlabeled model(x_unlabeled_strong) loss_con F.cross_entropy(logits_unlabeled, pseudo_labels, reductionnone) mask (max_probs threshold).float() loss_unsup (loss_con * mask).mean() loss loss_sup lambda_c * loss_unsup loss.backward() optimizer.step() # 更新教师模型EMA方式 with torch.no_grad(): for p_teacher, p_student in zip(teacher_model.parameters(), model.parameters()): p_teacher.data momentum * p_teacher.data (1.0 - momentum) * p_student.data这里有一个点很重要EMA更新的momentum一般设成0.99或者0.999。momentum越大教师模型的权重更新越慢预测越稳定但也不能太慢否则适应不了学生模型的最新状态。我自己的经验是图像分类选0.999文本分类这种收敛快的选0.99。3.3 参数选择与计算的那些细节半监督学习里的几个关键参数直接决定最终效果。我把调参经验整理成一个参照表格参数推荐区间经验判断依据常见误区伪标签置信度阈值0.90–0.99观察加入伪标签后验证集准确率是否持续上升阈值太低会引入噪声阈值太高伪标签数量过少一致性损失权重 λ0.5–2.0有标注数据少时调大标注数据充足时调小权重过大会让模型过于平滑丢失细节无标注数据比例5–20倍于标注数据超过20倍后收益边际递减以为越多越好忽略分布漂移风险EMA momentum0.99–0.999训练震荡明显时调大设成0.9会让教师模型追踪过快失去去噪意义还有一类细节容易被忽略弱增强和强增强的差异度。如果增强差异太小一致性损失就没法提供有效学习信号如果差异太大模型可能直接学崩。我的做法是先单独验证增强管线——把增强后的样本可视化或人工抽看确认不改变语义再上线。4. 常见问题与排查技巧实录4.1 确认偏差伪标签越学越偏怎么办确认偏差Confirmation Bias是半监督学习里最经典的问题也是我在实际项目中遇到最多的坑。表现是模型先在容易学习的样本上打出高置信度伪标签然后这些伪标签又反过来强化模型的既有偏好导致模型对困难样本彻底失去认知能力。我自己踩过最惨的一次是做一个多类别图像分类。初始模型在类别A和类别B上很容易混淆伪标签筛选时模型对这两类样本给出的置信度都不高所以它们没有被选入训练集这反而让模型更偏向于已经学会的类别C和类别D。几个轮次下来模型对A和B的准确率几乎降到了随机水平。后来我总结了一套排查和规避的流程。第一伪标签加入前一定要做类别分布统计如果伪标签里某类占比异常高大概率是模型偏科了需要人工干预。第二每轮训练后单独看每个类别的验证集准确率而不是只看整体准确率这个习惯帮我抓到了很多早期问题。第三考虑给伪标签样本设置更低的损失权重比如只让伪标签样本对模型更新贡献0.3倍的梯度这比全权重更稳。还有个笨但有效的办法把伪标签和真实标签做成不同颜色可视化到特征空间里比如用t-SNE投影。肉眼一看就知道伪标签是不是沿着真实标签的边界分布有没有大量越界。这个方法不需要写复杂代码但能帮你在调试时快速建立直觉。4.2 数据增强策略怎么选才不容易翻车一致性正则化方法高度依赖数据增强但增强策略选错了效果直接崩。我在文本分类项目里就翻过车给文本做了回译增强但对某些专业术语回译后产生了错别字而模型因为一致性损失被强制要求对这些错版样本输出相同预测最终学走了样。我的经验是分场景选增强策略。图像任务首选随机裁剪、翻转、颜色抖动、RandAugment的组合其中RandAugment的效果基本是稳定的。文本任务不要只依赖同义词替换回译、EDA或者语言模型生成的对抗增强更实用但必须抽样检查增强后的语义是否保留。时序数据则更小心时间序列增强一定要做到标签不变比如对幅值扰动、时间弯曲这类方式要做验证。增强强度也要控制不能一味往狠了调。我在一个OCR任务里试过把RandomErasing的遮挡比例调到0.5结果模型强行学成了“会脑补被遮挡的字符”但真实场景根本没那么多遮挡过拟合了增强本身。4.3 踩坑速查表从训练曲线到性能指标的排查清单再分享一些通用排查方法当半监督学习效果不理想时按下面的顺序一个个对通常能快速定位问题排查维度检查方法常见结论分布一致性可视化无标注数据和标注数据在特征空间的分布或者用密度估计对比分布差异大时先做无监督预训练或过滤再上半监督伪标签质量每轮抽样人工看100条伪标签样本错误率超过5%时优先调阈值或增强策略训练曲线对比有标注数据组成的小验证集在每轮后的loss曲线loss先降后升说明过拟合直接震荡说明训练不稳定类别均衡性统计伪标签的类别分布严重不均衡时考虑类别加权损失或重采样梯度规范监控无标注损失的梯度范数占比无标注损失梯度过大说明lambda太大了或伪标签噪声过高其中梯度范数这个维度比较容易被忽略。我一般每50步打印一次有监督损失和无监督损失各自反传的梯度L2范数如果无监督部分贡献的梯度一直比有监督部分高10倍以上基本可以判定一致性约束过强模型在“为一致而一致”而不是学特征。这个判断比单纯看loss数值要可靠得多因为loss的量级受不同任务影响很大但梯度占比直接反映了两部分对更新的实际影响权重。5. 其他值得关注的半监督变体与扩展方向5.1 从分类任务到回归任务的迁移策略前面聊的方法主要集中在分类场景但半监督学习同样适用于回归任务做法稍有不同。分类任务里我们通过置信度分数筛选伪标签回归任务没有类别置信度这个概念常规做法是利用模型对无标注样本的预测方差来度量不确定性。一个可落地的方案是训练一个带随机丢弃层Dropout的回归模型对每个无标注样本多次前向推理得到一组预测值它的方差就可以用来表征不确定性。方差小的样本伪标签价值高方差大的样本先不纳入训练。这个思路本质上是把分类场景里的“高置信度”换成了“低不确定性”其余流程几乎一致。另一种做法就是用集成模型。训练两三个结构稍微不同的模型比如不同深度或不同随机种子对无标注数据分别预测用多模型预测的一致性作为伪标签可靠性度量。这个方法在工程上实现比多次Dropout更直观只是训练成本线性增加。5.2 半监督和预训练、自监督的关系现在做半监督项目很难绕开预训练模型和自监督学习。这三者不是替代关系而是递进关系先用大量无标注数据做自监督预训练比如CLIP式的对比学习、掩码语言模型让模型学到通用的特征表示再用少量标注数据做有监督微调最后在微调基础上叠加半监督伪标签或一致性约束把剩余的无标注数据价值再榨一遍。我目前做项目基本是这条完整链路。自监督预训练负责构建优质特征空间半监督负责在特征空间里充分利用无标注样本的分布结构。这两者叠加的效果不是简单加法因为自监督预训练已经让模型具备不错的判别力此时半监督的置信度筛选会更准确伪标签的整体质量也随之提高。这不是让大家每个项目都从头训一遍预训练模型。大多数场景直接用开源的预训练模型做初始化就够了半监督环节的增量收益依然主要在特征空间的尾部也就是模型还分不太清的那部分样本。5.3 多标签场景和极端不平衡场景的适配思路最后再补充两个偏进阶的场景。多标签分类里一个样本同时属于多个类别伪标签筛选逻辑要从“整样本置信度”改成“逐标签置信度”。具体来说对每个标签单独过阈值某一标签过线就只把这个标签的伪标签加入训练同一类别的其他标签如果没过就忽略。这种逐标签筛选方式能显著减少多标签场景下的伪标签噪声。极端不平衡场景则要小心另一件事模型天然倾向于给高频类打高置信度所以伪标签里高频类会越来越多低频类逐步被挤到边缘。此时可以把伪标签阈值改成按类别设定高频类的阈值调高到0.98低频类的阈值调低到0.85以平衡样本难度差别。6. 半监督学习应用效果的影响范围分析6.1 节省标注成本最直接的价值落地半监督学习对项目影响最大最直接的一个方面就是显著降低数据标注成本。我做过一个银行领域的文本分类项目当时业务方给的需求是要区分客户工单属于咨询还是投诉细分下来有十几个子类别。最初全量标注的报价超出预算三倍多项目几乎无法启动。后来我们改了方案人工只标注了1200条种子数据然后用FixMatch风格的一致性正则方式结合内部积累了八九万条历史工单全部无标签最后模型在留出测试集上的宏F1做到了0.87而同期用1200条数据纯监督训练只能做到0.79。标注成本直接缩减到原来的三分之一左右。这个案例的价值不在于具体数字而在于给团队提供了一种新的选项不是所有项目都必须等标注完成才能启动。先让半监督模型跑起来在标注预算到位的过程中测试集和评估机制就已经建立后续持续补充标注数据、持续提升这也是我在实际项目里非常推荐的工作模式。6.2 对模型鲁棒性和泛化能力的影响半监督学习除了能省成本对模型鲁棒性的影响也值得专门说。一致性正则化天然要求模型在输入扰动下保持预测稳定这种训练方式实际上是一种隐式的正则化等价于给模型加了一个平滑性先验。我明显感觉到用半监督方案训练出的模型在业务数据分布发生小范围漂移时性能衰减比纯监督模型慢得多。有过一次线上流量潮汐导致特征分布变化的经历当时对比了两套模型一套是用5万条标注数据纯监督训练另一套是1.2万条标注40万条无标注数据的半监督训练。线上数据显示当特征发生偏移时纯监督模型准确率掉了8个点半监督模型只掉了3.2个点。原因也不难理解——半监督模型在被大量无标注数据的增强扰动“训练”过之后对分布变化更钝感。6.3 对项目流程和工程架构的连锁影响半监督学习不只是算法层面的改动它对整个项目流程也会产生一系列连锁影响最明显是数据管线。传统项目通常是“收集数据 → 标注 → 训练 → 上线”半监督项目则需要增加一条平行的“无标注数据管理 → 伪标签生成 → 伪标签质量监控”流水线。这会带来数据版本管理的新挑战伪标签不是静态的它会随着模型迭代而更新。我在工程实践中形成的习惯是把无标注数据池做成独立的存储模块每次模型产出的伪标签单独存一份快照带上模型版本号和产出时间这样即使后续发现问题也能回溯是哪一版模型的伪标签污染了训练集。这个习惯也便于做模型对比——不同方法的伪标签质量差异往往比最终指标差异更值得分析。算力方面也有影响。一致性正则化需要同时跑弱增强和强增强训练成本大概是纯监督的2到3倍但对大多数业务场景来说这个成本仍然远低于标注成本。如果用教师模型Mean Teacher方案还需要多存一份模型参数做EMA显存开销会增加30%左右在选型时要提前规划好。6.4 不同领域应用差异图像、文本与时序场景从我横跨几个行业的经验来看半监督学习在不同领域的效果差异非常大。图像领域是效果最好的。原因在于图像数据天然适合强增强RandAugment、Cutout这类手段能构造出足够有挑战性的增强样本一致性正则化的学习信号很充足。我在图像分类、目标检测、分割任务上都验证过半监督普遍能带来显著收益。文本领域的效果取决于预训练语言模型的介入程度。如果用BERT类模型做初始化加上回译和掩码增强半监督收益中等偏上如果直接训随机初始化的网络一致性正则化的信号会弱很多。我的经验是文本任务最好选Threshold-based的伪标签方案搭配少量高质量增强而不是一味堆一致性损失。时序数据是最棘手的。增强方式受限随机裁剪和时间弯曲容易破坏时序依赖无标注数据的价值又极依赖于数据平稳性。时间序列里非平稳的片段太多了分布假设很容易被破坏。我做时间序列异常检测的半监督方案时必须额外引入一个趋势判断模块把明显非平稳的片段过滤掉不然一致性损失的约束会出现系统性偏差。7. 调试工具与实验管理建议7.1 从A/B Test思维提效的实验管理策略半监督学习的实验维度比纯监督学习多不少——阈值、增强策略、一致性权重、轮数、无标注数据池大小这些因素交叉起来很容易让人迷失。我用的是类似A/B Test的思维来管理实验每次只改一个变量其他条件锁死。最开始踩过的一个坑同时改了增强策略和伪标签阈值发现效果提升了一个点但完全不知道是哪个改动带来的后续想复用都找不到依据。从那以后我定了规矩先固定一组基线参数然后每个实验只动一个变量并且对每个变量多做几个档位的搜索。比如调阈值就固定增强策略不动跑0.90、0.93、0.95、0.97四档画出一条准确率随阈值变化的曲线再决定下一步。7.2 训练曲线诊断技巧训练曲线观察上半监督学习比纯监督训练需要更多敏感性。重点观察两条曲线有监督损失和无监督损失的下降趋势关系。有价值的模式是有监督和无监督损失同步稳步下降两者处于一种“共振”状态。比如训练50个epoch时有监督损失从0.7降到0.3无监督一致性损失从0.5降到0.2。这种曲线说明无标注数据正在帮助模型学到更鲁棒的特征。问题模式也很固定。如果无监督损失快速趋近于零——比如前20个epoch直接掉到0.01那么模型多半是被强制“学到了”增强样本之间的对应关系而不是学到语义特征。这时我会立即降低一致性权重或者增强强增强的强度把一致性任务重新变得有挑战性。如果无监督损失迟迟不降则要检查是伪标签质量太差还是增强策略太激进导致模型学不过来。7.3 最小可行实验清单给想快速验证半监督学习是否适合自己项目的朋友一份最小可行实验清单。这个方案不需要太复杂大约两三天能跑出一轮结果。第一步准备数据。从业务数据里抽2000条标注数据作为标注集另外准备5000到2万条无标注数据同时留出一部分有标注数据做测试。第二步搭基线。用相同标注集跑一遍纯监督训练记住效果。第三步修改代码。在基线上加入伪标签筛选逻辑阈值从0.95开始试同时把无标注数据分批量轮流加入训练。第四步比较结果。如果半监督方案跑出的测试指标明显优于纯监督基线再进一步加入一致性正则化和更强增强。如果效果不明显甚至更差先回到这张清单前面的章节核查数据分布和增强策略是否合理。这套流程能帮你在最短时间内判断半监督学习在你的场景里到底值不值得投入。我的经验是大约三分之一场景跑出来会非常惊艳接近三分之一场景和基线持平还有三分之一场景完全不适合。做一轮小规模验证比闷头调半天参数强得多。半监督学习是我这几年认为性价比最高的机器学习方向之一尤其是工业界标注预算普遍吃紧的大背景下它的用武之地只会越来越大。从我个人的体会来说选方法不要贪新求贵先把自训练和一致性正则这两条主线做扎实把伪标签质量和分布一致性管好大部分项目的效果都能压榨出令人满意的增量。最后再分享一个小技巧项目上线后把每一轮模型产出的伪标签样本以及它们的预测置信度都存下来定期和真实标注交叉检验这个习惯能帮你持续保持模型的健康状态。半监督是一个“越用越懂”的方向跑过的项目越多你对那三个核心假设的体感就越准模型效果也就越稳。
阅读完成 · 觉得有帮助?
咨询建站