为了得到一个实体识别和关系抽取的模型,这里假设通过一个模型可以完成两件事情。我们需要有标注的数据,为了得到数据,可以有两种方式:

(1)人工打标签。缺点是成本巨大,优点是噪音较少。一个具体的例子:腾讯的一个文档级关系抽取的工作,打标签5000篇文章,在标注工具辅助下,花了大概十多万。

(2)弱监督数据。利用如distant supervision的方式等。缺点是噪音较大,优点是成本较小。

在理想情况下,我们希望通过(1)拿到数据。但是实际情况下,需要从(2)着手拿到数据。因此,snorkel主要是为(2)服务的一个框架。

重点提示:虽然有噪音,但是不影响我们借助于snorkel可以得到一个效果很不错的模型,相关论文中多次提到snorkel在多个机构和场景下的应用取得的不错的效果!

重点提示:目前snorkel在关系抽取上的应用也是只关注关系抽取,实体识别的模型应该还是要单独来做。因为snorkel在数据端需要先得到候选实体。

如果想对snorkel建立一个直观印象,1和6是不错的论文,之后可以读7,完了之后过snorkel的tutorial,其余论文可以后期跟进。

1.《Snorkel: Fast Training Set Generation for Information Extraction》

这是要读的第一篇论文,短短四页,用一个具体的关系抽取的例子解释了snorkel的多个概念等,通俗易懂,可以帮助建立对snorkel的直观印象。

整体上看,snorkel将劳动力从标注数据和特征工程的泥淖中解放出来,投放到写标签函数的任务中。snorkel可以让用户通过写标签函数的方式产生大量的带有噪音的训练数据。注意,得到的数据有两个特点:第一是量大,第二是有噪音。这里的核心概念是标签函数。标签函数的输入是候选三元组(关系抽取的背景知识不再介绍),输出是关系是否成立?标签函数的实现分为三大类,如下:

(1)启发式

(2)规则

(3)弱监督的方式。具体包括:distant supervision,crowdsourcing,ensembling of less accurate classifiers

一般而言,在snorkel框架下,用户会定义很多的标签函数。那么这些标签函数会表现出三种行为:

(1)较低的准确率。比如,单一靠写规则的方式判断一个关系是否成立还是有些不靠谱的。

(2)冲突。在一个标签函数中判断成立的关系,在另外一个标签函数中判断就不成立了。

(3)重叠。一个关系在多个标签函数中被判断成立。

既然用户自定义标签函数,那么需要对标签函数的质量进行评估。评估的内容主要也是包含上述三个方面,除此之外,标签函数的输出是估计标签,因此对估计标签的分布的评估也是需要的。但是,不要担心,snorkel会自动地根据标签函数的行为,得到最终的关系标签。具体是通过学习的方式。

snorkel是什么已经有了大致的印象了。那么这里简单谈一谈snorkel的设计哲学。snorkel的设计基于data programming paradigm,并且认为我们可以将训练数据的标注建模为一个随机过程。

那么什么是data programming paradigm?这里暂时不做过多展开,感兴趣可以阅读相关论文。简单来说,该paradigm可以划分为两个阶段:

(1)用一个生成模型建模标签函数的输出,得到估计的标签。

(2)用估计的标签训练最终的模型。

在此设计哲学下,snorkel的系统设计分为三个部分:

(1)预处理

该阶段可以自动地把输入数据表示为一个非结构化上下文层级结构。例如,一篇文章可以被分割为标题和内容部分,内容部分又可以被分割为段落和句子。

(2)写标签函数

标签函数是简单的python函数,把候选三元组作为input,输出是True,False或者None。

(3)自动化建模和训练

有了大量,带有噪音的数据,自然就可以训练下游模型了。

2.《Data Programming: Creating Large Training Sets, Quickly》,NIPS2016

这篇文章和上篇文章的作者基本相同,上篇偏重于实践,这篇偏重于理论。文章共27页,正文8页,其余都是理论证明。文章总体上阐述了data programming的motivation,概念和关键技术点:如何对标签函数之间的依赖进行建模。在最后的实验部分,通过三个实验证明三个结论:

(1)在真实世界的三个关系抽取任务上,证明了data programming是有效的paradigm;

(2)该paradigm可以和下游自动特征生成方法(或者说下游模型,如LSTM)一块工作;

(3)该paradigm对domain-expert用户非常友好(有助于写标签函数);

3.《Learning the Structure of Generative Models without Labeled Data》,ICML2017

延续上篇工作的主要内容。生成模型的依赖结构直接影响估计标签的质量,但是在没有标注数据的前提下自动选择一个结构是有挑战性的。这篇文章提出一个结构估计方法,通过最大化可观测数据的L1正则化边缘伪似然来自动选择一个好的结构。

相关工作还有这篇,《Inferring Generative Model Structure with Static Analysis》,都是围绕依赖结构的选择问题。

4.《Training Complex Models with Multi-Task Weak Supervision》,AAAI2019

浏览了摘要部分,扩展了弱监督学习的setting,提出多任务弱监督的setting。实验部分在三个细粒度分类问题(实体分类,关系分类和文档分类)上,取得了很不错的结果(都是和有监督的方法来比较)。

相关工作还有这篇,《The Role of Massively Multi-Task and Weak Supervision in Software 2.0》。

5.《Learning to Compose Domain-Specific Transformations for Data Augmentation》

在数据增强上的一个应用,有意思。

6.《Snorkel Fast Training Set Generation with Weak Supervision》

主要内容和1相似,不过内容更加丰富。这篇论文中的系统overview做的很不错。

7.《Data Programming with DDLite_Putting Humans in a Different Part of the Loop》

DDLite可以认为是snorkel的前身。这篇文章主要讨论了标签函数的开发流程,文章中的迭代流程图做的很不错。同时给出了进一步的三个工作,有意PR的同学可以关注:

(1)userful metics

(2)data exploration and rule suggestion

(3)principled management of labeled data

8.《Fonduer: Knowledge Base Construction from Richly Formatted Data》

在知识图谱补全方面的一个工作,从富文本中提取知识。文章中提出了一个多模态的LSTM用于候选实体,特征设计上有意思。从我们目前自己的工作来看,知识图谱的构建正处于第一个阶段:直接从网页上提取带有结构标签的数据;可能稍后的工作包括:从非结构化文本中提取;从富文本中提出;知识图谱的去噪等展开。

9.《Snorkel DryBell: A Case Study in Deploying Weak Supervision at Industrial Scale》

snorkel的工业级应用,由snorkel的主创和google的同学共同研发,特性之一是:分布式,大规模。

10.《弱监督系统snorkel在法律场景的应用》

snorkel的另外一个应用,用于法律文本的要素识别任务。

11.阿里神马知识图谱构建中DeepDive的应用

12.《How to Invest my Time: Lessons from Human-in-the-Loop Entity Extraction》,KDD2019, Applied Data Science Track

active learning+weakly learning

13.HoloClean:Weakly Supervised Data Repairing

用PGM的方式做数据清洗,目前只能用于表格数据。可以集成在Snorkel中。

14.Massive Multi-Task Learning with Snorkel MeTaL: Bringing More Supervision to Bear

Snorkel在弱监督,多任务场景下的应用。