1.4 数据标注【stanford-cs329p】


Flow Chart for Data Labeling

是否有足够数据?

提升标签,数据还是模型?

是否有足够的标签?=> 半监督学习

是否有足够的预算?=> 众包

是否使用弱标签?=> 弱监督学习

Semi-Supervised Learning (SSL)

  • 关注有少量标注信息的样本和很大的没标注的数据一起利用起来
  • 使用没标注的数据时需要做一些假设
    • 连续假设:有相似特征的要本倾向于有相同标签
    • 聚类假设:数据有内在的聚类结构,同一类有相同标签
    • 流形假设:数据内在复杂性在较低维度,可以通过降维

Self-training

  • 自学习是半监督学习里一个算法

    • 在标注好的小数据上训练模型
    • 使用没标注的数据在模型上预测,得到伪标签
    • 合并伪标签和初始的标签(可以设置一定的置信度再合并,选择置信样本需要考虑)
    • 继续训练预测
  • 使用昂贵的模型

    • 深度神经网络,模型ensemble/bagging

Label through Crowdsourcing

  • ImgaeNet通过Amazon Mechanical Turk来标注了百万数据,花了几年几百万

Reduce #tasks: Active Learning

  • 选出最有意思的为标注数据
    • Uncertainty sampling:选出最不置信的样本,例如最高分类分数和随机(1/n)差不多
  • 也可以和自学习一样用贵的模型
    • Query-by-committee:训练多个模型投票

Active Learning + Self-training

  • 标好的数据训练模型
  • 未标注的数据在模型上预测
  • 选出不置信的样本给标注工
  • 合并样本继续训练直到标注完

Quality Control

  • 标注没理解任务而犯错
  • 最简单但最贵的办法:每个任务发给多个标注工,通过投票

Weak Supervision

  • 半自动生成标签

    • 比手工不准,但能训练
  • 数据编程:用启发式方法生成标号

    1
    2
    3
    4
    5
    def check_out(x):
    return SPAM if "check_out" in x.lower() else ABSTRAIN

    def sentiment(x):
    return HAM if sentiment_polarity(x) > 0.9 else ABSTRAIN

Summary

  • 获取的标签的方法:
    • 自训练:不断迭代训练模型去标注未标注的数据
    • 众包:钞能力
    • 数据编程:启发式方法设顶有噪音的数据