在没有训练数据的情况下通过领域知识利用弱监督方法生成NLP大型标记数据集
在现实世界中开发机器学习(ML)模型的主要瓶颈之一是需要大量手动标记的训练数据。例如,Imagenet数据集由超过1400万手动标记的各种现实的图像组成。
虽然迁移学习的出现极大地缓解了这一要求但是仍然需要数百个标记的示例来进行微调。但是获得此类手动注释通常是耗时的和劳动力密集的,并且容易发生人类的错误和偏见。
那么,该怎么做才能改善这种情况呢?
最近的弱监督(WS)框架可以通过利用多样化来减少手动标记的工作,并且可以利用领域主题专家(SME)的广泛知识来提高模型的表现。
这篇文章将介绍Edelman DxI数据科学团队在使用弱监督解决NLP问题的一些最新进展!
弱监督学习
数据编程是指使用启发式标记函数结合标签模型以编程方式创建标记数据集。弱监督使用标签模型创建的标签数据集来训练下游模型,下游模型的主要工作是在标签模型的输出之外进行泛化。如Snorkel论文所述,在数据集上实现弱监督有三个步骤。
- 编写标记函数(LFS):标记函数是任何可以将数据作为输入的python函数,函数通过使用一些规则来输出该行的标签。例如,如果我们的任务是“电子邮件垃圾邮件检测”,则可以构建一个如下所示的标签函数。每个标签函数都独立运行以标记每行数据。在二元分类问题的情况下,标签为0(不存在标签)或1(标签的存在)或-1(信息不足,不标记)。
- 将弱标签与标签模型(LM)结合在一起:如果我们有M行数据和N个LFS,如果运行所有LFS将导致总共M x n标签,所以需要汇总n个单个LFS的输出,以使每行只有一个标记的结果。投票模型是将多个LF汇总到单个标签的最简单方法。但是还有更好的方法可以通过从整个M行的各个LF之间的相同结果和不同结果中学习的聚合方法。例如,Data Programming Paper ,MeTaL Pape,Flying Squid paper 这三篇论文中提到的一些方法。
- 训练下游模型(EM):使用标签模型的输出用作训练数据微调下游模型,例如BERT。由于LFS是程序化标签源,因此我们可以在整个未标记的语料库上运行步骤1和2,生成许多标签并在步骤3中训练的模型可以受益于步骤1和2中创建的更广泛的训练数据集。
上图中的Snorkel 是使用数据编程的弱监督学习的python库。它提供了易于使用的API来实现和评估步骤1和2。我们可以使用高级ML API,例如HuggingFace的transformers 或Sklearn来实现步骤3。
在某些方法中,还可以将步骤2和3结合到一个步骤中。但是一般情况下两阶段的方法优于单阶段方法,因为这样可以选择任何LM和EM组合,通过不同的组合可以找到最佳的性能。因此本文还是使用将步骤1和步骤2分开进行。
完整文章:
https://avoid.overfit.cn/post/82ca4ceb918d41ba95bfc53db3ebd14e