想象你是一家新开餐厅的老板,想研发一道招牌菜。你请不起米其林顶级评审团(昂贵的专业标注团队),只雇得起几位口味特殊、各有偏好的街坊食评员——有人嗜辣,有人爱甜,有人对食材新鲜度特别敏感。单独看,每个食评员的评价都不够全面,甚至互相矛盾。但如果你聪明地把他们的意见汇总分析,就能逐渐逼近“大众口味”的真实评价。 这正是 Snorkel 框架解决的核心难题:当你的 AI 模型需要海量标注数据,而人工标注又贵又慢时,与其雇佣“顶级评审团”,不如培养一群“单维度专精的普通食评员”,再设计一套规律把他们的意见智慧地融合起来。这个方法,业界称之为弱监督数据编程。 Snorkel 让你用“写规则”代替“逐条标注”:你只需写几十条粗糙的标注函数,就能为百万级数据自动生成标签。这就像给食评员们发一张打分卡让他们各自打分,最后你用一个“总评审模型”把各方的偏爱与偏见综合起来,得到一份接近真相的名单。

岗位关联

掌握弱监督数据标注能让 AI 工程师在预算极其有限时,用领域知识和规则撬动大规模训练数据,是提升数据效率的必备武器。

目录
  1. 可视化演示
  2. Snorkel是什么
  3. 标注函数学习
  4. 数据编程流程
  5. 标签模型与学习
  6. 框架对比分析
  7. 应用场景与局限
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示Snorkel弱监督数据标注的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Snorkel弱监督数据标注:Snor Snorkel框架概述 Snorkel框架原理 核心机制可视化 Snorkel弱监督数据标注整体架构与关键组件

Snorkel是什么

如果说传统监督学习是请米其林评审团一道菜一道菜地品尝打分,那 Snorkel 就像是召集了一群口味各异的街坊食评员,让他们按自己擅长的角度批量评价菜品。这些食评员的评价可能片面、可能矛盾,但你用数学方法把他们的意见“综合加权”,就能得到接近大众口味的结论。这就是弱监督数据编程。

在 AI 领域,数据标注往往是最耗时耗钱的环节。Snorkel 由斯坦福大学发布,核心思想是:把写标签的过程变成“写程序”。你编写一些粗糙的规则函数(称作标注函数 LF),让它们自动为未标注数据生成标签,然后训练一个标签模型去学习这些标注函数的准确性、冲突性、相关性,最终为每条数据产生一个高质量的合成标签。

Snorkel 框架的三大核心组件包括:标注函数(写规则的人)、标签模型(综合意见的主厨),以及下游训练模型(真正接受数据训练的 AI 系统)。你用几十条简单的 Python 规则,就能替代几十万条手工标注,这就像用几位街坊的集体智慧,逼近米其林评审团的判断力。

1. 后验概率:表示给定所有标注函数输出时,样本真实标签的条件概率分布

P(y∣λ1,...,λm)P(y \mid \lambda_1, ..., \lambda_m)

2. 标注函数集合:每个 $\lambda_i$ 是第 $i$ 个标注函数对某样本的输出值

λi∈{−1,0,1}\lambda_i \in \{-1, 0, 1\}

3. 最大值选择:取使后验概率最大的标签作为最终预测标签

y^=arg⁡max⁡yP(y∣λ1,...,λm)\hat{y} = \mathop{\arg\max}_y P(y \mid \lambda_1, ..., \lambda_m)

这就像主厨综合街坊们的意见,给每道菜一个综合评分,去掉嗜辣食评员对甜品的偏见,保留它对辣的敏锐判断。Snorkel 的本质,就是这种“去偏见、学权重”的自动化决策过程。

标注函数学习

每位食评员都有自己的“专属技能”——有人只评价面条的筋道程度,有人只关心汤头的咸淡。在 Snorkel 中,这个“专属技能”就是标注函数(Labeling Function, LF)。LF 本质上是一个 Python 函数,输入是一条待标注数据,输出是标签(如正例、负例或弃权)。

上面这个函数就是一个典型的 LF 例子:如果文本中出现“辣”字,就认为这条评论是正面情绪。它当然很粗糙——可能把“不够辣”的差评也误判为正例。但没关系,Snorkel 的设计哲学就是允许规则不完美,只需要比随机猜测好一点即可。

在设计 LF 时,常见模式包括关键词匹配、正则表达式、外部知识库查询、轻量模型推理等。你可能会写 20 条覆盖不同角度的 LF,期望它们之间有重叠、有冲突。Snorkel 的标签模型会自动学习每个 LF 的准确率和相关结构,这就好比主厨知道谁擅长什么,谁的判断容易与谁一致,然后有的放矢地分配权重。

覆盖率和冲突是设计 LF 时必须考虑的两个维度。覆盖率指某条 LF 能标记多少比例的数据;冲突则指不同 LF 给出相反标签的情况。Snorkel 并不会把冲突视作垃圾,反而把它当作学习 LF 相关性结构的重要信号。

一个 LF 就是一份“偏好问卷”,它只回答一个窄问题。主厨不需要问卷设计得完美无缺,而是要有足够多样的问卷覆盖面,然后通过综合模型纠偏。这也正是 Snorkel 与人工标注最大的差异——人工要求“每次都对”,Snorkel 只要求“有判断力即可”。

覆盖率=被 LF 标记的样本数总样本数\text{覆盖率} = \frac{\text{被 LF 标记的样本数}}{\text{总样本数}}
在 Snorkel 中,不必追求每条 LF 都完美,关键是“多而杂”。模型会自己学会如何拧干这些湿毛巾里的水分。
  1. 覆盖率定义衡量标注函数对数据集的标记程度,覆盖率太低意味着该 LF 作用有限
    覆盖率=N标N总\text{覆盖率} = \frac{N_{\text{标}}}{N_{\text{总}}}
  2. 分子分母含义$N_{\text{标}}$ 是被该 LF 标记的样本数,$N_{\text{总}}$ 是全部数据量
python4 行
def LF_keyword_spicy(x):    if '辣' in x['text']:        return 1    return 0

数据编程流程

Snorkel 提供了一套完整的数据编程pipeline,就像餐厅的一条标准化流水线。整个流程可以用一个清晰的框架来概括:从原始数据出发经历预处理、抽象语法树建模、标注函数应用、矩阵生成、标签模型训练、最终输出概率化训练集。

第一步是写标注函数。你对原始数据编写多个 LF,它们接收原始文本或结构化数据,输出标签或弃权。第二步,Snorkel 将全部 LF 应用于数据集,生成一个标注矩阵,矩阵的行是样本,列是 LF 的输出。在这个矩阵中,每个元素记录某条 LF 对某个样本的投票。

第三步,把这些“投票”交给标签模型。Snorkel 默认使用一个生成模型来学习 LF 的准确率与相关性,并输出每个样本在不同类别上的概率分布。第四步,用这些概率化标签作为训练数据,去训练一个下游判别模型(如 BERT、CNN 等)。整个 pipeline 的核心是:把“人工标注一例一例做”变成“规则批量生成,模型自动纠偏”。

| 阶段 | 输入 | 输出 | 比喻 |

|------|------|------|------|

| 写 LF | 原始数据+领域知识 | 标注函数集 | 选择食评团成员 |

| 应用 LF | 数据集+LF | 标注矩阵 | 收集所有人的评分卡 |

| 训练标签模型 | 标注矩阵 | 概率标签 | 主厨综合意见 |

| 训练判别模型 | 概率标签 | 下游模型 | 按大众口味烹饪 |

1. 联合分布:所有样本的真实标签 $Y$ 在给定标注矩阵 $\Lambda$ 下的概率被拆分为各样本独立概率的乘积

P(Y∣Λ)=∏i=1nP(yi∣λi)P(Y \mid \Lambda) = \prod_{i=1}^{n} P(y_i \mid \lambda_i)

2. 单样本概率:对每个样本 $i$,基于其对应的所有 LF 输出向量 $\lambda_i$ 来计算标签 $y_i$ 的概率

这条流水线把复杂的整体问题分解为清晰的阶段。每当数据量膨胀,你只需在流水线开端增加几条 LF,流水线末端就能批量产出标签。相比人工逐条标注的“手工作坊”,Snorkel 是名副其实的“数据工厂”。

标签模型与学习

标签模型是整个 Snorkel 流程的“主厨评审会”。它做的事情是:当多个食评员给出互相矛盾的评价时,如何综合出真正的口味真相。在数学上,这被建模为一个生成模型——模型假设每个标注函数都有自己的准确率参数和误差相关性,然后通过观测到的标注矩阵来估计这些参数。

具体地,Snorkel 使用了一个可扩展的生成模型对 LF 的依赖结构进行建模。它将 LF 的准确率视为潜变量,用 EM 算法(期望最大化)求解。这个模型不需要人工提供任何真实标签数据,仅依赖 LF 之间的统计关系就能推断出每个 LF 的可靠程度。这一步非常像主厨根据食评员们历次评价的偏离程度,推断出谁在哪些维度上过度敏感或不够敏感。

概率校准是标签模型的另一个关键能力。通常,标签模型输出的不是确定性的 0 或 1,而是一个概率分布(如 $P(y=1)=0.85$)。这个概率值反映了模型对该标签的信心,下游模型在训练时可以利用这种软标签(soft label)获得更平滑的决策边界。

其中 $\sigma$ 是 sigmoid 函数,$w$ 是各 LF 的权重向量,$b$ 是偏置。这就像主厨给每位食评员分配了权重系数——有些人权重高,有些人权重低,最终综合打分。

总而言之,标签模型就是 Snorkel 最核心的“不确定性折价器”。它把多个有噪声的信号转化为一个清晰、概率化的判断,让 AI 系统在训练时具备更强的鲁棒性。

P(y=1∣λ(x))=σ(w⋅λ(x)+b)P(y=1 \mid \lambda(x)) = \sigma(w \cdot \lambda(x) + b)
  1. sigmoid 映射将任意实数映射到 (0,1) 区间,作为正类概率
    σ(z)=11+e−z\sigma(z) = \frac{1}{1+e^{-z}}
  2. 线性加权$w \cdot \lambda(x) + b$ 是对各 LF 输出做带权求和
  3. 概率输出最终结果是一个概率值,反映数据的正类置信度

框架对比分析

Snorkel 与主动学习经常被拿来对比,因为它们都致力于减少标注成本。但你想象两种截然不同的策略:主动学习像是主厨亲自去问每一位顾客“您对我这道菜有何意见?”,然后有针对性地改进;而 Snorkel 则是主厨直接召集食评团,批量听取意见后综合判断。前者是“逐条精询”,后者是“批量收集”。

在成本模型上,主动学习通常需要你有一个初始模型,并且每轮迭代都要获取新标签来训练,整个过程与人类标注者互动频繁,延迟较高。Snorkel 则通过一次性编写 LF 并离线训练标签模型来生成海量标签,适合一次性构建大规模训练集的场景。前者在预算充足、追求极限精度时更优;后者在冷启动阶段或标注预算极度受限时,能以极低边际成本快速产出可用数据集。

数据质量权衡上也不同。主动学习通过选最有价值样本给专家标注,可以获得高质量但数量有限的标签;Snorkel 生产的数据虽然量大但含噪,需要依赖标签模型和判别模型的鲁棒性来吸收噪声。简单说,Snorkel 用“量的积累”换取“质的一般化”。

| 维度 | Snorkel | 主动学习 |

|------|---------|----------|

| 核心模式 | 批量规则标注 | 交互式精选标注 |

| 依赖标注人员 | 低(规则由工程师写) | 高(需人工逐条) |

| 标签量 | 百万级可扩展 | 千到万级 |

| 标签质量 | 含噪但可控 | 高质量 |

| 最佳时机 | 冷启动、预算少 | 已有模型、预算充足、需精调 |

应用场景与局限

Snorkel 在自然语言处理、计算机视觉、医疗文本处理等领域都有广泛的实战应用。比如在情感分析任务中,你可以写几条 LF:出现“好评”两个字判正例,出现“差评”判负例,出现“快递”认为与物流相关——几条简单规则就能为百万条评论生成训练标签。

在NLP领域,Snorkel 常被用于文本分类、实体识别、关系抽取等任务。比如在新闻分类任务中,使用关键词和正则能快速建立训练集。在CV领域,Snorkel 也可用于图像分类标注,比如通过图片的 EXIF 信息、文件来源等元数据编写 LF,为图片打粗略标签。医疗场景中,医院拥有海量电子病历文本,但几乎没有可用的标注数据。医生团队可以快速编写基于 ICD 编码关键词、药物名称库的 LF,为病历自动标注疾病类型,再训练一个 NER 模型抽取诊疗实体。

但 Snorkel 也有明显的边界。首先,它默认你拥有能够表达领域知识的“规则编写者”——如果领域专家本身无法清晰表达判断依据,LF 的质量就难以保证。其次,冷启动阶段如果没有先验知识,LF 的覆盖率可能非常低。另外,对于极复杂语义的任务(如讽刺识别、意图理解),简单的 LF 可能无法有效捕捉特征,标签模型的纠偏能力也有限。

1. 收益定义:使用 Snorkel 获得的净收益是节省的人工标注成本与引入的噪声成本之比

2. 分子与分母:标注成本节省来自批量自动化,噪声成本来自 LF 不准确带来的错误训练标签

因此,Snorkel 最适合“规则可表达、数据量巨大、人工预算有限”的三重场景。它不是万能的,但在正确的场景中,确实能以极低成本撬动巨大的数据价值。

AI 应用场景

医疗文本病历分类

阶段:数据准备与标注阶段

解决的问题:医院的电子病历(EMR)数据量巨大,但绝大多数是无标注的纯文本。传统做法需要医生逐条阅读病历并标注疾病类型,耗时昂贵;且高年资医生时间宝贵,无法承担大规模标注工作。Snorkel 允许医生编写关键词/模式规则自动生成大量标注数据,将医院积累的历史病历转化为可训练的数据资产。

具体案例:某医院需要构建一个肺炎分型模型。医生团队编写了若干条 LF,比如包含“肺部感染”“双肺阴影”等关键词标记为细菌性肺炎;包含“磨玻璃影”“病毒”等标记为病毒性肺炎。Snorkel 对 30 万份历史病历自动生成标签,训练出一个 F1 值达 0.89 的分类模型。

电商评论垃圾分类

阶段:监督数据构建

解决的问题:电商平台每天产生百万级用户评论,需要将其分为“好评”“差评”“中评”。人工抽取标注需要巨大的运营成本。通过 Snorkel,运营人员将积累的评论经验转化为规则,快速构建分类模型。

具体案例:某电商平台运营团队写了 30 条 LF——包含“太棒了”“朋友推荐”等判为好评;包含“退货”“失望”“客服差”判为差评;包含“一般”“还行”判为中评。Snorkel 在三天内为一周产生的 50 万条评论生成了训练集,训练出的分类模型在人工抽检中达到 95% 以上的一致率。

Python 演示

python56 行
import refrom snorkel.labeling import labeling_function, PandasLFApplierfrom snorkel.labeling.model import LabelModelimport pandas as pd # 模拟数据集df = pd.DataFrame({    'text': [        "这家餐厅的菜太棒了,下次还会来!",        "上菜速度极慢,体验很糟糕。",        "味道还不错,就是排队有点久。",        "服务员态度很差,不会推荐朋友来。",        "性价比很高,值得一试。",    ]}) # 定义标签:正例=1,负例=0,弃权=-1POSITIVE = 1NEGATIVE = 0ABSTAIN = -1 @labeling_function()def lf_keyword_praise(x):    """关键词好评"""    if any(w in x['text'] for w in ['太棒了', '值得', '推荐']):        return POSITIVE    return ABSTAIN @labeling_function()def lf_keyword_complain(x):    """关键词差评"""    if any(w in x['text'] for w in ['糟糕', '失望', '差', '慢']):        return NEGATIVE    return ABSTAIN @labeling_function()def lf_regex_pos(x):    """正则:感叹号+正面词"""    if re.search(r'[!!].*(棒|好|赞)', x['text']):        return POSITIVE    return ABSTAIN # 应用标注函数lfs = [lf_keyword_praise, lf_keyword_complain, lf_regex_pos]applier = PandasLFApplier(lfs)L_train = applier.apply(df=df) # 训练标签模型(生成模型)label_model = LabelModel(cardinality=2, verbose=True)label_model.fit(L_train=L_train, n_epochs=100, seed=123) # 生成概率化标签probs = label_model.predict_proba(L=L_train)df['pred_label'] = probs.argmax(axis=1)df['pred_prob'] = probs.max(axis=1)print(df)
目的:展示了使用 Snorkel 构建弱监督数据标注流水线的完整例子——从定义标注函数、应用标注函数到训练标签模型并生成概率化标签。
  1. from snorkel.labeling import labeling_function导入装饰器,将普通 Python 函数转化为标注函数。
  2. @labeling_function()装饰器标记一个函数为 LF,Snorkel 会识别并纳入标注流程。
  3. PandasLFApplier(lfs)批量应用所有 LF 到 DataFrame 数据集上,生成标注矩阵。
  4. L_train = applier.apply(df=df)执行应用过程,得到每行样本在每条 LF 下的标注结果。
  5. LabelModel(cardinality=2, verbose=True)创建标签模型,cardinality=2 表示二分类任务。
  6. label_model.fit(L_train=L_train, n_epochs=100, seed=123)训练标签模型,学习各 LF 的隐含准确率与相关性。
  7. label_model.predict_proba(L=L_train)为每条样本输出概率化标签分布,作为后续训练数据。

常见误区

误区很多初学者认为标注函数写得越多、每条规则越精细,最终生成的标签质量就越高。于是他们花费大量时间打磨几十上百条规则,试图覆盖每个边界情况。

正解Snorkel 的设计哲学与“多而精”恰恰相反,它提倡“多而杂”。标注函数的价值在于提供多样化的弱信号,而标签模型会自适应地学习每个 LF 的权重。真正重要的不是单条 LF 完美,而是 LF 之间的多样性和互补性。在极端情况下,几十条粗糙规则的效果远超两条“完美”规则。

为何常见:从传统编程思维出发,人们习惯性地认为“规则越细,结果越好”。但 Snorkel 的本质是统计学习,冗余且高度相关的 LF 反而可能让标签模型难以区分它们各自的贡献。

误区有人认为有了 Snorkel,就再也不需要任何人工标注了——直接写几条规则就能搞定一切。

正解Snorkel 的目标是“最大化减少”而非“完全消除”人工标注。你仍然需要:

为何常见:人们听到“自动标注”时容易产生“全自动”的浪漫想象。但实际上 Snorkel 只是把人工标注工作转化为规则工程和验证任务,它是一种工作重心的转移,而非彻底消失。

误区初学者容易把 Snorkel 输出的概率化标签当成了 ground truth,直接拿去评估模型在测试集上的效果。

正解Snorkel 生成的标签始终是含噪的合成标签,它们的质量上限取决于 LF 的质量。正确做法是:预留一小部分人工标注的验证集,用它与 Snorkel 生成的标签对比,或用它对标签模型进行校准。这些概率标签应用在训练集和验证集上,绝对不能替代测试集的人工标注。

为何常见:因为 Snorkel 的使用过程太“顺滑”了——输入数据,输出标签,看起来就像自动标注工具。但“看起来像标签”不等于“真实标签”,这种认知差距容易导致评估偏差。

误区很多人认为 Snorkel 的标注函数只能是简单的关键词或正则匹配,因而怀疑它在深度学习任务中的实用性。

正解标注函数可以是任意 Python 函数,这意味着你可以调用任意库、查询外部知识库、调用另一模型等——只要它输出 -1/0/1。比如一条 LF 可以调用一个小型的预训练模型来输出标签;可以查询数据库中的已知模式;可以执行复杂的业务逻辑。

为何常见:Snorkel 文档中的示例通常以关键词匹配为主(因其便于教学),导致初学者的认知被局限在“简单规则”层面。

面试题

Q1. Snorkel 的核心思想是什么?

单选题 · easy

  • A.用主动学习选择最有价值的数据标注
  • B.用标注函数自动生成含噪标签再合成干净标签← 正确答案
  • C.用大规模人工标注提升模型精度
  • D.用无监督聚类自动给数据分类

答案:B。Snorkel 的核心思想是“数据编程”——编写多个低质量的标注函数(LF)为数据自动生成含噪标签,再用标签模型对这些含噪标签进行融合纠偏,最终得到高质量的训练数据。B 项准确描述了这一过程,其他选项分别属于主动学习、传统人工标注和无监督学习的范畴。

Q2. 在 Snorkel 中,标注函数(LF)的输出可以有哪些取值?

多选题 · mid

  • A.正例标签(如 1)← 正确答案
  • B.负例标签(如 0)← 正确答案
  • C.弃权(如 -1)← 正确答案
  • D.任意浮点数

答案:ABC。Snorkel 的 LF 输出必须是离散的标签值:正例(1)、负例(0)或弃权(-1)。弃权表示该 LF 对此样本无法判断。LF 不应输出连续值分数,因为标签模型假设输入为类别投票,设计为处理此类离散输出。

Q3. 标签模型(Label Model)在 Snorkel 中主要解决的问题是什么?

单选题 · mid

  • A.直接训练最终的分类模型
  • B.学习多个标注函数之间的准确率与相关性← 正确答案
  • C.对原始数据进行特征工程
  • D.消除所有标注函数的噪声

答案:B。标签模型是一个生成模型,它通过分析标注矩阵中各 LF 的统计关系,估计每个 LF 的准确率、倾向性以及它们之间的相关性,从而为每条数据生成融合后的概率标签。它不直接训练下游判别模型,也不做特征工程;“消除所有噪声”是不现实的,标签模型的作用是"吸收''噪声。

Q4. 下面哪个场景最适合使用 Snorkel?

单选题 · mid

  • A.只有100条数据且预算充足,追求最高精度
  • B.有100万条无标注数据,预算极其有限却拥有领域规则专家← 正确答案
  • C.数据已有完整的人工标注,想训练深度学习模型
  • D.需要实时的数据标注反馈以交互式改进模型

答案:B。Snorkel 最适用的场景是“海量无标注数据 + 有限的标注预算 + 可表达的领域规则”。选项 A 数据量少可以直接人工标注;C 已有标注无需 Snorkel;D 描述的是主动学习的特征。只有 B 满足 Snorkel 的核心适用条件——大语料、小预算、有规则可写。

Q5. 以下关于 Snorkel 中“覆盖率”的说法,正确的有?

多选题 · hard

  • A.覆盖率 = 被某条 LF 标记的样本数 / 总样本数← 正确答案
  • B.覆盖率越低说明 LF 越精准
  • C.覆盖率太低会导致 LF 在标签模型中的可学习信息不足← 正确答案
  • D.覆盖率与准确率是同一概念

答案:AC。覆盖率度量的是 LF 能作用的样本范围,A 项定义正确。B 不正确,覆盖率低不一定代表精准,可能只是规则过于局限。C 项正确——覆盖率过低时,标签模型无法从该 LF 获得足够的统计信号来估计其准确率。D 项混淆了覆盖率和准确率两个概念。

Q6. Snorkel 的标签模型输出的标签形式是什么?

单选题 · mid

  • A.确定性整数标签(0 或 1)
  • B.概率化软标签(如 0.85 表示正类概率)← 正确答案
  • C.聚类中心距离
  • D.无标签,仅做数据筛选

答案:B。标签模型通常输出概率化的软标签,如 $P(y=1)=0.85$,表示样本属于正类的概率。这个概率值同时反映了标签模型对预测的信心。这种软标签相比硬标签包含更多信息,下游模型训练时可以利用这些置信度信息获得更鲁棒的决策边界。

Q7. 在 Snorkel 工作流中,标注矩阵的行和列分别代表什么?

单选题 · easy

  • A.行是标注函数,列是样本
  • B.行是样本,列是标注函数← 正确答案
  • C.行和列都是样本
  • D.行是标签,列是特征

答案:B。标注矩阵 $\Lambda$ 的形状是 $n \times m$,其中 $n$ 是样本数,$m$ 是标注函数数。每行对应一个样本在所有 LF 上的标注结果,每列对应一个 LF 对所有样本的输出。这个矩阵是标签模型的输入。

Q8. 下面哪些属于“标注函数”设计的常见模式?

多选题 · mid

  • A.关键词匹配和正则表达式← 正确答案
  • B.外部知识库查询(如 ICD 编码表)← 正确答案
  • C.调用其他 ML 模型作为规则← 正确答案
  • D.基于深度学习的端到端全自动标注

答案:ABC。Snorkel 的 LF 可以是任意 Python 函数,关键词匹配(A)、外部知识库查询(B)和调用其他模型做启发式判断(C)都是常见的 LF 模式。D 项不符合 Snorkel 的理念——LF 是“弱监督规则”而不是端到端全自动标注,每条 LF 都应该简单、可解释。

Q9. 为什么 Snorkel 使用生成模型而非直接平均多个 LF 的投票?

单选题 · hard

  • A.生成模型计算更快
  • B.LF 之间可能存在相关性和准确率差异,需要建模学习← 正确答案
  • C.生成模型能够生成新的数据样本
  • D.平均投票无法处理多分类问题

答案:B。直接平均投票隐含假设所有 LF 等权重且相互独立,这显然不符合实际——不同 LF 的准确率差异很大(有的 80% 有的 55%),且它们可能因使用相似的关键词而高度相关。生成模型能学习每个 LF 的参数(准确率、倾向、相关性),从而更合理地融合意见。即使对于多分类问题,简单平均投票也适用,并非缺陷。

Q10. Snorkel 与主动学习最主要区别是什么?

单选题 · easy

  • A.Snorkel 是批量规则自动标注,主动学习是交互式精选标注← 正确答案
  • B.Snorkel 只适用于 NLP,主动学习只适用于 CV
  • C.Snorkel 不需要模型,主动学习需要深度学习
  • D.两者完全相同,只是名字不同

答案:A。Snorkel 的核心是批量地应用标注函数自动生成大量含噪标签,再通过统计模型纠偏——类似“批量收集街坊意见”。主动学习则是迭代地选择最有价值的数据点请专家标注,再更新模型——类似“逐条请教美食家”。两者都减少标注成本,但工作模式截然不同:一个是“批量自动”,一个是“交互精选”。