文章目录

  • Snorkel简介与入门
    • 1. 背景
    • 2. LF (Labeling Function) 标注函数
    • 3. TF (Transformation Function) 转换函数
    • 4. SF (Slicing Functions) 剪切函数
    • Ref

Snorkel简介与入门

1. 背景

弱监督(Weak Supervision)可以让我们低成本的利用领域专家的知识来程序化的标注上百万级别的 数据样本,从而帮助我们解决人工智能时代的数据瓶颈问题。更确切地说,这是一个帮助将领域专家的知识编码到AI系统中的框架,专家知识注入的方式可以采用手写的推理规则或者远程监督。

弱监督的主要优点在于:

  • 灵活:需要更新模型时,只需要更新标注函数、重新生成训练集和分类器即可
  • 提高召回率:判别模型将提供优于弱监督模型的泛化能力,因此可以提高召回率

Google在20018年12月刚发了一篇论文介绍Snorkel DryBell,一个Google自制的内部工具,利用弱监督快速 构建了3个强大的文本分类器。

Snorkel is a system for programmatically building and managing training datasets without manual labeling. In Snorkel, users can develop large training datasets in hours or days rather than hand-labeling them over weeks or months.

Snorkel currently exposes three key programmatic operations:

  • Labeling data, e.g., using heuristic rules or distant supervision techniques

  • Transforming data, e.g., rotating or stretching images to perform data augmentation

  • Slicing data into different critical subsets for monitoring or targeted improvement

Snorkel then automatically models, cleans, and integrates the resulting training data using novel, theoretically-grounded techniques.

snorkel的核心在于两个方面:

  • 第一,将所有标注源抽象为label function(LF),由用户来设计LF,而不是标注数据;
  • 第二,构造Generative Model(GM) 对多个LF的预测结果进行融合,输出在各个样本在不同标签上的概率分布。

第一点更偏向于工程设计,snorkel的代码中对LF进行了很好的抽象和封装,能够满足绝大多数的场景。第二点偏向于算法。实际使用snorkel时,会根据正负标签的比例进行选择,作者通过实验证明在正负标签比例低的情况下,使用majority voting可以得到与GM相同的结果。简单地说,当不同数据源标注的的样本重合非常小的情况下,构建GM的意义不大,直接投票就可以。在其他情况下,使用GM可以得到更好的效果。

GM的细节需要参考作者的另一篇大作(Data Programming:Creating Large Training Sets, Quickly)。作者使用factor graph对LF输出结果的概率分布P(lambda, Y)进行建模,其中lambda是多个LF输出的结果构成的维度为(M,N)的矩阵,M为样本数量,N为LF的数量。模型设计时考虑了三个因素,包括:不同LF在标签集合上的覆盖情况、不同LF的准确率,不同LF之间的相关性。GM模型的训练使用最大似然方法进行无监督训练,最大化训练集合中所有LF输出结果的概率。

最后,使用P(Y|lambda)进行预测,预测的结果作为训练样本训练分类模型。

作者通过实验证明

  • snorkel收集的训练样本进行训练,效果优于远程监督的方法
  • snorkel收集的训练样本可以与人工标注的样本质量齐平,且标准成本低
  • snorkel框架非常容易上手(亲测,非常好用,与tf无缝连接)

2. LF (Labeling Function) 标注函数

在Snorkel中,推理逻辑被成为标注函数(Labeling Function)。有如下这些常见类型的标注函数:

  • 硬编码规则:通常使用正则表达式
  • 语义规则:例如,使用spaCy的依存树
  • 远程监督:使用外部知识库
  • 有噪声人工标注:众包标注
  • 外部模型:包含有价值信号的第三方模型

当编写完标注函数后,Snorkel将利用所有标注函数之间的预测结果与冲突来训练一个标注模型。然后,当标注新的数据时,每个标注函数都会投票:正、负或弃权。基于这些投票以及标注函数的权重,标注模型能够地为百万级的数据点自动进行概率型标注。最终的目标是训练一个可以超过标注函数性能的分类器。

一个简单的LF

from snorkel.labeling import labeling_function@labeling_function()
def lf_keyword_my(x):"""Many spam comments talk about 'my channel', 'my video', etc."""return SPAM if "my" in x.text.lower() else ABSTAIN

应用LF并查看效果

lfs = [textblob_polarity, textblob_subjectivity]applier = PandasLFApplier(lfs)
L_train = applier.apply(df_train)LFAnalysis(L_train, lfs).lf_summary()

3. TF (Transformation Function) 转换函数

当某个分类的样本数据较少时,训练模型的效果往往效果不尽人意。除了调整训练权重之外,我们还可以使用Snorkel框架的Data Augumentation数据增长函数: Transformation Function

我们可以制定一些简单的规则,使一些影响不大的特征的变换,比如在NLP中替换一些词语为近义词,或者替换语气助词等,增大训练样本让模型训练更准确。

下面是两个TF的例子,替换人名与变换形容词,以达到增加训练样本的目的。

from snorkel.augmentation import transformation_function# Replace a random named entity with a different entity of the same type.
@transformation_function(pre=[spacy])
def change_person(x):person_names = [ent.text for ent in x.doc.ents if ent.label_ == "PERSON"]# If there is at least one person name, replace a random one. Else return None.if person_names:name_to_replace = np.random.choice(person_names)replacement_name = np.random.choice(replacement_names)x.text = x.text.replace(name_to_replace, replacement_name)return x# Swap two adjectives at random.
@transformation_function(pre=[spacy])
def swap_adjectives(x):adjective_idxs = [i for i, token in enumerate(x.doc) if token.pos_ == "ADJ"]# Check that there are at least two adjectives to swap.if len(adjective_idxs) >= 2:idx1, idx2 = sorted(np.random.choice(adjective_idxs, 2, replace=False))# Swap tokens in positions idx1 and idx2.x.text = " ".join([x.doc[:idx1].text,x.doc[idx2].text,x.doc[1 + idx1 : idx2].text,x.doc[idx1].text,x.doc[1 + idx2 :].text,])return x

写完TF之后就可以将TF应用至训练数据,通过调整参数n_per_original控制每条训练数据生成的样本个数,参数p为控制每个function使用的概率使得一些function权重会更大。

from snorkel.augmentation import MeanFieldPolicymean_field_policy = MeanFieldPolicy(len(tfs),sequence_length=2,n_per_original=2,keep_original=True,p=[0.05, 0.05, 0.3, 0.3, 0.3],
)
from snorkel.augmentation import PandasTFAppliertf_applier = PandasTFApplier(tfs, mean_field_policy)
df_train_augmented = tf_applier.apply(df_train)
Y_train_augmented = df_train_augmented["label"].values
print(f"Original training set size: {len(df_train)}")
print(f"Augmented training set size: {len(df_train_augmented)}")
Original training set size: 1586
Augmented training set size: 2486

通过打印的结果可以看到,训练集得到了有效扩大。

4. SF (Slicing Functions) 剪切函数

Slicing Functions剪切函数和前两个函数目的不同,SF是为了检查模型的最后的预测效果是否达到预期。使用场景是在一个大的机器学习场景下,如自动驾驶任务,可能我们的模型准确性还不错,我们想检查模型检测自行车识别是否准确,就可以使用SF将自行车数据剪切出来,单独查看模型预测分类的效果。

比如以下SF示例,将较短评论剪切下查看分类效果:

import re
from snorkel.slicing import slicing_function@slicing_function()
def short_comment(x):"""Ham comments are often short, such as 'cool video!'"""return len(x.text.split()) < 5sfs = [short_comment]

查看SF划分出来的数据集

from snorkel.slicing import slice_dataframeshort_comment_df = slice_dataframe(df_test, short_comment)
short_comment_df[["text", "label"]].head()
TEXT LABEL
194 super music 0
2 I like shakira… 0
110 subscribe to my feed 1
263 Awesome 0
77 Nice 0

最后我们可以查看模型预测在SF数据集下的效果如何

from snorkel.slicing import PandasSFApplierapplier = PandasSFApplier(sfs)
S_test = applier.apply(df_test)
from snorkel.analysis import Scorerscorer = Scorer(metrics=["f1"])
scorer.score_slices(S=S_test, golds=Y_test, preds=preds_test, probs=probs_test, as_dataframe=True
)
F1
OVERALL 0.925000
SHORT_COMMENT 0.666667

尽管整体F1很高,但是在短评论场景下准确率表现一般。

Ref

  1. https://www.chainnews.com/articles/424602825079.htm
  2. https://cloud.tencent.com/developer/article/1491797
  3. https://arxiv.org/pdf/1711.10160.pdf snorkel论文
  4. https://www.snorkel.org/get-started/
  5. https://zhuanlan.zhihu.com/p/55138499
  6. https://www.snorkel.org/use-cases/02-spam-data-augmentation-tutorial
  7. https://www.snorkel.org/use-cases/03-spam-data-slicing-tutorial
  8. https://medium.com/@harrison.miller13_28580/labeling-transforming-and-structuring-training-data-sets-for-machine-learning-with-snorkel-d4813e2aad74

Snorkel 学习笔记 简介与入门 LF TF SF Labeling Functions Transformation Function Slicing Function 示例相关推荐

  1. Hadoop学习笔记(1) ——菜鸟入门

     Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...

  2. iOS学习笔记-地图MapKit入门

    代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...

  3. 【学习笔记】密码学入门(2) 单向散列函数,消息认证码,数字签名,证书

    [学习笔记]密码学入门(2) 单向散列函数,消息认证码,数字签名,证书 学习笔记 2 – 混合密码系统 在密码学入门(1)中提到了基本的密码形式,对称密码和公钥密码以及混合密码系统. 这一部分将学习到 ...

  4. 逐梦旅程学习笔记 DirectX开发入门02:旋转的彩色立方体

    本文是 系列笔记DirectX部分的第2篇,上一篇参见 逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架 这个示例增加了一些实际的内容,首先是绘制一个颜色随机变幻的彩色立方体,其二是显示 ...

  5. oracle 删除awr报告,学习笔记:Oracle awr入门 深入了解AWR报告

    天萃荷净 深入了解AWR报告,ASH与AWR报告的官方说明,数据库进程和性能视图获取 1.AWR与ASH概念 1.ASH 若是一个普通的会话(我是指没有大量地耗费资源),则对于性能调整来说无足轻重.但 ...

  6. 【学习笔记】Mininet 入门

    [学习笔记]Mininet入门实战 课程介绍 Mininet是由一些虚拟的终端节点.交换机.路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美. Mininet可以很 ...

  7. oracle rman ora19602,学习笔记:OracleRMAN备份入门 将RMAN备份数据放到nfs远程文件系统中...

    天萃荷净 rman通过nfs备份,记录一篇关于使用RMAN备份软件,将RMAN的备份结果集存放到远程的NFS文件系统中 1.RMAN挂载至nfs文件系统 [root@oracleplus tmp]# ...

  8. 【学习笔记】JavaWeb入门篇—HTML

    [学习笔记]JavaWeb入门篇-HTML

  9. Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用

    Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用 按照官网教程学习使用组件,并且重点把容器组件的应用进行了练习. 1.官网关于组件的介绍 组件是视图层的基本组成单元,是一个单独且可复用的 ...

最新文章

  1. 卡尔曼滤波— Constant Velocity Model
  2. 1.08亿条在线赌场信息泄露,来源指向 ElasticSearch
  3. POJ 1260 Pearls(DP)
  4. c++精确到小数点后两位_高考试卷的小数点是怎么算入总分的?
  5. ceph pool 管理(基础操作)
  6. 交叉线和直连线的线序,做法和使用场合
  7. Bootstrap4+MySQL前后端综合实训-Day01-AM【实训安排、HBuilder下载及使用、双飞翼布局(圣杯布局)案例、CSS在线手册、flex布局中的对齐方式】
  8. jQuery.ready in CRM Fiori Opportunity Application
  9. SpringSecurity权限配置详解
  10. 蓝桥杯数字三角形java,蓝桥杯数字三角形(java)
  11. Leetcode 513 javascript
  12. goto 语句和标号
  13. 【2016北京集训测试赛(八)】 直径 (虚树+树的直径)
  14. SCCM2012 R2实战系列之五:发现方法
  15. RFID将成为物联网革命的首战
  16. Vue基础及一些常用指令
  17. 算法笔记_面试题_20.数组相关_模板及示例十几道
  18. r 语言初学者指南_阻止自然语言处理的初学者指南
  19. 因果信号的傅里叶变换_常用信号的傅里叶变换对
  20. 关闭445端口方法(解决永恒之蓝病毒)

热门文章

  1. 撩妹恋爱话术库告诉你:生活,从来都不会辜负一个想要“变好”的人
  2. 最好的体育测试软件,看体育直播用什么软件?评测推荐几款免费好用的体育直播app...
  3. 易语言python识别图片验证码_TensorFlow实战:验证码识别 (少样本高精度)
  4. Translatium for Mac 8.2.1 Google翻译 实时翻译 破解版下载
  5. 秦韵FPGA 转载或原创(十四) 高云FPGAGW2A18C
  6. Kali Linux 更换系统主题
  7. 安信可Ai-WB1系列AT指令连接MQTT阿里云物联网平台
  8. Linux部署项目jar包遇到的问题——nohup命令
  9. Thinking In ASP
  10. spring、springmvc和springboot的比较