Snorkel-数据标注系统

为什么需要数据标注

在面临机器学习问题时,我们往往会面临两个问题:数据和算法(模型)。随着各种机器学习框架的完善,算法的应用门槛正在逐渐的降低。但数据的获取却仍然是一个费时费力的必需流程。在工作中,我们通常会面临如下问题:

  1. 该任务有大量数据,但都没有可靠标签
  2. 该任务为新增需求,没有任何(或者很少)原始数据,但需要快速上线。这在快速迭代的产品开发中尤为常见,比如在分类系统中的新增类别
  3. 标注数据来源多样(不同的标注team或个人),数据中混杂了噪音
  4. 数据标注成本过高,或者没有标注人力
  5. 模型已经在某一应用场景中训练良好,现在需要迁移到类似场景中,但没有监督数据

针对以上问题,我们通常的做法有:无监督学习可迁移特征,规则系统与模型结合或者单纯的堆叠规则系统,半监督的方法扩充标签数据,增加人工校验和标注等。但这些方法要么操作起来太麻烦(比如无监督的方法,要求数据量要足够大),要么成本太高,或者灵活性太差。有没有更好的方法呢?或者一种统一的编程范式?(转https://zhuanlan.zhihu.com/p/55138499

通过规则标注样本

很直观的想法我们可以根据多个规则从多个数据源进行生成,但规则往往会带来噪声甚至是错误。

多个规则也可能存在不一致的问题,一种简单的解决方法是直接剔除冲突部分样本,但这种做法实际上抛弃了模型本身需要深度学习的困难部分,一定程度上会影响模型的性能。

另一个曾经尝试的办法是对规则样本进行分层采样,分层的方法是对样本进行关联切分成多个网格,比如有特征a,b,c,那可以切分成a*b,a*c,b*c,a*b*c等,并计算各个网格内样本对照验证集的准确率,按照不同的准确率作为采样权重进行分层采样。但这种办法还是有验证集。

最后我们可以考虑斯坦福大学在 2016 年Snorkel 项目中的Data Programming的方法。

Snorkel & Data Programming

Snorkel 将人工 One By One 的标注方式,通过 Label Function(LF) 进行抽象,并通过 多任务弱监督(Multi-Task Weak Supervision) 方式基于 LFs 训练得到一个生成模型与各 LF 的权重,从而可以对每个命中不同 LFs 的样本给出预测标记与得分。每个规则可以作为一个 Label Function,从论文中对Label Function数量和性能的对比发现,Label Function不宜太少也不宜太多。同时我们也可以使用通Snorkel 的 LFAnalysis 对各个规则之间的关联性和冲突性进行分析,如果某些规则冲突性较大,可以适当进行一些过滤。

LFs 分析之后,可以基于 LabelModel 进行训练,并对全量进行预测,比如二分类场景中我们采取模型基于 0.5 阈值给出的预测标注。最终选取的时候,可以选择模型预测置信度较高的部分,也可以选择规则标注与模型预测标注一致的部分。

总结

Snorkel 的核心思想:

1、估计不同弱标签的准确度or置信度;

2、将标签的准确度or置信度做为样本权重影响分类器的训练。

跟 factor graph or基于矩阵分解的都是类似思路。有人实际在使用的时候效果并不好,一种可能的原因是标签的准确度做为样本权重,可能是本来就好分的样本权重大(样本好分,所以不同弱标签更容易有共识),本来就不好分的样本权重小,这样对模型的性能提升就比较小。新的思路是可以让人工标注极小量标签,然后借鉴迁移学习的方法,让 带噪声标签的训练样本的分布 和 人工标注样本的分布 接近,从而让样本的重要性作为样本权重影响分类器的训练。

转载:https://zhuanlan.zhihu.com/p/55138499

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值