人类参与的机器学习-全-
人类参与的机器学习(全)
原文:Human-in-the-Loop Machine Learning
译者:飞龙
前置材料
前言
随着机器学习在许多行业领域的广泛应用,人工智能系统现在正与人类系统和人类进行日常接触。大多数人已经注意到了一些面向用户的影响。机器学习可以改善人们的生活,例如通过有用的语音助手的语音识别和自然语言理解,或者它可能会打扰甚至主动伤害人类,例子从令人烦恼的产品推荐到系统性地歧视女性或代表性不足的少数族裔的简历审查系统。与其考虑人工智能在孤立状态下运行,本世纪迫切需要探索以人为本的人工智能——即构建能够有效与人类合作和协作、增强人类能力的 AI 技术。
这本书的重点不是放在最终用户身上,而是关注人和机器学习如何在机器学习系统的生产和运行中结合在一起。在工业界,机器学习从业者都知道,获取正确标注的数据比采用更先进的机器学习算法要宝贵得多。数据的生成、选择和标注是一项非常人性化的工作。手动标注数据可能既昂贵又不可靠,这本书花了很多篇幅来探讨这个问题。一个方向是减少需要标注的数据量,同时通过主动学习的方法仍然允许训练高质量的系统。另一个方向是利用机器学习和人机交互技术来提高人工标注的速度和准确性。事情并不止于此:大多数大型部署系统还涉及各种各样的人类审查和更新。再次,机器学习既可以设计为利用人的工作,也可以是人们需要与之抗争的东西。
罗伯特·莫纳克是这个旅程中一位高度合格的向导。在他攻读博士学位之前和期间的工作中,罗伯特的关注点是实用且关注人的。他基于自己在几个危机场景中提供帮助的努力,开创了将自然语言处理(NLP)应用于灾害响应相关信息的先河。他从处理关键数据的人类方法开始,然后寻找利用 NLP 自动化部分流程的最佳方式。我很高兴,现在许多这些方法正在被灾害响应组织使用,并且可以在本书中与更广泛的受众分享。
尽管机器学习的数据方面通常被认为主要是管理工作,但本书表明这一方面也非常技术性。数据采样算法和注释质量控制的算法通常接近下游模型消耗训练数据的复杂性,在某些情况下,在注释过程中实现了机器学习和迁移学习技术。对注释过程更多资源的真正需求,这本书在写作过程中就已经产生了影响。随着各个章节的出版,它们被农业、娱乐和旅游等领域的大型组织中的数据科学家所阅读。这突出了机器学习的现在广泛使用和对数据聚焦书籍的渴望。本书规范了许多当前的最佳实践和算法,但由于数据方面长期以来被忽视,我预计还有更多关于数据聚焦机器学习的科学发现有待发现,并且我希望这本入门指南能够鼓励进一步的进步。
—克里斯托弗·D·曼宁
克里斯托弗·D·曼宁是斯坦福大学计算机科学和语言学教授,斯坦福人工智能实验室主任,以及斯坦福以人为本的人工智能研究所联合主任。
前言
我将本书的所有作者收入捐赠给改善数据集的倡议,特别是针对低资源语言和健康及灾害响应。当我开始写这本书时,关于灾害响应的示例数据集并不常见,且与我作为机器学习科学家和灾害响应者的双重背景相关。随着 COVID-19 的出现,全球格局发生了变化,现在许多人理解为什么灾害响应用例如此重要。大流行暴露了我们机器学习能力的许多差距,特别是在获取相关医疗保健信息和对抗虚假信息运动方面。当搜索引擎未能呈现最新的公共卫生信息,而社交媒体平台未能识别广泛传播的虚假信息时,我们都体验了无法快速适应数据变化的应用的负面影响。
这本书并不仅限于灾难响应。我在这里分享的观察和方法的来源也来自于我为自动驾驶汽车、音乐推荐、在线商业、语音设备、翻译以及广泛的其它实际应用构建数据集的经验。在撰写这本书的过程中,了解到许多新的应用让我感到非常高兴。从阅读草稿章节的数据科学家那里,我了解到一些组织在历史上与机器学习并不相关:一家农业公司在其拖拉机上安装智能摄像头,一家娱乐公司将人脸识别技术应用于卡通角色,一家环保公司预测碳足迹,以及一家服装公司个性化时尚推荐。当我在这家数据科学实验室关于这本书的邀请演讲时,我确信我学到的东西比我教给他们的还要多!
所有这些用例有两个共同点:数据科学家需要为他们机器学习模型创建更好的训练和评估数据,而且关于如何创建这些数据的出版物几乎为零。我很高兴分享策略和技术,以帮助结合人类和机器智能的系统,几乎适用于机器学习的任何应用。
致谢
我最感激的是我的妻子,维多利亚·莫纳克,她支持我最初决定写这本书。我希望这本书能帮助让我们的世界因为我在写书时出生的小小人类而变得更好。
大多数撰写技术书籍的人告诉我,他们在写作结束时都停止了享受这个过程。这并没有发生在我身上。由于自 2019 年以来提供反馈的所有人,我享受了写这本书直到最后的修订。我非常感激早期反馈对 Manning 出版社流程的内在重要性,在 Manning 出版社,我最感激的是我的编辑,苏珊·埃奇里斯。我期待着我们的每周通话,我特别幸运地有一位编辑之前曾在电子发现领域担任“人工审核员”。并不是每个作家都有幸拥有具有领域经验的编辑!我也感谢弗朗西斯·布昂特莫普对章节的详细审查;阿尔·克林的克对技术的审查;项目编辑迪尔德丽·希姆;校对员基尔·辛普森;校对员凯里·黑尔斯;审查编辑伊万·马丁诺维奇;以及 Manning 出版社内为本书的内容、图像和代码提供反馈的每一个人。
感谢所有审稿人:Alain Couniot、Alessandro Puzielli、Arnaldo Gabriel Ayala Meyer、Clemens Baader、Dana Robinson、Danny Scott、Des Horsley、Diego Poggioli、Emily Ricotta、Ewelina Sowka、Imaculate Mosha、Michal Rutka、Michiel Trimpe、Rajesh Kumar R S、Ruslan Shevchenko、Sayak Paul、Sebastián Palma Mardones、Tobias Bürger、Torje Lucian、V. V. Phansalkar、Vidhya Vinay。你们的建议帮助使这本书更加完善。
感谢我的网络中所有在早期草稿中给予我直接反馈的人:Abhay Agarwa、Abraham Starosta、Aditya Arun、Brad Klingerberg、David Evans、Debajyoti Datta、Divya Kulkarni、Drazen Prelec、Elijah Rippeth、Emma Bassein、Frankie Li、Jim Ostrowski、Katerina Margatina、Miquel Àngel Farré、Rob Morris、Scott Cambo、Tivadar Danka、Yada Pruksachatkun 以及通过 Manning 在线论坛评论的每个人。Adrian Calma 特别勤奋,我很幸运一位最近获得主动学习博士学位的人如此仔细地阅读了草稿章节!
我对我的职业生涯中合作过的许多人表示感谢。除了今天在苹果公司的同事外,我还特别感激在 Idibon、Figure Eight、AWS 和斯坦福大学的过去同事。我很高兴我的斯坦福大学博士导师 Christopher Manning 为这本书提供了序言。
最后,我特别感谢在本书中分享轶事的 11 位专家:Ayanna Howard、Daniela Braga、Elena Grewal、Ines Montani、Jennifer Prendki、Jia Li、Kieran Snyder、Lisa Braden-Harder、Matthew Honnibal、Peter Skomoroch 和 Radha Basu。他们所有人都创立了成功的机器学习公司,并在他们职业生涯的某个阶段直接参与了机器学习的数据处理方面。如果你像本书的大多数预期读者一样——一个职业生涯早期、努力创造良好训练数据的人——请将他们视为你未来自己的榜样!
关于本书
这是我希望在我接触机器学习时存在的书,因为它解决了人工智能中最重要的问题:人类和机器应该如何合作解决问题?大多数机器学习模型都是基于人类示例的,但大多数机器学习文本和课程只关注算法。你通常可以用好的数据和简单的算法获得最先进的结果,但你很少用基于糟糕数据的最先进算法获得最先进的结果。所以如果你需要首先深入研究机器学习的某个领域,你可能会认为数据方面更重要。
适合阅读本书的人群
本书主要面向数据科学家、软件开发人员和最近才开始使用机器学习(或最近才开始在数据方面工作)的学生。你应该对监督学习和无监督学习等概念有一些经验,以及训练和测试机器学习模型、PyTorch 和 TensorFlow 等库。但你不需要在这些领域的任何一个是专家就可以开始阅读这本书。
当你变得更加有经验时,这本书应该仍然是不同技术的一个有用的快速参考。这本书是第一本包含注释、主动学习和相邻任务(如注释的界面设计)等最常见策略的书籍。
本书如何组织:路线图
本书分为四个部分:介绍;对主动学习的深入探讨;对标注的深入探讨;以及最后一部分,它通过人机界面设计策略和三个实现示例将所有内容整合在一起。
本书的第一部分介绍了创建训练和评估数据的基本模块:标注、主动学习和帮助人类和机器最有效地结合其智能的人机交互概念。到第二章结束时,您将构建一个人类在循环的机器学习应用,用于标注新闻标题,从而完成从标注新数据到重新训练模型,然后使用新模型来帮助决定哪些数据应该被标注的循环。
第二部分涵盖了主动学习——用于采样人类审查的最重要数据的技术集合。第三章介绍了理解模型不确定性的最广泛使用的技术,第四章探讨了由于采样不足或数据不具有代表性而导致模型可能自信但错误的复杂问题。第五章介绍了将不同策略组合成一个全面的主动学习系统的方法,第六章介绍了主动学习技术如何应用于不同类型的机器学习任务。
第三部分涵盖了标注——获取训练和评估数据准确且具有代表性的标签的常见问题。第七章介绍了如何寻找和管理合适的人员进行数据标注。第八章介绍了标注质量控制的基礎,介绍了计算准确性和一致性的最常见方法。第九章涵盖了标注质量控制的高级策略,包括主观任务的标注以及使用基于规则的系统、基于搜索的系统、迁移学习、半监督学习、自监督学习和合成数据创建等多种方法来半自动化标注。第十章介绍了如何管理不同类型的机器学习任务的标注。
第四部分通过第十一章对有效注释界面的深入探讨和第十二章中三个人类在循环的机器学习应用示例,完成了“循环”。
在整本书中,我们不断回到不同类型的机器学习任务中的例子:图像和文档级别的标注、连续数据、目标检测、语义分割、序列标注、语言生成和信息检索。内封面包含快速参考,展示了您可以在书中找到这些任务的位置。
关于代码
本书使用的所有代码都是开源的,并可以从我的 GitHub 账户获取。本书前六章使用的代码位于github.com/rmunro/pytorch_active_learning。
一些章节也使用电子表格进行分析,最后三章中的三个例子分别存放在各自的存储库中。有关更多详细信息,请参阅相应的章节。
liveBook 讨论论坛
购买《人机协同机器学习》(Human-in-the-Loop Machine Learning)包括免费访问由 Manning Publications 运营的私人网络论坛,您可以在论坛上发表关于本书的评论,提出技术问题,并从作者和其他用户那里获得帮助。要访问论坛,请访问 livebook.manning.com/book/human-in-the-loop-machine-learning/welcome/v-11。您可以在 livebook.manning.com/#!/discussion 了解更多关于 Manning 的论坛和行为准则。
Manning 对读者的承诺是提供一个场所,让读者之间以及读者与作者之间可以进行有意义的对话。这不是对作者参与特定数量活动的承诺,作者对论坛的贡献仍然是自愿的(且未付费)。我们建议您尝试向作者提出一些挑战性的问题,以免他的兴趣转移!只要本书有售,论坛和先前讨论的存档将可通过出版社的网站访问。
其他在线资源
每章都有一个“进一步阅读”部分,并且除了少数例外,列出的所有资源都是免费的,并且可在网上获取。正如我在几个地方所说的,寻找那些引用我所引用论文的高引用工作。包含一些有影响力的论文没有意义,而且在此书之后还将发表许多其他相关论文。
关于作者
Robert Monarch 博士(原名 Robert Munro),是结合人类和机器智能的专家,目前居住在旧金山,并在苹果公司工作。Robert 在塞拉利昂、海地、亚马逊、伦敦和悉尼等地工作过,在从初创公司到联合国的各种组织中工作过。他是 Idibon 的首席执行官和创始人,Figure Eight 的首席技术官,并领导了亚马逊网络服务(Amazon Web Services)的第一个自然语言处理和机器翻译服务。
第一部分 初步步骤
大多数数据科学家在处理数据上花费的时间比在算法上更多。然而,大多数关于机器学习的书籍和课程都集中在算法上。本书旨在填补关于机器学习数据方面的材料空白。
本书的第一部分介绍了创建训练和评估数据的基石:标注、主动学习和帮助人类与机器最有效地结合智能的人机交互概念。到第二章结束时,你将构建一个包含人类操作员的机器学习应用,用于标注新闻标题,从而完成从标注新数据到重新训练模型,然后使用新模型决定哪些数据应该被标注的循环。
在接下来的章节中,你将学习如何通过更高级的数据采样、标注和结合人机智能的技术来扩展你的第一个应用。本书还涵盖了如何将你将学习的技巧应用到不同类型的机器学习任务中,包括目标检测、语义分割、序列标注和语言生成。
1 闭环机器学习简介
本章涵盖
-
将未标记数据标注以创建训练、验证和评估数据
-
抽取最重要的未标记数据项(主动学习)
-
将人机交互原则融入标注
-
实施迁移学习以利用现有模型中的信息
与电影中的机器人不同,今天的大多数人工智能(AI)无法自主学习;相反,它依赖于密集的人类反馈。今天大约 90%的机器学习应用都是由监督式机器学习驱动的。这个数字涵盖了广泛的使用案例。自动驾驶汽车可以安全地将你送下街道,因为人类已经花费数千小时告诉它当传感器看到行人、移动车辆、车道标记或其他相关物体时的情况。当你说出“调高音量”时,你的家庭设备知道该怎么做,因为人类已经花费数千小时告诉它如何解释不同的命令。而且,你的机器翻译服务可以翻译不同语言,因为它在数千(或可能数百万)个由人类翻译的文本上进行了训练。
与过去相比,我们的智能设备从程序员那里学习到的规则越来越少,更多地是从不需要编码的人类提供的示例和反馈中学习。这些由人类编码的示例——训练数据——被用来训练机器学习模型,并使它们在特定任务上更加准确。但程序员仍然需要创建允许非技术性人类提供反馈的软件,这提出了当今技术领域中的一个最重要问题:人类和机器学习算法如何正确互动以解决问题。阅读这本书后,你将能够为你在机器学习中可能遇到的大多数用途回答这个问题。
标注和主动学习是闭环机器学习的基础。它们规定了如何从人们那里获取训练数据,以及在你没有预算或时间对所有数据进行人类反馈时,如何确定正确的数据展示给人们。迁移学习使我们能够避免从头开始,而是将现有的机器学习模型适应到我们的新任务中。我们将在本章中介绍这些概念。
1.1 闭环机器学习的基本原则
闭环 机器学习 是一套策略,用于在应用人工智能的应用中结合人类和机器智能。通常的目标是完成以下一项或多项:
-
提高机器学习模型的准确性。
-
更快地达到机器学习模型的准确度目标。
-
结合人类和机器智能以最大化准确性。
-
使用机器学习辅助人类任务以提高效率。
本书涵盖了最常见的主动学习和标注策略,以及如何为您的数据、任务和标注劳动力设计最佳界面。本书从简单的例子逐渐过渡到更复杂的例子,并编写成顺序阅读。然而,您不太可能同时应用所有这些技术,因此,本书也被设计成每个特定技术的参考。
图 1.1 展示了添加标签到数据的人机交互机器学习过程。这个过程可以是任何标注过程:将主题添加到新闻故事中,根据正在进行的运动对体育照片进行分类,识别社交媒体评论的情感,对视频内容是否露骨进行评分,等等。在所有情况下,您都可以使用机器学习来自动化标注过程的一部分或加快人工过程。在所有情况下,使用最佳实践意味着实施图 1.1 中所示的循环:采样正确的数据进行标注,使用这些数据来训练模型,并使用该模型来采样更多数据进行标注。

图 1.1 人机交互过程中预测数据标签的心理模型
在某些情况下,您可能只需要一些技术。例如,如果您有一个在机器学习模型不确定时退回到人类的系统,您就会查看关于不确定性采样、标注质量和界面设计的相关章节和部分。即使您没有完成“循环”,这些主题仍然代表了本书的大部分内容。
本书假设您对机器学习有一定的了解。一些概念对于人机交互系统尤为重要,包括对 softmax 及其局限性的深入理解。您还需要知道如何使用考虑模型置信度的指标来计算准确率,计算调整后的准确率,以及从人类视角衡量机器学习的性能。(附录中包含这些知识的总结。)
1.2 介绍标注
标注是将原始数据进行标记的过程,使其成为机器学习的训练数据。大多数数据科学家都会告诉你,他们花费在数据集整理和标注上的时间比构建机器学习模型的时间要多得多。人类标注的质量控制依赖于比大多数机器学习模型更复杂的统计方法,因此,花时间学习如何创建高质量的训练数据是非常重要的。
1.2.1 简单和更复杂的标注策略
标注过程可以很简单。例如,如果您想对关于产品的社交媒体帖子进行标注,以分析该产品情绪趋势的广泛趋势,您可以在几小时内构建并部署一个 HTML 表单。一个简单的 HTML 表单可以允许某人根据情绪选项对每条社交媒体帖子进行评分,每个评分将成为您训练数据中社交媒体帖子的标签。
标注过程也可以很复杂。例如,如果您想对视频中的每个对象进行标注并绘制边界框,简单的 HTML 表单就不够了;您需要一个允许标注者绘制这些框的图形界面,而良好的用户体验可能需要数月的工程时间来构建。
1.2.2 填补数据科学知识空白
您的机器学习算法策略和数据标注策略可以同时优化。这两种策略紧密相连,如果您采用综合方法,您将更快地从模型中获得更高的准确度。算法和标注是优秀机器学习同等重要的组成部分。
所有计算机科学系都提供机器学习课程,但很少有课程教授如何创建训练数据。在最多的情况下,您可能只能在六门课程中的数百个机器学习讲座中找到一两个关于创建训练数据的讲座。这种情况正在改变,但进展缓慢。由于历史原因,学术机器学习研究人员倾向于保持数据集不变,并仅从不同算法的角度评估他们的研究。
与学术机器学习相比,在工业界,通过标注更多训练数据来提高模型性能更为常见。尤其是在数据性质随时间变化(这也是很常见的情况)时,使用少量新的标注可能比尝试将现有模型适应新的数据领域更有效。但相比之下,更多的学术论文关注的是如何在没有新训练数据的情况下将算法适应新领域,而不是如何高效地标注正确的新训练数据。
由于学术界存在这种不平衡,我经常看到工业界的人犯同样的错误。他们雇佣了一打了解如何构建最先进算法的聪明博士,但他们没有创建训练数据或考虑标注正确接口的经验。我最近在世界最大的汽车制造商之一看到了这种情况。公司雇佣了大量最近毕业的机器学习毕业生,但由于新员工无法扩展他们的数据标注策略,公司无法实施其自动驾驶汽车技术。公司最终解雇了整个团队。在事件发生后,我建议公司如何通过将算法和标注作为优秀机器学习同等重要、相互交织的组成部分来重建其策略。
1.2.3 质量人工标注:为什么很难?
对于那些研究它的人来说,标注是一门与机器学习紧密相关的科学。最明显的例子是,提供标签的人类可能会犯错误,克服这些错误需要惊人的复杂统计。
训练数据中的人类错误可能重要或不重要,这取决于用例。如果一个机器学习模型仅用于识别消费者情绪的广泛趋势,那么从 1%的糟糕训练数据中传播的错误可能无关紧要。但如果一个驱动自动驾驶车辆的算法由于从糟糕的训练数据中传播的错误而没有看到 1%的行人,结果将是灾难性的。一些算法可以处理训练数据中的一些噪声,随机噪声甚至有助于某些算法通过避免过拟合而变得更加准确。但人类错误往往不是随机噪声;因此,它们往往会向训练数据中引入不可恢复的偏差。没有任何算法能够从真正糟糕的训练数据中幸存。
对于简单的任务,例如在客观任务上的二进制标签,当不同的标注者意见不一致时,统计数据对于决定哪个标签是正确的相当直接。但对于主观任务,或者甚至具有连续数据的客观任务,不存在简单的启发式方法来决定正确的标签。想想通过在自动驾驶汽车识别到的每个行人周围放置边界框来创建训练数据的这项关键任务。如果两个标注者的边界框略有不同怎么办?哪个框是正确的?答案并不一定是任何一个框或者是两个框的平均值。实际上,聚合这两个框的最佳方式是使用机器学习。
确保质量标注的最佳方法之一是确保有合适的人来做这些标注。本书的第七章致力于寻找、培训和管理工作最佳的标注者。关于合适的劳动力与合适技术的结合的重要性,请参阅以下侧边栏。
人类洞察力和可扩展的机器学习等于生产型人工智能
由 Radha Ramaswami Basu 提供的专家轶事
人工智能的结果高度依赖于输入其内的训练数据的质量。一个小小的用户界面改进,比如一个魔法棒来选择图像中的区域,当应用于数百万数据点并配合良好的质量控制流程时,可以实现巨大的效率提升。一支先进的工作队伍是关键因素:培训和专业化提高质量,专家工作队伍的见解可以与领域专家一起指导模型设计。最佳模型是由机器和人类智能之间建设性、持续的合作创造的。
我们最近承接了一个项目,需要对机器人冠状动脉旁路移植术(CABG)视频中各种解剖结构的像素级标注。我们的标注团队并非解剖学或生理学专家,因此我们实施了临床知识教学课程,由一位受过培训的外科医生领导的解决方案架构师来增强现有的 3D 空间推理和精确标注的核心技能。对我们客户的结果是成功的培训和评估数据。对我们来说,结果是看到来自资源不足背景的人们在动画讨论中迅速成为医学图像分析最重要步骤之一的专家。
拉达·巴苏是 iMerit 的创始人兼首席执行官。iMerit 利用技术和由 50%来自弱势社区的女性和青年组成的 AI 劳动力,为全球客户提供高级技术工作者。拉达之前在惠普工作,作为首席执行官将 Supportsoft 上市,并在圣克拉拉大学创立了节俭创新实验室。
1.3 介绍主动学习:提高训练数据的速度和降低成本
监督学习模型几乎总是随着标注数据的增加而变得更加准确。主动学习是决定哪些数据用于人工标注的过程。没有一种算法、架构或参数集能在所有情况下使机器学习模型更准确,也没有一种主动学习的策略在所有用例和数据集中都是最优的。然而,你应该首先尝试某些方法,因为它们更有可能适用于你的数据和任务。
大多数关于主动学习的研究论文都关注训练项的数量,但在许多情况下,速度可能是一个更重要的因素。例如,在灾害响应中,我经常部署机器学习模型从新兴灾害中过滤和提取信息。任何灾害响应的延误都可能至关重要,因此快速获得可用的模型比需要输入模型中的标签数量更重要。
1.3.1 三种广泛的主动学习抽样策略:不确定性、多样性和随机
存在许多主动学习策略,但在大多数情况下,三种基本方法都适用:不确定性、多样性和随机抽样。这三种方法的组合几乎总是应该从起点开始。
随机抽样听起来最简单,但可能最难。如果你的数据预先过滤,或者数据随时间变化,或者你知道由于其他原因,随机样本不能代表你正在解决的问题,那么什么是随机呢?这些问题将在以下章节中更详细地讨论。无论策略如何,你都应该始终标注一定量的随机数据,以评估你模型的准确性,并将你的主动学习策略与随机选择的项目基线进行比较。
在文献中,不确定性和多样性采样有不同的名称。它们通常被称为 利用 和 探索,这两个名字听起来巧妙且押韵,但并不十分透明。
不确定性采样 是一组用于识别当前机器学习模型中接近决策边界的未标记项目的策略。如果你有一个二元分类任务,这些项目将有接近 50%的概率属于任一标签;因此,模型被称为不确定或困惑。这些项目最有可能被错误分类,因此它们最有可能导致与预测标签不同的标签,在它们被添加到训练数据中并重新训练模型后,移动决策边界。
多样性采样 是一组用于识别当前机器学习模型中未充分代表或未知的项目策略。这些项目可能具有在训练数据中罕见的特征,或者它们可能代表当前在模型中未充分代表的真实世界人口统计特征。在任何情况下,当模型应用时,结果都可能表现不佳或参差不齐,尤其是在数据随时间变化的情况下。多样性采样的目标是针对新的、不寻常的或未充分代表的项目进行标注,以便为机器学习算法提供一个更完整的对问题空间的了解。
虽然术语 不确定性采样 被广泛使用,但 多样性采样 在不同领域有不同的名称,例如代表性采样、分层采样、异常检测和异常检测。对于某些用例,例如在天文数据库中识别新现象或检测异常网络活动以进行安全监控,任务的目标是识别异常或异常值,但我们可以将它们适应为主动学习的采样策略。
不确定性采样和多样性采样在单独使用时存在缺点(图 1.2)。不确定性采样可能专注于决策边界的一部分,例如,而多样性采样可能专注于远离边界的异常值。因此,这些策略通常一起使用,以找到最大化不确定性和多样性的未标记项目选择。

图 1.2 不同主动学习策略的优缺点。左上角:机器学习算法在项目之间的决策边界,其中一些项目被标记为 A,一些被标记为 B。右上角:不确定性采样的一个可能结果。这种主动学习策略对于选择决策边界附近的无标签项目是有效的。这些项目最有可能被错误预测,因此,最有可能获得一个能够移动决策边界的标签。然而,如果所有的不确定性都集中在问题空间的一个部分,那么对这些项目进行标记将不会对模型产生广泛的影响。左下角:多样性采样的一个可能结果。这种主动学习策略对于选择问题空间不同部分的无标签项目是有效的。然而,如果多样性远离决策边界,那么这些项目不太可能被错误预测,因此,当人类给他们分配与模型预测相同的标签时,它们对模型的影响不会很大。右下角:结合不确定性采样和多样性采样的一个可能结果。当策略结合时,会选择靠近决策边界不同部分的项目。因此,我们正在优化找到可能导致决策边界变化的项目的机会。
需要注意的是,主动学习过程是迭代的。在主动学习的每一次迭代中,都会识别出一组项目并为其分配一个新的由人类生成的新标签。然后,使用新项目重新训练模型,并重复此过程。图 1.3 展示了选择和标注新项目的两个迭代过程,导致边界发生变化。

图 1.3 迭代主动学习过程。从左上角到底右角:两次主动学习的迭代。在每次迭代中,都会选择沿着边界进行多样化的选择,这反过来又会在重新训练后导致边界移动,从而得到一个更准确的机器学习模型。理想情况下,我们请求人类为我们的主动学习策略中所需的最少项目数量提供标签。这个请求加快了获得准确模型的时间,并减少了整体的人工标注成本。
迭代周期本身可以是一种多样性采样。想象一下,你只使用了不确定性采样,并在一个迭代中只从问题空间的一个部分进行采样。你可能会解决该部分问题空间中的所有不确定性;因此,下一个迭代将集中在其他地方。经过足够的迭代,你可能根本不需要多样性采样。不确定性采样的每次迭代都会关注问题空间的不同部分,并且迭代在一起,足以获得用于训练的项目多样样本。
正确实施主动学习具有这种自我纠正功能:每次迭代都会找到最适合人工标注的数据的新方面。然而,如果你的数据空间中某些部分本质上是模糊的,每次迭代可能会不断地把你带回到问题空间中具有那些模糊项目的同一部分。因此,通常明智的做法是考虑不确定性和多样性采样策略,以确保你不会将所有的标注努力都集中在模型可能无法解决的问题空间的一部分。
图 1.2 和图 1.3 为你提供了关于主动学习过程的良好直观理解。正如任何处理过高维或序列数据的人都知道,从边界或多样性中识别距离并不总是直接的。至少,这个过程比图 1.2 和图 1.3 中的简单欧几里得距离要复杂。但同样的思想仍然适用:我们试图尽可能快地达到一个准确模型,同时尽可能少地使用人工标签。
迭代次数和每次迭代中需要标注的项目数量取决于任务。当你从事自适应机器+人工翻译工作时,一个翻译过的句子就足以作为训练数据,要求模型更新,理想情况下在几秒钟内完成。从用户体验的角度来看,这一点很容易理解。如果人工翻译者纠正了某些单词的机器预测,但机器没有快速适应,人工翻译者可能需要(重新)纠正那个机器输出数百次。当你翻译高度上下文相关的单词时,这个问题很常见。例如,你可能想在新闻文章中直译一个人的名字,但在一部虚构作品中将其翻译成本地化名字。如果软件在人工纠正后不久就重复同样的错误,用户体验将会很糟糕,因为我们期望近期性有助于适应。
在技术层面上,当然,快速适应模型要困难得多。以大型机器翻译模型为例。目前,训练这些模型需要一周或更长时间。根据翻译者的经验,能够快速适应的软件系统正在采用持续学习。在我所工作的多数用例中,例如识别社交媒体评论中的情感,我只需要大约每月迭代一次来适应新的数据。尽管目前很少有应用具有实时自适应机器学习,但越来越多的应用正在朝这个方向发展。
1.3.2 什么是评估数据的随机选择?
虽然容易说你应该始终在保留数据的随机样本上进行评估,但在实际操作中,确保你有一个真正随机的数据样本通常并不容易。如果你通过关键词、时间或其他因素预先过滤了你正在处理的数据,你已经有一个非代表性的样本。该样本的准确率并不一定能够表明你的模型部署的数据上的准确率。
我看到人们使用广为人知的 ImageNet 数据集,并将机器学习模型应用于大量数据。标准的 ImageNet 数据集有 1,000 个标签,每个标签描述了该图像的类别,例如“篮球”、“出租车”或“游泳”。ImageNet 挑战赛评估了该数据集的保留数据,系统在该数据集内达到了接近人类水平的准确率。然而,如果你将这些相同的模型应用于社交媒体平台上发布的随机选择图像,准确率会立即下降到大约 10%。
在大多数机器学习的应用中,数据也会随时间而变化。如果你处理的是语言数据,人们讨论的话题会随时间变化,语言本身也会创新和演变。如果你处理的是计算机视觉数据,你遇到的物体类型也会随时间变化。同样重要的是,图像本身也会根据相机技术的进步和变化而变化。
如果你不能定义一个有意义的随机评估数据集,你应该尝试定义一个代表性的评估数据集。如果你定义了一个代表性数据集,你是在承认对于你的数据集来说,真正随机的样本是不可能的或不具有意义的。根据你如何应用数据,你需要自己定义什么是有代表性的。你可能想要为每个你关心的标签选择数据点,从每个时间段选择一定数量的数据点,或者从聚类算法的输出中选择一定数量的数据点以确保多样性。(我在第四章中更详细地讨论了这一主题。)
你可能还希望拥有多个通过不同标准编制的评估数据集。一个常见的策略是有一个数据集是从与训练数据相同的数据中抽取的,并且至少有一个来自不同来源的域外评估数据集。域外数据集通常来自不同类型的媒体或不同时间段。例如,如果一个自然语言处理(NLP)任务的所有训练数据都来自历史新闻文章,那么域外数据集可能来自最近的社会媒体数据。对于大多数实际应用,你应该使用域外评估数据集,这是衡量你的模型真正泛化到问题并不仅仅是过度拟合特定数据集的特性的最佳指标。然而,这种做法在主动学习时可能会很棘手,因为一旦开始标注这些数据,它们就不再是域外的了。如果这样做是可行的,我建议你保留一个不应用主动学习的域外数据集。这样,你可以看到你的主动学习策略在泛化问题时表现如何,而不仅仅是适应和过度拟合它遇到的领域。
1.3.3 何时使用主动学习
当你只能标注你数据的一小部分,并且随机抽样无法覆盖数据的多样性时,你应该使用主动学习。这个建议涵盖了大多数实际场景,因为数据的规模在许多用例中成为一个重要的因素。
一个很好的例子是视频中存在的数据量。例如,在视频的每一帧中为每个对象画一个边界框,这将非常耗时。假设这个视频是关于在街道上行驶的自动驾驶汽车,你关心大约 20 个对象(汽车、行人、标志等)。每秒 30 帧,那么就是 30 帧 * 60 秒 * 20 对象,所以你需要为 1 分钟的数据创建36,000个框!即使是速度最快的人类标注员也需要至少 12 小时来标注 1 分钟的数据。
如果我们计算一下,我们会看到这个问题有多么难以处理。在美国,人们平均每天开车 1 小时,这意味着美国人每年开车 95,104,400,000 小时。很快,每辆车都将配备前视摄像头来辅助驾驶。所以,仅在美国一年的驾驶时间就需要 60,000,000,000(60 万亿)小时来标注。地球上的人不足以标注今天美国驾驶员的视频,即使全世界的人除了标注数据外什么都不做,只是为了使美国驾驶员更安全。
因此,任何在自动驾驶汽车公司工作的数据科学家都需要回答关于标注过程的各种问题。视频中的每n帧是否都合适?我们能否采样视频,这样我们就不需要标注所有视频?有没有设计标注界面的方法来加速这个过程?
标注的不可行性在大多数情况下都是真实的。将需要标注的数据量将超过预算或时间,将每个数据点展示给人类。这可能是最初使用机器学习的原因。如果您有预算和时间手动标注所有数据点,那么您可能不需要自动化这项任务。
并非在所有情况下都需要主动学习,尽管人机交互学习策略可能仍然相关。在某些情况下,法律要求对每个数据点进行标注,例如法院命令审计,要求人类检查公司内的每一条通信以寻找潜在的欺诈。尽管人类最终需要查看每个数据点,但主动学习可以帮助他们更快地找到欺诈示例并确定最佳用户界面。它还可以识别人类标注中的潜在错误。实际上,这就是今天许多审计是如何进行的。
还有一些狭窄的用例,在这些用例中,您几乎肯定不需要主动学习。例如,如果您在工厂中监控具有一致照明的设备,那么应该很容易实现一个计算机视觉模型,从机器上的灯光或开关确定给定的机械设备是开启还是关闭。由于机械设备、照明、摄像头等不会随时间变化,您可能不需要在模型构建后使用主动学习来持续获取训练数据。然而,这些用例很少见。我在工业界遇到的用例中,不到 1%的用例不需要更多训练数据。
类似地,可能存在一些用例,其中您的基线模型对于您的业务用例来说足够准确,或者更多训练数据的成本超过了更准确模型可能带来的任何价值。这个标准也可能是主动学习迭代的停止点。
1.4 机器学习和人机交互
几十年来,许多聪明的人未能借助机器翻译使人类翻译更快、更准确。显然,应该有可能结合人类翻译和机器翻译。然而,当人类翻译需要从机器翻译输出中纠正一句话中的一个或两个错误时,翻译者重新从零开始键入整个句子会更快。在翻译时使用机器翻译句子作为参考对速度的影响很小,除非人类翻译者格外小心,否则他们最终会延续机器翻译中的错误,使他们的翻译不够准确。
这个问题的最终解决方案不在于机器翻译算法的准确性,而在于用户界面。现代翻译系统不再要求人类翻译员重新输入整个句子,而是允许他们使用在手机上(以及越来越多地)在电子邮件和文档编辑工具中常见的预测文本功能。人类翻译员像以前一样输入翻译内容,通过按下 Enter 或 Tab 键接受预测翻译中的下一个单词,每次机器翻译预测正确时都会提高他们的整体速度。因此,最大的突破在于人机交互,而不是底层机器学习算法。
人机交互是计算机科学中的一个成熟领域,最近它对于机器学习变得尤为重要。当你为人类创建用于生成训练数据的界面时,你正在利用一个位于认知科学、社会科学、心理学、用户体验设计以及其他几个领域交叉点的领域。
1.4.1 用户界面:你如何创建训练数据?
通常,一个简单的网页表单就足以收集训练数据。与网页表单交互背后的人机交互原则同样简单:人们因为整天都能看到它们,所以习惯了网页表单。表单直观,因为许多聪明的人对 HTML 表单进行了工作并进行了优化。你正在利用这些约定:人们知道简单的 HTML 表单是如何工作的,因此你不需要对他们进行教育。另一方面,打破这些约定可能会让人困惑,因此你被限制在预期的行为上。你可能有一些想法,认为动态文本可以加快某些任务,但这个约定可能会比它帮助的人更多。
最简单的界面——二元响应——也是质量控制的最佳选择。如果你能将你的注释项目简化或分解为二元任务,那么设计直观界面和实现第八章至第十一章中涵盖的注释质量控制功能就会容易得多。
当你处理更复杂的界面时,约定也变得更加复杂。想象一下,你要求人们在一个图像中围绕某些对象绘制多边形,这是自动驾驶汽车公司常用的用例。注释者会期待哪些方式?他们会期待自由手绘、线条、画笔、通过颜色/区域进行智能选择,或其他选择工具吗?如果人们习惯于在 Adobe Photoshop 等程序中处理图像,他们可能会在注释图像时期待相同的功能。就像你在构建和受限于人们对网页表单的期望一样,你也在受限于他们对选择和编辑图像的期望。不幸的是,如果你提供功能齐全的界面,这些期望可能需要数百小时的编码才能实现。
对于任何从事重复性任务,如创建训练数据的人来说,移动鼠标效率低下,如果可能的话应该避免。如果整个注释过程都可以在键盘上完成,包括注释本身以及任何表单提交或导航,注释者的节奏将大大提高。如果你必须包括鼠标,你应该获得丰富的注释来弥补较慢的输入。
一些注释任务有专门的输入设备。将语音转录成文字的人通常使用脚踏板在音频录音中前后导航。这个过程允许他们将双手放在键盘上。用脚导航录音比用鼠标导航录音要高效得多。
除了转录等例外,键盘仍然是王者。大多数注释任务没有像转录那样流行了很长时间,因此没有发展出专门的输入设备。对于大多数任务来说,在笔记本电脑或 PC 上使用键盘比在平板电脑或手机屏幕上使用键盘要快。在保持眼睛关注输入的同时在平坦表面上打字并不容易,所以除非任务是一个简单的二元选择任务或类似的东西,否则手机和平板电脑不适合进行大量数据注释。
1.4.2 前置条件:什么可以影响人类的感知?
为了获得准确的学习数据,你必须考虑到人类注释者的注意力集中、注意力持续时间和可能使他们犯错误或改变行为的情境效应。考虑一个来自语言学研究的绝佳例子。在一项名为“填充玩具与语音感知”的研究中(doi.org/10.1515/ling.2010.027),研究人员要求参与者区分澳大利亚和新西兰口音。研究人员在参与者进行研究的房间里的架子上放置了一只填充玩具几维鸟或袋鼠(这些是那些国家的标志性动物)。进行研究的负责人没有向参与者提及这个填充玩具;玩具只是放在背景中。令人难以置信的是,当几维鸟在场时,人们认为口音听起来更像新西兰,而当袋鼠在场时,口音听起来更像澳大利亚。鉴于这一事实,很容易想象,如果你正在构建一个用于检测口音的机器学习模型(也许你正在开发一个希望尽可能在多种口音下工作的智能家居设备),在收集训练数据时需要考虑情境。
当上下文或事件序列可以影响人类感知时,这种现象被称为启动效应。在创建训练数据时最重要的类型是重复启动效应,它发生在任务序列可以影响某人感知的情况下。例如,如果一个注释者正在为社交媒体帖子进行情感标注,并且他们连续遇到 99 条负面情感帖子,那么他们更有可能在第一百条帖子实际上是正面时将其错误地标注为负面。帖子可能是固有的模糊(例如讽刺)或注释者在重复工作中注意力下降所造成的简单错误。在第十一章中,我讨论了需要控制的各种启动效应类型。
1.4.3 通过评估机器学习预测创建标签的优缺点
将机器学习和确保质量注释相结合的一种方法是通过使用简单的二进制输入表来让人们评估模型预测并确认或拒绝该预测。这种方法可以将更复杂的任务转化为二进制注释任务。你可以问某人围绕一个对象的边界框是否正确,这是一个简单的二进制问题,不涉及复杂的编辑/选择界面。同样,询问注释者某个词是否是一段文本中的位置比提供一个界面来有效地注释自由文本中的位置短语要容易得多。
然而,当你这样做的时候,你可能会专注于局部模型的不确定性,而错过问题空间的重要部分。尽管你可以通过让人类评估机器学习模型的预测来简化界面和注释准确度评估,但你仍然需要一个多样性策略来进行采样,即使这个策略仅仅是确保随机选择的项目也是可用的。
1.4.4 设计注释界面的基本原则
基于我到目前为止所涵盖的内容,以下是一些设计注释界面的基本原则。我将在整本书中详细介绍这些原则:
-
尽可能将问题表述为二进制选择。
-
确保预期的响应多样化,以避免启动效应。
-
使用现有的交互约定。
-
允许键盘驱动响应。
1.5 机器学习辅助人类与人类辅助机器学习
环境中的人类机器学习可以有两个不同的目标:通过人类输入使机器学习应用更准确,以及通过机器学习的辅助来提高人类任务。这两个目标有时会结合在一起,机器翻译就是一个很好的例子。通过使用机器翻译来建议单词或短语,人类可以选择接受或拒绝,就像你在打字时你的智能手机预测下一个单词一样,这样可以使人类翻译更快。这项任务是一个机器学习辅助的人类处理任务。我还与那些在人类翻译过于昂贵时使用机器翻译的客户合作过。由于人类翻译和机器翻译的数据内容相似,机器翻译系统随着时间的推移从人类翻译的数据中变得更加准确。这些系统正在实现两个目标,使人类更有效率,使机器更准确。
搜索引擎是另一个人类在环机器学习的绝佳例子。人们常常忘记,尽管搜索引擎在通用搜索和特定用例(如电子商务和导航(在线地图))中无处不在,但它们仍然是一种人工智能形式。例如,当你在线搜索页面并点击出现的第四个链接而不是第一个链接时,你可能在训练那个搜索引擎(信息检索系统),使其第四个链接可能成为你搜索查询的更好顶部响应。有一种普遍的误解,即搜索引擎只根据最终用户的反馈进行训练。实际上,所有主要的搜索引擎都雇佣了成千上万的注释员来评估和调整他们的搜索引擎。评估搜索相关性是机器学习中人类注释的最大用例。尽管最近计算机视觉用例(如自动驾驶汽车)和语音用例(如家庭设备和智能手机)的流行有所上升,但搜索相关性仍然是专业人类注释的最大用例。
尽管乍一看它们可能有所不同,但大多数环境中的人类机器学习任务都包含机器学习辅助人类和人类辅助机器学习的元素,因此你需要为两者都进行设计。
1.6 转移学习以启动你的模型
在大多数情况下,你不需要从头开始构建你的训练数据。通常,现有的数据集接近你所需的内容。例如,如果你正在创建用于电影评论的情感分析模型,你可能有一个从产品评论开始的情感分析数据集,然后你可以将其适应到你的用例中。这个过程——从一个用例中提取模型并将其适应到另一个用例中——被称为迁移学习。
最近,将通用预训练模型适应新的、特定的用例的流行度大幅增加。换句话说,人们正在构建模型,专门用于在许多用例中进行迁移学习。这些模型通常被称为预训练模型。
历史上,迁移学习涉及将一个过程的输出输入到另一个过程中。在自然语言处理(NLP)中的一个例子可能是
通用词性标注器 > 语法解析器 > 情感分析标注器
今天,迁移学习通常意味着
重新训练神经网络模型的一部分以适应新的任务(预训练模型)或使用一个神经模型的参数作为另一个模型的输入
图 1.4 展示了迁移学习的一个例子。一个模型可以在一组标签上训练,然后通过保持相同的架构并冻结模型的一部分(在这种情况下仅重新训练最后一层)来在另一组标签上重新训练。

图 1.4 迁移学习的一个例子。构建了一个模型来预测标签为“A”、“B”、“C”或“D”。通过重新训练模型的最后一层,并且使用比从头开始训练模型时少得多的人工标注项,模型能够预测标签“Y”和“Z”。
1.6.1 计算机视觉中的迁移学习
迁移学习在计算机视觉领域最近取得了最大的进展。一种流行的策略是从 ImageNet 数据集开始,构建一个模型,从数百万个示例中分类 1,000 个标签:运动、鸟类、人造物体等等。
为了学习分类不同类型的运动、动物和物体,机器学习模型正在学习区分图像中 1,000 种物品所需的纹理和边缘类型。许多这些纹理和边缘比 1,000 个标签更通用,可以在其他地方使用。因为所有这些纹理和边缘都是在网络的中间层中学习的,所以你只需要在新的标签集上重新训练最后一层。你可能只需要几百个或几千个示例,而不是数百万个,因为你已经从数百万张图像中提取了纹理和边缘。当人们用少量数据重新训练最终层到新的标签时,ImageNet 取得了很高的成功,包括生物中的细胞和卫星视图中的地理特征等物体。
也可能重新训练除最后一层之外的其他几层,并从你正在迁移的模型中添加更多层。迁移学习可以与许多架构和参数一起使用,以适应新的用例,但目标仍然是限制构建新数据集上准确模型所需的人工标注数量。
到目前为止,计算机视觉在超越图像标注方面还不太成功。对于检测图像中物体等任务,很难创建能够从一个物体类型适应到另一个物体类型的迁移学习系统。问题在于物体被检测为边缘和纹理的集合,而不是整体物体。然而,许多人正在研究这个问题,因此毫无疑问,突破将会发生。
1.6.2 NLP 中的迁移学习
对于 NLP 来说,对预训练模型的推动甚至比计算机视觉还要晚。这种形式的迁移学习在过去两三年内才在 NLP 中变得流行,因此它是本文中涵盖的最前沿技术之一,但它也可能很快过时。
类似于 ImageNet 的适应方法对语言数据不起作用。将一个情感分析数据集的迁移学习应用到另一个情感分析数据集上,只能提供大约 ~2–3% 的准确率提升。预测文档级标签的模型没有像等价的计算机视觉模型那样捕捉到人类语言的广度。但通过观察它们经常出现的上下文,你可以学习到单词的有趣属性。例如,doctor 和 surgeon 可能会在相似的环境中出现。假设你找到了任何英语单词出现的 10,000 个上下文,查看其前后单词集合。你可以看到单词 doctor 在这 10,000 个上下文中出现的可能性。其中一些上下文将与医学相关,因此 doctor 在这些上下文中的得分会很高。但大多数 10,000 个上下文不会与医学相关,因此 doctor 在这些上下文中的得分会很低。你可以将这些 10,000 个得分视为一个 10,000 维的向量。单词 surgeon 很可能有一个与 doctor 类似的向量,因为它经常出现在相同的环境中。
通过上下文理解单词的概念很古老,构成了语言学功能理论的基石:
通过它所伴随的词语来认识一个单词(Firth, J. R. 1957:11)。
严格来说,我们需要深入到单词层面才能获取最重要的信息。英语是一个例外,因为单词往往对机器学习来说是非常好的原子单位。英语允许有复杂的单词,例如 un-do-ing,很明显我们为什么想要解释其单独的部分(词素),但英语这样做比典型语言要少得多。英语用词序表达的内容,比如主语-谓语-宾语,更频繁地用英语限制的词缀来表达,比如现在时和过去时以及单复数区别。因此,对于不偏向于像英语这样的特权语言的机器学习任务,我们需要对子词进行建模。
费尔思会欣赏这个事实。他创立了英格兰第一个语言学系,我在那里工作了两年,帮助记录和保护濒危语言。在那里的时候,很明显,语言的全部多样性意味着我们需要比仅仅词语更精细的特征。如果我们想要将世界的机器学习能力适应尽可能多的 7,000 种世界语言,那么需要人参与的机器学习方法就是必要的。
当迁移学习最近取得突破时,它遵循了在上下文中理解词语(或词语片段)的原则。如果我们能从上下文中预测词语,我们就可以免费为我们的模型获得数百万个标签:
我的 ___ 很可爱。他 ___ play-ing
不需要人工标注。我们可以从原始文本中移除一部分词语,然后将剩余的文本转化为一个预测性机器学习任务。正如你可以猜到的,第一个空缺的词可能是 狗、小狗 或 小猫,而第二个空缺的词很可能是 是 或 曾经是。就像 外科医生 和 医生 一样,我们可以根据上下文预测词语。
与早期迁移学习从一种情感类型到另一种情感类型失败的例子不同,这类预训练模型已经取得了广泛的成功。通过仅对预测上下文中词语的模型进行少量调整,就有可能构建具有最先进技术的系统,这些系统只需要少量的人工标注来完成语言任务,如问答、情感分析和文本蕴涵。与计算机视觉不同,迁移学习正在迅速成为复杂 NLP 任务(如摘要和翻译)的普遍方法。
预训练的模型并不复杂。目前最复杂的模型是训练来预测上下文中的一个词,句子中词语的顺序,以及句子之间的顺序。从这个数据中固有的三种预测类型的基础模型,我们可以构建几乎任何具有先发优势的 NLP 应用场景。因为词语顺序和句子顺序是文档的固有属性,预训练的模型不需要人工标注。它们仍然像监督机器学习任务一样构建,但训练数据是免费生成的。模型可能需要预测数据中每十个被移除的词中的一个,并预测在源文档中某些句子是否依次出现,在你需要为任务添加人工标注之前,提供强大的先发优势。
然而,预训练模型受可用未标记文本数量的限制。即使考虑不同语言的总体频率,英语中的未标记文本也比其他语言多得多。也会有文化偏见。例如,“我的狗很可爱”这句话在在线文本中可能经常出现,这是预训练模型的主要数据来源。但并非每个人都有宠物狗。当我短暂生活在亚马逊研究马赛语时,猴子是受欢迎的宠物。英语短语“我的猴子很可爱”很少在网上出现,马赛语的对应短语“Chuna bëdambo ikek”则根本不存在。预训练系统中的词向量以及上下文模型确实允许一个词表达多个含义,因此它们可以捕捉到这个上下文中的“狗”和“猴子”,但它们仍然偏向于它们训练的数据,并且“猴子”的上下文在任何语言中都不太可能大量出现。我们需要意识到预训练系统可能会放大文化偏见。
预训练模型仍然需要额外的手工标注才能在其任务中实现准确的结果,因此转移学习并没有改变我们用于人机交互机器学习的一般架构。然而,它可以给我们一个实质性的起点,在标注方面,这可能影响我们选择用于采样额外数据项以供人工标注的主动学习策略,甚至影响人类提供标注的界面。
转移学习也是第五章中讨论的一些高级主动学习策略和第九章中高级数据标注和增强策略的基础。
1.7 本文中可以期待的内容
要思考文本各部分如何相互关联,可以将主题视为知识四象限(图 1.5)。

图 1.5 展示了机器学习知识四象限,涵盖了本书中的主题,并以您机器学习模型已知和未知的内容来表述。
四个象限是:
-
已知已知——您机器学习模型今天可以自信且准确地执行的内容。这个象限是您模型当前的状态。
-
已知未知——您机器学习模型今天无法自信执行的内容。您可以对这些项目应用不确定性采样。
-
已知未知——预训练模型中可以适应您任务的已知知识。转移学习允许您使用这些知识。
-
未知未知——您机器学习模型中的差距。您可以对这些项目应用多样性采样。
列和行也很有意义,行捕捉了您模型当前状态的知识,而列捕捉了所需解决方案的类型:
-
顶部行捕捉了您模型的知识。
-
底部行捕捉了模型外的知识。
-
左列可以通过合适的算法来解决。
-
右列可以通过人机交互来解决。
本文涵盖了广泛的技术,因此保留这张图可能有助于了解所有内容是如何相互关联的。
本书在第一、二章节的末尾提供了速查表,作为对已涵盖的主要概念的快速参考。阅读后续章节时,你可以将这些速查表随时备用。
摘要
-
更广泛的人机交互机器学习架构是一个结合人类和机器组件的迭代过程。理解这些组件可以解释本书各部分是如何结合在一起的。
-
你可以使用一些基本的注释技术来开始创建训练数据。理解这些技术可以确保你准确且高效地进行注释。
-
两种最常见的主动学习策略是不确定性采样和多样性采样。理解每种类型的基本原理有助于你针对特定问题制定合适的策略组合。
-
人机交互为你提供了一个框架,用于设计包含人类操作员的机器学习系统的用户体验组件。
-
迁移学习使我们能够将一个任务中训练的模型适应到另一个任务中,并使用更少的注释构建更准确的模型。
2 人机交互机器学习入门
本章涵盖了
-
根据模型置信度对预测进行排名以识别混淆项
-
寻找具有新颖信息的未标记项
-
构建一个简单的界面来标注训练数据
-
随着添加更多训练数据评估模型准确性的变化
对于任何机器学习任务,你应该从一个简单但功能性的系统开始,随着你的进展构建更复杂的组件。这个指南适用于大多数技术:推出最小可行产品(MVP),然后对产品进行迭代。你从最初推出的产品中获得的反馈将告诉你哪些部分是构建下一个产品时最重要的。
本章致力于构建你的第一个人机交互机器学习 MVP。随着本书的进展,我们将在此基础上构建系统,让你了解构建更复杂的数据标注界面、主动学习算法和评估策略所需的不同组件。
有时候,一个简单的系统就足够了。假设你在一家媒体公司工作,你的工作是按照主题对新闻文章进行标记。你已经有了体育、政治和娱乐等主题。最近自然灾害的新闻报道很多,你的老板要求你标注相关的过去新闻文章为灾害相关,以便更好地搜索这个新标签。你没有几个月的时间来构建一个最优的系统;你希望尽快推出一个最小可行产品(MVP)。
2.1 超越黑客式学习:你的第一个主动学习算法
你可能没有意识到,但你可能之前已经使用过主动学习了。正如你在第一章中学到的,主动学习是选择合适数据供人类审查的过程。通过关键词或其他预处理步骤过滤数据是一种主动学习形式,尽管它不是特别有原则性。
如果你最近才开始尝试机器学习实验,你可能已经使用了常见的学术数据集,例如 ImageNet、MNIST 光学字符识别(OCR)数据集和 CoNLL 命名实体识别(NER)数据集。在创建实际训练数据之前,这些数据集都经过了各种采样技术的严格筛选。因此,如果你从这些流行的数据集中随机采样,你的样本并不是真正随机的:它是对在创建这些数据集时使用的任何采样策略所符合的数据的选择。换句话说,你无意中使用了可能来自十多年前的一些手工制作的启发式方法作为采样策略。在这篇文章中,你将学习到更复杂的方法。
您很可能已经使用了 ImageNet、MNIST OCR 或 CoNLL NER 数据集,但没有意识到它们是如何被过滤的。关于这些数据集的正式文档很少,而且据我所知,在大多数使用这些数据集的人中都没有提及。ImageNet 是在我在斯坦福大学时由同事创建的;我是原始 CoNLL NER 任务中的 15 个研究团队之一;当我看到一篇现在著名的深度学习基础论文中提到 MNIST 时,我了解到了 MNIST 的局限性。显然,拼凑现有数据集是如何创建的是如此困难且随意,但直到这本书,还没有一个地方告诉您:不要相信任何现有的数据集能够代表您在现实世界中遇到的数据。
由于您在构建机器学习模型时可能已经使用了过滤后的数据,因此将大多数机器学习问题视为已经处于主动学习迭代过程的中期可能会有所帮助。一些关于数据采样的决策已经做出;它们引导您到达当前的数据标注状态,并且可能并不完全最优。因此,您需要首先关注的是如何在前进的过程中开始正确地采样数据。
如果您没有明确实现一个好的主动学习策略,而是采用临时方法来采样您的数据,那么您就是在实施“黑客式学习”。¹ 组装一些东西是可以的,但即使您做得很快,也要确保基础正确。
您的第一个带人类交互的机器学习系统将类似于图 2.1 所示。在本章的剩余部分,您将实现这个架构。本章假设您将使用 2.2 节中介绍的数据集,但您也可以轻松地使用自己的数据。或者,您可以构建这里描述的系统;然后,通过更改数据和标注说明,您应该能够将您自己的文本标注任务插入其中。

图 2.1 您的第一个带人类交互的机器学习系统架构
2.2 您的第一个系统架构
在本文中,您将构建的第一个带人类交互的机器学习系统将把一组新闻标题标注为“与灾难相关”或“非灾难相关”。这项现实世界的任务可能有多个应用领域:
-
使用这个数据集构建一个机器学习模型,以帮助实时识别与灾难相关的新闻文章,从而帮助应对
-
为新闻文章添加一个新的“与灾难相关”标签,以提高数据库的可搜索性和可索引性
-
通过允许某人分析相关标题来支持一项关于媒体如何报道灾难的社会研究
在全球疫情追踪中,识别关于爆发的新闻文章是一项重要任务。H5N1(禽流感)在确定为流感新株之前几周就已经公开报道,而 H1N1(猪流感)在几个月前就已经公开报道。如果这些报告能更早地呈现在病毒学家和流行病学家面前,他们就能识别流感新株的模式,并能够更快地做出反应。尽管您第一个带有人工智能的机器学习系统的用例很简单,但它是一个现实世界的用例,可能会挽救生命。²
对于您将在整本书中使用的数据,您将使用我在作为专业灾害响应者工作时处理的一些过去灾难的消息。在这些案例中,我运行了带有人工智能的机器学习系统来处理数据,因此这些示例与本文相关。数据包括 2010 年海地地震和智利地震后的消息、2010 年巴基斯坦洪水、2012 年美国飓风桑迪以及大量关注疾病爆发的新闻标题集合。
您将加入斯坦福大学 NLP 专业的学生、Udacity 的数据科学学生以及报名参加“人工智能普及”([ai-4-all.org](http://ai-4-all.org/))的高中生,他们今天也将使用这个数据集作为课程的一部分。您将执行本章开头介绍的任务:对新闻标题进行分类。您可以在https://github.com/rmunro/pytorch_active_learning下载代码和数据。
请参阅 readme 文件,了解如何在您的机器上安装 Python 3.6 或更高版本以及 PyTorch 的说明。Python 和 PyTorch 的版本更新迅速,因此我将保持 readme 文件更新,提供安装说明,而不是尝试在此处包含该信息。
如果您不熟悉 PyTorch,请从本 PyTorch 教程中的示例开始:mng.bz/6gy5。本章中的示例是从 PyTorch 示例和 PyTorch 教程中的示例结合而来的。如果您熟悉这两个教程,本章中的所有代码都应该对您来说很清晰。CSV 文件中的数据包括两个到五个字段,具体取决于其处理程度,看起来类似于表 2.1 中的示例。
表 2.1 一个示例数据文件,包含 ID、实际文本、选定的主动学习采样策略和该策略的分数
| 文本 ID | 文本 | 标签 | 样本策略 | 分数 |
|---|---|---|---|---|
| 596124 | Dolores 湖居民洪水预警 | 1 | 低置信度 | 0.5872 |
| 58503 | 地震救援人员抵达 | 1 | 随机 | 0.6234 |
| 23173 | 自行车手在尝试导航新自行车道时迷路 | 0 | 随机 | 0.0937 |
本章中您将使用的数据来自大量新闻标题的集合。这些文章跨越了许多年和数百次灾难,但大多数标题并非与灾难相关。
数据库中有四个数据位置:
-
/训练数据—你的模型将用于训练的数据
-
/验证数据—你的模型将用于微调的数据
-
/评估数据—你的模型将用于评估准确性的数据
-
/未标记数据—你想要标记的大量数据池
你将在这个存储库中的 CSV 文件中看到数据,并且它们将具有以下格式:
-
0. 文本 ID(此项目的唯一 ID)
-
1. 文本(文本本身)
-
2. 标签(标签:1 = “与灾难相关”;0 = “与灾难无关”)
-
3. 样本策略(我们用来采样此项的主动学习策略)
-
4. 置信度(机器学习对此项是“与灾难相关”的置信度)
(此列表从 0 开始计数而不是 1,以便它与代码中每个字段的项目/行的索引相匹配)。
这些字段足够你构建你的第一个模型。你会发现示例中的未标记数据还没有标签、样本策略或置信度,这是显而易见的原因。
如果你想要立即开始,你可以运行此脚本:
> python active_learning_basics.py
你最初将被提示将消息标注为“与灾难相关”或“与灾难无关”以创建评估数据。然后你将再次被提示对初始训练数据进行相同的操作。只有在这种情况下,你才会看到模型开始基于你的数据构建,并且主动学习过程开始。我们将在本章后面返回代码,并介绍其背后的策略。
在实际灾难中,你将需要将数据分类到大量细粒度的类别中。例如,你可能需要区分食物和水的请求,因为人们没有食物可以忍受的时间比没有水要长得多,所以对饮用水的请求需要比食物的请求更紧急地响应。另一方面,你可能能够通过过滤在当地提供水,但食物仍需要运送到受灾地区,以更长时间的需求。因此,不同的救灾组织通常专注于食物或水。同样,对于医疗援助、安全、住房等类型的区分也是如此,所有这些都需要细粒度的类别才能实施。但在任何这些情况下,在“相关”和“不相关”之间进行过滤都可以是一个重要的第一步。如果数据量足够低,你可能只需要机器学习辅助来区分相关信息和非相关信息;人类可以处理其他类别。我参与过这样的救灾行动。
此外,在大多数灾难中,你不会用英语工作。英语只占全球日常对话的约 5%,因此大约 95%关于灾难的交流不是用英语进行的。更广泛的结构可以应用于任何语言。最大的区别是英语使用空格将句子分割成单词。大多数语言都有更复杂的词缀、后缀和复合词,使得单个单词更加复杂。一些语言,如中文,在大多数单词之间不使用空格。将单词分解为其构成部分(语素)本身就是一个重要的任务。事实上,这是我博士论文的一部分:自动发现任何语言在灾难响应通信中的词内边界。一个有趣且重要的研究领域将是使机器学习真正在全球范围内平等,我鼓励人们追求这一目标!
这有助于使你的数据假设明确,这样你就可以构建和优化最适合你用例的架构。在任何机器学习系统中包含假设是一种好的实践,因此以下是我们的假设:
-
数据仅包含英语。
-
数据包含不同种类的英语(英国英语、美国英语、作为第二语言的英语)。
-
我们可以使用空格分隔的单词作为我们的特征。
-
对于这个用例,二元分类任务就足够了。
应该很容易看出,人类在循环机器学习的更广泛框架如何适用于任何类似的用例。本章中的框架几乎可以像对另一个文本分类任务一样容易地适应图像分类。
如果你已经开始了,你会看到在你可以构建模型之前,你需要标注一些额外的数据。这在一般情况下是一种好的实践:查看你的数据将为你模型的所有部分提供更好的直觉。参见以下侧边栏了解为什么你应该查看你的数据。
阳光是最好的消毒剂
彼得·斯科莫罗赫的专家轶事
你需要深入查看真实数据,以确切知道要构建哪些模型。除了高级图表和汇总统计之外,我建议数据科学家定期浏览大量随机选择的、细粒度的数据,让这些例子影响他们。作为高管每周查看公司级图表,网络工程师查看系统日志的统计数据,数据科学家应该对其数据及其变化有直觉。
当我构建 LinkedIn 的技能推荐功能时,我创建了一个简单的网页界面,其中包含一个随机按钮,它显示了推荐示例以及相应的模型输入,这样我就可以快速查看数据,并了解可能最成功的算法和注释策略。这种方法是确保你已经发现潜在问题并获得了关键的高质量输入数据的最佳方式。你正在给你的数据带来光明,阳光是最好的消毒剂。
彼得·斯科莫罗赫(Peter Skomoroch),前 SkipFlag(被 WorkDay 收购)的首席执行官,曾在 LinkedIn 担任首席数据科学家,是该团队发明“数据科学家”这一职位的人之一。
2.3 解释模型预测和数据以支持主动学习
几乎所有的监督机器学习模型都会给你两样东西:
-
一个预测标签(或一组预测标签)
-
与每个预测标签相关联的数字(或一组数字)
这些数字通常被解释为预测的置信度,尽管这取决于数字是如何生成的,可能会有所不同。如果有相互排斥的类别并且具有相似的置信度,那么你有很好的证据表明模型对其预测感到困惑,并且人类的判断将是有价值的。因此,当模型学会正确预测具有不确定预测的项目的标签时,它将受益最大。
假设我们有一个可能与灾难相关的消息,预测看起来是这样的:
{
"Object": {
"Label": "Not Disaster-Related",
"Scores": {
"Disaster-Related": 0.475524352,
"Not Disaster-Related": 0.524475648
}
}
}
在这个预测中,消息被预测为“非灾难相关”。在其余的监督机器学习中,这个标签是人们最关心的:标签预测是否正确,以及模型在预测大量保留数据集时的整体准确率是多少?
然而,在主动学习过程中,与预测相关的数字通常是我们最关心的。你可以从例子中看到,“非灾难相关”被预测为 0.524 分。这个分数意味着系统有 52.4%的信心认为预测是正确的。
从这里任务的视角来看,你可以看到为什么你可能仍然希望有人审查结果:这仍然有相对较高的可能是与灾难相关的。如果它确实与灾难相关,那么你的模型可能因为某些原因在这个例子上犯了错误,所以你很可能希望将其添加到你的训练数据中,以免错过类似的例子。
在第三章中,我们将转向如何可靠地评估 0.524 分的这个问题。特别是对于神经网络模型,这些置信度可能会相差很大。为了本章的目的,我们可以假设虽然确切数字可能不准确,但我们通常可以相信多个预测中置信度相对差异的准确性。
2.3.1 置信度排名
假设我们还有另一个带有这种预测的消息:
{
"Object": {
"Label": "Not Disaster-Related",
"Scores": {
"Disaster-Related": 0.015524352,
"Not Disaster-Related": 0.984475648
}
}
}
此项也被预测为“非灾难相关”,但置信度为 98.4%,而第一项的置信度仅为 52.4%。因此,模型对第二项的信心比对第一项的信心更大。因此,合理地假设第一项更有可能被错误标记,并将从人工审查中受益。即使我们不信任 52.4%和 98.4%的数字(正如你将在后面的章节中了解到的那样),假设置信度排名将与准确性相关是合理的。这几乎适用于几乎所有机器学习算法和几乎所有计算准确性的方法:你可以根据预测的置信度对项目进行排名,并抽取置信度最低的项目。对于一个关于项目x的标签集合y的概率分布,置信度由以下方程给出,其中 y*是最有信心(c)的标签:

对于像这个例子这样的二元预测任务,你可以简单地按置信度排名,并抽取置信度接近 50%的项目。然而,如果你尝试更复杂的事情,比如预测三个或更多互斥的标签、标记数据序列、生成整个句子(包括翻译和语音转录)或在图像和视频中识别对象,你有多种方法来计算置信度。我们将在后面的章节中回到其他计算置信度的方法。关于低置信度的直觉保持不变,二元任务对于你的第一个人工系统来说更容易。
2.3.2 识别异常值
如第一章所述,你通常想确保你为人工标记获得的项目种类多样,以便新抽取的项目不会都相似。这项任务可以包括确保你没有遗漏任何重要的异常值。一些灾难是罕见的,例如一颗大型小行星撞击地球。如果新闻标题说“小行星使核桃溪变平”,而你的机器学习模型还没有学会什么是小行星或核桃溪是一个城市,那么很容易理解为什么你的机器学习模型可能没有预测这个标题与灾难相关。你可以称这个句子在这个方面的一个异常值:它离你之前见过的任何东西都最远。
与置信度排名一样,我们有多种方法来确保我们最大化了为人工审查选择的内容的多样性。你将在后面的章节中了解更多关于这些方法的内容。现在,我们将关注一个简单的指标:每个未标记项目中单词的平均训练数据频率。以下是本章我们将实施的策略:
-
对于未标记数据中的每个项目,计算它与训练数据中已有项目的平均单词匹配数。
-
根据平均匹配数对项目进行排名。
-
抽取平均匹配数最低的项目。
-
将该项目添加到标记数据中。
-
重复这些步骤,直到你采样足够的数据进行一次人工审核迭代。
注意,在第 4 步中,当你采样了第一个项目后,你可以将该项目视为已标记,因为你知道你稍后会为它获取一个标签。
这种确定异常值的方法往往倾向于偏好小型和新颖的标题,因此你会看到代码将 1 加到计数中作为平滑因子。它还不喜欢包含许多常见单词(如the)的句子,即使其他单词不常见。因此,你与其使用平均匹配,不如跟踪新颖单词的原始数量,以模拟标题中新颖信息的总量,而不是整体平均值。
你也可以将训练数据中的匹配数除以该词在所有数据中出现的总次数,然后将这些分数相乘,这大致会给你提供该元素是异常值的贝叶斯概率。你不仅可以使用词匹配,还可以使用更复杂的基于编辑距离的指标,这些指标会考虑句子中单词的顺序。或者,你可以使用许多其他字符串匹配和其他算法来确定异常值。
与其他一切一样,你可以从实现本章中的简单示例开始,以后再尝试其他示例。主要目标是保险策略:是否有什么完全不同的事情我们还没有看到?可能没有,但如果有的话,那将是正确注释的最高价值项。我们将在第五章中探讨结合置信度采样和多样性采样的方法。
我们还将探讨如何将你的机器学习策略与你的注释策略相结合。如果你在机器学习领域工作了一段时间,但从未参与过注释或主动学习,你可能只优化了模型以实现准确性。对于完整的架构,你可能希望采取更全面的方法,其中你的注释、主动学习和机器学习策略相互告知。你可以决定实施可以提供更准确置信度估计的机器学习算法,但这可能会牺牲标签预测的准确性。或者,你可能增强你的机器学习模型以具有两种类型的推理:一种用于预测标签,另一种用于更准确地估计每个预测的置信度。如果你正在构建用于更复杂任务的模型,例如生成文本序列(如机器翻译)或图像中的区域(如目标检测),今天最常见的方法是为该任务本身构建单独的推理能力并解释置信度。我们将在本书的第九章到第十一章中探讨这些架构。
构建你的第一个带人工审核的机器学习模型的过程总结在图 2.2 中。

图 2.2 在你的第一个包含人类操作员的机器学习系统中,迭代过程。最初(顶部),你正在标注未标记项目的随机样本,将其作为评估数据。然后你开始标注用于训练数据的第一批项目(中间),同样从随机选择开始。在此之后,你开始使用主动学习(底部)来抽样低置信度或异常值的项目。
2.3.3 迭代过程中可以期待什么
在我们的示例代码中,在我们有足够的评估和初始训练数据后,我们将每 100 个项目迭代一次主动学习。从每次迭代的项数来看,这个数字可能有点小,因为你将花费大量时间等待模型重新训练相对较少的新标注项目,但 100 个是一个合适的数字,可以让你感受到每次迭代中采样数据的变化程度。
在你通过主动学习过程迭代时,可能会注意到以下一些事情:
-
第一次迭代—你主要在标注“非灾难相关”的标题,这可能会感觉有些枯燥。当主动学习开始发挥作用时,这种平衡将会改善,但到目前为止,获取随机抽样的评估数据是必要的。你也应该注意到,这个问题并不简单,因为记者经常将灾难隐喻用于非灾难事件,尤其是体育团队(宣布战争、得分干旱等)。你还将面临边缘案例的挑战。例如,飞机坠毁是否算作灾难,或者其状态是否取决于飞机的大小和/或原因?这些边缘案例将帮助你细化任务定义,并为吸引更多劳动力大规模标注数据制定正确的指导方针。
-
第二次迭代—你已经创建了你的第一个模型!你的 F 分数可能非常糟糕,可能只有 0.20。然而,你的曲线下面积(AUC)可能大约是 0.75。(参见附录了解更多关于 F 分数和 AUC 的信息。)所以尽管准确度不高,你比随机选择能更好地找到与灾难相关的信息。你可以通过调整模型参数和架构来修复 F 分数,但更多数据比模型架构更重要,当你开始标注时这一点将变得清晰:你将在第二次迭代时立即注意到大量项目与灾难相关。实际上,大部分项目可能都是。在早期,你的模型仍然会尝试将大多数事情预测为“非灾难相关”,所以任何接近 50%置信度的都位于“与灾难相关”的端点。这个例子表明,主动学习可以自我纠正:它在不要求你明确实现针对重要标签的采样策略的情况下,对低频标签进行了过度采样。你还将看到过度拟合的证据。例如,如果你的第一次迭代中随机选择的项目恰好有很多关于洪水的大标题,你可能有太多关于洪水的大标题,而关于其他类型灾难的则不够。
-
第三次和第四次迭代—你应该开始看到模型准确率提高,因为你现在标注了更多与“灾难相关”的标题,使得每个标签的标注数据更接近 50:50。如果你的模型对某些术语(如洪水示例)进行了过度拟合,你应该已经看到了一些反例,例如“新投资涌入市场”,这些反例有助于将你的模型推向对这些术语的标题进行更准确的预测。如果包含“地板”的所有内容确实与灾难相关,这些项目现在将以高置信度预测,并且不再接近 50%。无论如何,问题会自我纠正,你所看到的标题多样性应该会增加。
-
第五次到第十次迭代—你的模型开始达到合理的准确率水平,你应该会看到标题的更多多样性。只要每 100 个标注中 F 分数或 AUC 提高几个百分点,你就在准确率上取得了良好的提升。你可能希望你有更多的标注评估数据,这样你就可以在更大的保留数据集上计算准确率。不幸的是,你做不到。除非你准备放弃大量的现有标签,否则几乎不可能回到真正的随机采样。
虽然感觉很简单,但本章中你构建的系统遵循与 2018 年(在本章撰写前不到一年)亚马逊网络服务(AWS)SageMaker Ground Truth 初始发布相同的策略。事实上,在第一个版本中,SageMaker 仅根据置信度进行采样,在该版本中没有寻找异常值。虽然你构建的系统很简单,但它超越了目前由主要云服务提供商提供的主动学习工具的算法复杂性水平。我在 AWS 工作时短暂地参与了 SageMaker Ground Truth 的开发,所以这并不是对该产品或我的同事的批评,他们比我投入了更多的工作。尽管主动学习首次成为大规模商业产品的一部分,但它仍然处于早期阶段。
我们将在本书的第二部分介绍更复杂的采样方法。目前,更重要的是关注建立主动学习的迭代过程,以及标注、重新训练和评估你的模型的最佳实践。如果你没有正确地制定迭代和评估策略,你可能会轻易地使你的模型变得更差而不是更好,甚至可能没有意识到这一点。
2.4 构建获取人工标签的界面
为了标注你的数据,你需要从正确的界面开始。在本节中,我们将介绍我们的示例数据应该是什么样的。
适合人工标注的正确界面与合适的采样策略一样重要。如果你能将你的界面效率提高 50%,那就相当于将你的主动学习采样策略提高了 50%。出于对进行标注的人的尊重,你应该尽可能确保他们觉得他们尽可能有效。如果你真的不知道界面或算法改进是下一步的最佳关注点,那么从改善人类工作的界面开始,以后再考虑 CPU 的感受。
本书第三部分致力于数据标注,因此我们将做出一些假设以保持本章讨论的简单性:
-
标注者没有在标签上犯很多错误,所以我们不需要对标注实施质量控制。
-
标注者完全理解任务和标签,所以他们不会意外地选择错误的标签。
-
只有一个标注者在同一时间工作,所以我们不需要跟踪任何正在进行的标注。
这些假设是很大的。在大多数部署的系统中,你需要实施质量控制以确保标注者不会犯错误;你很可能会需要多次迭代标注来细化标签和指令的定义;并且你需要一个系统来跟踪分配给多个人并行工作的任务。如果你只想快速标注一些数据用于探索目的,就像你现在所做的那样,一个简单的标注界面就足够了。
2.4.1 用于标注文本的简单界面
你构建的界面取决于你的任务和数据分布。对于像我们在这里实施的二进制标注任务,一个简单的命令行界面就足够了(图 2.3)。如果你运行本章中介绍的脚本,你会立即看到它:
> python active_learning_basics.py

图 2.3 本章示例的命令行界面标注工具
如引言中所述,许多人机交互因素都涉及到制作一个好的标注界面。但如果你必须快速构建一些东西,请执行以下操作:
-
建立一个界面,让标注者能够专注于屏幕的一部分。
-
允许所有操作的热键。
-
包含一个后退/撤销选项。
首先确保这三件事正确,然后图形设计可以稍后进行。
要确切了解代码在做什么,请查看github.com/rmunro/pytorch_active_learning上的仓库,或者将其本地克隆并对其进行实验。为了说明目的,本书将分享该代码的摘录。
你可以在以下列表中的get_annotations()函数的前 20 行中看到引发标注的代码。
列表 2.1 标注我们想要标注的无标签项
def get_annotations(data, default_sampling_strategy="random"):
"""Prompts annotator for label from command line and adds annotations to
➥ data
Keyword arguments:
data -- an list of unlabeled items where each item is
[ID, TEXT, LABEL, SAMPLING_STRATEGY, CONFIDENCE]
default_sampling_strategy -- strategy to use for each item if not
➥ already specified
"""
ind = 0
while ind <= len(data):
if ind < 0:
ind = 0 # in case you've gone back before the first
if ind < len(data):
textid = data[ind][0]
text = data[ind][1]
label = data[ind][2]
strategy = data[ind][3]
if textid in already_labeled:
print("Skipping seen "+label)
ind+=1
else:
print(annotation_instructions)
label = str(input(text+"\n\n> ")) ❶
...
...
❶ input()函数提示用户输入。
对于我们的数据,标签有点不平衡,因为大多数标题与灾难无关。这一事实对界面设计有影响。如果有人不断选择“与灾难无关”,这将既低效又无聊。只要你有标注者不可避免地被诱导选择默认选项的后备选项,你就可以将“与灾难无关”作为默认选项以提高效率。你可能自己就是这样做的:快速标注后,当你按下错误答案时不得不返回。你应该在get_annotations()函数的下一部分和最后的 20 行代码中看到这个功能。
列表 2.2 允许标注者通过重复来避免错误
def get_annotations(data, default_sampling_strategy="random"):
...
...
if label == "2":
ind-=1 # go back
elif label == "d":
print(detailed_instructions) # print detailed
➥ instructions
elif label == "s":
break # save and exit
else:
if not label == "1":
label = "0" # treat everything other than 1 as 0
data[ind][2] = label # add label to our data
if data[ind][3] is None or data[ind][3] == "":
data[ind][3] = default_sampling_strategy # default if
➥ none given
ind+=1
else:
#last one - give annotator a chance to go back
print(last_instruction)
label = str(input("\n\n> "))
if label == "2":
ind-=1
else:
ind+=1
return data
2.4.2 管理机器学习数据
对于一个部署的系统,最好将你的注释存储在一个负责备份、可用性和可扩展性的数据库中。但你不能像在本地机器上浏览文件那样轻松地浏览数据库。除了将训练项目添加到你的数据库中,或者如果你正在构建一个简单的系统,拥有可以快速检查的本地存储数据和注释可能会有所帮助。
在我们的例子中,我们将根据标签将数据分开存储到单独的文件中,以增加冗余。除非你在一个已经为标注和机器学习建立了良好数据管理流程的组织中工作,否则你可能没有像对代码那样对数据进行相同的质量控制,例如单元测试和良好的版本控制。因此,在存储数据的方式上保持冗余是明智的。同样,你也会看到代码会附加文件,但永远不会覆盖文件。它还会保持未标记数据.csv 文件不变,在项目被标记时检查其他数据集的重复项,而不是从该文件中删除标题。
在存储标签的方式上保持冗余并强制不删除数据,当你开始实验时将节省你很多麻烦。我从未遇到过一位机器学习专业人士没有在某个时候意外删除过标记数据,所以请遵循这些建议!同时,也请记住,如果你在本地机器上存储数据,这些数据可能属于其他人或包含敏感内容。确保你有权存储这些数据,并在不再需要时删除数据。
尽管这个主题没有在本书中涵盖,但对你数据版本控制同样重要,尤其是当你边更新指令边进行时。一些较旧的标签可能是不正确的,如果你想在以后重新创建你的主动学习迭代,你希望能够重新生成它们。
2.5 部署你的第一个闭环机器学习系统
现在,让我们将您第一个闭环系统中所有部件组合起来!如果您在本章的早期没有这样做,请从github.com/rmunro/pytorch_active_learning下载代码和数据,并查看 readme 文件以获取安装说明。
您可以立即运行此代码,它将开始提示您标注数据,并在每次迭代后自动训练。您应该体验在 2.3.3 节中学到的每个迭代中的数据变化。
为了了解底层发生了什么,让我们通过此代码的主要组件及其背后的策略来分析。我们使用一个简单的 PyTorch 机器学习模型进行文本分类。我们将使用一个可以快速重新训练的浅层模型来使我们的迭代快速进行。在 PyTorch 中,整个模型定义只有十几行代码。
列表 2.3 具有一个隐藏层的简单 PyTorch 文本分类模型
class SimpleTextClassifier(nn.Module): # inherit pytorch's nn.Module
"""Text Classifier with 1 hidden layer
"""
def __init__(self, num_labels, vocab_size):
super(SimpleTextClassifier, self).__init__() # call parent init
# Define model with one hidden layer with 128 neurons
self.linear1 = nn.Linear(vocab_size, 128) ❶
self.linear2 = nn.Linear(128, num_labels) ❷
def forward(self, feature_vec):
# Define how data is passed through the model
hidden1 = self.linear1(feature_vec).clamp(min=0) # ReLU ❸
output = self.linear2(hidden1) ❹
return F.log_softmax(output, dim=1) ❺
❶ 具有 128 个神经元/节点的隐藏层
❷ 输出层预测每个标签
❸ 使用 ReLU 激活函数优化我们的隐藏层
❹ 使用线性激活函数作为我们的输出层
❺ 将我们的线性输出的 log softmax 返回以优化训练中的模型,并将其作为预测的概率分布返回
我们输入层包含特征集中每个单词的一热编码(数千个),输出层是两个标签,隐藏层有 128 个节点。
对于训练,我们知道标签之间的数据最初是不平衡的,因此我们想要确保我们为每个标签选择接近偶数个项目的某种东西。此规范在代码开始时设置在这些变量中:
epochs = 10 # number of epochs per training session
select_per_epoch = 200 # number to sample per epoch per label
我们将训练我们的模型 10 个周期,并且对于每个周期,我们将从每个标签随机选择 200 个项目。这种方法不会使我们的模型完全平衡,因为我们仍然是在所有周期中选择来自非灾难相关文本的更大种类,但即使我们只有大约 100 个与灾难相关的示例,这也将足够我们从数据中获得一些信号。
(隐藏神经元、周期和每个周期选择的项目是合理的,但其他方面是任意起点。您可以尝试不同的超参数,但在标注过程的开始,您应该专注于数据。)
下一个展示的train_model()函数是训练我们模型的代码。
列表 2.4 训练文本分类模型
def train_model(training_data, validation_data = "", evaluation_data = "",
➥ num_labels=2, vocab_size=0):
"""Train model on the given training_data
Tune with the validation_data
Evaluate accuracy with the evaluation_data
"""
model = SimpleTextClassifier(num_labels, vocab_size)
# let's hard-code our labels for this example code
# and map to the same meaningful booleans in our data,
# so we don't mix anything up when inspecting our data
label_to_ix = {"not_disaster_related": 0, "disaster_related": 1}
loss_function = nn.NLLLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# epochs training
for epoch in range(epochs):
print("Epoch: "+str(epoch))
current = 0
# make a subset of data to use in this epoch
# with an equal number of items from each label
shuffle(training_data) #randomize the order of the training data
related = [row for row in training_data if '1' in row[2]]
not_related = [row for row in training_data if '0' in row[2]]
epoch_data = related[:select_per_epoch] ❶
epoch_data += not_related[:select_per_epoch]
shuffle(epoch_data)
# train our model
for item in epoch_data:
features = item[1].split()
label = int(item[2])
model.zero_grad()
feature_vec = make_feature_vector(features, feature_index)
target = torch.LongTensor([int(label)])
log_probs = model(feature_vec)
# compute loss function, do backward pass, and update the
➥ gradient
loss = loss_function(log_probs, target)
loss.backward()
optimizer.step()
❶ 为每个标签选择等量的项目,以有效地对较小的标签进行过采样,尤其是在标注的早期迭代中。
您可以看到我们正在保持训练超参数不变,例如学习率和激活函数的类型。对于实际系统,您可能想要尝试训练超参数,以及更好地模拟单词序列或像素集群的架构,如果您正在进行图像分类。
如果你进行任何超参数调整,你应该创建验证数据并使用这些数据来调整你的模型,就像你在机器学习中已经习惯做的那样。实际上,你可能需要多种类型的验证数据集,包括在每个迭代中从你的训练数据中抽取的一个,一个在你使用主动学习之前从你的未标记数据中抽取的,以及一个在每个迭代中从剩余的未标记项目中抽取的。我们将在第三章中回到主动学习的验证数据。现在,我们省略了额外的标注。如果你想在本章的示例中调整模型,请在每个迭代中从你的训练数据集中抽取随机选择的数据。
train_model() 函数的剩余部分评估新模型的准确性并将其保存到 models/ 文件夹中。我将在下一节中介绍评估。
如前所述,在开始构建任何机器学习系统之前,你应该熟悉你的数据。幸运的是,这个最佳实践也适用于主动学习。你应该首先选择评估数据,并且你应该成为负责标注这些数据的人之一。
2.5.1 总是首先获取评估数据
评估数据通常被称为测试集或保留数据,对于这个任务,它应该是我们标注的标题的随机样本。我们将在每次主动学习迭代后始终保留这些标题,以便我们可以跟踪模型在每次迭代后的准确性。
首先获取评估数据非常重要,因为在你开始其他采样技术之后,有很多方式会无意中使你的评估数据产生偏差。以下是一些如果你没有首先提取评估数据可能会出错的情况:
-
如果你忘记在低置信度采样之后从未标记的项目中采样评估数据,你的评估数据将偏向于剩余的高置信度项目,你的模型看起来会比实际更准确。
-
如果你忘记采样评估数据,并在置信度采样之后从你的训练数据中抽取评估数据,你的评估数据将偏向于低置信度项目,你的模型看起来会比实际更不准确。
-
如果你已经实现了异常值检测,后来又尝试提取评估数据,几乎不可避免地会产生偏差,因为你抽取的项目已经对额外异常值的采样做出了贡献。
如果你没有首先制作评估数据会发生什么?
如果你没有记住首先获取评估数据,就很难知道你的模型有多准确。这个错误是我看到人们犯的最大错误之一。一旦数据科学家获得任何新的手工标签,他们自然会想要将这些标签添加到他们的训练数据中,看看他们的模型能提高多少准确性。但如果你对评估数据没有给予足够的重视,并且没有小心地确保其真正随机,你就不会知道你的模型有多准确。我见过一些公司错误地构建自动驾驶汽车、社交媒体流和约会应用,评估数据出错。要知道,今天从你身边驶过的车辆、推荐给你的新闻文章以及你未来可能要嫁的人,都可能是由不确定准确性的机器学习模型决定的。
如果你想要立即开始训练,至少先设置好评估数据,这样它就不会影响你的分析。你可以稍后回来注释这些数据,或者与你的训练和验证数据并行注释。
最后,如果你将模型应用于一个持续变化的信息流,可能无法选择真正随机的数据。在持续的灾害响应情况下,这绝对会是这种情况,因为随着时间的推移,会报告有关变化条件和需求的新信息。对于我们在这里正在处理的例子,我们被要求标记一组有限的新闻标题,因此选择标题的随机样本作为我们的训练数据是有意义的。我们将在第三章中回到更复杂情境下的评估数据抽样策略。
评估模型在每个迭代中准确性的代码是evaluate_model()函数。
列表 2.5 在保留数据上评估模型
def evaluate_model(model, evaluation_data):
"""Evaluate the model on the held-out evaluation data
Return the f-value for disaster-related and the AUC
"""
related_confs = [] # related items and their confidence of being related
not_related_confs = [] # not related items and their confidence of
➥ being _related_
true_pos = 0.0 # true positives, etc
false_pos = 0.0
false_neg = 0.0
with torch.no_grad():
for item in evaluation_data:
_, text, label, _, _, = item
feature_vector = make_feature_vector(text.split(), feature_index)
log_probs = model(feature_vector)
# get confidence that item is disaster-related
prob_related = math.exp(log_probs.data.tolist()[0][1]) ❶
if(label == "1"):
# true label is disaster related
related_confs.append(prob_related)
if prob_related > 0.5:
true_pos += 1.0
else:
false_neg += 1.0
else:
# not disaster-related
not_related_confs.append(prob_related)
if prob_related > 0.5:
false_pos += 1.0
...
...
❶ PyTorch 张量是二维的,所以我们只需要提取预测的置信度。
这段代码获取每个项目被预测为“与灾害相关”的置信度,并跟踪每个预测是否正确或错误。原始准确率在这里不是一个好的度量标准。因为两个标签的频率不平衡,你每次预测“非灾害相关”都会得到近 95%的准确率。这个结果没有信息量,我们的任务特别是要找到与灾害相关的标题,因此我们将计算准确率作为灾害相关预测的 F 分数。
除了关心 F 分数外,我们还关心置信度是否与准确性相关,因此我们计算 ROC 曲线下的面积。ROC(接收者操作特征)曲线按置信度对数据集进行排序,并计算真正例与假正例的比率。
请参阅附录,其中定义了精确度、召回率、F 分数和 AUC 的讨论,这些都在我们代码的evaluate_model()函数中实现。
列表 2.6 计算精确度、召回率、F 分数和 AUC
def evaluate_model(model, evaluation_data):
...
...
# Get FScore
if true_pos == 0.0:
fscore = 0.0
else:
precision = true_pos / (true_pos + false_pos)
recall = true_pos / (true_pos + false_neg)
fscore = (2 * precision * recall) / (precision + recall) ❶
# GET AUC
not_related_confs.sort()
total_greater = 0 # count of how many total have higher confidence
for conf in related_confs:
for conf2 in not_related_confs:
if conf < conf2: ❷
break
else:
total_greater += 1
denom = len(not_related_confs) * len(related_confs)
auc = total_greater / denom
return[fscore, auc]
❶ 精确度和召回率的调和平均值
❷ 对于我们关心的标签(在这种情况下是“相关”),我们想知道有多少被预测为具有该标签,并且比没有该标签的项目具有更高的置信度。
如果你查看模型目录中任何你构建的模型的文件名,你会看到文件名包括时间戳、模型的 F 分数和 AUC 的准确度以及训练项的数量。为你的模型提供详细和透明的名称是良好的数据管理实践,这将让你通过查看目录列表简单地跟踪每个迭代的准确度。
2.5.2 每个数据点都有机会
通过在主动学习的每个迭代中包含新的随机采样项目,你得到该迭代的一个基线。你可以比较在随机项目上训练的准确性与你的其他采样策略,这可以告诉你你的采样策略与随机采样相比有多有效。你将已经知道有多少新标注的项目与你的模型预测的标签不同,但你不会知道它们在添加到训练数据后会对未来的预测造成多大的变化。
即使你的其他主动学习策略在迭代中失败,你仍然会从随机样本中获得增量改进,因此随机采样是一个很好的后备方案。
在这里也有一个道德选择。我们承认所有策略都不完美,因此每个数据项仍然有一定的机会被随机选择并由人工审查,即使没有任何采样策略会选择它。在实际的灾难场景中,你希望消除有人会看到重要标题的机会吗?因为你的采样策略永远不会选择它?道德问题是一个你应该根据你正在处理的数据和用例来问自己的问题。
2.5.3 为您的数据选择合适的策略
我们知道在我们的数据中,灾难相关的标题很少,因此选择异常值的策略不太可能选择很多与灾难相关的项目。因此,示例代码专注于根据以下策略按置信度选择并针对每个迭代采样数据:
-
10% 从未标记的项目中随机选择
-
80% 从置信度最低的项目中选择
-
10% 被选为异常值
假设低置信度项目实际上是 50:50 与灾难相关和非灾难相关,当大量项目已被标注并且我们的模型稳定时,标注者应该看到略多于 4/10 的与灾难相关的消息。这个结果足够接近,以至于我们不必担心排序效应会在后续迭代中影响标注者。
以下三个列表包含三个策略的代码。首先,我们获取低置信度预测。
列表 2.7 使用低置信度采样项目
def get_low_conf_unlabeled(model, unlabeled_data, number=80, limit=10000):
confidences = []
if limit == -1:
print("Get confidences for unlabeled data (this might take a while)")
else:
# only apply the model to a limited number of items
shuffle(unlabeled_data)
unlabeled_data = unlabeled_data[:limit]
with torch.no_grad():
for item in unlabeled_data:
textid = item[0]
if textid in already_labeled:
continue
text = item[1]
feature_vector = make_feature_vector(text.split(), feature_index)
log_probs = model(feature_vector)
prob_related = math.exp(log_probs.data.tolist()[0][1]) ❶
if prob_related < 0.5:
confidence = 1 - prob_related
else:
confidence = prob_related
item[3] = "low confidence"
item[4] = confidence
confidences.append(item)
confidences.sort(key=lambda x: x[4]) ❷
return confidences[:number:]
❶ 获取每个标签的项目概率。
❷ 按置信度对项目进行排序。
接下来,我们获取随机项目。
列表 2.8 样本随机项
def get_random_items(unlabeled_data, number = 10):
shuffle(unlabeled_data)
random_items = []
for item in unlabeled_data:
textid = item[0]
if textid in already_labeled:
continue
random_items.append(item)
if len(random_items) >= number:
break
return random_items
最后,我们得到了异常值。
列表 2.9 样本异常值
def get_outliers(training_data, unlabeled_data, number=10):
"""Get outliers from unlabeled data in training data
Returns number outliers
An outlier is defined as the percent of words in an item in
unlabeled_data that do not exist in training_data
"""
outliers = []
total_feature_counts = defaultdict(lambda: 0)
for item in training_data:
text = item[1]
features = text.split()
for feature in features:
total_feature_counts[feature] += 1 ❶
while(len(outliers) < number):
top_outlier = []
top_match = float("inf")
for item in unlabeled_data:
textid = item[0]
if textid in already_labeled:
continue
text = item[1]
features = text.split()
total_matches = 1 # start at 1 for slight smoothing
for feature in features:
if feature in total_feature_counts:
total_matches += total_feature_counts[feature] ❷
ave_matches = total_matches / len(features)
if ave_matches < top_match:
top_match = ave_matches
top_outlier = item
# add this outlier to list and update what is 'labeled',
# assuming this new outlier will get a label
top_outlier[3] = "outlier"
outliers.append(top_outlier)
text = top_outlier[1]
features = text.split()
for feature in features:
total_feature_counts[feature] += 1 ❸
return outliers
❶ 计算训练数据中所有特征的数量。
❷ 将未标记数据项中此特征出现的次数添加到该特征中。
❸ 更新此项目的训练数据计数,以帮助增加下一次采样的异常值的多样性。
你可以看到,在默认情况下,在 get_low_conf_unlabeled() 函数中,我们只对 10,000 个未标记项进行置信度预测,而不是对整个数据集进行预测。这个示例使得迭代之间的时间更加可控,因为你可能需要等待几分钟甚至几小时才能完成所有预测,这取决于你的机器。这个示例也增加了数据的多样性,因为我们每次都是从未标记项的不同子集中选择低置信度项。
2.5.4 重新训练模型并迭代
现在你有了新标注的项,你可以将它们添加到训练数据中,并查看模型准确性的变化。如果你运行本章开头下载的脚本,你会看到在完成每个迭代的标注后,重新训练会自动进行。
如果你查看那段代码,你也会看到结合了本章中我们讨论的所有代码的控制部分。这段额外的代码是超参数,例如每次迭代的注释数量,以及文件末尾的代码,确保首先获取评估数据,然后训练模型,并在拥有足够的评估数据时开始使用主动学习进行迭代。本章的示例代码少于 500 行,因此花时间理解每一步发生的事情,并思考如何扩展代码的任何部分是值得的。
如果你来自机器学习背景,特征的数量可能会让你感到惊讶。你可能只有 1,000 个标记的训练项,就有超过 10,000 个特征。如果你不再标记任何数据,你的模型不应该看起来是这个样子:如果你减少特征数量,你几乎肯定能获得更高的准确性。但有些反直觉的是,你想要大量的特征,尤其是在主动学习的早期迭代中,当你希望每个特征都对罕见的灾难相关标题产生影响时。否则,你的早期模型可能会更加偏向于你随机首次采样的那种标题类型。你有多种方式可以将你的机器学习架构和主动学习策略结合起来,我将在第九章到第十一章中介绍主要的方法。
在完成大约 10 次注释迭代后,查看您的训练数据。您会发现大多数项目都是通过低置信度选择的,这并不令人惊讶。寻找那些被列为异常值选择的项,可能会让您感到惊讶。可能有一些例子,其中的单词(对您来说)显然与灾难相关,这意味着这些例子以可能被遗漏的方式增加了您数据集的多样性。
尽管主动学习可以自我纠正,但您是否能看到任何证据表明它没有纠正某些偏差?常见例子包括过度采样过长或过短的句子。计算机视觉的等效例子是过度采样过大或过小、高分辨率或低分辨率的图像。您选择的异常值策略和机器学习模型可能基于这些特征进行过度采样,而这些特征并不是您目标的核心。在这种情况下,您可能需要考虑将本章中的方法应用于不同数据桶中的数据:最低置信度短句、最低置信度中等句子和最低置信度长句。
如果您愿意,也可以在这个代码中尝试采样策略的变体。尝试仅对随机选择的项进行重新训练,并将结果精度与另一个系统进行比较,该系统在相同数量的低置信度选择的项上重新训练,并使用异常值采样。哪种策略影响最大,以及影响有多大?
您还可以考虑接下来应该开发什么:
-
更高效的注释界面
-
帮助防止注释错误的质量控制
-
更好的主动学习采样策略
-
用于分类算法的更复杂的神经网络架构
您的主观体验可能与我的不同,而且尝试在此处提供的示例数据集之外的数据集上的这个例子也可能改变了某些事情。但很可能您已经将前三个选项之一识别为下一个需要构建的最重要组件。如果您来自机器学习背景,您的第一直觉可能是保持数据不变,并开始尝试更复杂的神经网络架构。这项任务可能是最好的下一步,但通常在早期并不是最重要的。一般来说,您应该首先确保数据正确;调整机器学习架构在迭代后期变得更重要。
本书剩余部分帮助您学习如何设计更好的注释界面,实施更好的注释质量控制,制定更好的主动学习策略,以及找到更好的方法来组合这些组件。
摘要
-
一个简单的人机交互机器学习系统可以涵盖整个周期,从采样未标记数据到更新模型。这种方法让您可以快速开始使用一个完整的 MVP 系统,并根据需要构建。
-
两种简单的主动学习策略易于实施:从预测中采样最不自信的项目和采样异常值。理解这些策略的基本目标将有助于你深入探索本书后面的不确定性采样和多样性采样。
-
简单的命令行界面可以允许人类高效地标注数据。即使是一个简单的纯文本界面,如果按照一般的人机交互原则构建,也可以是高效的。
-
良好的数据管理,例如将创建评估数据作为首要任务,对于正确执行至关重要。如果你没有正确处理你的评估数据,你可能永远不知道你的模型有多准确。
-
定期迭代使用新标注的数据重新训练机器学习模型表明,随着时间的推移,你的模型会变得更加准确。如果设计得当,主动学习迭代自然会自我纠正,一个迭代中的过拟合会在后续迭代中的采样策略中得到纠正。
^(1.)感谢 Jennifer Prendki(本文中一个轶事的作者)提出了“hacktive learning”这个术语。由于我们不同的口音,我们在合作时互相误解,我们都将“active learning”理解为“hacktive learning”,无意中发明了这个有用的短语。
^(2.)有关我们如何追踪流行病的信息,请参阅nlp.stanford.edu/pubs/Munro2012epidemics.pdf。自从我在 2019 年初写下这个笔记以来,COVID-19 使这个用例的重要性变得更加明显。
第二部分 主动学习
现在您已经在前两章学习了人机交互架构,我们将用四章来探讨主动学习:一组用于采样人类需要审查的最重要数据的技巧。
第三章涵盖了不确定性采样,介绍了理解模型不确定性的最广泛使用的技术。章节首先介绍了从单个神经网络模型解释不确定性的不同方法,然后探讨了不同类型的机器学习架构中的不确定性。章节还涵盖了在您对每个数据项有多个预测时如何计算不确定性,例如当您使用模型集成时。
第四章解决了这样一个复杂问题:由于采样不足或数据不具代表性,您的模型可能自信但错误。它介绍了一系列数据采样方法,这些方法有助于识别模型知识中的空白,例如聚类、代表性采样以及识别和减少模型中现实世界偏差的方法。这些技术统称为多样性采样。
不确定性采样和多样性采样结合使用时最为有效,因此第五章介绍了将不同策略结合成一个综合的主动学习系统的方法。第五章还涵盖了某些优势迁移学习技术,这些技术允许您调整机器学习模型以预测要采样的项目。
第六章涵盖了如何将主动学习技术应用于不同类型的机器学习任务,包括目标检测、语义分割、序列标注和语言生成。这些信息,包括每种技术的优缺点,将使您能够将主动学习应用于任何机器学习问题。
3 不确定性采样
本章涵盖
-
理解模型预测的分数
-
将多个标签的预测组合成一个单一的不确定性分数
-
将多个模型的预测组合成一个单一的不确定性分数
-
使用不同种类的机器学习算法计算不确定性
-
决定每次迭代周期向人类展示多少个项目
-
评估不确定性采样的成功率
人们用来使人工智能变得更聪明的最常见策略是让机器学习模型告诉人类它们在任务上不确定的时候,然后请求人类提供正确的反馈。一般来说,混淆算法的无标签数据在标记并添加到训练数据中时最有价值。如果算法可以以高置信度标记一个项目,那么它很可能是正确的。
这章致力于解释我们的模型试图告诉我们它对其任务不确定时的问题。但知道模型不确定以及如何计算这种不确定性并不总是容易的。在简单的二进制标记任务之外,衡量不确定性的不同方式可以产生截然不同的结果。你需要理解和考虑所有确定不确定性的方法,以便为你的数据和目标选择正确的方法。
例如,想象一下你正在构建一辆自动驾驶汽车。你希望帮助汽车理解它在行驶过程中遇到的新类型物体(行人、骑自行车的人、街牌、动物等等)。然而,要做到这一点,你需要了解汽车在看到什么物体时感到不确定,以及如何最好地解释和应对这种不确定性。
3.1 解释机器学习模型中的不确定性
不确定性采样 是一系列技术,用于识别当前机器学习模型决策边界附近的无标签项目。虽然识别模型何时自信很容易——有一个非常高的置信度结果——但你有很多种计算不确定性的方法,你的选择将取决于你的用例以及对你特定数据最有效的方法。
在本章中,我们探讨了四种不确定性采样的方法:
-
最小置信度采样—最自信预测与 100%置信度之间的差异。在我们的例子中,如果模型最自信地认为图像中有一个行人,最小置信度捕捉了该预测的置信度(或不确定性)。
-
置信度采样范围 两个最自信预测之间的差异。在我们的例子中,如果模型最自信地认为图像中有一个行人,第二自信地认为图像中包含一个动物,置信度范围捕捉了这两个置信度之间的差异。
-
置信度比率——两个最自信预测之间的比率。在我们的例子中,如果模型最自信地认为图像中有一个行人,第二自信地认为图像中包含一个动物,比率捕捉了这两个置信度之间的比率(而不是差异)。
-
基于熵的采样,根据信息理论定义的所有预测之间的差异。在我们的例子中,基于熵的采样将捕捉每个置信度与每个其他置信度之间的差异程度。
我们还将探讨如何从不同类型的机器学习算法中确定不确定性,以及当你对每个数据项有多个预测时如何计算不确定性,例如当你使用模型集成时。
理解每种方法的优缺点需要深入了解每种策略的确切操作,因此本章提供了详细的示例,包括方程和代码。在你开始正确解释置信度之前,你还需要了解置信度是如何生成的,因此本章从如何解释你模型的概率分布开始,特别是如果它们是由 softmax 生成的,这是从神经网络模型生成置信度最流行的算法。
3.1.1 为什么要在你的模型中寻找不确定性?
让我们回到我们的自动驾驶汽车示例。假设你的汽车大部分时间都在高速公路上行驶,它已经擅长导航,而且物体数量有限。例如,在主要高速公路上,你很少看到骑自行车的人或行人。如果你从汽车的录像中随机选择视频片段,你的选择将主要来自高速公路,汽车在那里已经很有信心并且驾驶得很好。如果人类主要对汽车在已经很有信心的高速公路驾驶方面提供反馈,那么人类几乎无法做任何事情来提高汽车的驾驶技能。
因此,你想要知道当你的自动驾驶汽车在行驶时最困惑的时刻。所以你决定从汽车对其检测到的物体最不确定的视频片段中提取视频片段,然后让人类为这些视频片段中的物体提供地面真实情况(训练数据)。人类可以识别移动物体是行人、另一辆车、骑自行车的人,或者汽车的对象检测系统可能遗漏的其他重要物体。不同的物体可以预期以不同的速度移动,并且更或更不可预测,这将帮助汽车预测这些物体的移动。
例如,汽车在暴风雪中驾驶时可能最困惑。如果你只展示暴风雪的视频片段,那么这些数据在 99%的情况下对汽车没有帮助,因为那时汽车不在暴风雪中。事实上,这些数据可能会使汽车变得更糟。暴风雪会限制可见范围,你可能会无意中使数据产生偏差,使得汽车的行为只有在暴风雪中才有意义,而在其他地方则很危险。你可能会教会汽车忽略所有远处的物体,因为下雪时它们根本看不见;这样,你将限制汽车在非暴风雪条件下预测远处物体的能力。因此,你需要不同类型的条件,在这些条件下你的汽车正在经历不确定性。
此外,在多个对象的情况下,如何定义不确定性并不明确。是不确定性关于预测的最可能对象吗?是在两个最可能的预测之间吗?或者,在为汽车检测到的某个对象制定整体不确定性得分时,你应该考虑每个可能的对象吗?当你深入挖掘时,决定应该将自动驾驶汽车视频中的哪些对象展示给人类进行审查是困难的。
最后,当模型不确定时,它并没有用简单易懂的语言告诉你:即使对于单个对象,机器学习模型给出的数字可能对应预测的置信度,但不一定是准确性的可靠度量。我们本章的起点是了解模型何时不确定。从这个基础上,你将能够构建更广泛的样本不确定性策略。
所有主动学习技术的潜在假设是,某些数据点对你的模型比其他数据点更有价值。(具体例子见以下边栏。)在本章中,我们将从通过查看 softmax 来解释模型输出开始。
并非所有数据都同等重要
Jennifer Prendki 的专家轶事
如果你关心你的营养,你不会去超市随意从货架上挑选商品。你可能会通过从超市货架上随机挑选商品最终获得所需的营养,但在这个过程中你会吃很多垃圾食品。我认为在机器学习中,人们仍然认为随机采样超市比找出他们需要的东西并集中精力在那里更好,这很奇怪。
我构建的第一个主动学习系统是迫不得已的。我正在构建机器学习系统,以帮助一家大型零售店确保当有人在网站上搜索时,正确的产品组合会显示出来。一夜之间,公司重组意味着我的人力标注预算减半,而我们需要标注的库存增加了 10 倍。因此,我的标注团队每个项目的预算只有我们之前的一半。我创建了第一个主动学习框架,以发现最重要的 5%。结果比使用更大预算的随机采样要好。从那时起,我在大多数项目中都使用了主动学习,因为并非所有数据都是平等的!
Jennifer Prendki 是 Alectio 公司的首席执行官,该公司专门寻找机器学习所需的数据。她之前在 Atlassian、Figure Eight 和 Walmart 领导数据科学团队。
3.1.2 Softmax 和概率分布
正如你在第二章中发现的那样,几乎所有的机器学习模型都给你两样东西:
-
一个预测标签(或一组预测)
-
与每个预测标签相关联的数字(或一组数字)
假设我们有一个简单的自动驾驶汽车目标检测模型,它试图区分只有四种类型的对象。该模型可能会给出以下预测。
列表 3.1 JSON 编码的预测示例
{
"Object": {
"Label": "Cyclist",
"Scores": {
"Cyclist": 0.9192784428596497, ❶
"Pedestrian": 0.01409964170306921,
"Sign": 0.049725741147994995,
"Animal": 0.016896208748221397
}
}
}
❶ 在这个预测中,对象被预测为“Cyclist”,准确率为 91.9%。这些分数相加将等于 100%,从而给出该项目的概率分布。
这个输出很可能是来自softmax,它通过指数将 logits 转换为 0-1 范围的分数。softmax 的定义如下

如图 3.1 所示。

图 3.1 如何通过 softmax 创建概率分布。输出层使用线性激活函数,生成模型得分(logits),然后通过 softmax 转换为概率分布。
因为softmax除以指数,它失去了 logits 的规模。例如,图 3.1 中的 logits 是[1, 4, 2, 1]。如果 logits 是[101, 104, 102, 101],softmax 将产生相同的概率分布,所以模型中的激活水平在输出中丢失了。我们将在第四章中探讨如何考虑激活。在本章中,理解仅使用概率分布时丢失了一些信息是很重要的。
如果你过去只使用了 softmax 的输出,我强烈建议阅读附录。正如其中解释的那样,softmax 的基数(.是任意的)可以通过改变基数来改变对不同项目预测的置信度排名顺序。这个事实并不广为人知,在此书之前从未有过报道。排名顺序对于不确定性采样很重要,正如你将在本章中看到的那样,因此在你自己的实验中,你可能想尝试改变 softmax 的基数(或等价地,温度),除了采用本章后面描述的技术之外。
从你的模型中获得更准确的置信度的一个常见方法是通过使用验证数据集调整 softmax 的基数/温度,以便概率分布尽可能接近实际准确性。例如,你可能调整 softmax 的基数/温度,使得置信度分数 0.7 有 70%的时间是正确的。调整基数/温度的一个更强大的替代方法是使用局部回归方法,如 LOESS,将你的概率分布映射到验证数据上的实际准确性。每个统计软件包都将包含一个或多个你可以实验的局部回归方法。
如果你只是建模不确定性以便采样最不确定的项目进行主动学习,那么概率分布是否准确反映准确性可能并不重要。你的选择将取决于你试图实现的目标,了解所有可用的技术会有所帮助。
3.1.3 解释主动学习的成功
你可以使用 F 分数和 AUC 等准确性指标来计算主动学习的成功,就像你在第二章中所做的那样。如果你来自算法背景,这项技术对你来说将是熟悉的。
然而,有时考虑人力成本更有意义。例如,你可以通过所需的人类标签数量来比较两种主动学习策略以实现一定的准确性目标。这可能会比使用相同数量的标签比较准确性大得多或小得多,因此计算两者都很有用。
如果你没有将项目放回训练数据中,因此没有实施完整的主动学习周期,那么仅从不确定性采样中暴露出的多少个错误预测来评估更有意义。也就是说,当你采样N个最不确定的项目时,模型错误预测的百分比是多少?
关于以人为中心的评估质量方法,例如标注数据所需的时间,请参阅附录,其中更详细地介绍了衡量模型性能的方法。
3.2 不确定性采样算法
现在你已经了解了模型预测中的置信度来源,你可以思考如何解释概率分布,以找出你的机器学习模型最不确定的地方。
不确定性采样是一种识别当前机器学习模型中接近决策边界的未标记项目的策略。如果你有一个二元分类任务,就像你在第二章中看到的那样,这些项目被预测为接近 50%的概率属于任一标签;因此,模型是不确定的。这些项目最有可能被错误分类;因此,它们最有可能导致人类标签与预测标签不同。图 3.2 显示了不确定性采样应该如何找到接近决策边界的项目。

图 3.2 不确定性采样是一种主动学习策略,它对接近决策边界(有时彼此接近)的未标记项目进行过采样,因此更有可能得到导致决策边界变化的人类标签。
有许多计算不确定性的算法,其中一些我们将在这里介绍。它们都遵循相同的原理:
-
将不确定性采样算法应用于大量预测,为每个项目生成一个不确定性分数。
-
按不确定性分数对预测进行排序。
-
选择前N个最不确定的项目进行人工审查。
-
为前N个项目获取人类标签,用这些项目重新训练模型,并迭代这个过程。
本章涵盖的三种方法对预测的数据是无关的:给定项目将获得相同的置信度分数,无论其他被预测项目的分数如何。这种无关性有助于本章中方法的简单性和可预测性:不确定性分数的排名顺序足以在一系列预测中找到最不确定的。然而,其他技术可以采用预测的分布来改变个别分数。我们将在第五章和第六章回到这个话题。
注意:对于二元分类任务,本章中的策略是相同的,但对于三个或更多标签,策略会迅速分化。
3.2.1 最小置信度采样
最简单且最常用的不确定性采样方法是将每个项目的 100%置信度与最自信预测的标签之间的差异。你在第二章中看到了这种主动学习的实现。让我们将 softmax 的结果称为给定预测的标签概率。我们知道 softmax 并不严格给出概率,但这些方程是适用于任何来源的概率分布的通用方程,而不仅仅是 softmax。基本方程只是标签最高置信度的概率,这是你在第二章中实现的:

虽然你可以仅根据置信度进行排序,但将不确定性得分转换为 0–1 范围可能很有用,其中 1 是最不确定的得分。在这种情况下,我们必须归一化得分。我们从 1 减去值,将结果乘以标签数量,然后除以标签数量 - 1。我们这样做是因为最小置信度永远不会低于标签数量的倒数,这是当所有标签都有相同的预测置信度时。因此,0-1 范围的最小置信度采样是

以下列表展示了 PyTorch 中最小置信度采样的实现。
列表 3.2 PyTorch 中的最小置信度采样
def least_confidence(*self*, prob_dist, sorted=False):
*"""*
*Returns the uncertainty score of an array using*
*least confidence sampling in a 0-1 range where 1 is most uncertain*
*Assumes probability distribution is a pytorch tensor, like:*
*tensor([0.0321, 0.6439, 0.0871, 0.2369])*
*Keyword arguments:*
*prob_dist -- a pytorch tensor of real numbers between 0 and 1 that*
➥ *total to 1.0*
*sorted – if the probability distribution is pre-sorted from largest to*
➥ *smallest*
*"""*
if sorted:
simple_least_conf = prob_dist.data[0]
else:
simple_least_conf = torch.max(prob_dist)
num_labels = prob_dist.numel() # number of labels
normalized_least_conf = (1 - simple_least_conf) *
➥ (num_labels / (num_labels - 1))
return normalized_least_conf.item()
让我们应用最小置信度来获取自动驾驶汽车预测的不确定性得分。这里只计算“行人”的置信度。使用我们的示例,这个不确定性得分将是 (1 – 0.6439) * (4 / 3) = 0.4748。因此,最小置信度采样为你提供了预测的排序顺序,其中你会采样预测标签置信度最低的项目。这种方法对第二、第三等值敏感,仅在于其他预测的总和将是得分本身:将分配给最自信标签之外标签的置信度量。
| 预测标签 | 骑行者 | 行人 | 标志 | 动物 |
|---|---|---|---|---|
| softmax | 0.0321 | 0.6439 | 0.0871 | 0.2369 |
此方法不会对其他任何预测之间的不确定性敏感:对于最自信的预测具有相同的置信度,从第二到第 n 个置信度可以取任何值,而不会改变不确定性得分。如果你只关心特定用例中最自信的预测,这种方法是一个很好的起点。否则,你可能希望使用以下章节中讨论的其中一种方法。
最小置信度对 softmax 算法的基数敏感。这个例子有点反直觉,但回想一下 softmax(base=10) 给出 ~0.9 的置信度,这将导致不确定性得分为 0.1——比相同数据上的 0.35 小得多。对于不同的基数,这个得分将改变整体排名。softmax 的更高基数会拉大最自信标签和其他标签之间的差异;因此,在更高基数下,标签置信度之间的差异将比最自信标签和 1.0 之间的绝对差异更重要。
3.2.2 置信度边际采样
最直观的不确定性采样形式是两个最自信预测之间的差异。也就是说,对于模型预测的标签,它比下一个最自信标签更自信多少?这被定义为

再次强调,我们可以将其转换为 0–1 范围。我们再次需要从 1.0 中减去,但最大可能的得分已经是 1,因此不需要乘以任何系数:

下面是使用 PyTorch 实现的置信度范围采样。
列表 3.3 PyTorch 中的置信度范围采样
def margin_confidence(*self*, prob_dist, sorted=False):
*"""*
*Returns the uncertainty score of a probability distribution using*
*margin of confidence sampling in 0-1 range where 1 is most uncertain*
*Assumes probability distribution is a pytorch tensor, like:*
*tensor([0.0321, 0.6439, 0.0871, 0.2369])*
*Keyword arguments:*
*prob_dist -- a pytorch tensor of real numbers between 0 and 1 that*
➥ *total to 1.0*
*sorted -- if the probability distribution is pre-sorted from largest to*
➥ *smallest*
*"""*
if not sorted:
prob_dist, _ = torch.sort(prob_dist, descending=True)
difference = (prob_dist.data[0] - prob_dist.data[1])
margin_conf = 1 - difference
return margin_conf.item()
让我们将置信度范围采样应用于我们的示例数据。“行人”和“动物”是最自信和次自信的预测。使用我们的示例,这个不确定性得分将是 1.0 - (0.6439 - 0.2369) = 0.5930。
| 预测标签 | 自行车 | 行人 | 标志 | 动物 |
|---|---|---|---|---|
| softmax | 0.0321 | 0.6439 | 0.0871 | 0.2369 |
这种方法对除了两个最自信的预测之外的不确定性不会敏感:对于最自信和次自信的预测,相同的置信度差异,从第三到第 n 个置信度可以取任何值,而不会改变不确定性得分。
如果你只关心你特定用例中预测标签和次自信预测之间的不确定性,这个方法是一个好的起点。这种类型的不确定性采样是我在工业界看到人们使用最常见的一种。
置信度范围比最小置信度采样对 softmax 算法中使用的基数更不敏感,但它仍然敏感。尽管 softmax(base=10) 会给我们的数据集一个置信度范围得分为 0.1899,与 base e 的 0.5930 相比,所有两个最可能的分数都会移动。这些分数将以不同的速率移动,这取决于所有原始分数的总相对差异,但请记住,我们是在模型最不确定的时候进行采样——也就是说,当最自信的分数尽可能低且因此最相似的时候。因此,当你在不同的 softmax 基数下通过置信度范围采样采样最不确定的项目时,你可能只会得到几个百分点的差异。
3.2.3 比率采样
置信度比率是对置信度范围的轻微变化,它查看前两个分数之间的比率,而不是差异。这是改善你对置信度和 softmax 之间关系理解的最佳不确定性采样方法。为了使技术更直观,将比率视为捕捉第一个标签比次自信标签更有可能多少次:

现在让我们再次输入我们的数字:
0.6439 / 0.2369 = 2.71828
我们得到了自然对数,e = 2.71828!同样,如果我们使用以 10 为底,我们得到
90.01% / 9.001% = 10
我们得到了 10——我们使用的基数!这个例子很好地说明了为什么 e 是生成置信度的任意基数。(有关此主题的更多信息,请参阅附录。)在这个上下文中,“行人”真的比“动物”更有可能作为预测吗?可能不是。怀疑它确实比“动物”多 10 倍的可能性。唯一告诉我们的是,置信度比率告诉我们“行人”和“动物”之间的原始得分差异为“1”——仅此而已。使用除法的置信度比率可以用原始得分来定义,在这种情况下,使用 softmax(base=),其中是 softmax 中使用的基数(如果不是 e):

置信度比率在 softmax 中使用的任何基数上都是不变的。得分完全由你的模型中最高两个原始得分之间的距离决定;因此,通过基数或温度进行缩放不会改变排名顺序。为了给置信度比率一个 0-1 的归一化范围,你只需取前面方程的倒数:

我们使用上面的非倒置版本是为了直接输出它们的 softmax 基数,以便说明。以下列表展示了使用 PyTorch 实现的置信度比率采样。
列表 3.4 PyTorch 中的置信度比率采样
def ratio_confidence(*self*, prob_dist, sorted=False):
*"""*
*Returns the uncertainty score of a probability distribution using*
*ratio of confidence sampling in 0-1 range where 1 is most uncertain*
*Assumes probability distribution is a pytorch tensor, like:*
*tensor([0.0321, 0.6439, 0.0871, 0.2369])*
*Keyword arguments:*
*prob_dist -- pytorch tensor of real numbers between 0 and 1 that total*
➥ *to 1.0*
*sorted -- if the probability distribution is pre-sorted from largest to*
➥ *smallest*
*"""*
if not sorted:
prob_dist, _ = torch.sort(prob_dist, descending=True)
ratio_conf = prob_dist.data[1] / prob_dist.data[0]
return ratio_conf.item()
我希望这个例子能给你另一个直观的理由,说明为什么置信度采样边际相对不变:当你的目标是进行排名时,从你的两个最高值中减去和除以你的两个最高值之间没有太大差异。
幸运的是,当置信度边际减法与置信度比率不同时,它通过优先考虑最不确定的来做到我们想要的事情。尽管置信度边际和置信度比率没有明确查看两个最自信的置信度之外的内容,但它们影响了可能的值。如果第三自信的值是 0.25,第一和第二的值最多可以相差 0.5。所以如果第三自信的预测相对接近第一和第二,置信度边际的不确定性得分就会增加。这种变化很小,并不是直接由置信度边际引起的;它是 softmax 方程中的分母更大的副产品,由于第三自信的值更大,它成为不成比例地更大的指数。尽管如此,这种行为是正确的;在其他条件相同的情况下,置信度边际在可能平局的情况下寻找两个最自信预测之外的不确定性。
与置信度边际不同,其中从第三到 nth 预测的变化是 softmax 的幸运副产品,我们的下一个最受欢迎的不确定性采样策略明确地模拟了所有预测。
3.2.4 熵(分类熵)
观察一组预测中的不确定性的方法之一是看你是否会因结果而感到惊讶。这一概念是熵技术的基础。相对于它们的概率,你会对每个可能的结果感到多么惊讶?
将熵和惊讶用你长期支持的体育队伍来考虑是很直观的,即使它处于输球状态。对我来说,这支队伍是底特律雄狮美式足球队。近年来,即使雄狮在比赛中早期领先,他们赢得比赛的概率也只有 50%。所以即使雄狮在比赛中早期领先,我也不知道结果会怎样,而且每场比赛无论哪种结果都会有相等程度的惊讶。熵并不衡量输球的情感负担——只衡量惊讶。熵方程为我们提供了一个数学上合理的计算结果惊讶的方法,如图 3.3 所示。

图 3.3 低熵(左)和高熵(右)的示例。高熵发生在概率最相似的时候,并且从分布中任何单个预测的惊讶程度最大。熵有时有点反直觉,因为左边的图有最大的变异性和三个极不可能的事件。然而,这三个不可能的事件却被一个高度可能的事件所抵消。四个在相等可能性附近的事件将具有更大的总熵,即使这三个罕见的事件在它们发生的罕见时刻会有更大的信息。
将熵应用于概率分布,涉及将每个概率乘以其自身的对数并取负和:

我们可以通过除以预测(标签)数量的对数将熵转换为 0-1 范围:

以下列表展示了使用 Python 和 PyTorch 库实现熵分数比率的示例。
列表 3.5 PyTorch 中的基于熵的采样
def entropy_based(*self*, prob_dist):
*"""*
*Returns uncertainty score of a probability distribution using entropy*
*Assumes probability distribution is a pytorch tensor, like:*
*tensor([0.0321, 0.6439, 0.0871, 0.2369])*
*Keyword arguments:*
*prob_dist -- a pytorch tensor of real numbers between 0 and 1 that*
➥ *total to 1.0*
*sorted -- if the probability distribution is pre-sorted from largest to*
➥ *smallest*
*"""*
log_probs = prob_dist * torch.log2(prob_dist) ❶
raw_entropy = 0 - torch.sum(log_probs)
normalized_entropy = raw_entropy / math.log2(prob_dist.numel())
return normalized_entropy.item()
❶ 将每个概率乘以其以 2 为底的对数。
首先,不要因为另一个任意的基数,即用于历史原因的 log(base=2),而感到害怕:熵的基数选择不会改变不确定性采样的排名顺序。与 softmax 不同,使用不同基数的熵计算对于不确定性采样不会改变数据集上分数的排名顺序。根据基数,你会得到不同的熵分数,但熵分数将对于每个概率分布单调变化,因此不会改变不确定性采样的排名顺序。以 2 为基数用于熵的历史原因,因为熵来自信息理论,它处理以二进制位压缩数据流。让我们计算我们示例数据的熵:
| 预测标签 | 骑行者 | 行人 | 标志 | 动物 |
|---|---|---|---|---|
| P(y | x) 即 softmax | 0.0321 | 0.6439 | 0.0871 |
| log2(P(y | x)) | –4.963 | –0.635 | –3.520 |
| P(y | x) log2(P(y | x)) | –0.159 | –0.409 |
将这些数字相加并取反
0 – SUM(–0.159, –0.409, –0.307, –0.492) = 1.367
除以标签数量的对数返回
1.367 / log2 = 0.684
注意,P(y|x) log(P(y|x))这一步与 softmax 算法给出的概率分布不是单调的。“行人”返回-0.409,但“动物”返回-0.492。因此,“动物”尽管不是最自信或最不自信的预测,却对最终的熵得分贡献最大。
根据熵对数据进行排序的不确定性对 softmax 算法使用的基数很敏感,并且与最小置信度几乎同样敏感。为什么是这样很直观:熵明确地使用了概率分布中的每一个数字,因此这些数字通过更高的基数分散得越远,结果就会越发散。
回想我们之前的例子,其中 softmax(base=10)给出约 0.9%的置信度,这将导致不确定性得分为 0.1——远小于相同数据上的 0.35。对于不同的基数,这个分数将改变整体排名。softmax 的更高基数会拉大最自信标签和其他标签之间的差异。
3.2.5 深入探讨熵
如果你想深入了解熵,可以尝试将不同的置信度插入方程的内侧,每个置信度乘以其自身的对数,例如 0.3 * log(0.3)。对于这种熵度量,P(y|x) log(P(y|x))的每次预测得分将返回大约 0.3679 的(负)最大值。与 softmax 不同,欧拉数是特殊的,因为 e^(-1) = 0.3679。用来推导这个结果的公式被称为欧拉公式,它本身是 9 世纪左右创造的Thâbit ibn Kurrah 规则的推导。无论你使用什么基数来计算熵,每个预测的最大(负)值都会接近 0.3679,这应该有助于你理解为什么在这个情况下基数并不重要。
在机器学习和信号处理中,你会在几个地方遇到熵,所以这个方程是一个很好的理解点。幸运的是,你不需要推导欧拉公式或 Thâbit ibn Kurrah 规则来使用熵进行不确定性采样。0.3679(或接近这个数字)对熵贡献最大的直觉相当简单:
-
如果概率是 1.0,模型是完全可预测的,没有熵。
-
如果概率是 0.0,那么这个数据点对熵没有任何贡献,因为它永远不会发生。
-
因此,在每次预测的基础上,0.0 和 1.0 之间的某个数字对熵是最优的。
但 0.3679 仅对单个概率是最佳的。使用一个标签的概率为 0.3679,你将只为每个其他标签留下 0.6431。因此,整个概率分布的最高熵,而不仅仅是单个值,总是在每个概率都相同且等于标签数量的倒数时发生。
3.3 识别不同类型模型混淆的时刻
你最有可能在机器学习中使用神经网络模型,但神经网络模型有许多不同的架构,还有许多其他流行的监督机器学习算法。几乎每个机器学习库或服务都会返回它们算法的某种形式的分数,这些分数可以用于不确定性采样。在某些情况下,你将能够直接使用这些分数;在其他情况下,你将不得不使用类似 softmax 的方法将分数转换为概率分布。
即使你只使用神经网络或常见机器学习库和服务的默认设置进行预测模型,了解算法的全范围以及不同类型的机器学习模型中不确定性的定义也是很有用的。有些与我们从神经网络模型中得出的解释大不相同,但并不一定更好或更差,因此这将帮助你欣赏不同常见方法的优缺点。不同类型机器学习算法的不确定性确定策略总结在图 3.4 中,并在本节中更详细地展开。

图 3.4 不同监督机器学习算法的不确定性采样。
左上角:支持向量机(SVM)的决策边界。与神经网络模型一样,判别性学习器试图找到一种最优地划分数据的方法。与神经网络分类器不同,SVM 还试图最大化边界的宽度。这就是 SVM 决定多个可能的中心线中哪一个是最佳划分的方法:它具有最宽的边界。请注意,从分隔器(SVM 的超平面)的距离是从分隔器的远端,而不是中间线。
右上角:一个潜在的贝叶斯模型。这个模型是一个生成式监督学习模型,试图模拟每个标签的分布,而不是模拟它们之间的边界。基于每个标签的置信度可以直接读取为该标签的概率。
Bottom left: 决策树可能提供的划分,一次只按一个特征划分并递归细分数据。置信度定义为最终桶(叶子节点)中标签的百分比,例如,左下角的叶子节点有一个标签 A 和三个标签 B,因此在那个叶子节点中的预测会有 25%的置信度在标签 A 上,75%的置信度在标签 B 上。决策树对它们可以划分多深很敏感——它们可以继续划分到只有一个项目的叶子节点——因此概率通常不可靠。
Bottom right: 决策树的集成,其中最著名的变体是随机森林。训练了多个决策树。不同的树通常是通过在不同的数据子集和/或特征上训练来实现的。标签的置信度可以是所有模型预测中一个项目被预测的百分比,或者所有预测的平均置信度。
3.3.1 使用逻辑回归和 MaxEnt 模型的不确定性采样
对于解释模型置信度,你可以将逻辑回归和最大熵(MaxEnt)模型视为与神经网络模型相同。逻辑回归模型、MaxEnt 模型和单层神经网络模型之间几乎没有区别(有时没有区别)。因此,你可以像对神经网络模型那样应用不确定性采样:你可能得到 softmax 输出,或者得到可以应用 softmax 的分数。同样需要注意:逻辑回归或 MaxEnt 模型的任务不是准确计算模型的置信度,因为模型试图在标签之间最优地区分,所以你可能需要尝试不同的基数/温度来生成你的概率分布。
3.3.2 使用 SVMs 的不确定性采样
支持向量机(SVMs)代表另一种类型的判别学习。与神经网络模型一样,它们试图找到一种最优划分数据的方法。与神经网络分类器不同,SVMs 还试图最大化边界的宽度并决定多个可能的划分中哪一个是正确的。最优边界定义为最宽的边界——更具体地说,是最佳地模拟标签与划分边界另一侧的最大距离的边界。你可以在图 3.5 中看到 SVMs 的例子。支持向量本身是定义边界的数据点。

图 3.5 SVM 将我们的示例 2D 数据集(顶部)投影到 3D(底部),以便线性平面可以分离两组标签:标签 A 位于平面之上,标签 B 位于平面之下。采样项是最接近平面的。如果你想学习一些重要的早期主动学习文献,你需要了解 SVMs 在这个高级别是如何工作的。
SVMs also differ in how they model more complicated distributions. Neural networks use hidden layers to discover boundaries between labels that are more complicated than simple linear divisions. Two hidden layers are enough to define any function. SVMs more or less do the same thing, but with predefined functions that map the data into higher dimensions. In figure 3.5, our 2D example data is projected into a third dimension that raises items on one side of that function and lowers them on the other. With the projection into a higher dimension, the data is linearly separable, and a plane divides the two labels.
It is many orders of magnitude more efficient to train a model when you’ve predefined the type of function (as in SVMs) rather than let your model find the function itself among all possible alternatives (as in neural models). The chance of predefining the correct function type is low, however, and the cost of hardware is coming down while speed is going up, so SVMs are rarely used today, compared with their earlier popularity.
3.3.3 使用贝叶斯模型的不确定性采样
贝叶斯模型是生成式监督学习模型,这意味着它们试图模拟每个标签及其潜在样本的分布,而不是模拟标签之间的边界。贝叶斯模型的优势在于你可以直接从模型中读取概率:

你不需要单独的步骤或特定的激活函数来将任意分数转换为概率分布;模型明确地计算一个项目具有标签的概率。因此,基于每个标签的置信度可以直接读取为该标签的概率。
因为它们不试图模拟标签之间的差异,所以贝叶斯模型通常无法在不进行大量微调的情况下捕获更复杂的决策边界。朴素贝叶斯算法因其无法模拟特征之间的线性关系(更不用说更复杂的线性关系)而获得了“朴素”这个名字,尽管它可以几乎瞬间用新的训练数据进行重新训练,这对于需要人工干预的系统来说很有吸引力。
贝叶斯模型也必须对数据分布做出假设,例如真实值落在正态分布内,这在你实际数据中可能并不一定成立。如果不小心,这些假设可能会使概率偏离真实值。尽管如此,它们通常会比判别模型的概率更可靠,但你不能盲目地信任它们,而不了解它们对数据的假设。
因此,尽管贝叶斯模型并不总是像判别性模型那样有可能获得相同的准确度,但它们通常会产生更可靠的置信度分数,因此可以直接用于主动学习。例如,如果你信任你的置信度分数,你可以根据该分数进行采样:采样 90%具有 0.9 不确定性的项目,采样 10%具有 0.1 不确定性的项目,依此类推。然而,在简单的标记任务之外,当人们谈论主动学习的贝叶斯方法时,他们通常指的是在判别性模型集成上的预测,这将在本章后面的第 3.4 节中介绍。
3.3.4 使用决策树和随机森林的不确定性采样
决策树 是一种判别性学习器,它一次只根据一个特征划分数据,递归地将数据划分为桶,直到最终的桶——叶节点——只包含一组标签。树通常在早期停止(剪枝),这样叶节点最终会有一些标签的多样性,模型不会过度拟合数据。本章前面的图 3.4 展示了这样一个例子。
置信度由该预测的叶节点中标签的百分比定义。例如,图 3.4 中左下角的叶节点有一个标签 A 和三个标签 B,因此在该叶节点中的预测会有 25%的置信度在标签 A 上,以及 75%的置信度在标签 B 上。
决策树对它们可以划分多深很敏感;它们可能会继续划分到只有一个项目的叶节点。相比之下,如果它们不够深,每个预测将包含很多噪声,桶会很大,同一桶中的相对较远的训练项目错误地贡献了置信度。因此,概率通常不可靠。
由于这个原因,单棵决策树的置信度很少被信任,并且不建议用于不确定性采样。它们在其他主动学习策略中可能很有用,我们将在后面介绍,但对于任何涉及决策树的主动学习,我建议你使用多棵树并合并结果。
随机森林 是最著名的决策树集成。在机器学习中,集成 指的是一组机器学习模型,这些模型被组合起来进行预测,我们将在第 3.4 节中更详细地介绍。
对于随机森林,训练了多个不同的决策树,目的是从每个决策树中得到略微不同的预测。不同的树通常是通过在不同的数据子集和/或特征上训练来实现的。标签的置信度可以是所有模型预测中一个项目被预测的百分比,或者是所有预测的平均置信度。
如图 3.4 所示,在右下角的图中结合了四个决策树,随着在多个预测中进行平均,两个标签之间的决策边界开始变得更加平缓。因此,随机森林在两个标签之间的边界上提供了一个很好的、有用的置信度近似。决策树训练速度快,所以如果您选择它们作为主动学习的算法,在随机森林中训练许多树几乎没有理由。
3.4 在多个预测中测量不确定性
有时,您可能已经从您的数据中构建了多个模型。您可能已经在尝试不同的模型类型或超参数,并希望将预测组合成一个单一的不确定性得分。如果不是这样,您可能想对您的数据尝试几种不同的模型来观察方差。即使您没有使用多个模型来处理您的数据,观察不同模型预测的变异也能让您对当前模型的不稳定性有一个直观的认识。
3.4.1 使用集成模型进行不确定性采样
与随机森林是一个监督学习算法的集成类似,您可以使用多种类型的算法来确定不确定性,并在它们之间进行汇总。图 3.6 显示了一个示例。不同的分类器由于使用了不同类型的统计方法,其置信度得分可能不太可能直接兼容。
结合多个分类器最简单的方法是按每个分类器的不确定性得分对项目进行排序,根据其排名顺序给每个项目分配一个新得分,然后将这些排名得分组合成一个主不确定性排名。

图 3.6:结合不同类型机器学习算法预测的集成模型:神经网络模型、SVMs、贝叶斯模型和决策树(决策森林)。预测可以通过各种方式(最大值、平均值等)组合,以找到每个未标记项目的联合不确定性。
您可以通过不同模型对项目标签的一致性频率来计算不确定性。分歧最大的项目是需要采样的对象。您还可以考虑预测的概率分布。您可以通过多种方式组合不同模型的预测:
-
所有模型中最低的最大置信度
-
模型间最小和最大置信度之间的差异
-
模型间最小和最大置信度之间的比率
-
所有模型中所有置信度的熵
-
所有模型中的平均置信度
您可能已经注意到,前四种方法与我们在单个预测中进行不确定性采样时使用的相同算法,但在这个情况下是跨多个预测。因此,您应该已经能够实现这些方法。
3.4.2 委员会查询和 dropout
在主动学习过程中,基于集成的方法有时被称为委员会查询,尤其是在仅使用一种机器学习算法进行集成时。你可以尝试使用基于神经模型的集成方法:多次训练一个模型,并查看每个神经模型预测中未标记数据的共识。如果你已经多次重新训练模型以调整超参数,那么利用不同的预测来帮助主动学习也是可以的。
按照随机森林方法,你可以尝试使用不同子集的项目或特征重新训练你的模型,以强制在构建的模型类型中实现多样性。这种方法将防止一个特征(或少数几个特征)主导最终的不确定性得分。
一种最近流行的用于神经模型的方法是使用 dropout。你可能熟悉在训练模型时使用 dropout:在训练模型时,你移除/忽略一些随机百分比的神经元/连接,以避免将模型过度拟合到任何特定的神经元。
你可以将 dropout 策略应用于预测:多次对项目进行预测,每次丢弃不同的随机选择的神经元/连接。这种方法会导致项目有多个置信度,你可以使用这些置信度与集成评估方法一起采样正确的项目,如图 3.7 所示。

图 3.7 将 dropout 应用于模型以获得单个项目的多个预测。在每个预测中,随机丢弃(忽略)一组神经元,导致不同的置信度和(可能)不同的预测标签。然后,可以通过计算所有预测之间的变化来计算不确定性:不一致性越高,不确定性越大。从单个模型中获得多个预测的方法被称为蒙特卡洛dropout。
你将在本书的其余部分看到更多使用神经网络架构本身来帮助主动学习的例子。第四章,涵盖了多样性采样,以一个类似的例子开始,该例子使用模型激活来检测异常值,本书后面的许多高级技术也做同样的事情。
在人机交互的机器学习领域工作是一个令人兴奋的时代。你可以与机器学习算法的最新架构一起工作,并思考它们与人类-计算机交互的关系。
3.4.3 随机性和认知不确定性的区别
来自哲学文献的术语随机不确定性和认知不确定性在从未阅读过哲学文献的机器学习科学家中很受欢迎。在机器学习文献中,这些术语通常指的是使用的方法。"认知不确定性"是指单个模型预测中的不确定性,而"随机不确定性"是指多个预测中的不确定性(特别是在最近的文献中,尤其是蒙特卡洛 dropout)。"随机"在历史上意味着固有的随机性,而"认知"意味着缺乏知识,但这些定义只在机器学习中才有意义,在机器学习中没有新的数据可以标注,这在学术研究之外是罕见的。
因此,在阅读机器学习文献时,假设研究人员只讨论用于计算不确定性的方法,而不是更深层次的哲学意义。图 3.8 展示了这些差异。

图 3.8 展示了根据在机器学习文献中最广泛使用的定义,随机不确定性和认知不确定性之间的差异。第一个突出显示的项目靠近所有五个预测的决策边界,因此具有高认知不确定性,但决策边界聚集在一起,因此具有低随机不确定性。第二个突出显示的项目具有低认知不确定性,因为它不靠近大多数决策边界,但它的决策边界距离有很大的变化,因此具有高随机不确定性。最后一个项目靠近平均决策边界,所有边界之间的距离变化很大,因此两种类型都具有高不确定性。
图 3.8 展示了如何通过多个预测来预测不确定性,除了从单个决策边界距离外,还可以从多个决策边界的方差来衡量。对于一个神经网络模型,从决策边界距离的变化可以计算为预测标签的变化,任何在 3.2 节中提到的不确定性采样指标的变化,或者每个预测整个概率分布的变化。
有关起始点的进一步阅读,请参阅 3.8 节,因为这个研究领域非常活跃。关于随机不确定性的文献往往关注最优类型的集成或 dropout,而关于认知不确定性的文献往往关注从单个模型中获得更准确的概率分布。
3.4.4 多标签和连续值分类
如果你的任务是多标签,允许每个项目有多个正确标签,你可以使用与集成相同的聚合方法来计算不确定性。你可以将每个标签视为一个二元分类器。然后你可以决定是否要平均不确定性,取最大不确定性,或使用本章前面介绍的其他聚合技术之一。
当你将每个标签视为一个二元分类器时,不确定性采样算法的类型(最小置信度、置信度范围等)之间没有区别,但你可能尝试在本节中除了跨不同标签聚合之外,还可以尝试集成方法。例如,你可以在你的数据上训练多个模型,然后聚合每个项目的每个标签的预测。这种方法将为每个项目的每个标签提供不同的不确定性值,你可以尝试不同的方法来聚合每个标签的不确定性,包括跨标签的不确定性。
对于连续值,例如预测真实值的回归模型而不是标签,你的模型可能不会在预测中给出置信度分数。在这些情况下,你可以应用集成方法并查看变化来计算不确定性。实际上,蒙特卡洛 dropout 最初用于估计不需要标注新数据的回归模型中的不确定性。在那个受控环境中,你可以认为认知不确定性是正确的术语。
第六章涵盖了主动学习在许多用例中的应用,关于目标检测的部分更详细地讨论了回归中的不确定性。第十章有一个专门的部分用于评估连续任务的标注准确性,这可能与你的任务也相关。我建议你阅读这两章,以了解更多关于与预测连续值的模型一起工作的细节。
3.5 选择合适数量的人为审查项目
不确定性采样是一个迭代过程。你选择一定数量的项目供人工审查,重新训练你的模型,然后重复这个过程。回想一下第一章中,如果不进行多样性采样,仅对不确定性进行采样的潜在缺点,如图 3.9 所示。

图 3.9 从特征空间相同区域选择的不确定性项目,因此缺乏多样性
这里最不确定的项目都彼此靠近。在真实示例中,成千上万的示例可能会聚集在一起,并且不需要对它们全部进行采样。无论项目是从哪里采样的,你都无法完全确定直到人工提供了标签并且模型重新训练后,对模型的影响是什么。
重新训练模型可能需要很长时间,然而,在此期间要求人工标注员等待可能会浪费他们的时间。有两个相互竞争的力量在起作用:
-
最小化样本大小将确保在每次迭代中从每个数据点中获得最大利益。
-
最大化样本大小将确保更多项目能够更快地被标注,并且模型需要重新训练的频率更低。
正如你在第二章中看到的,你的模型在早期迭代中多样性较低,但随着模型的重新训练,这种情况在后续迭代中自行纠正。最终的决定取决于业务流程。在最近的翻译工作中,我们希望我们的模型能在几秒钟内适应,以便在翻译者工作时看起来能够实时响应。我也看到过一些公司对每年大约一次的迭代来适应新数据感到满意。
3.5.1 预算约束的不确定性采样
如果你有一个固定的标注预算,你应该尽量进行尽可能多的迭代。可能的迭代次数将取决于你是否按标签(如许多众包工作者模型)或按小时(如许多专家人类模型)支付标注者的报酬。
如果你的预算是按标签计算的,这意味着无论获取这些标签之间的时间间隔有多长,你都要支付固定的价格,那么最佳做法是优化以实现尽可能多的迭代次数。人们确实倾向于在等待模型训练时感到无聊。当重新训练模型需要超过几天时,我看到人们最多进行大约 10 次迭代并相应地计划。选择 10 并没有特别的原因:这是一个直观的迭代次数,用于监控准确性的变化。
如果你的预算是按小时计算的,这意味着你每天有固定的人数来标注固定的小时数,那么最佳做法是始终确保有可用的数据用于标注。让标注者逐步通过不确定性的排名顺序处理未标注的项目,并在固定间隔内重新训练模型,每当新模型准备好时,就用新的不确定性排名替换旧的排名。如果你使用不确定性采样并且想要避免只从问题空间的一个部分过度采样,你应该定期更换模型。现实中,如果有人全职为你标注数据,你应该给予他们应有的尊重,实施本书中提到的多种主动学习采样策略,并从所有这些策略中进行采样,这样那些人就会觉得自己贡献了最大的价值。你也更不可能引入仅实施一个算法可能导致的偏差,因此人和机器都能得分。我们将在第七章中回到不同类型的标注工作队伍的策略。
3.5.2 时间约束的不确定性采样
如果你时间紧迫,需要快速推出更新后的模型,你应该考虑尽可能快速重新训练模型的策略,正如第二章所述。最快的方法是使用简单的模型。只有一个或两个层(或者更好的是,使用朴素贝叶斯模型)的模型可以非常快速地重新训练,让你能够快速迭代。此外,有一些证据表明,从更简单的模型中进行的不确定性采样可以与从更复杂的模型中进行采样一样有效。记住,我们寻找的是最大的困惑,而不是最大的准确性。只要一个简单模型对相同项目的困惑程度与一个更复杂的模型相同,这两个模型就会采样相同的项。
一种更高级的方法是只重新训练一个更大模型的最後一层(或几层)。你可以通过只使用新数据重新训练最后一层来快速重新训练你的模型,而不是重新训练整个模型。这个过程可能只需要几秒钟,而不是几周。重新训练的模型不一定那么准确,但它可能很接近。与选择一个更简单的模型一样,如果目标是寻找更多的不确定性,这种准确性的微小损失可能并不重要。更快的迭代甚至可能产生比等待很长时间用更少的迭代重新训练整个模型更准确的模型。
一种更高级的方法是取两者之长:使用方法来发现哪些参数是重新训练整个模型时最重要的,然后只重新训练它们。这种方法可以提供与重新训练整个模型相同的准确性,但所需时间却少得多。
另一种可以更容易实施的高级方法是拥有两个模型:一个增量模型,它会立即更新每个新的训练项,另一个模型则定期从头开始重新训练。第十二章中的一个示例实现就使用了这种架构。
3.5.3 如果我没有时间或预算限制,何时停止?
真幸运!你应该在你模型不再变得更准确的时候停止。如果你已经尝试了许多不确定性采样的策略,并且在达到一定准确性后没有获得任何更多收益,那么这个条件是一个很好的信号,表明你应该停止并思考其他主动学习和/或算法策略,如果你的期望准确性目标尚未实现。
随着你标注的数据越来越多,你最终会发现收益递减;无论你使用什么策略,随着你添加更多数据,学习率都会下降。即使这个比率还没有达到平台期,你也应该能够对每条标签的准确性以及这些标签的成本进行成本效益分析。
3.6 评估主动学习的成功
总是评估不确定性采样在随机选择的、保留的测试集上。如果在每次迭代后从你的训练数据中随机选择测试数据,你就不知道你的实际准确率是多少。事实上,你的准确率可能看起来比实际要低。通过选择难以分类的项目,你很可能会过度采样固有的模糊项。如果你在固有的模糊项上测试得更多,你更有可能看到错误。(我们在第二章中讨论了这个问题,但在这里重复一遍。)因此,不要陷入忘记在不确定性采样之外随机采样的陷阱:你将不知道你的模型是否在改进!
3.6.1 我需要新的测试数据吗?
如果你已经保留了测试数据集,并且你知道未标记的数据与你的训练数据大致相同,你不需要额外的测试数据。你可以继续在相同的数据上进行测试。
如果你知道测试数据与你的原始训练数据分布不同,或者如果你不确定,你应该通过随机选择未标记的项目来收集额外的标签,并将它们添加到你的测试集中或创建第二个独立的测试集。
小贴士:在第一次迭代的不确定性采样之前创建你的新测试集。
一旦你通过不确定性采样从池中移除了一些未标记的项目,这个池就不再是随机选择了。现在,这个池偏向于自信地预测的项目,因此从这个池中随机选择很可能会在用作测试集时返回错误的高精度。
在所有迭代过程中保持你的测试集独立,并不要允许其项目成为任何采样策略的一部分。如果你在迭代了几次之后才忘记这样做,并且你的随机样本包括通过不确定性采样选择的项目,你需要回到第一次迭代。你不能简单地从训练数据中移除那些测试项目,因为它们在中间的不确定性采样策略中已经被训练并做出了贡献。
也是一个好主意,看看你的不确定性采样技术在随机采样的基线旁边表现如何。如果你没有比随机采样更准确,你应该重新考虑你的策略!选择随机选择的项,对于这些项,你知道比较将具有统计学意义:通常,几百个项就足够了。与你的整个模型的评估数据不同,这些项可以在下一次迭代中添加到你的训练数据中,因为你正在比较每个步骤的采样策略,考虑到剩余需要标记的内容。
最后,你可能希望包括一些随机选择的物品,以及由不确定性采样选择的物品。如果你不打算实现第四章中的一些多样性采样方法,随机采样将给你提供最基本的形式的多样性采样,并确保每个数据点都有机会得到人工审查。
3.6.2 我需要新的验证数据吗?
你还应该考虑在每个迭代中最多使用四个验证集,数据来自
-
与测试集相同的分布
-
每个迭代中剩余的未标记物品
-
每个迭代中与新采样物品相同的分布
-
每个迭代中与总训练集相同的分布
如果你是在每次添加数据后调整模型参数,你将使用验证集来评估准确性。如果你在测试集上调整模型,你将不知道你的模型是否真正泛化,或者你只是找到了一组恰好与特定评估数据配合得很好的参数。
验证集将让你在查看测试集的情况下调整模型的准确性。通常,你从一开始就会有一个验证集。与你的测试集一样,如果你认为未标记的物品来自与你的初始训练数据相同的分布,你不需要更新/替换它。否则,你应该在不确定性采样的第一次迭代之前更新你的验证数据,就像你的测试数据一样。
你可能想使用第二个验证集来测试你的主动学习策略在每个迭代中的表现如何。在你开始主动学习迭代后,剩余的未标记物品将不再是一个随机样本,因此这个分布将不同于你现有的测试集和验证集。这个数据集作为每个迭代的基线。不确定性采样是否仍然比从剩余物品中随机选择给出更好的结果?因为这个数据集只对一次迭代有用,所以在每个迭代结束时将这些物品添加到训练数据中是可以的;这些标签不是被丢弃的人工标签。
如果你想评估每一轮中创建的人为标签的准确性,你应该在从与新采样数据相同分布中抽取的第三个验证数据集上进行此操作。你的新采样数据可能对于人类来说天生更容易或更难进行标签化,因此你需要在该相同分布上评估人类准确性。
最后,你应该考虑在每个迭代中随机从训练数据中抽取的第四个验证集。这些验证数据可以用来确保模型没有过度拟合训练数据,许多机器学习库默认会这样做。如果你的验证数据和训练数据不是来自相同的分布,将很难估计你过度拟合了多少,因此拥有一个单独的验证集来检查过度拟合是一个好主意。
缺点是高达四个验证数据集的人工标注成本。在工业界,我经常看到人们使用错误的验证数据集,通常是在所有情况下都使用一个验证集。最常见的原因是人们希望尽可能多地将其标注项目放入训练数据中,以便更快地使模型更准确。当然,这也是主动学习的目标,但没有正确的验证数据,您将不知道下一步的战略方向以获得更高的准确性。
3.7 不确定性采样速查表
本文中的示例数据只有两个标签。不确定性采样算法将返回具有两个标签的相同样本。图 3.10 展示了当有三个标签时,不同算法的目标区域示例。该图显示,置信度边际和比率采样了一些只有成对混淆的项目,这反映了算法只针对最有可能的两个标签。相比之下,熵最大化所有标签之间的混淆,这也是为什么最高浓度出现在所有三个标签之间。

图 3.10 四种主要不确定性采样算法的热图以及它们为三个标签问题采样的区域。在这个例子中,每个点是一个具有不同标签的项目,每个像素的热度是不确定性。最热(最不确定)的像素是最浅的像素(如果你在彩色模式下查看,是红色像素)。左上角是最小置信度采样,右上角是置信度边际采样,左下角是比率采样,右下角是基于熵的采样。主要收获是置信度边际和比率采样了一些只有成对混淆的项目,而熵最大化所有标签之间的混淆。
注意,随着标签数量的增加,方法之间的差异变得更加极端。图 3.11 比较了配置以突出显示方法之间的差异。

图 3.11 方法比较。左边的四个图像显示,置信度边际和比率的不确定性空间大部分在两个标签之间,由于对第三个标签来说并不模糊,因此熵完全忽略了这一点。右边的四个图像显示,特别是在更复杂的任务中,不同不确定性采样算法将要采样的项目将不同。¹
TIP 您可以在robertmunro.com/uncertainty_sampling_example.html上尝试 3.10 和 3.11 图标的交互式版本。交互式示例的源代码实现了 JavaScript 中的不确定性采样算法,但您可能更希望使用与本章相关的 PyTorch 和 NumPy 代码库中的 Python 示例。
图 3.12 总结了本章中你已实现的四个不确定性采样算法。

图 3.12 不确定性采样速查表
3.8 进一步阅读
不确定性采样已经存在很长时间了,关于它的很多优秀文献已经被撰写。对于不确定性采样的最前沿研究,寻找那些自身被频繁引用的近期论文。
注意,大多数论文都没有将分数归一化到[0, 1]的范围。如果你打算将你的模型部署到现实世界的情况中,我强烈建议你归一化输出。即使归一化输出不会改变准确性,它也会使检查更容易,并防止下游处理中的问题,特别是对于你将在后续章节中学习的先进方法。
3.8.1 关于最小置信度采样的进一步阅读
关于最小置信度的一个早期论文是“Aron Culotta 和 Andrew McCallum 的《Reducing labeling effort for structured prediction tasks》”,链接。
3.8.2 关于置信度边界采样的进一步阅读
关于置信度边界的早期论文是“Tobias Scheffer, Christian Decomain 和 Stefan Wrobel 的《Active Hidden Markov Models for Information Extraction》”,链接。
3.8.3 关于置信度采样比率的进一步阅读
我不知道关于置信度比率的文章,尽管我在主动学习课程中教授了这个主题。当这本书中提出时,比率和 softmax 基础/温度之间的关系是新的。由于置信度比率与置信度边界相似,因为两者都关注两个最自信预测之间的关系,所以置信度边界的文献应该大部分是相关的。
3.8.4 关于基于熵采样的进一步阅读
关于基于熵采样的一个早期论文是“Ido Dagan 和 Sean P. Engelson 的《Committee-Based Sampling For Training Probabilistic Classifiers》”,链接。
3.8.5 关于其他机器学习模型的进一步阅读
关于不确定性采样的一般性基础论文是“David D. Lewis 和 William A. Gale 的《A Sequential Algorithm for Training Text Classifiers》”,链接。这篇论文使用贝叶斯分类器。如果你查看下个十年高度引用的文本,你会发现 SVMs 和线性模型很常见。由于本章中提到的理由,我不建议你尝试使用决策树实现不确定性采样。
3.8.6 关于基于集成的不确定性采样的进一步阅读
Dagan 和 Engelson 的论文(第 3.8.4 节)涵盖了多个分类器(委员会查询)的使用案例,因此它是集成模型的一个良好起点。对于更多关注神经模型的研究,包括 dropout 和贝叶斯方法以更好地估计不确定性,一个良好的入门点是 Zachary C. Lipton 和 Aditya Siddhant 的“Deep Bayesian Active Learning for Natural Language Processing: Results of a Large-Scale Empirical Study”(mng.bz/Qmae)。
你会在学术论文中看到随机 dropout 称为蒙特卡洛 dropout 和贝叶斯(深度)主动学习。无论名称如何,策略仍然是随机选择在预测期间忽略的神经元/连接。术语“蒙特卡洛”是发明该术语的物理学家开的玩笑。术语“贝叶斯”来自如果你眯着眼睛看变化,它看起来像高斯分布;它实际上不是一个贝叶斯分类器。在理解术语的积极方面,通过在预测期间向你的模型传递一个额外的参数,你可以通过告诉你的朋友你刚刚实现了“蒙特卡洛 dropout 用于贝叶斯深度主动学习”来让他们印象深刻。
摘要
-
有四种常见的算法用于不确定性采样:最小置信度、置信度范围、置信度比和熵。这些算法可以帮助你理解你模型中的不同类型的“已知未知”。
-
你可以从每种不确定性采样算法中获取不同的样本。理解为什么将帮助你决定哪种方式是衡量你模型中不确定性的最佳方法。
-
不同的监督机器学习算法,包括神经网络模型、贝叶斯模型、SVM 和决策树,会输出不同类型的分数。理解每个分数将帮助您解释它们以确定不确定性。
-
集成方法和 dropout 可以用于为同一项目创建多个预测。你可以通过查看不同模型预测中的变化来计算不确定性。
-
在每个主动学习周期内获取更多注释与在更多周期内获取较少注释之间存在权衡。理解这些权衡将让你在使用不确定性采样时能够选择正确的周期数量和每个周期的规模。
-
你可能想要创建不同类型的验证数据来评估你系统的不同部分。理解不同类型的验证数据将让你能够选择正确的数据来调整每个组件。
-
正确的测试框架将帮助你计算你系统的准确性,确保你正确地测量性能提升,而不是无意中偏差了你的数据。
^(1.)感谢 Adrian Calma 建议使用左侧图像作为突出差异的绝佳方式。
4 多样性采样
本章涵盖
-
使用异常检测来采样当前模型未知的数据
-
在标注开始之前,使用聚类来采样更多样化的数据
-
使用代表性采样来针对与模型部署位置最相似的数据
-
通过分层采样和主动学习提高现实世界的多样性
-
使用不同类型的机器学习架构进行多样性采样
-
评估多样性采样的成功
在第三章中,你学习了如何识别模型的不确定性:模型“知道它不知道”的地方。在本章中,你将学习如何识别模型中缺失的部分:模型“不知道它不知道”的“未知未知”,或称为“未知未知”。这个问题很棘手,因为模型需要知道的信息通常是一个在不断变化的世界中的移动目标。就像人类每天都会学习新单词、新物体和新行为来适应不断变化的环境一样,大多数机器学习算法都是在不断变化的环境中部署的。
例如,如果我们使用机器学习来分类或处理人类语言,我们通常期望应用能够适应新单词和新含义,而不是保持陈旧,只理解历史某个时间点的语言。在接下来的章节中,我们将探讨语音识别和计算机视觉中的几个用例,以说明多样性采样对不同类型机器学习问题的价值。
假设你的工作是构建一个可以为尽可能多的用户成功的语音助手。你公司的领导期望你的机器学习算法比任何一个人都拥有更广泛的知识。典型的英语使用者知道大约 40,000 个单词,占英语 20 万词汇量的 20%,但你的模型应该接近 100%的覆盖率。你有很多未标记的录音可以标记,但其中一些单词的使用频率很低。如果你随机采样这些录音,你会错过这些罕见的单词。因此,你需要明确尝试获取尽可能覆盖不同单词的训练数据。你也可能想了解人们在与其语音助手交谈时最常使用的单词,并采样更多这些单词。
你还担心人口统计学上的多样性。录音主要来自一个性别,以及生活在少数几个地区的人,因此生成的模型可能只对那个性别和某些口音更准确。你希望尽可能公平地从不同的群体中采样,以使模型对所有群体都同样准确。
最后,许多人不会说英语,但希望有一个语音助手,但你几乎没有非英语数据。你可能不得不公开诚实地承认这种多样性方面的限制。
这个问题比仅仅知道模型何时困惑更难,因此多样性采样的解决方案本身在算法上比不确定性采样的解决方案更加多样化。
4.1 了解你所不知道的:识别模型知识中的差距
在本章中,我们探讨了四种多样性采样的方法:
-
基于模型的异常值采样—确定在当前状态下模型不知道哪些项目(与第三章中的不确定相比)。在我们的语音助手例子中,基于模型的异常值采样将有助于识别我们的语音助手之前未曾遇到过的单词。
-
基于聚类的采样—使用独立于你的模型的统计方法来找到用于标记的多样化项目选择。在我们的例子中,基于聚类的采样将有助于识别数据中的自然趋势,这样我们就可以确保不遗漏任何罕见但有意义的变化。
-
代表性采样—找到与你的目标领域最相似的未标记项目样本,与你的训练数据相比。在我们的例子中,让我们假设人们主要使用你的语音助手来请求歌曲。因此,代表性采样将针对歌曲请求的示例。
-
针对现实世界多样性的采样—确保我们的训练数据中包含各种现实世界实体的多样性,以减少现实世界的偏差。在我们的例子中,这种方法可能包括针对尽可能多的口音、年龄和性别进行录音。
正如你在本书的引言中所学到的,短语不确定性采样在主动学习中广泛使用,但多样性采样在不同领域有不同的名称,通常只解决部分问题。你可能看到多样性采样被称为分层采样、代表性采样、异常检测或异常检测。很多时候,我们用于多样性采样的算法是从其他用例借用的。例如,异常检测主要用于识别天文数据库中的新现象或检测安全中的异常网络活动等任务。
为了不混淆非主动学习用例并提供一致性,我们将在本文中使用“多样性采样”这个短语。这个短语故意唤起数据中代表的人口的多样性。尽管我们明确针对的是第四种多样性采样,旨在实现人口多样性,但其他三种类型与真实世界的多样性相关。你的未标记数据可能偏向于最有特权的群体:来自最富裕国家的语言、来自最富裕经济体的图像、由最富裕的个人创建的视频,以及其他由权力不平衡产生的偏见。如果你只基于随机采样的原始数据构建模型,可能会放大这种偏见。任何增加你为主动学习采样的项目多样性的方法,都可能增加从这些数据构建的模型中受益的人的多样性。
即使你不在意人口统计学上的偏见,你可能仍然想要克服数据中的样本偏差。如果你正在处理农业图像,并且你的原始数据中恰好有一种作物过度代表,你可能需要一个采样策略来重新平衡数据,以代表许多类型的作物。此外,还可能存在与人群相关的更深层次的偏见。如果你有一种作物的例子更多,这种作物在富裕国家是否更常见,你是否有更多的照片,因为富裕国家的拖拉机更有可能配备摄像头?当我们深入挖掘时,数据偏差和现实世界偏差往往密切相关。图 4.1 重复了你在第一章中看到的多样性采样示例。

图 4.1 多样性采样,展示了被选中的用于标记的项目,这些项目与现有的训练项目以及彼此之间差异最大。你想要采样与当前训练数据中的项目不同,并且彼此之间也不相似的项目。
对于不确定性采样,你只想看到靠近你当前决策边界的内容,或者在不同预测中变化最大的内容——一个相对较小且定义明确的特征空间。对于多样性采样,你想要探索特征空间中每个角落的更大问题,并将决策边界扩展到该空间的新部分。不用说,你可以使用的算法集比不确定性采样更丰富,有时也更复杂。
如果你只关注学术数据集,可能不需要担心每个数据点,但在真实世界数据集中,多样性问题更为常见。请参阅以下侧边栏,了解更多关于真实世界数据集与学术数据集之间差异的信息。
学术数据与真实世界数据标注之间的差异
专家观点,来自贾莉
在现实世界中部署机器学习比学术研究要困难得多,主要区别在于数据。现实世界的数据杂乱无章,往往由于制度障碍而难以获取。在干净、不变的数据集上进行研究是可以的,但当你将这些模型带入现实世界时,很难预测它们的性能。
当我在帮助构建 ImageNet 时,我们不必担心在现实世界中可能遇到的每一个可能的图像类别。我们可以将数据限制在 WordNet 层次结构中概念子集的图像。在现实世界中,我们没有这种奢侈。例如,我们无法收集大量与罕见疾病相关的医学图像。这些图像的标注还需要领域专业知识,这带来了更多的挑战。现实世界系统需要 AI 技术专家和领域专家紧密合作,以激发研究、提供数据和数据分析,并开发算法来解决这些问题。
李佳是 Dawnlight 医疗公司的首席执行官和联合创始人,该公司使用机器学习。她之前曾领导过 Google、Snap 和 Yahoo!的研究部门,并在斯坦福大学获得博士学位。
4.1.1 多样性采样的示例数据
在本章中,我们将基于第二章中的示例,即灾害响应信息。回想一下第二章,我们想要将新闻标题标注为与灾害相关或不相关。在那一章中,我们实现了一个基本的异常检测算法,现在我们将通过更复杂的多样性采样算法来扩展它。代码位于与第二章相同的库中:github.com/rmunro/pytorch_active_learning。本章我们将使用的代码在这两个文件中:diversity_sampling.py 和 active_learning.py。
在本章中,我们将介绍多种多样性采样策略。对于我们的示例数据,你可以想象一个机器学习模型在灾害发生时进行跟踪,以及区分目击者报告和二手(或三手)信息是有用的。如果你想要部署这种系统来实时跟踪灾害,你希望尽可能拥有多样化的过去训练数据项。例如,过去训练数据中可能只有一两条关于洪水的新闻报道,如果你随机选择项目供人类标注,很容易就会遗漏。
你还可以想象新的灾害类型,例如具有以前未观察到的感染模式的疾病爆发。如果人们以新的方式谈论这些新灾害,你想要确保你不会错过这些项目,并且这些项目能够尽快获得人类标注。
最后,你可能想要开始整合新的数据来源。如果其中一些新来源是美式英语而不是英式英语,或者它们使用不同的俚语,或者它们不是英语,那么你的模型在这些新的信息来源上可能不会准确。你想要确保你的模型能够尽可能快地适应这些新的数据来源及其风格差异,因为它本身也在适应文本中的新类型信息。
在每个步骤中减少偏差都很重要。如果你使用你的模型预测来找到更多洪水示例,但你的现有模型只有来自澳大利亚洪水的数据,那么你可能会从澳大利亚获得更多洪水示例供人类审查,而来自世界其他地方的示例则没有,因此你永远无法摆脱模型中的初始偏差。出于这个原因,大多数多样性采样算法与我们使用的模型无关。
4.1.2 解释用于多样性采样的神经网络模型
对于本章中的一些采样策略,我们需要新的方法来解释我们的模型。如果你访问你最终层的线性激活函数的原始输出而不是 softmax 输出,你可以更准确地分离真正的异常值和由冲突信息导致的项目。包括负范围的激活函数,如 Leaky ReLU,是理想的;否则,你可能会得到很多归零的分数,无法确定哪个是最大的异常值。
你将在第 4.1.3 节中学习如何访问和解释 PyTorch 模型的不同层。但你可能无法对最后一层的激活函数架构发表意见。Softmax 可能是预测标签最准确的激活函数,因为它可以忽略其输入的绝对值。在这些情况下,你可能仍然能够说服你的算法团队公开其他层以供分析。
如果我不控制我的模型架构怎么办?
如果你无法对预测算法的架构发表意见,你可能能够说服你的算法团队公开 logits 或仅使用 Leaky ReLU 激活函数重新训练模型的最后一层。重新训练模型的最后一层将比重新训练整个模型快得多。这种方法应该会吸引那些担心重新训练成本的人:他们通过支持一个不需要额外太多工作的有趣并行架构来支持一个新的用例。如果你使用 Transformer 模型,同样的概念也适用,但你将训练一个新的注意力头。(如果你不熟悉 Transformer 模型,不用担心;它们对本章来说并不重要。)
如果你遇到对重新训练最后一层想法的阻力,或者如果存在技术障碍,你的下一个最佳选择是使用模型的倒数第二层。无论如何,比较模型不同层的异常值采样方法,看看哪种方法最适合你的特定数据和模型架构,可能会很有趣。这类模型分析是当今机器学习研究中最激动人心的领域之一,同时也允许迁移学习,这在即将到来的章节中的技术中得到了应用。
在本章中,我们将限制自己使用简单但有效的方式来解释你的模型。图 4.2 中的两种场景解释了最后一层或倒数第二层。
第二种方法,使用倒数第二层,在更深层的网络中效果最好,其中倒数第二层更接近最后一层,并且该层中的神经元更少。更多的神经元会引入更多的随机变异性,这在统计上可能更难克服。
无论你使用哪种架构,你都会得到一个表示你的预测模型输出处/附近的激活水平的数字集合(向量/张量)。为了简单起见,我们将把这两个向量都称为 z,尽管 z 通常仅保留表示最后一层的 logits。我们还将使用 n 来表示该向量的大小(神经元的数量),无论它是否恰好是最后一层,因此也是标签的数量或中间层。
低激活意味着这个项目更有可能是异常值。从数学上讲,异常值可以是任何不寻常的向量,可能是异常高或异常低。但当我们解释模型预测以寻找异常值时,我们只关注低激活项——即模型今天关于这些项目信息很少的项。

图 4.2 两种神经网络架构以及如何解释它们进行异常值检测。在上面的例子中,你可以使用模型得分(称为 z 或 logits),在它们通过 softmax 归一化之前保留它们的绝对值。在下面的例子中,由于 softmax 函数,你在最终层失去了绝对值,因此你可以使用倒数第二层的激活来确定一个项目是否是异常值。
4.1.3 从 PyTorch 的隐藏层获取信息
要获取模型隐藏层中值的 z 值(logits),我们需要修改我们的代码,以便我们可以访问这些信息。幸运的是,在 PyTorch 中,代码很简单。首先,作为提醒,以下是你在第二章中用于训练中的前馈步骤以及生成推理中的置信度和标签预测的代码:
def forward(self, feature_vec):
# Define how data is passed through the model
hidden1 = self.linear1(feature_vec).clamp(min=0) # ReLU
output = self.linear2(hidden1)
return F.log_softmax(output, dim=1)
您可以看到中间层和输出是变量(hidden1 和 output),它们保存了每一层的激活(在这种情况下是 PyTorch 张量,它们将是 1D 数组)。因此,我们可以简单地添加一个参数来返回所有层,并相应地修改代码。
列表 4.1 允许我们的模型返回除了 softmax 值之外的所有隐藏层
def forward(self, feature_vec, return_all_layers=False):
# Define how data is passed through the model and what is returned
hidden1 = self.linear1(feature_vec).clamp(min=0) # ReLU
output = self.linear2(hidden1)
log_softmax = F.log_softmax(output, dim=1) ❶
if return_all_layers:
return [hidden1, output, log_softmax] ❷
else:
return log_softmax
❶ 与返回函数相同,但被提取到一个变量中
❷ 当 return_all_layers=True 时,唯一的真正新行是返回所有层
就这些了!您将在 active_learning.py 中看到这个修改后的代码。现在我们可以使用模型的任何部分来找到模型内的异常值。此外,我们还有其他方法来查询模型隐藏层。¹ 我更喜欢在推理函数中显式编码选项,就像在 forward() 函数中一样。我们将在未来的章节中以多种方式查询我们的模型,这种方法使得构建最简单的代码变得简单。
主动学习的良好编码实践
作为良好编码实践的说明,您可能希望将 forward() 函数中的 return log_softmax 行更改为也返回一个数组:return [log_softmax]。这样,无论传递给函数什么参数,函数都返回相同的数据类型(一个数组),这是一个更好的软件开发实践。缺点是它不具有向后兼容性,因此您必须更改调用该函数的每一块代码。如果您是经验丰富的 PyTorch 用户,您可能习惯于使用函数中的一个功能,该功能知道它处于训练模式或评估模式。这个功能对于一些常见的机器学习策略很有用,例如在训练时屏蔽神经元但预测时不屏蔽。但请抵制在这里使用这个功能的诱惑;在这种情况下,这是不良的软件开发,因为全局变量使得编写单元测试更加困难,并且会使您的代码在独立阅读时更难以理解。使用命名参数,如 return_all_layers=True/False;您希望以最透明的方式扩展代码。
通过添加代码以访问模型的所有层进行推理,我们可以使用该代码来确定异常值。回想一下,在第二章中,您使用以下行从您的模型中获取了对数概率:
log_probs = model(feature_vec)
现在您可以通过调用函数并使用以下行来选择您想要使用的模型层:
hidden, logits, log_probs = model(feature_vector, return_all_layers=True)
您有隐藏层、logits(z)和模型物品的对数概率。
回想第三章和附录,我们的 logits(来自最后一层的分数)在通过 softmax 转换为概率分布时失去了它们的绝对值。图 4.3 重新生成了附录中 softmax 扩展部分的一些示例。

图 4.3 通过 softmax(以 e 为底)从不同输入中导出的四个相同的概率分布
因此,我们的概率分布并不能告诉我们不确定性之间的区别,这种不确定性源于信息不足(如图 4.3 左例所示)和由于冲突但高度自信的信息(如图 4.3 右例所示)。因此,使用 logits(最后一层的分数)来区分这两种类型的不确定性会更好。
除了不确定性之外,我们还可以找到那些确定但错误的异常值。最值得标记的无标签项目是那些预测错误且远离决策边界的项目——也就是说,当前模型自信但错误地预测的项目。所有神经元低激活通常是一个很好的信号,表明还没有足够多的训练数据包含在该项目中的特征。
4.2 基于模型的异常值采样
现在我们能够解释我们的模型,我们可以查询模型以找到异常值。在神经网络中,模型异常值被定义为给定层中激活最低的项目。对于我们的最后一层,这种激活就是 logits。
选择用于确定异常值的正确指标的最大障碍是了解你神经元值的分布。你在高中时被教导,任何大于平均数三个标准差的数据点都是异常值,但这只适用于正态分布。不幸的是,你的线性激活函数并没有创建正态分布:如果它们准确模拟你的任务,它们应该是双峰分布的。如果你过去调查过模型,你也会知道一些神经元可能是在模拟噪声或简单通过值,即使在相同的数据上训练模型两次,它们也可能变化。此外,除非你有简单的架构,否则你网络的各个部分将具有不同的激活函数,因此它们将无法直接比较。
正如我们不能相信不确定性采样的置信度的绝对值一样,我们也不能相信我们神经元的绝对值来确定异常值。但就像我们可以相信排名顺序的置信度来找到最不确定的预测一样,我们也可以相信神经元激活的排名顺序来找到最不活跃的。排名顺序是一种稳健的方法,它让我们避免确定每个神经元中激活的实际分布。
这里有一个简单的例子,用于确定某个项目是异常值到什么程度。假设我们对 10 个项目进行了预测,并且这些预测是由一个神经元产生的,按从大到小的顺序排列(排名):
[2.43, 2.23, 1.74, 1.12, 0.89, 0.44, 0.23, -0.34, -0.36, -0.42]
激活值为-0.36(下划线)的项目是 10 个项目中的第九低,因此我们可以给它一个异常值分数为 9/10 = 0.9。在刻度的两端,激活值为-0.42 的项目将得到 1.0 的分数,而激活值为 2.43 的项目将得到 0 的分数。因此,我们可以将每个神经元的这种激活排名顺序转换为刻度。那么,问题是什么数据用于生成排名。
4.2.1 使用验证数据对激活进行排名
我们不能使用训练数据来排名,因为模型已经在这个数据上进行了训练,一些神经元可能比其他神经元更多地过度拟合了这些数据,因此我们必须使用与我们的训练数据具有相同分布的数据。从实现的角度来看,这并不是一个很大的区别:我们只是在验证数据上计算排名,然后使用这个排名来获取我们未标记数据的异常值分数,正如你将在本节中看到的那样。
主要的区别是我们将获得排名中两个值之间的未标记数据值。我们可以使用简单的线性插值来计算这些值。假设我们的验证数据只包含 10 个项目,恰好与第 4.2 节中的相同:
[2.43, 2.23, 1.74, 1.12, 0.89, 0.44, 0.23, -0.34,(-0.35) -0.36, -0.42]
现在想象一个未标记的项目,其值为-0.35(高于其在排名中的位置)。这个值位于第八和第九低值项目之间的一半,因此我们可以给这个项目一个异常值分数为 8.5/10 = 85%。同样,如果未标记的项目值为-0.355,这是第八和第九项目之间距离的三分之四,分数将是 87.5%。我们将高于第一个项目的值视为 1,低于最后一个项目的值视为 0,这给我们一个[0–1]的范围,其中最大的异常值分数为 100%。
有不同的方法来组合每个项目的神经元之间的分数。从统计学的角度来看,最安全的方法是取每个项目所有神经元的平均激活值。特别是如果你使用的是隐藏层之一的激活值,你可能有一些神经元实际上在输出随机值,因此产生了虚假的最高值,这本来可能是一个异常值。你的 logits 对于每个值来说更有可能是可靠的,所以你可以尝试 logits 的最小置信度:所有神经元中的最低最大分数。为了查看基于模型的异常值采样的结果,请运行
> python active_learning.py --model_outliers=95
如同第二章所述,代码将选择这种采样策略,并为你选择 95 个未标记的项目进行标注,以及从剩余未标记的项目中随机选择的 5 个项目。如同第二章所述,你总是希望包含少量随机项目作为安全网。如果你不想评估任何随机项目,可以添加random=0选项:
> python active_learning.py --model_outliers=95 --random_remaining=0
您可以尝试调整其他数字,看看和/或注释多于或少于 95 的结果。如果您跳过了第二章,您将首先被要求注释一个纯随机样本,直到您有足够的初始训练和测试选项。这次注释的时间对于评估准确性和理解数据非常重要,所以如果您之前没有做过,请现在就做这些注释!
计算排名模型异常分数的代码被拆分为四个代码块。模型异常函数接受当前模型、未标记数据和从与训练数据相同分布中提取的保留验证数据。首先,我们在保留的验证数据上创建排名,您可以在 diversity_ sampling.py 中看到这些。
列表 4.2 使用验证数据获取激活排名
def get_validation_rankings(self, model, validation_data, feature_method):
""" Get activation rankings using validation data
Keyword arguments:
model -- current machine learning model for this task
validation_data -- held out data drawn from the same distribution as
➥ the training data
feature_method -- the method to create features from the raw text
An outlier is defined as
unlabeled_data with the lowest average from rank order of logits
where rank order is defined by validation data inference
"""
validation_rankings = [] # 2D array, every neuron by ordered list of
➥ output on validation data per neuron
# Get per-neuron scores from validation data
if self.verbose:
print("Getting neuron activation scores from validation data")
with torch.no_grad():
v=0
for item in validation_data:
textid = item[0]
text = item[1]
feature_vector = feature_method(text)
hidden, logits, log_probs = model(feature_vector,
➥ return_all_layers=True) ❶
neuron_outputs = logits.data.tolist()[0] #logits
# initialize array if we haven't yet
if len(validation_rankings) == 0:
for output in neuron_outputs:
validation_rankings.append([0.0] * len(validation_data))
n=0
for output in neuron_outputs:
validation_rankings[n][v] = output ❷
n += 1
v += 1
# Rank-order the validation scores
v=0
for validation in validation_rankings:
validation.sort() ❸
validation_rankings[v] = validation
v += 1
return validation_rankings
❶ 我们在这里获取所有模型层的成果。
❷ 我们存储每个验证项和每个神经元的对数分数。
❸ 根据保留验证数据中的分数对每个神经元进行排名顺序。
在第二步中,我们根据每个神经元对每个未标记的数据项进行排序。
列表 4.3 PyTorch 中基于模型的异常值代码
def get_model_outliers(self, model, unlabeled_data, validation_data,
➥ feature_method, number=5, limit=10000):
"""Get model outliers from unlabeled data
Keyword arguments:
model -- current machine learning model for this task
unlabeled_data -- data that does not yet have a label
validation_data -- held out data drawn from the same distribution
➥ as the training data
feature_method -- the method to create features from the raw text
number -- number of items to sample
limit -- sample from only this many items for faster sampling
➥ (-1 = no limit)
An outlier is defined as
unlabeled_data with the lowest average from rank order of logits
where rank order is defined by validation data inference
"""
# Get per-neuron scores from validation data
validation_rankings = self.get_validation_rankings(model,
➥ validation_data, feature_method) ❶
# Iterate over unlabeled items
if self.verbose:
print("Getting rankings for unlabeled data")
outliers = []
if limit == -1 and len(unlabeled_data) > 10000 and self.verbose:
# we're drawing from *a lot* of data this will take a while
print("Get rankings for a large amount of unlabeled data: this
➥ might take a while")
else:
# only apply the model to a limited number of items
shuffle(unlabeled_data)
unlabeled_data = unlabeled_data[:limit]
with torch.no_grad():
for item in unlabeled_data:
text = item[1]
feature_vector = feature_method(text)
hidden, logits, log_probs = model(feature_vector,
➥ return_all_layers=True) ❷
neuron_outputs = logits.data.tolist()[0] #logits
n=0
ranks = []
for output in neuron_outputs:
rank = self.get_rank(output, validation_rankings[n]) ❸
ranks.append(rank)
n += 1
item[3] = "logit_rank_outlier"
item[4] = 1 - (sum(ranks) / len(neuron_outputs)) # average
➥ rank
outliers.append(item)
outliers.sort(reverse=True, key=lambda x: x[4])
return outliers[:number:]
❶ 调用以获取验证数据的激活。
❷ 我们在这里获取所有模型层的成果。
❸ 我们为每个未标记项获取排名顺序。
排名函数接受一个未标记项的一个神经元的激活值和该神经元在验证数据上计算的排名。使用以下代码根据验证排名对每个未标记项进行排序。
列表 4.4 根据验证激活返回项的排名顺序
def get_rank(self, value, rankings):
""" get the rank of the value in an ordered array as a percentage
Keyword arguments:
value -- the value for which we want to return the ranked value
rankings -- the ordered array in which to determine the value's
➥ ranking
returns linear distance between the indexes where value occurs, in the
case that there is not an exact match with the ranked values
"""
index = 0 # default: ranking = 0
for ranked_number in rankings:
if value < ranked_number:
break #NB: this O(N) loop could be optimized to O(log(N))
index += 1
if(index >= len(rankings)):
index = len(rankings) # maximum: ranking = 1
elif(index > 0):
# get linear interpolation between the two closest indexes
diff = rankings[index] - rankings[index - 1]
perc = value - rankings[index - 1]
linear = perc / diff
index = float(index - 1) + linear
absolute_ranking = index / len(rankings)
return(absolute_ranking)
这个列表只是实现了排名排序示例。不要过于担心线性插值部分;代码在实现时有点晦涩,但它并没有捕捉到比您在示例中看到更复杂的内容。
4.2.2 我应该使用哪些层来计算基于模型的异常值?
您可能想尝试在不同的模型层上进行异常检测,看看它们是否能产生更好的异常值用于采样。一般来说,层越早,神经元就越接近原始数据。如果您选择了模型的输入层,即特征向量,输入层的异常值几乎与您在第二章中实现的异常检测方法相同。任何隐藏层都将介于表示原始数据(早期层)和表示预测任务(后期层)之间。
你也可以选择查看同一样本内的多个层。这种方法在迁移学习和预训练模型中使用;模型被“展平”以创建一个包含所有层的单个向量。你也可以使用展平的模型进行异常值检测,但你可能希望按每层的神经元数量进行归一化。在我们的模型中,隐藏层中的 128 个神经元将成为包含最终层 2 个神经元的异常值检测算法的主要贡献者,因此你可能希望独立计算各层的异常值排名,然后将两个结果合并。
或者,你也可以从两者中采样,将一半的模型异常值从 logits 中采样,另一半从隐藏层中采样。请注意,如果你仍然只有大约 1,000 个训练项目,隐藏层中的 128 个神经元可能不太具有信息量。你应该预计隐藏层将是嘈杂的,一些神经元是随机的,直到你拥有的标记训练项目比隐藏层中的神经元多得多——理想情况下,比层中的神经元多两个或更多数量级(超过 10,000 个标记项目)。
如果你使用接近输入的层,当你的特征值不表示激活时,要小心。对于我们的文本示例,输入确实代表了一种激活形式,因为它们代表了一个词出现的频率。然而,对于计算机视觉来说,更高的输入值可能只是代表更亮的 RGB 颜色。在这些情况下,模型输出层和 logits 层将更加可靠。
4.2.3 基于模型的异常值的局限性
这里是使用你的模型进行异常值采样的主要缺点的总结:
-
这种方法可能会生成在活跃学习迭代中相似且缺乏多样性的异常值。
-
很难避免模型中固有的某些统计偏差,因此你可能会持续错过某些类型的异常值。
-
在开始之前,你仍然需要一个模型,并且这种方法随着更多训练数据的增加而变得更好,因此基于模型的异常值采样不适合冷启动。
-
我们是通过使用我们的未标记数据来确定异常值的。很容易意外地采样到我们不想得到的东西——那些看起来最不像我们试图用新标签适应的数据。因此,我们使用验证数据来获取我们的排名,你应该遵循这种做法来检测任何其他类型的基于模型的异常值。
我们将在第五章中介绍解决第一个问题的方法,包括结合异常值检测和迁移学习的算法。第二个、第三个和第四个问题更难克服。因此,如果你正在采样基于模型的异常值,你应该考虑同时使用其他多样性采样方法,包括你可以从冷启动中使用的那些方法,例如聚类,我们将在下一节中介绍。
4.3 基于聚类的采样
聚类可以帮助你从一开始就针对数据多样性进行选择。策略相当直接:我们不是一开始就随机采样训练数据,我们还把我们的数据分成大量聚类,并从每个聚类中均匀采样。
这种方法之所以有效应该同样简单明了。到现在为止,你可能已经注意到有关当地澳大利亚体育团队的新闻文章标题有成千上万条。如果我们随机采样数据供人类审查,我们将花费大量时间手动标注关于体育比赛结果的相似标题。然而,如果我们预先聚类我们的数据,这些标题很可能会最终聚集在一个聚类中,因此我们只需要从这个与体育相关的聚类中标注少量示例。这种方法将节省大量时间,我们可以用这些时间来标注来自其他聚类的数据。那些其他聚类可能代表更罕见的标题类型,这些标题虽然重要但非常罕见,在随机采样中可能会被遗漏。所以聚类既节省了时间,又增加了多样性。
聚类是迄今为止在现实世界机器学习中用于多样性采样的最常用方法。它是本章讨论的第二种方法,因为它更适合本书的流程。在实践中,你可能首先尝试这种方法进行多样性采样。
你可能已经遇到过无监督学习,并且你很可能熟悉 k-means 聚类算法,这是我们将会使用的算法。无监督聚类和用于主动学习的聚类方法相同,但我们将会使用聚类来采样项目供人类审查进行标注,而不是解释聚类或在下一次处理中使用聚类本身。
4.3.1 聚类成员、质心和异常值
距离聚类中心最近的项被称为质心。实际上,一些聚类算法明确地测量质心项的距离,而不是整个聚类属性的距离。
你在第二章中从整个数据集中计算了异常值,在使用聚类时也可以计算异常值。异常值是质心的统计对立面:它们距离任何聚类的中心最远。
图 4.4 展示了五个聚类的示例,其中两个聚类的质心和异常值被标出。图 4.4 中的大多数项目都在一个聚类中:中间的大聚类。所以如果我们不是通过聚类而是随机采样,我们就会花费大部分时间标注相似的项目。通过首先聚类并从每个聚类中采样,我们可以确保更多的多样性。

图 4.4 展示了应用于数据的示例聚类算法,将其分为五个独立的聚类。对于每个聚类,最中心的项目被称为质心,距离中心最远的项目被称为异常值。
我们将以三种方式从聚类中进行采样:
-
随机—从每个聚类中随机采样项目。这种策略接近随机采样,但比纯随机采样更均匀地分散我们的选择在整个特征空间中。
-
质心—采样聚类的质心来代表我们数据中有意义的趋势的核心。
-
异常值—从我们的聚类算法中采样异常值,以找到可能被聚类遗漏的潜在有趣数据。聚类中的异常值有时被称为基于邻近度的异常值。
在单个聚类内,排名靠前的质心可能是相似的。也就是说,离中心最近的项可能类似于离中心第二近的项。因此,我们在聚类内部随机采样或仅选择质心。
同样,我们可能只需要每个聚类中采样少量异常值。可能这些异常值是算法遗漏的有意义趋势,但更有可能的是它们确实是真正罕见的:在文本中是重复的罕见单词,在计算机视觉中是嘈杂或损坏的图像。通常,您只需要采样少量异常值,如果您有大量聚类,可能每个聚类只采样一个异常值。
为了使示例简单,假设我们正在采样每个聚类的质心,每个聚类的单个最大异常值,以及每个聚类内部额外随机采样的三个项目。要使用基于聚类的采样,请运行
> python active_learning.py --cluster_based=95 --verbose
此命令通过基于聚类的采样为您采样 95 个未标记的项目进行标注,同时还有从剩余未标记项目中随机选择的 5 个项目。我建议使用verbose标志运行代码,该标志在代码运行时打印出每个聚类的三个随机项目。您可以通过检查聚类中的项目是否在语义上似乎相关,来了解聚类是否很好地捕捉到了有意义的差异。反过来,这种方法将给您一个关于数据中有多少有意义的趋势被呈现出来供人工标注的印象。
4.3.2 任何宇宙中的聚类算法
就我所知,没有人深入研究过是否有一个聚类算法始终比另一个聚类算法更好用于主动学习。许多成对研究查看特定聚类算法的变体,但没有全面广泛的研究,所以如果您对这个主题感兴趣,这种情况将是一个很好的研究课题。
一些聚类算法只需要对数据进行单次遍历,而一些算法的复杂度可能为 O(N³)或更差。尽管计算密集型算法可以在您的数据中找到更多数学上合理的聚类,但聚类中信息分布的分布对于需要标记的项目采样来说,不一定更好或更差。
对于我们将要实施的系统,我们不希望使用系统的人需要等待很长时间,直到聚类算法找到最佳的聚类。因此,我们将选择一个高效的聚类算法。我们将使用一种变种的 k-means 算法,它使用余弦相似度作为距离度量,而不是更典型的欧几里得距离(图 4.5)。我们处理的是高维数据,而在高维空间中欧几里得距离效果不佳。思考这个问题的方法之一是想象数据中的许多角落。几乎所有的聚类算法在高维数据中都容易产生不可靠的结果。在图 4.4 中,我们有两个维度的示例,只有四个角落,异常值可以隐藏在数据分布的中心。如果我们有三个维度的特征,异常值可以占据八个角落。(想象一下立方体的八个角落。)当我们达到 300 个特征时,数据就有 10⁹⁰ 个角落,而 10⁹⁰ 大于可观测宇宙中的原子数量。在几乎任何自然语言处理(NLP)任务中,你肯定会有超过 300 个特征,因此异常值可能会出现在空间的许多角落。对于超过 10 维度的数据,超过 99%的空间都在角落里,所以如果数据是均匀分布的,甚至高斯分布,你将测量到角落的伪影,而不是距离,这可能是不可靠的。

图 4.5 使用余弦相似度的聚类算法示例。对于每个聚类,中心被定义为从 0 出发的向量,该聚类的成员资格是表示该聚类的向量和表示项目的向量之间的角度。请注意,尽管这个例子看起来不像图 4.4 中的球形聚类那样像真实的聚类,但它受限于二维。对于更高维度的稀疏数据,你更有可能在使用你的模型时使用这种数据,这种聚类通常比这里展示的球形类型更好。
你可以将余弦相似度想象成在夜空中观察星星。如果你从自己出发,向两颗星星画一条直线,并测量这两条线之间的角度,那么这个角度就会给你余弦相似度。在夜空示例中,你只有三个物理维度,但你的数据对于每个特征都有一个维度。余弦相似度并不是对高维问题的免疫,但它通常比欧几里得距离表现得更好,尤其是在稀疏数据方面,比如我们的文本编码。
余弦相似度衡量两个向量是否指向同一方向,但不衡量距离。天空中两颗星星之间可能有一个很小的角度,但其中一颗可能远得多。因为你只测量角度,所以你将星星视为距离相等。因此,余弦相似度有时被称为球面 k-means,其中所有数据点都被视为在多维球面上距离 0 相同的距离。这个例子确实提出了一个问题:数据点可能意外地指向同一方向,因此错误地看起来很相似。然而,在高度数据中发生这种问题的可能性很低,因此高维度有助于(并使我们的计算更简单)。我们可以将聚类的向量计算为该聚类中所有项目(特征)向量的总和,而不用担心按项目数量进行归一化,因为余弦对距离函数的绝对值不敏感。
4.3.3 使用余弦相似度的 K-means 聚类
给定两个相同大小的特征向量 v[1]和 v[2],你可以计算这两个向量之间角度的余弦值如下
𝛟CS = (v[1] ⋅ v[2]) / (‖v[1]‖[2] ⋅ ‖v[2]‖[2])
余弦相似度是 PyTorch 的内置函数,所以我们不会在这里深入探讨其实现。夜空中星星之间的角度和图 4.5(第 4.3.2 节)中的示例应该足以让你理解正在发生的事情。(如果你对余弦相似度感兴趣或想查看 PyTorch 中的其他距离函数,可以从mng.bz/XdzM的文档开始。)
其他流行的机器学习库也实现了大量的聚类算法。这些其他算法可能和你在这里实现的示例一样有效。有一种普遍的看法认为,聚类算法不应用于超过 10,000 个项目的数据集,但这并不正确。始终存在一些聚类算法,它们可以通过单次数据遍历合理地工作,因此你不应该根据数据集大小考虑任何限制,除非你试图将处理时间缩短到几秒钟。即使对于计算密集型的聚类算法,你通常也可以在数据的小子集(批次)中构建聚类,使用这些结果聚类几乎和整个数据集一样好。
K-means 的一般策略如下:
-
通过从所需的注释数量反向工作来选择你想要的聚类数量。
-
随机将数据项添加到初始聚类之一。
-
遍历项目,如果它们更接近另一个聚类,则将它们移动到另一个聚类。
-
重复步骤 3,直到没有更多项目可以移动或者达到通过数据预定义的 epoch 数量限制。
余弦相似度和余弦距离是同一回事
你可能会在文献中看到余弦相似度被称作余弦距离。这些术语意味着同一件事。一般来说,聚类算法更可能使用“距离”这个术语,而在最严格的定义中,距离 = 1 – 相似度。然而,余弦相似度并不遵循严格的三角不等式性质(Schwarz 不等式),因此余弦相似度不符合距离度量的正式定义——因此得名“相似度”。在这个章节中,当我们把中心点和异常值作为互补来获取每个采样项目的 [0, 1] 范围时,术语已经足够令人困惑了,所以不要让这增加你的困惑!
如步骤 1 所述,你应该反向工作,并选择最合理的簇数量,这取决于你从每个簇中想要采样的项目数量。如果你想从每个簇中采样 5 个项目(1 个中心点,1 个异常值和 3 个随机选择),并且你想要在这个主动学习迭代中通过这种采样策略注释 100 个项目,那么你应该选择 20 个簇,因为 20 × 5 = 100。
为了完整性,本书示例代码中实现了带有余弦相似度的 k-means 聚类算法的完整代码,你可以在 mng.bz/MXQm 上看到它。这个 k-means 策略与距离度量无关。k-means 函数只接受两个参数:数据,可以是未标记的或标记的(在这种情况下,标签被忽略),以及你想要的簇数量。你可以在 diversity_sampling.py 中的 k-means 策略中看到,以下列表中的主函数。
列表 4.5 PyTorch 中的基于簇的采样
def get_cluster_samples(self, data, num_clusters=5, max_epochs=5,
➥ limit=5000):
"""Create clusters using cosine similarity
Keyword arguments:
data -- data to be clustered
num_clusters -- the number of clusters to create
max_epochs -- maximum number of epochs to create clusters
limit -- sample only this many items for faster clustering (-1 = no
➥ limit)
Creates clusters by the k-means clustering algorithm,
using cosine similarity instead of more common euclidean distance
Creates clusters until converged or max_epochs passes over the data
"""
if limit > 0:
shuffle(data)
data = data[:limit]
cosine_clusters = CosineClusters(num_clusters)
cosine_clusters.add_random_training_items(data) ❶
for i in range(0, max_epochs):
print("Epoch "+str(i))
added = cosine_clusters.add_items_to_best_cluster(data) ❷
if added == 0:
break
centroids = cosine_clusters.get_centroids() ❸
outliers = cosine_clusters.get_outliers() ❹
randoms = cosine_clusters.get_randoms(3, verbose) ❺
return centroids + outliers + randoms
❶ 使用随机分配初始化簇。
❷ 将每个项目移动到最适合它的簇中,并重复。
❸ 从每个簇中采样最佳拟合(中心点)。
❹ 从每个簇中采样最大的异常值。
❺ 从每个簇中随机采样三个项目,并传递 verbose 参数以了解每个簇中有什么。
你可以用余弦替换任何其他距离/相似度度量,并且可能效果一样好。你可能想要尝试的一种策略是为了加快过程,在数据的一个子集上创建簇,然后将剩余的数据分配到其簇中。这种方法让你两全其美:快速创建簇并从整个数据集中采样。你可能还想要尝试不同的簇数量和每个簇中不同的随机选择数量。
你可能会记得,从高中数学中学到的余弦函数值:余弦(90°) = 0 和余弦(0°) = 1。这使得我们的目标值在[0,1]范围内变得容易实现,因为当仅对正特征值进行计算时,余弦相似度已经返回了[0,1]范围内的值。对于我们的质心,我们可以直接将余弦相似度作为每个项目的多样性得分。对于异常值,我们将从 1 中减去这些值,以确保我们在主动学习排名策略中保持一致性,并且总是采样最高值。正如我们在第三章中提到的,一致性对于下游任务很重要。
4.3.4 通过嵌入或 PCA 减少特征维度
聚类对于文本比对图像来说效果更好。如果你来自计算机视觉背景,你早已知道这一点。当你查看本章中的示例中的聚类时,你可以看到每个聚类中项目之间的语义关系。所有聚类都包含具有相似主题的新闻标题,例如。但如果将余弦相似度应用于图像,情况可能就不一样了,因为单个像素比字符序列从图像内容中抽象出来得更多。如果你将余弦相似度应用于图像,你可能会得到一个包含风景图像的聚类,但这个聚类可能错误地包含一张绿色汽车停在蓝色墙前的图像。
减少数据维度最常见的方法是主成分分析(PCA)。PCA 通过组合高度相关的特征来减少数据集的维度。如果你已经从事机器学习一段时间了,你可能认为 PCA 是减少数据维度时的首选选项。PCA 对于早期非神经机器学习算法来说很常见,当有大量维度(特征)之间存在相关性时,其质量会下降。基于神经模型的嵌入在学术界更为常见,但 PCA 在工业界更为常见。
PCA 的实现超出了本书的范围。尽管如此,PCA 是机器学习中一个很好的技术,因此我建议你阅读更多关于它的内容,以便你拥有几个降维的工具。PCA 不是 PyTorch 的本地函数(尽管我并不惊讶它很快就会被添加),但 PCA 的核心操作是奇异值分解(SVD),这在pytorch.org/docs/stable/torch.html#torch.svd中有介绍。
作为 PCA 的替代方案,你可以使用你模型的嵌入——也就是说,使用你模型的隐藏层或另一个在其它数据上训练过的模型。你可以将这些层用作直接建模的表现。或者,你可以使用模型蒸馏来降低聚类过程中的维度,如下所示:
-
选择你想要的聚类数量。
-
根据你现有的(高维)特征空间对项目进行聚类。
-
将每个聚类视为一个标签,并构建一个模型来将项目分类到每个聚类中。
-
使用你新中间层的隐藏层作为新的特征集,继续将项目重新分配到最佳聚类的过程。
模型设计在这里很重要。对于文本数据,你第 4.2 节中的架构可能就足够了:一个包含 128 个神经元的单个隐藏层。对于图像数据,你可能需要更多层,并使用卷积神经网络(CNN)或类似网络来帮助泛化到特定的像素位置。在两种情况下,使用你构建模型时的直觉,根据你拥有的数据量和选择的聚类(标签)数量。
注意,如果你的向量中有负值,比如你在使用 LeakyReLU 作为激活函数的隐藏层上进行聚类时,余弦相似度将返回[-1,1]范围内的值,而不是[0,1]范围内的值。因此,为了保持一致性,你可能需要通过加 1 并减半余弦相似度的结果来归一化,以获得[0,1]的范围。
对于更密集的特征向量,无论是来自模型还是来自 PCA,你也可能考虑使用除了余弦以外的其他距离函数。余弦相似度最适合大型稀疏向量,例如我们的词表示。你可能不想像余弦相似度那样将[0.1, 0.1]的激活与[10.1, 10.1]的激活同等对待。PyTorch 还内置了一个用于成对距离的距离函数,在这种情况下可能更合适。你可以在 pytorch_clusters.py 文件中看到这个函数被注释掉,现在余弦函数存在的地方。你可以尝试不同的距离函数,看看是否可以得到更有意义的聚类。正如代码所述,你可能需要根据该聚类中的项目数量来归一化你的聚类向量;否则,你应该能够在不修改代码的其他部分的情况下替换其他距离函数。
作为计算机视觉高级聚类的最后一个要点,如果你是为了多样性采样而聚类,那么聚类本身是否具有语义意义可能并不重要。从采样的角度来看,即使聚类本身在语义上不一致,你仍然可能从你的聚类中获得来自不同图像的良好多样性。也就是说,你可能可以忽略嵌入和 PCA,并直接在像素值上聚类。这种方法可能同样成功。余弦相似度将为 RGB = (50,100,100)和 RGB = (100,200,200)创建相同的向量,因此相同图像的较亮、较饱和的版本可能是相同的,但这可能并不重要。我不了解任何关于图像像素级聚类是否总是比在主动学习采样时使用降维更差的研究,因此这个研究主题对于任何有兴趣追求它的人来说都是一个有价值的主题。
4.3.5 其他聚类算法
除了 k-means 的其他变体之外,你可能还想尝试其他聚类算法和相关无监督机器学习算法。本书的范围不涉及每个流行的聚类算法;关于聚类已有许多优秀的书籍。然而,在本书中,我们将从高层次的角度审视三种算法:
-
基于邻近度的聚类,例如 k-最近邻(KNN)和谱聚类
-
高斯混合模型(GMM)
-
主题建模
你可能熟悉 KNN 算法。KNN 通过该簇中少数几个项目之间的邻近度来形成簇(k 个项目,而不是整个簇。k-means 的一个优点和局限性是所有簇都有一个有意义的中心:即均值本身。你可以想象 L 形状的簇或其他没有有意义的中心的模式;KNN 允许你捕捉这些类型的簇。谱聚类也是如此,它是一种基于向量的聚类方法,可以通过在新向量中表示特征空间来发现更复杂的簇形状。
然而,没有明确的证据表明基于邻近度的聚类在主动学习方面始终优于 k-means 聚类。你可能想在 L 形状的两个不同极端分别捕获数据点,因为即使它们之间有连续的项目链接,它们也足够不同。此外,如果你的 k-means 算法建立在隐藏层或 PCA 导出的向量上,那么它将在你学习的向量中发现不同类型的形状,正如你之前所学的。你的 k-means 算法只会在它学习的向量中发现简单的球状簇,但如果这些向量是从更多特征中抽象出来的,那么当它们映射回这些特征时,簇就会变得更加复杂。实际上,将 k-means 应用于隐藏层中的向量与使用谱聚类来发现不同的簇形状相似。因此,对于主动学习来说,谱聚类没有明显的优势——至少,还没有人深入研究这个话题,以至于在大多数主动学习用例中,一种方法明显优于另一种方法。
GMM 允许一个项目同时属于多个聚类。与试图强制在两个自然重叠的聚类之间设置聚类边界的 k-means 相比,这种算法可以产生更数学上合理的聚类。你可能会看到 GMMs 和相关算法被称为软聚类与硬聚类或模糊聚类。与基于邻近度的聚类一样,没有强有力的证据表明 GMMs 比 k-means 在主动学习方面产生更好的样本。在我职业生涯的早期,我同时从事混合模型和主动学习,但从未将两者结合起来;我从未觉得其他主动学习技术存在需要 GMMs 或类似算法来克服的不足。所以从实践经验来看,我可以报告说,我从未觉得有必要尝试将两者结合起来,但我也没有深入测试 GMMs 在主动学习中的应用。这个主题是另一个可能令人兴奋的研究领域。
主题模型几乎仅用于文本。主题模型明确地发现一个主题中相关词的集合以及这些主题在文档中的分布。最流行的算法是潜在狄利克雷分配(LDA),你可能在文献中看到主题模型被称为 LDA。与 GMMs 不同,主题模型在实际应用中使用得很多,尤其是在社交媒体监控工具中。一个主题中的相关词通常在语义上是相关的,因此专家用户可以生成主题,然后选择最有趣的主题进行进一步分析。这种方法是一种轻量级监督,是我们将在第九章中再次讨论的重要的人机交互策略。在多样性采样中,你可以将聚类作为主题,并从每个主题中采样项目,就像使用任何其他聚类机制一样。
虽然任何聚类算法可能都不如 k-means 在建模数据方面更好,但它将带来不同的结果,这将增加多样性。所以如果你有多个聚类算法为主动学习生成样本,你就不太可能因为任何一种聚类方法的数学假设而产生偏差。如果你已经因为其他原因在你的数据上使用聚类算法,那么尝试将它们作为采样策略来使用。
4.4 代表性采样
代表性 采样 指的是明确计算训练数据与我们部署模型的应用域之间的差异。在基于模型的异常值和基于聚类的采样方法中,我们没有明确尝试建模我们的模型与评估模型准确性的数据之间的差距。因此,自然的下一步是尝试找到符合这一特征的项目:哪些未标记数据看起来最像我们部署模型所在的领域?这一步骤对于你作为数据科学家来说,就像对于你的模型一样有用:了解哪些数据看起来最像你正在适应的地方,将给你关于整个数据集以及你可能会遇到的问题的良好直觉。一个示例如图 4.6 所示。

图 4.6 代表性采样的一个示例,显示了当前训练数据来自与应用域数据不同的分布。代表性采样最大化了相对于当前训练数据,采样与应用域看起来最像的项目。
4.4.1 代表性采样很少单独使用
如果你认为代表性采样是主动学习中最优的方法,这是可以理解的。如果我们能够采样看起来最像我们希望部署模型的地方的数据,这难道不是解决了我们大部分的多样性问题吗?虽然这种直觉是正确的,代表性采样也是最强大的主动学习策略之一,但它也是最容易出现错误和过拟合的。因此,在深入实施之前,我们将探讨一些局限性。
首先,在大多数现实场景中,你的未标记数据并不是来自你将部署模型的领域。如果你正在部署一个模型来识别未来的新闻标题(如我们的示例)或帮助自动驾驶汽车在未来某个时刻在道路上导航,你并没有来自目标域的数据样本;你有一个来自早期中间时间点的样本。这一事实在大多数现实场景中都是正确的:你将在未来部署你的模型。因此,如果你将训练数据调整得太接近你的未标记数据,当模型部署到未来数据时,它将陷入过去。
在某些部署场景中,例如集中式模型处理新闻标题,你可能能够几乎实时地适应新数据,因此你不会遇到大问题。在其他用例中,例如自动驾驶汽车,几乎实时地调整模型并将其部署到每辆车上将是不可能的。在两种情况下,你仍然需要比仅看起来最像你当前未标记数据的训练项目更多样化的训练项目。
在本书的所有主动学习策略中,代表性采样最容易出现噪声。如果你有干净的训练数据,你的未标记数据中的噪声通常与训练数据最不同。在自然语言处理任务中,这种噪声可能包括损坏的文本、不属于你的目标域的语言文本、来自你的训练数据中不存在的地名列表的文本,等等。对于计算机视觉,噪声可能包括损坏的图像文件;例如,在将相机镜头对准地面时意外拍摄的图片;以及由于使用不同相机、分辨率或压缩技术而产生的伪影。这些类型的噪声中,没有一种对你的任务是有趣的,因此它们不会产生有趣或多样化的样本范围以进行标记。
最后,如果你只在主动学习过程的后期周期中应用代表性采样,那么它可能会产生比好处更多的坏处,尤其是在你没有领域适应问题时。假设你使用了不确定性采样进行几次主动学习迭代,然后在后续迭代中应用代表性采样。你在早期迭代中过度采样了接近决策边界的项目,因此代表性采样将在后续迭代中过度采样远离决策边界的项目。如果你这样实施,这种方法将比随机采样更差。
由于这些原因,代表性采样很少单独使用;它最常用于将代表性采样与不确定性采样结合的算法或过程中。例如,你可能只为也接近决策边界的项目使用代表性采样。在一些关于代表性采样的基础学术论文中,你可能会看到他们所说的代表性采样是多样性和不确定性的结合。我们将在第五章中回到方法的组合,在那里我们将充分利用所有采样技术。在这一章中,我们将单独介绍代表性采样,以便你在学习如何将其与其他方法结合之前理解其基本原理。
考虑到这些注意事项,代表性采样对于领域适应可能是有用的。在学术研究中,人们关注的是没有任何额外标签的领域适应,这通常被称为差异而不是表示。在工业界,我还没有遇到没有额外人工干预的领域适应,因此它应该成为你工具箱中的重要工具。
4.4.2 简单代表性采样
与我们在 4.4.1 节中的聚类示例一样,我们可以使用许多算法进行代表性采样。我们在第二章中提到过一种,其中对异常检测方法进行微小修改,计算某事物是否是训练数据的异常,但不是未标记数据的异常。在这里,我们将提高一点复杂性,并使用从我们的训练数据到未标记数据的余弦相似度,如下所示:
-
创建一个包含训练数据的簇。
-
创建一个包含未标记数据的第二个簇。
-
从训练数据相对于未标记数据的异常分数中采样具有最大异常分数的项目。
要尝试代表性采样,请运行
> python active_learning.py --representative=95
此命令使用代表性采样为您采样 95 个未标记项目以便标注,以及从剩余未标记项目中随机选择的 5 个项目。代表性采样函数将训练数据和未标记数据作为参数,以找到相对于训练数据的未标记数据项目中最具代表性的项目。使用我们现有的聚类实现,我们可以看到这只需要几行额外的代码。
列表 4.6 PyTorch 中的代表性采样
def get_representative_samples(self, training_data, unlabeled_data, number=20, limit=10000):
"""Gets the most representative unlabeled items, compared to training data
Keyword arguments:
training_data -- data with a label, that the current model is trained
➥ on
unlabeled_data -- data that does not yet have a label
number -- number of items to sample
limit -- sample from only this many items for faster sampling (-1 =
➥ no limit)
Creates one cluster for each data set: training and unlabeled
"""
if limit > 0:
shuffle(training_data)
training_data = training_data[:limit]
shuffle(unlabeled_data)
unlabeled_data = unlabeled_data[:limit]
training_cluster = Cluster() ❶
for item in training_data:
training_cluster.add_to_cluster(item)
unlabeled_cluster = Cluster() ❷
for item in unlabeled_data:
unlabeled_cluster.add_to_cluster(item)
for item in unlabeled_data: ❸
training_score = training_cluster.cosine_similary(item)
unlabeled_score = unlabeled_cluster.cosine_similary(item)
representativeness = unlabeled_score - training_score
item[3] = "representative"
item[4] = representativeness
unlabeled_data.sort(reverse=True, key=lambda x: x[4])
return unlabeled_data[:number:]
❶ 为训练数据创建一个簇。
❷ 为未标记数据创建一个簇。
❸ 对于每个未标记项目,计算它与标记数据相对于未标记数据的接近程度。
与聚类代码一样,如果您将此采样策略应用于图像,您可能希望使用一个低维向量,该向量将图像从单个像素中抽象出来。如果您使用不同的特征维度,代码中不需要进行任何更改;您只需将新的数据向量直接插入算法中即可。
4.4.3 自适应代表性采样
对我们代码的微小修改意味着我们可以在每个主动学习迭代中使我们的代表性采样策略自适应。当我们采样了最具代表性的项目时,我们知道该项目将在以后获得标签,即使我们还不确定那个标签是什么。因此,我们可以将那个单独的项目添加到假设的训练数据中,然后对下一个项目再次运行代表性采样。这种方法将有助于防止代表性采样只采样相似的项目。要尝试自适应代表性采样,请运行
> python active_learning.py --adaptive_representative=95
此命令使用自适应代表性采样为您采样 95 个未标记项目以便标注,以及从剩余未标记项目中随机选择的 5 个项目。新代码甚至更短,使用相同的参数,并对每个新项目调用一次代表性采样函数。
列表 4.7 PyTorch 中的自适应代表性采样
def get_adaptive_representative_samples(self, training_data, unlabeled_data,
➥ number=20, limit=5000):
"""Adaptively gets the most representative unlabeled items, compared to
➥ training data
Keyword arguments:
training_data -- data with a label, that the current model is trained on
unlabeled_data -- data that does not yet have a label
number -- number of items to sample
limit -- sample from only this many items for faster sampling (-1 =
➥ no limit)
Adaptive variant of get_representative_samples() where the training_data
➥ is updated
after each individual selection in order to increase diversity of samples
"""
samples = []
for i in range(0, number):
print("Epoch "+str(i))
representative_item = get_representative_samples(training_data,
➥ unlabeled_data, 1, limit)[0]
samples.append(representative_item)
unlabeled_data.remove(representative_item)
return samples
使用我们的集群和代表性采样的构建块,在代码上开始实施更复杂的主动学习策略只是一个小的扩展。我们将在第五章中详细介绍这些高级技术。在大多数情况下,代码将保持简短,但了解构建块很重要。
注意,这个函数运行需要一段时间,因为它需要重新评估您所采样的每个未标记数据点的代表性得分。因此,如果您在一个较小的服务器或个人电脑上运行此代码,您可能希望降低要采样的数量或考虑的限制,这样您就可以在不等待很长时间的情况下看到此采样策略的结果。
4.5 为现实世界多样性进行采样
识别和减少偏差的策略很复杂,可能足以填满一本书。在本文本中,我们将集中讨论数据标注问题:确保训练数据尽可能公平地代表现实世界的多样性。正如您在本章引言中所读到的,在某些情况下,我们对机器学习的期望比对人还高。例如,我们期望许多模型包含接近英语 20 万个词汇量,而不是典型流利人士所知的约 4 万个词汇。因此,本节涵盖了确保模型从主动学习角度公平的最佳实践,同时知道衡量和减少现实世界偏差是一个复杂且远未解决的问题的领域。
现实世界的多样性人口可以是任何对您的数据有意义的现实世界划分。以下是一个(非详尽)的列表,列出了我们可能对我们灾害响应示例中关心的多样性人口类型:
-
语言—我们能否更准确地识别用某些语言编写的与灾害相关的内容?这里存在明显的偏见,因为数据大部分是英文。
-
地理—我们能否更准确地识别来自/关于某些国家的与灾害相关的内容?这里存在很高的偏差可能性,因为一些国家会有更多媒体报道其灾害,并且还会存在国家层面的人口偏差。
-
性别—我们能否更准确地识别来自/关于某一性别人群的与灾害相关的内容?可能男性比其他性别更多地编写内容,这可能会反映在写作风格中。
-
社会经济—我们能否更准确地识别来自/关于不同收入人群的与灾害相关的内容?关于富裕国家的报道通常更多,因此这种情况可能导致数据和模型中的偏差。
-
种族和民族——我们能否更准确地识别来自或关于某些种族或民族的与灾难相关的内容?媒体文章往往将同一类型的事件,如一名男子单独进行的枪击,描述为某些民族的恐怖战争的一部分(因此与灾难相关),但对于其他民族来说则被视为个人犯罪(因此与灾难无关)。
-
日期和时间——我们能否在一天中的某些时间、一周中的某一天或一年中的某个月份更准确地识别与灾难相关的内容?周末发布的文章较少,而且这些文章往往更关注人文兴趣。
偏差可能在不同组合中有所不同,这种情况被称为交叉性偏差。对某些性别的人的偏见可能对某些种族和民族来说更好、更差,甚至可能相反。
根据你部署模型的位置,你可能需要遵守当地法律。例如,在加利福尼亚州,劳动法禁止在多个人口统计中歧视,包括前述列表中的许多人口统计,以及年龄、移民状态、性取向和宗教。在某些情况下,通过编码数据以改变采样策略来解决问题可能不是正确的选择;相反,你需要在收集数据时解决问题。
4.5.1 训练数据多样性的常见问题
图 4.7 总结了数据公平性的三个常见问题。图 4.7 中的三个人口统计显示了在尝试创建训练数据时可能会遇到的一些常见问题:
-
在你的训练数据中过度代表但并非来自相同分布的人口统计(X)
-
一种人口统计,其分布与整体数据分布相似,但在训练数据中尚未以平衡的方式表示(O)
-
一种在训练数据中代表性不足的人口统计,以至于产生的模型可能比使用随机采样更差(Z)

图 4.7 展示了多样性采样试图解决的问题的例子。在这里,我们有项目映射到三个现实世界的人口统计,我们称之为 X、O 和 Z。
人口统计 X 看起来相当不错。到目前为止,我们所有的例子都在当前训练数据中。X 与整体训练数据的分布并不相同。这个问题并不典型于神经网络模型,但它可能是像朴素贝叶斯这样的简单模型的问题。X 是特权人口统计的典型例子,具有积极的偏差,例如在多语言数据集中标准英语数据。
人口统计学 O 今天部分在训练数据中,部分在训练数据外。O 在整个特征范围内分布得相当均匀。因此,如果我们能够收集代表整个特征空间的训练数据,我们对 O 就最不担心。O 是具有最小偏差(正面或负面)的人口统计学的典型代表,例如基于时间的 demographics,其中每个项目都在一定时期内被仔细收集。
相比之下,人口统计学 Z 在当前训练数据之外聚集。更糟糕的是,当前训练数据中的 Z 数据点似乎对 Z 来说是异常值。模型可能没有关于 Z 的信息,实际上可能错误地建模了 Z。Z 是代表性不足的人口统计学的典型代表,例如在数据集中没有出现的代表性不足的种族,除非那个人偶然与更受优待的人口统计学共享特征。
机器学习算法本身并不容易受到数据中已经存在的许多固有偏差的影响,尽管这些偏差是可能的。大多数时候,当一个算法表现出偏差时,它是在反映或放大来自训练数据或训练数据表示为模型特征的方式中的偏差。即使偏差完全来自模型本身,你也可能需要负责创建用于检测和测量该偏差的评估数据。如果数据来源导致结果不佳,当你开始标注数据时,你也负责识别这一事实。所以如果你负责标注数据,你可能在模型公平性方面比组织中的任何人都更有影响力。
注意,许多人工智能伦理学研究人员使用的“算法”定义比大多数计算机科学家更广泛,包括机器学习模型的数据处理和输出解释。这种定义本身并不更好或更差——只是不同。当你阅读人工智能伦理文献中的算法时,请注意具体指的是应用程序中哪些使用机器学习的部分。
4.5.2 确保人口统计学多样性的分层抽样
没有来自每个人口统计学的未标记项目参考数据集,你需要应用之前已经应用过的主动学习策略,但现在以分层方式应用于所有数据:
-
对每个人口统计学应用最小置信度抽样,在每个人口统计学中选择与该人口统计学最自信预测相等的项目数量。
-
对每个人口统计学应用置信度边际抽样,在每个人口统计学中选择与该人口统计学最自信或次自信相等的项目数量。记住,置信度边际是明确查看两个最自信的项目。)
-
对每个人口统计学应用基于模型的异常值检测。
-
在每个人口统计学内应用基于聚类的抽样。
基本上,我们希望从整体未标记数据中获得最佳可能的数据集,同样地,我们也希望为每个群体做这件事,同时注意在那些群体之间进行分层抽样。
本章中没有为这个任务提供单独的代码。你应该能够根据你关心的群体划分数据,并且只对每个群体的数据进行抽样策略的应用。
4.5.3 代表性和代表性:哪个更重要?
在拥有代表一个群体的数据与该群体在数据中得到良好代表之间有一个微妙但重要的区别。这种区别在使用的模型类型不同时尤其重要,因此我们将在这里区分它们:
-
代表性群体数据—如果你的数据是从与该群体相同的分布中抽取的,那么你的数据就是代表该群体的。在统计术语中,如果你的标记数据是从随机抽取该群体的数据中独立且同分布(IDD)的,那么你的标记数据就是代表性的。
-
一个得到良好代表的群体—一个群体如果存在足够的数据代表该群体,以便你的模型能够公平地执行,但数据不需要是 IDD。
如果你知道你的未标记数据公平地代表了你所关心的群体,并且它对该群体进行了准确编码,你可以创建一个额外的评估数据集,该数据集从每个群体中随机抽取。如果你的群体不是同等频繁的,这种方法将比从整个数据集中随机抽样创建评估数据更快。但你可以只使用这个数据集来评估你的每个群体的准确性(第 4.5.4 节)。
记住,你的未标记数据可能不代表每个群体。本章中来自澳大利亚媒体组织的这一章的数据专注于澳大利亚及其地理或政治上接近的国家新闻。例如,关于乌干达的文章不会代表乌干达的实际事件;数据将偏向于那些被认为对澳大利亚更重要的事件。在这种情况下,不可能获得代表乌干达的数据。相反,你应该使用聚类来获取尽可能多样化的关于乌干达的文章集合,这样至少可以保证关于乌干达的文章得到良好代表。
如果你使用的是神经网络模型,那么即使数据有很好的代表性但并不具有代表性,你可能也还可以接受。只要数据足够多,神经网络模型可以针对给定的人口统计中的所有项目保持准确性,即使它在训练时使用的数据在该人口统计中是不平衡的。例如,乌干达的新闻文章可能过多地偏向于体育相关文章。只要你的模型有足够的乌干达其他类型新闻的例子来确保在这些主题上的准确性,那么体育相关新闻的过度代表就不会产生影响;你的模型可以对乌干达的所有类型新闻都保持相同的准确性。
然而,如果你使用的是生成模型,尤其是像朴素贝叶斯这样的简单模型,你的模型会明确地通过假设代表性数据来尝试对分类任务进行建模。在这种情况下,你需要更加努力地确保你的数据具有代表性,或者通过操纵某些参数(如某些数据类型的先验概率)来尝试在模型中编码代表性。
这种方法将现实世界多样性的采样与分层采样分开。在社会科学中,分层采样是一种确保数据尽可能具有代表性的技术,并且用于调整调查等活动的结果,以考虑人口统计的不平衡。根据神经网络模型的不同,数据存在于训练数据中可能就足够了,偏见不会持续存在。另一方面,一个模型可能会放大任何偏见。因此,情况变得稍微复杂一些,需要整体解决,考虑到机器学习架构。如果你关心你模型的现实世界多样性,分层采样的文献仍然是一个好的起点,了解这种采样策略不一定是解决问题的唯一方案。
4.5.4 按人口统计的准确性
如果我们的数据中有现实世界的人口统计数据,我们可以根据这些统计数据计算宏观准确性的变体。对于属于某个特定人口统计的每个项目,有多少个被正确预测了它们的给定标签?请注意,每个“错误”都将既是误报也是漏报。因此,除非你从准确性中排除了某些标签,或者为可信预测设置了阈值,否则你将具有相同的精确度和召回率值(与微观精确度和召回率相同的情况)。用d表示属于每个人口统计的成员。因此,精确度和召回率是

我没有在工业界经常看到这种技术的使用,但这并不意味着它不应该被采用。大多数关于人口统计不平等的研究往往是临时的。例如,在人脸识别方面,有许多流行媒体机构选择少量代表不同种族的人的图片,并寻找这些种族之间的不同准确度水平。在这些用例中,媒体机构仅测试精确度,并且是在一个小(可能不具有代表性)的样本上。这种方法适用于媒体故事,但如果我们认真对待提高我们模型公平性的话,这种方法是行不通的。
如果你负责构建模型并确保其尽可能公平,你应该考虑更广泛的方式来衡量精度。你可能希望根据你的用例进一步细化基于人口统计的精度。以下是一些选项:
-
最小精度—任何人口统计中的最低精确度、召回度或 F 分数。如果你想将你的模型视为在人口统计公平性方面仅与其最薄弱环节一样强大,你应该取最小精度。你可以从一个特定的人口统计中取最小 F 分数。对于更严格的指标,可以取最小精确度和最小召回度,可能来自不同的标签,并将 F 分数应用于这些。
-
谐波精度—按人口统计的精度计算出的调和平均值,这将比平均人口统计精度更严格,但不会像取最小值(除非有 0 值)那样严格。正如我们通过取精确度和召回率的调和平均值来得到 F 分数,而不是算术平均值一样,我们也可以取调和平均值。调和平均值会更多地惩罚异常低精度,而不是奖励异常高精度,但不会像取最小值那样多。
4.5.5 实际世界多样性的采样局限性
实际世界多样性采样的最大缺点是你无法保证模型是完美的,但你可以更准确地测量偏差,并确保你的模型将比仅使用随机采样时的模型公平得多。有时,你可能无法弥补偏差,仅仅是因为可用的未标记数据不足。我在海地克里奥尔语和乌尔都语等语言中从事灾害响应工作,那里根本没有足够的数据来覆盖与英语标题相同的潜在灾害范围。仅通过标记是无法解决这个问题。数据收集超出了本书的范围,但我们在第九章中介绍创建合成数据的方法时,将回到一些其他相关技术。
4.6 使用不同类型模型的多样性采样
你可以将多样性采样应用于任何类型的模型架构。类似于我们在第三章学习的不确定性采样,有时其他模型的多样性采样与神经网络模型相同,有时多样性采样是特定于某种类型模型的。
4.6.1 使用不同类型模型的基于模型的异常值
对于使用线性回归的模型,你可以像神经网络模型一样计算模型异常值:哪些项目在所有标签上的激活度最低?如果你可以访问它们,可以使用预先归一化的预测分数,就像你在本章中对 logits 所做的那样。
在贝叶斯模型的情况下,基于模型的异常值具有每个标签最低的整体概率。正如我们在这里的神经网络模型一样,你可以根据你的用例中最有意义的方式计算最低的整体值,是最低的平均值还是最低的最大值。
在 SVMs 的情况下,你可以寻找接近超平面(决策边界)但与支持向量本身的最大距离的预测:确定决策边界的训练项目。这些项目将是神经网络模型中具有高不确定性的模型异常值的等价物。
4.6.2 使用不同类型模型的聚类
你可以使用本章中提到的无监督聚类方法,例如 k-means,为任何监督机器学习算法进行采样。不需要为不同类型的监督机器学习算法改变 k-means 方法,因此你可以从本章中的方法开始,然后根据你的模型和数据考虑对其进行优化。
如果你想要深入了解基于聚类的采样,2000 年代初对多样性采样进行了大量研究。SVMs 在当时达到了顶峰,因此你需要复习你的 SVM 知识,以充分利用当时的研究成果。
4.6.3 使用不同类型模型的代表性采样
如本章前面所述,你可以使用朴素贝叶斯或欧几里得距离进行代表性采样,而不是余弦相似度。任何距离函数都可能适用于你的特定数据;我们在这本书中只使用余弦相似度,是因为从第 4.3 节关于聚类的连续性。如果你将聚类算法中的距离函数从余弦相似度更改为聚类成员的概率,那么这仅仅需要几行代码的编辑,你就可以尝试贝叶斯聚类。
决策树提供了一种独特的多样性采样类型。你可以查看不同叶子中的预测数量在训练数据和评估数据之间的差异。假设你的决策树有 10 个叶子,当预测你的验证数据时,所有 10 个叶子中的项目数量都相等。现在想象一下,当你将模型应用于你的未标记数据时,90%的数据最终落在了一个叶子上。这个叶子显然比迄今为止的训练数据更好地代表了目标域中的数据类型。因此,你应该从包含 90%数据的叶子中抽取更多项目,知道这些数据对你将部署模型的地方更重要。
4.6.4 使用不同类型的模型进行现实世界多样性采样
提高你的神经网络模型多样性的策略可以应用于其他类型的机器学习模型。你想要确保你正在为每个人口统计优化相同数量的标签,并为每个人口统计的相等精度进行优化。
4.7 多样性采样速查表
图 4.8 是本章中你实施的四种多样性采样方法的速查表。如果你对这些策略有信心,请将此速查表放在手边,以便快速查阅。

图 4.8 本章涵盖的多样性采样类型的速查表:基于模型的异常值采样、基于聚类的采样、代表性采样和现实世界多样性采样。这四种策略确保了数据中的多样性和代表性——分别对应于模型当前状态下未知的项目;统计上代表整个数据分布的项目;最大程度代表你将部署模型的地方的项目;以及最代表现实世界人口统计的项目。
4.8 进一步阅读
你将不得不超出机器学习文献的范围,去寻找与多样性采样相关的许多最重要的论文。如果你专注于收集正确的数据,那么从 2000 年代初开始的文档语言和存档文献是最好的起点。如果你专注于数据中的分层抽样,那么有一百年的社会科学文献与教育、经济学等各个领域相关。本节将进一步阅读限制在机器学习文献中,所以请记住,最好的论文是建立在其他领域的进步之上的。
4.8.1 基于模型的异常值进一步阅读
基于模型的异常值算法是我个人开发的,尚未在本书以外的出版物中发表,除了在非正式的演示和课程中。关于确定异常值的基于神经的方法的文献正在增长,但往往关注的是统计异常值而不是低激活。
调查神经网络模型以确定其知识(或缺乏知识)的实践有时被称为探查。虽然还没有关于探查以发现主动学习中的异常值的论文,但无疑在更广泛模型探查文献中存在一些可以为此目的改编的良好技术。
4.8.2 基于聚类的采样进一步阅读
对于基于聚类的采样,最佳起点是 Hieu T. Ngyuen 和 Arnold Smeulders 的《使用预聚类进行主动学习》(mng.bz/ao6Y)。对于基于聚类的采样最前沿的研究,寻找近期被这些作者引用且自身引用率很高的论文。
注意,Ngyuen 和 Smeulders 使用了一个结合聚类与不确定性采样的主动学习度量。正如本章前面所提到的,这种组合是主动学习中使用聚类的最常见方式。本文本中这些主题是分别教授的,这样你可以在学习如何结合它们之前单独理解它们。在深入研究之前,你可能想阅读第五章,其中你将聚类与不确定性采样结合起来。
最早关注主动学习聚类问题的论文来自俄罗斯的科学家。我所知道的这些论文的第一版英文翻译是 Novosibirk Zagoruiko 的《分类与识别》(mng.bz/goXn)。如果你能阅读俄语,你甚至可以找到 50 多年前就开始思考这个问题的科学家的更早论文!
4.8.3 代表性采样进一步阅读
代表性采样的原则首先在 Andrew Kachites McCallum 和 Kamal Nigam 的《使用 EM 和池式主动学习进行文本分类》中进行了探索(mng.bz/e54Z)。对于代表性采样的最前沿研究,寻找近期被这些作者引用且自身引用率很高的论文。
4.8.4 为现实世界多样性采样的进一步阅读
这里有两篇关于现实世界多样性的机器学习的好论文,一篇在计算机视觉领域,一篇在自然语言处理领域。两者都发现,对于来自更富裕背景的人来说,流行的模型更准确,训练数据偏向于更富裕的人看到的对象和富裕/多数人群使用的语言:
-
Terrance DeVries、Ishan Misra、Changhan Wang 和 Laurens van der Maaten 的《是否对象识别对每个人都是有效的?》(
mng.bz/pVG0)。 -
David Jurgens、Yulia Tsvetkov 和 Dan Jurafsky 的《为社会公平的语言识别引入方言变异性》(
mng.bz/OEyO)。
对于语言技术文献中偏差的批判性回顾,包括该术语使用的不一致性,我推荐苏琳·布洛杰特、索隆·巴罗卡斯、哈尔·道姆三世和汉娜·沃拉奇的论文“语言(技术)是力量:NLP 中‘偏差’的批判性调查”(mng.bz/Yq0Q)。
摘要
-
本章介绍了四种常见的多样性抽样方法:基于模型的异常值抽样、基于聚类的抽样、代表性抽样和针对现实世界多样性的抽样。这些技术可以帮助你了解模型中的“未知未知”类型。
-
基于模型的异常值抽样允许你抽取当前模型状态下未知的项目,帮助你扩展模型的知识,填补当前存在的知识空白。
-
基于聚类的抽样允许你抽取那些在统计上能代表你数据整体分布的样本,帮助你扩展模型的知识,以捕捉数据中的所有有意义的趋势,包括那些随机抽样可能遗漏的较罕见趋势。
-
代表性抽样可以用来抽取那些最能代表你将要部署模型的地方的样本,帮助你将模型适应到与当前训练数据不同的领域,这在现实世界的机器学习中是一个常见问题。
-
为了支持现实世界的多样性,你需要部署所有从不确定性抽样和多样性抽样到的不确定性抽样技术,以使你的应用在多样化的用户群体中更加准确,因此更加公平。
-
微分和宏分等准确度指标可以应用于现实世界的群体,作为衡量模型潜在偏差的一种方式。
-
解释用于多样性抽样的神经网络模型的层,让你能够尽可能多地获取信息以进行主动学习,为你计算模型异常值提供更多选项,并为高级迁移学习技术提供构建块。
-
决定在实施多样性抽样时应该由人类审查多少项目的方法与不确定性抽样不同,因为在某些情况下,它们可以在主动学习的每个迭代中自适应调整。自适应抽样方法允许你使人类在循环中的机器学习反馈循环更加高效,因为你不必等待模型重新训练。
-
使用任何监督机器学习算法,包括神经网络模型、贝叶斯模型、SVM 和决策树,都可以实现多样性抽样。你可以使用你目前正在使用的任何类型的机器学习算法来实现主动学习;你不需要切换到本书示例中重点关注的神经网络模型。你甚至可能决定尝试一些这些额外的主动学习算法,以利用它们的独特特性。
(1.) 在 PyTorch 中获取隐藏层的一种替代方法是 hook() 方法。请参阅mng.bz/XdzM上的文档。
5 高级主动学习
本章涵盖
-
结合不确定性采样和多样性采样技术
-
使用主动迁移学习来采样最不确定和最具代表性的项目
-
在主动学习周期内实现自适应迁移学习
在第三章和第四章中,你学习了如何识别模型的不确定性(模型知道它不知道的内容)以及模型缺失的内容(模型不知道它不知道的内容)。在本章中,你将学习如何将这些技术结合成一个全面的主动学习策略。你还将学习如何使用迁移学习来调整你的模型,以预测哪些项目需要采样。
5.1 结合不确定性采样和多样性采样
本节探讨了将你迄今为止所学的所有主动学习技术结合起来的方法,以便你可以有效地将它们应用于特定的用例。你还将学习一种新的主动学习策略:预期误差减少,它结合了不确定性采样和多样性采样的原则。回顾第一章,理想的主动学习策略试图采样接近决策边界但彼此距离较远的项目,如图 5.1 所示。

图 5.1 结合不确定性采样和多样性采样的一种可能结果。当这些策略结合时,会选择接近决策边界不同部分的项目。因此,我们正在优化找到可能改变决策边界的项目的概率,当它们被添加到训练数据中时。
你已经学会了识别接近决策边界(不确定性采样)和彼此之间距离较远的项目(基于聚类的采样和自适应代表性采样)。本章将向你展示如何采样既接近决策边界又具有多样性的项目,如图 5.1 所示。
5.1.1 基于聚类的最小置信度采样
在工业界,不确定性采样和多样性采样最常见的结合方式是从一种方法中抽取大量样本,然后使用另一种方法进一步过滤这些样本。尽管这种技术无处不在,但它没有统一的名称,这可能是由于许多公司出于必要而独立发明了它。
如果你使用最不确定的 50%项目进行最小置信度采样,然后应用基于聚类的采样来采样这些项目的 10%,你最终可以得到大约 5%的数据样本,类似于图 5.1 中的那些:不确定性和多样性的近似最优组合。图 5.2 以图形方式表示了这一结果。首先,你采样最不确定的 50%项目;然后应用聚类确保所选项目中的多样性,采样每个聚类的质心。

图 5.2 结合最小置信度和基于聚类的采样的示例。首先,不确定性采样找到决策边界附近的项;然后聚类确保该选择中的多样性。在此图中,每个聚类的质心被采样。或者,你也可以选择随机选择异常值成员。
使用你已经学到的代码,你可以看到结合最小置信度采样和聚类是我们在同一代码仓库中使用的advanced_active_learning.py的一个简单扩展(github.com/rmunro/pytorch_active_learning),如下所示。
列表 5.1 结合最小置信度采样和聚类
def get_clustered_uncertainty_samples(*self*, model, unlabeled_data, method,
➥ feature_method, perc_uncertain = 0.1, num_clusters=20, max_epochs=10,
➥ limit=10000):
if limit > 0:
shuffle(unlabeled_data)
unlabeled_data = unlabeled_data[:limit]
uncertain_count = math.ceil(len(unlabeled_data) * perc_uncertain)
uncertain_samples = *self*, uncertainty_sampling.get_samples(model,
➥ unlabeled_data,
➥ method, feature_method, uncertain_count, limit=limit) ❶
samples = *self*, diversity_sampling.get_cluster_samples(uncertain_samples,
➥ num_clusters=num_clusters) ❷
for item in samples:
item[3] = method.__name__+"_"+item[3] # record the sampling method
return samples
❶ 获取大量最不确定的样本。
❷ 在这些不确定的样本中,使用聚类确保样本的多样性。
只需要两行新代码就可以结合这两种方法:一行用于获取最不确定的项,另一行用于聚类它们。如果你对灾难响应文本分类任务感兴趣,尝试使用这个新命令:
> python active_learning.py --clustered_uncertainty=10 --verbose
你会立即看到数据往往落在可能或可能不与灾难相关的文本的分割附近,并且这些项是一个多样化的选择。你有许多选项可以使用不确定性采样来找到决策边界附近的项,然后应用基于聚类的采样以确保这些项中的多样性。你可以尝试不同的不确定性采样类型,不同的不确定性截止阈值,以及不同的聚类参数。在许多情况下,这种聚类和不确定性采样的组合将是深入挖掘主动学习中最有价值项的最快方式,应该是最先尝试的策略之一。
结合策略的简单方法很少出现在学术论文中;学术界更喜欢将方法结合成一个单一算法的论文,而不是将多个简单算法链在一起。这很有道理,因为结合方法是容易的,正如你已经看到的;没有必要为可以在几行代码中实现的事情写一篇学术论文。但是作为一个构建现实世界主动学习系统的开发者,你应该在尝试更实验性的算法之前,始终实现简单的解决方案。
尝试简单方法的第一种原因是,你可能会需要长时间在你的应用程序中支持它们。如果你不需要发明新技术就能达到 99%的效果,那么维护你的代码将会更容易。以下侧边栏提供了一个很好的例子,说明了早期决策的重要性。
你的早期数据决策持续重要
凯里安·斯奈德的专家轶事
在机器学习项目的早期所做的决策可能会影响你未来多年所构建的产品。这一点对于数据决策尤其如此:你的特征编码策略、标签本体和源数据将产生长期影响。
在我研究生毕业后第一次工作的时候,我负责构建基础设施,使得微软软件能够在世界各地的数十种语言中运行。这项工作包括做出基本决策,比如决定一个语言的字符的字母顺序——这在当时许多语言中是不存在的。当 2004 年的海啸摧毁了印度洋周边的国家时,对于斯里兰卡的僧伽罗语使用者来说,这是一个紧迫的问题:由于僧伽罗语还没有标准化的编码,因此没有简单的方法来支持搜索失踪人员。我们为僧伽罗语支持的时间表从几个月缩短到几天,以便我们能够帮助失踪人员服务,与本土语言使用者合作,尽可能快地构建解决方案。
我们当时决定的编码被 Unicode 采纳为僧伽罗语的官方编码,现在永久地编码了这种语言。你并不总是会在如此关键的时间线上工作,但你应该始终从一开始就考虑你产品决策的长期影响。
基兰·斯奈德(Kieran Snyder)是 Textio 的 CEO 和联合创始人,Textio 是一个广泛使用的增强写作平台。基兰之前在微软和亚马逊担任过产品领导角色,并在宾夕法尼亚大学获得了语言学博士学位。
不要假设复杂的解决方案一定是最好的;你可能会发现,对于你的数据来说,只需要简单地将最小置信度和聚类结合起来就足够了。像往常一样,你可以测试不同的方法,看看哪种方法在随机采样的基线准确性上产生了最大的变化。
5.1.2 基于模型的异常值的不确定性采样
当你将不确定性采样与基于模型的异常值相结合时,你正在最大化你模型当前的混淆。你正在寻找接近决策边界的项目,并确保它们的特征对于当前模型来说是相对未知的。图 5.3 展示了这种方法可能生成的样本类型。

图 5.3 这个将不确定性采样与基于模型的异常值相结合的例子选择了接近决策边界但与当前训练数据项不同的项目,因此也与模型不同。
列表 5.2 将不确定性采样与基于模型的异常值相结合
def get_uncertain_model_outlier_samples(*self*, model, outlier_model,
➥ unlabeled_data, training_data, validation_data, method, feature_method,
➥ perc_uncertain = 0.1, number=10, limit=10000):
if limit > 0:
shuffle(unlabeled_data)
unlabeled_data = unlabeled_data[:limit]
uncertain_count = math.ceil(len(unlabeled_data) * perc_uncertain)
uncertain_samples = *self*, uncertainty_sampling.get_samples(model,
➥ unlabeled_data, method, feature_method, uncertain_count, limit=limit) ❶
samples = *self*, diversity_sampling.get_model_outliers(outlier_model,
➥ uncertain_samples, validation_data,feature_method,
➥ number=number, limit=limit) ❷
for item in samples:
item[3] = method.__name__+"_"+item[3]
return samples
❶ 获取最不确定的项目。
❷ 对这些项目应用基于模型的异常值采样。
正如列表 5.1 中的示例一样,这里只需要两行代码就可以将所有内容整合在一起。虽然将不确定性采样与基于模型的异常值结合是针对最有可能增加你的模型知识和整体准确性的项目最优的,但它也可能采样相似的项目。你可以使用以下命令尝试此技术:
> python active_learning.py --*uncertain_model_outliers*=100 --verbose
5.1.3 基于模型的异常值和聚类的不确定性采样
由于 5.1.2 节中的方法可能会对彼此接近的项进行过采样,你可能希望首先实施此策略,然后应用聚类以确保多样性。只需一行代码即可将聚类添加到先前方法末尾,因此可以轻松实现。或者,如果你有快速的主动学习迭代,这种方法在结合不确定性采样和基于模型的异常值时可以确保更多的多样性;你可以在每个迭代中采样少量项目。
5.1.4 代表性采样和基于簇的采样
你在第四章中学到的代表性采样技术的缺点是它将训练数据和目标域视为单个簇。实际上,你的数据通常会在特征空间中呈现多峰分布,而单个簇无法最优地捕捉。
为了捕捉这种复杂性,你可以将代表性采样和基于簇的采样结合到一个稍微复杂一些的架构中。你可以独立地对你的训练数据和未标记数据进行聚类,识别出最能代表你的未标记数据的簇,并从这些簇中进行过采样。这种方法比单独的代表性采样提供了更多样化的项目(图 5.4)。

图 5.4 结合代表性采样和基于簇的采样的一个示例(底部)。这种方法采样了相对于你的当前训练数据最像你的应用域的项目,并且彼此不同。相比之下,第四章中更简单的代表性采样方法将每个分布视为单个分布。
正如你在图 5.4 中可以看到的,你的当前训练数据和目标域可能不是特征空间内的均匀分布。首先对数据进行聚类将帮助你更准确地建模特征空间,并采样更多样化的未标记项目。首先,从应用域创建训练数据和未标记数据的簇。
列表 5.3 结合代表性采样和聚类
def get_representative_cluster_samples(self, training_data, unlabeled_data,
➥ number=10, num_clusters=20, max_epochs=10, limit=10000):
"""Gets the most representative unlabeled items, compared to training data,
➥ across multiple clusters
Keyword arguments:
training_data -- data with a label, that the current model is trained on
unlabeled_data -- data that does not yet have a label
number -- number of items to sample
limit -- sample from only this many items for faster sampling (-1 =
➥ no limit)
num_clusters -- the number of clusters to create
max_epochs -- maximum number of epochs to create clusters
"""
if limit > 0:
shuffle(training_data)
training_data = training_data[:limit]
shuffle(unlabeled_data)
unlabeled_data = unlabeled_data[:limit]
# Create clusters for training data
training_clusters = CosineClusters(num_clusters)
training_clusters.add_random_training_items(training_data)
for i in range(0, max_epochs): ❶
print("Epoch "+str(i))
added = training_clusters.add_items_to_best_cluster(training_data)
if added == 0:
break
# Create clusters for unlabeled data
unlabeled_clusters = CosineClusters(num_clusters)
unlabeled_clusters.add_random_training_items(training_data)
for i in range(0, max_epochs): ❷
print("Epoch "+str(i))
added = unlabeled_clusters.add_items_to_best_cluster(unlabeled_data)
if added == 0:
Break
❶ 在现有训练数据中创建簇。
❷ 在未标记数据中创建簇。
然后迭代每个未标记数据的簇,并找到每个簇中相对于训练数据簇的质心最近的项。
列表 5.4 结合代表性采样和聚类,继续
most_representative_items = []
# for each cluster of unlabeled data
for cluster in unlabeled_clusters.clusters:
most_representative = None
representativeness = float("-inf")
# find the item in that cluster most like the unlabeled data
item_keys = list(cluster.members.keys())
for key in item_keys:
item = cluster.members[key]
_, unlabeled_score =
➥ unlabeled_clusters.get_best_cluster(item) ❶
_, training_score = training_clusters.get_best_cluster(item) ❷
cluster_representativeness = unlabeled_score - training_score ❸
if cluster_representativeness > representativeness:
representativeness = cluster_representativeness
most_representative = item
most_representative[3] = "representative_clusters"
most_representative[4] = representativeness
most_representative_items.append(most_representative)
most_representative_items.sort(reverse=True, key=lambda x: x[4])
return most_representative_items[:number:]
❶ 在未标记数据簇中找到最佳拟合簇。
❷ 在训练数据簇中找到最佳拟合簇。
❸ 记录两个之间的差异作为我们的代表性分数。
在设计上,这个代码几乎与你第四章中实现的代表性采样方法相同,但你要求聚类算法为每个分布创建多个簇,而不是只为训练数据和未标记数据创建一个簇。你可以用这个命令尝试这个技术:
> python active_learning.py --*representative_clusters*=100 --verbose
5.1.5 从最高熵簇中采样
如果你某个簇中有高熵,那么关于该簇中项目的正确标签存在很多混淆。换句话说,这些簇在所有项目中的平均不确定性最高。因此,这些项目最有可能改变标签,并且有最大的标签变化空间。
图 5.5 中的例子在某些方面与为了多样性而进行聚类的相反,因为它故意关注问题空间的一部分。但有时,这种关注正是你所需要的。

图 5.5 这个结合基于簇的采样与熵(底部)的例子采样了簇内最混乱的项目。你可能认为这个簇是最接近决策边界的。在这个例子中,簇内随机采样项目,但你可以通过采样质心、异常值和/或对簇内具有最高熵的项目进行过采样来实验。相比之下,简单的聚类(顶部)从每个簇中采样项目。
注意,这种方法在你有准确标签的数据并且有信心任务可以用机器学习解决时效果最好。如果你有大量固有模糊性的数据,这种方法往往会集中在那些区域。为了解决这个问题,看看你现有的训练数据中有多少落在高熵簇中。如果簇已经在你的训练数据中得到了很好的代表,那么你有很好的证据表明它是特征空间中固有的模糊部分,并且额外的标签不会有所帮助。以下列表显示了选择具有最高平均熵簇的代码。
列表 5.5 从最高熵簇中采样
def get_high_uncertainty_cluster(*self*, model, unlabeled_data, method,
➥ feature_method, number=10, num_clusters=20, max_epochs=10, limit=10000):
*"""Gets items from the cluster with the highest average uncertainty*
*Keyword arguments:*
*model -- machine learning model to get predictions from to determine*
➥ *uncertainty*
*unlabeled_data -- data that does not yet have a label*
*method -- method for uncertainty sampling (eg: least_confidence())*
*feature_method -- the method for extracting features from your data*
*number -- number of items to sample*
*num_clusters -- the number of clusters to create*
*max_epochs -- maximum number of epochs to create clusters*
*limit -- sample from only this many items for faster sampling*
➥ *(-1 = no limit)*
*"""*
if limit > 0:
shuffle(unlabeled_data)
unlabeled_data = unlabeled_data[:limit]
unlabeled_clusters = CosineClusters(num_clusters)
unlabeled_clusters.add_random_training_items(unlabeled_data)
for i in range(0, max_epochs): ❶
print(*"Epoch * "str(i))
added = unlabeled_clusters.add_items_to_best_cluster(unlabeled_data)
if added == 0:
break
# get scores
most_uncertain_cluster = None
highest_average_uncertainty = 0.0
# for each cluster of unlabeled data
for cluster in unlabeled_clusters.clusters:
total_uncertainty = 0.0
count = 0
item_keys = list(cluster.members.keys())
for key in item_keys:
item = cluster.members[key]
text = item[1] # the text for the message
feature_vector = feature_method(text)
hidden, logits, log_probs = model(feature_vector,
➥ return_all_layers=True)
prob_dist = torch.exp(log_probs) # the probability distribution of
➥ our prediction
score = method(prob_dist.data[0]) # get the specific type of
➥ uncertainty sampling
total_uncertainty += score
count += 1
average_uncertainty = total_uncertainty / count ❷
if average_uncertainty > highest_average_uncertainty:
highest_average_uncertainty = average_uncertainty
most_uncertain_cluster = cluster
samples = most_uncertain_cluster.get_random_members(number)
return samples
❶ 创建簇。
❷ 计算每个簇中项目的平均不确定性(使用熵)。
在这个代码示例中,我们正在计算一个簇中所有项目的平均熵。你可以尝试基于你的采样策略不同的聚合统计。例如,如果你知道你只采样了前 100 个项目,那么你可以计算每个簇中 100 个最不确定的项目之间的平均熵,而不是计算簇中每个项目之间的平均熵。你可以用这个命令尝试这个技术:
> python active_learning.py --*high_uncertainty_cluste*=100 --verbose
5.1.6 其他主动学习策略的组合
在这本书中涵盖主动学习技术的所有可能组合太多了,但到这个阶段,你应该已经很好地了解了如何将它们组合起来。以下是一些起点:
-
结合不确定性采样与代表性采样—您可以采样最能够代表您的目标领域且不确定的项目。这种方法在主动学习的后期迭代中特别有用。如果您在早期迭代中使用了不确定性采样,您的目标领域将包含与决策边界不成比例地远的项,可能会被错误地选为代表性。
-
结合基于模型的异常值与代表性采样—这是领域自适应的终极方法,针对的是今天您的模型未知但也在您的目标领域中相对常见的项目。
-
将聚类与自身结合以创建层次聚类—如果您有一些大型簇或希望在簇内进行多样性采样,您可以从一个簇中提取项目,并使用它们来创建一组新的簇。
-
结合从最高熵簇中进行采样与置信度边界采样(或某些其他不确定性指标)—你可以找到具有最高熵的簇,然后从中采样所有最接近决策边界的项目。
-
结合集成方法或 dropout 与个体策略—您可能正在构建多个模型,并决定贝叶斯模型更适合确定不确定性,而神经网络模型更适合确定基于模型的异常值。您可以使用一个模型进行采样,并使用另一个模型进一步细化。如果您基于隐藏层进行聚类,您可以从不确定性采样中采用 dropout 方法,并在创建簇时随机忽略一些神经元。这种方法将防止簇过度拟合到您网络的内部表示。
5.1.7 结合主动学习分数
将一个采样策略的输出管道传输到另一个策略的替代方法是,从不同的采样策略中提取分数,并找到最高平均分数,这对于除了聚类以外的所有方法都有数学意义。例如,您可以平均每个项目的置信度边界分数、基于模型的异常值分数和代表性学习分数,然后根据这个单一的汇总分数对所有项目进行排名。
虽然所有分数都应该在[0–1]范围内,但请注意,其中一些可能集中在很小的范围内,因此对平均值的贡献可能不大。如果您的数据中存在这种情况,您可以尝试将所有分数转换为百分位数(分位数),这实际上将所有采样分数转换为分层排名顺序。您可以使用您选择的数学库中的内置函数将任何数字列表转换为百分位数。在各种 Python 库中寻找名为rank()、percentile()或percentileofscore()的函数。与您用于采样的其他方法相比,将分数转换为百分位数相对较快,因此无需担心尝试找到最优化函数;选择您已经使用的库中的一个函数即可。
你也可以通过方法的并集来采样,而不是通过过滤(这是通过交集的组合)。这种方法可以用于任何方法,并且在你结合多个不确定性采样分数时可能最有意义。你可以通过最不自信、置信度边际、置信度比率或熵来采样最不确定的 10%的项目,从而产生一个通用的“不确定”样本集,然后直接使用这些样本或通过结合其他方法来细化采样。你可以以许多方式组合你所学到的构建块,我鼓励你尝试它们。
5.1.8 预期误差减少采样
预期误差减少是文献中旨在将不确定性采样和多样性采样结合成一个单一指标的一小部分积极学习策略之一。这个算法被包括在这里是为了完整性,但有一个前提,就是我还没有看到它在现实世界中的实现。预期误差减少采样的核心指标是,如果给一个未标记的项目分配一个标签,模型中的误差将减少多少。¹你可以给每个未标记的项目分配可能的标签,用这些标签重新训练模型,然后观察模型准确率的变化。你有两种常见的方式来计算模型准确率的变化:
-
总体准确率——如果这个项目有一个标签,预测正确的项目数量会有什么变化?
-
总体熵——如果这个项目有一个标签,总体熵会有什么变化?这种方法使用你在不确定性采样章节 3.2.4 和 3.2.5 中学到的熵的定义。与第一种方法相比,它对预测的置信度敏感,而第一种方法只对预测的标签敏感。
分数是按照每个标签的频率加权计算的。你采样那些最有可能提高模型整体性能的项目。然而,这个算法存在一些实际问题:
-
对于大多数算法来说,为每个未标记的项目和每个标签重新训练模型一次是非常昂贵的。
-
重新训练模型时可能会有很大的变化,以至于一个额外标签的变化可能无法与噪声区分开来。
-
由于标签的熵很高,对于可能性越来越小的标签,算法可能会过度采样远离决策边界的项目。
因此,在使用神经网络模型时,这种方法存在实际限制。这个算法的原始作者使用了增量朴素贝叶斯,可以通过更新新项的特征计数来适应新的训练项,并且是确定性的。鉴于这一事实,预期误差减少对作者们的特定算法是有效的。可以通过使用每个标签的预测概率而不是标签频率(先验概率)来解决远离决策边界的过度采样项的问题,但你可能需要从你的模型中获得准确的置信度预测,正如你在第三章中学到的,你可能没有。
如果你尝试实现预期误差减少,你可以尝试不同的准确度指标,以及除了熵之外的其它不确定性采样算法。因为这种方法使用熵,它来自信息论,你可能会在关于这个算法变体的文献中看到它被称为信息增益。仔细阅读这些论文,因为增益可能意味着更低的信息。尽管这个术语在数学上是正确的,但当预测信息较少时,说你的模型知道得更多可能会感觉反直觉。
如本节开头所述,据我所知,没有人(至少)在是否预期误差减少比通过采样策略的交集和/或并集简单组合方法更好的问题上发表过文章。你可以尝试实现预期误差减少和相关算法,看看它们是否有助于你的系统。你可能只需要通过用新项重新训练你模型的最后一层来实现它们,这将加快这个过程。
如果你想要采样具有与预期误差减少类似目标的项,你可以聚类你的数据,然后查看预测中熵最高的聚类,就像本章前面 5.4 节中的示例。然而,预期误差减少有一个问题,那就是它可能只找到特征空间中某一部分的项,就像在孤立中使用的不确定性采样算法。如果你将 5.4 节中的示例扩展到从N个最高熵聚类中采样项,而不仅仅是单个最高熵聚类,你将在几行代码中解决预期误差减少的局限性。
而不是尝试手工制作一个将不确定性采样和多样性采样结合成一个算法的算法,然而,你可以让机器学习为你决定这种组合。原始的预期误差减少论文的标题为“通过采样估计误差减少实现最优主动学习”,这篇论文已有 20 年历史,因此这很可能是作者们所考虑的方向。本章的其余部分将构建用于主动学习中的采样过程的机器学习模型。
5.2 不确定性采样的主动迁移学习
最先进的主动学习方法使用了你在本书中学到的所有内容:第三章中学到的解释混淆的采样策略,第四章中学到的查询模型不同层的方法,以及本章第一部分中学到的技术组合。
使用所有这些技术,你可以构建一个新的模型,其任务是预测最大不确定性的位置。首先,让我们回顾一下第一章中关于迁移学习的描述,如图 5.6 所示。

图 5.6 我们有一个预测标签为“A”、“B”、“C”或“D”的模型,以及一个带有标签“W”、“X”、“Y”和“Z”的独立数据集。当我们只重新训练模型的最后一层时,模型能够使用比从头开始训练模型时更少的人工标记项目来预测标签“W”、“X”、“Y”和“Z”。
在图 5.6 的示例中,你可以看到模型如何在一个标签集上训练,然后通过保持相同的架构和冻结模型的一部分(在这种情况下仅重新训练最后一层)在另一个标签集上重新训练。还有许多其他方法可以使用迁移学习和上下文模型进行人机交互的机器学习。本章中的示例是图 5.6 中所示迁移学习类型的变体。
5.2.1 让你的模型预测自己的错误
迁移学习产生的新标签可以是任何你想要的类别,包括关于任务本身的信息。这一事实是主动迁移学习的核心洞察:你可以使用迁移学习来询问你的模型它在哪些方面感到困惑,通过让它预测自己的错误。图 5.7 概述了这一过程。

图 5.7 模型预测验证项目,并根据它们是否被正确分类将它们分类为“正确”或“不正确”。然后重新训练模型的最后一层来预测项目是“正确”还是“不正确”,有效地将这两个桶转换为新的标签。
如图 5.7 所示,这个过程有几个步骤:
-
将模型应用于验证数据集,并捕获哪些验证项目被正确和错误地分类。这些数据是你的新训练数据。现在你的验证项目有了“正确”或“不正确”的额外标签。
-
为模型创建一个新的输出层,并使用你的新训练数据训练这个新层,预测你的新“正确”和“不正确”标签。
-
将未标记的数据项通过新模型运行,并采样预测为“不正确”且置信度最高的项目。
现在你已经获得了一组项目样本,这些项目被你的模型预测为最有可能不正确,因此将受益于人工标记。
5.2.2 实施主动迁移学习
最简单的主动迁移学习方法可以使用您已经学到的代码构建块来构建。要实现图 5.7 中的架构,您可以创建一个新的层作为其自己的模型,并使用最终的隐藏层作为该层的特征。
这里是 5.2.1 节中的三个步骤,在 PyTorch 中实现。首先,将模型应用于验证数据集,并捕获哪些验证项被正确和错误地分类。这些数据是您的新训练数据。您的验证项有一个额外的标签“正确”或“错误”,这在(名称冗长但透明地命名的)get_deep_active_transfer_learning_uncertainty_samples()方法中。
列表 5.6 主动迁移学习
correct_predictions = [] # validation items predicted correctly
incorrect_predictions = [] # validation items predicted incorrectly
item_hidden_layers = {} # hidden layer of each item, by id
for item in validation_data:
id = item[0]
text = item[1]
label = item[2]
feature_vector = feature_method(text)
hidden, logits, log_probs = model(feature_vector, return_all_layers=True)
item_hidden_layers[id] = hidden ❶
prob_dist = torch.exp(log_probs)
# get confidence that item is disaster-related
prob_related = math.exp(log_probs.data.tolist()[0][1])
if item[3] == "seen":
correct_predictions.append(item) ❷
elif(label=="1" and prob_related > 0.5) or (label=="0" and prob_related
➥ <= 0.5):
correct_predictions.append(item)
else:
incorrect_predictions.append(item) ❸
❶ 将此项目的隐藏层存储起来,稍后用于我们的新模型。
❷ 项被正确预测,因此在新模型中它获得“正确”标签。
❸ 项被错误预测,因此在新模型中它获得“错误”标签。
第二步,为在您的新的训练数据上训练的模型创建一个新的输出层,预测新的“正确”和“错误”标签。
列表 5.7 创建新的输出层
correct_model = SimpleUncertaintyPredictor(128)
loss_function = nn.NLLLoss()
optimizer = optim.SGD(correct_model.parameters(), lr=0.01)
for epoch in range(epochs): ❶
if self.verbose:
print("Epoch: "+str(epoch))
current = 0
# make a subset of data to use in this epoch
# with an equal number of items from each label
shuffle(correct_predictions) #randomize the order of the validation data
shuffle(incorrect_predictions) #randomize the order of the validation data
correct_ids = {}
for item in correct_predictions:
correct_ids[item[0]] = True
epoch_data = correct_predictions[:select_per_epoch]
epoch_data += incorrect_predictions[:select_per_epoch]
shuffle(epoch_data)
# train the final layers model
for item in epoch_data:
id = item[0]
label = 0
if id in correct_ids:
label = 1
correct_model.zero_grad()
feature_vec = item_hidden_layers[id] ❷
target = torch.LongTensor([label])
log_probs = correct_model(feature_vec)
# compute loss function, do backward pass, and update the gradient
loss = loss_function(log_probs, target)
loss.backward(retain_graph=True)
optimizer.step()
❶ 训练代码与本书中的其他示例类似。
❷ 在这里,我们使用原始模型的隐藏层作为我们的特征向量。
最后,将您的未标记数据项通过新模型运行,并采样预测置信度最高的错误项。
列表 5.8 预测“错误”标签
deep_active_transfer_preds = []
with torch.no_grad(): ❶
v=0
for item in unlabeled_data:
text = item[1]
# get prediction from main model
feature_vector = feature_method(text) ❷
hidden, logits, log_probs = model(feature_vector,
➥ return_all_layers=True)
# use hidden layer from main model as input to model predicting
➥ correct/errors
logits, log_probs = correct_model(hidden, return_all_layers=True) ❸
# get confidence that item is correct
prob_correct = 1 - math.exp(log_probs.data.tolist()[0][1])
if(label == "0"):
prob_correct = 1 - prob_correct
item[3] = "predicted_error"
item[4] = 1 - prob_correct
deep_active_transfer_preds.append(item)
deep_active_transfer_preds.sort(reverse=True, key=lambda x: x[4])
return deep_active_transfer_preds[:number:]
❶ 评估代码与本书中的其他示例类似。
❷ 首先,我们需要从我们的原始模型中获取隐藏层。
❸ 然后,我们将那个隐藏层作为我们新模型的特征向量。
如果您对灾害响应文本分类任务感兴趣,请尝试使用这种新的主动迁移学习方法:
> python active_learning.py --*transfer_learned_uncertainty* 10 --verbose
如您在这段代码中所见,我们并没有改变用于预测消息是否与灾害响应相关的原始模型。我们不是替换该模型的最后一层,而是在现有模型之上有效地添加了一个新的输出层。作为替代,您也可以用相同的结果替换最后一层。
本书使用这种架构是因为它是非破坏性的。旧模型仍然存在。这种架构防止了当您仍然想使用原始模型(无论是生产中还是用于其他采样策略)时出现不希望的错误。您还避免了需要额外的内存来并行拥有两个完整模型的副本。构建一个新层或复制并修改模型是等效的,因此请选择适合您代码库的方法。所有这些代码都位于本章前面讨论的方法相同的文件中:advanced_active_learning.py。
5.2.3 带有更多层的主动迁移学习
您不需要将主动迁移学习限制在单个新层或仅基于最后一个隐藏层。如图 5.8 所示,您可以构建多个新层,并且它们可以直接连接到任何隐藏层。

图 5.8 更复杂的活跃迁移学习架构,使用活跃迁移学习来创建预测。顶部示例在新的输出层中有一个单神经元。底部示例是一个更复杂的架构,有一个新的隐藏层与多个现有隐藏层相连。
将扩展到图 5.8 中更复杂的架构只需要几行额外的代码。首先,用于预测“正确”或“错误”的新模型需要一个隐藏层。然后,这个新模型将从多个隐藏层中提取其特征。你可以将不同层的向量附加在一起,这个展平的向量成为新模型的特征。
如果你熟悉自然语言处理(NLP)中的上下文模型或计算机视觉中的卷积模型,这个过程是熟悉的;你正在从你的网络的不同部分提取神经元的激活并将其展平成一个长的特征向量。这个结果向量通常被称为表示,因为你在使用一个模型中的神经元来表示另一个模型中的特征。我们将在第九章中回到表示,在那里它们对于一些半自动化的创建训练数据的方法也很重要。
然而,你可以构建一个更复杂的模型,但这并不意味着你应该构建它。如果你没有很多验证数据,你更有可能对更复杂的模型进行过拟合。如果你只训练一个新输出神经元,那么避免训练错误会容易得多。根据你通常为该数据量构建的二进制预测任务,使用你的直觉来判断你的模型需要有多复杂。
5.2.4 活跃迁移学习的优缺点
活跃迁移学习具有一些很好的特性,使其适用于广泛的问题:
-
你正在重用你的隐藏层,因此你是在直接基于你的模型当前的信息状态构建模型。
-
你不需要太多的标记项来使模型有效,特别是如果你只重新训练最后一层(如果你的验证数据量不大,这很方便)。
-
训练速度快,特别是如果你只重新训练最后一层。
-
它可以与许多架构一起工作。你可能是在文档或图像级别预测标签,预测图像中的对象,或者生成文本序列。对于所有这些用例,你都可以添加一个新的最终层或几层来预测“正确”或“错误”。(有关主动学习用例的更多信息,请参阅第六章。)
-
你不需要对不同神经元的不同激活范围进行归一化,因为你的模型将为你完成这项任务。
第五点特别不错。回想一下,使用基于模型的异常值时,你需要使用验证数据对激活进行量化,因为一些神经元在平均激活上可能任意地更高或更低。能够将信息传递给另一层的神经元,并告诉新层确定每个现有神经元应应用的精确权重,这很好。主动迁移学习也有一些缺点:
-
与其他不确定性采样技术一样,它可能会过分关注特征空间的一部分;因此,它缺乏多样性。
-
你可能会过拟合你的验证数据。如果没有很多验证项目,你的预测不确定性的模型可能无法推广到你的未标记数据。
第一个问题可以在不添加额外人工标签的情况下部分解决,正如你在本章 5.3.2 节中稍后看到的。这个事实是与其他不确定性采样算法相比,这种方法最大的优势之一。
过拟合问题也可以相对容易地诊断,因为它表现为对项目是错误的极高信心。如果你对你的主要模型有一个二进制预测,并且你的错误预测模型有 95%的信心认为一个项目被错误分类,那么你的主要模型最初就应该正确地分类那个项目。
如果你发现你正在过拟合,并且提前停止训练没有帮助,你可以尝试通过获取多个预测,使用第三章 3.4 节中的集成方法来避免过拟合。这些方法包括训练多个模型,在推理时使用 dropout(蒙特卡洛采样),以及从不同的验证项目特征子集中抽取。
5.3 将主动迁移学习应用于代表性采样
我们可以将相同的主动迁移学习原则应用于代表性采样。也就是说,我们可以调整我们的模型来预测一个项目与我们的模型的应用领域相比,是否更相似于当前的训练数据。
这种方法有助于领域自适应,例如你在第四章中学到的代表性采样方法。实际上,代表性采样并没有太大的不同。在第四章以及下文中的示例中,你都在构建一个新的模型来预测一个项目是否是你试图适应的模型数据的代表性。
5.3.1 让你的模型预测它不知道的内容
在原则上,你不需要你的现有模型来预测一个项目是否在你的训练数据中或在你的未标记数据中。你可以构建一个新的模型,该模型将你的训练数据和未标记数据作为二进制预测问题。在实践中,包括对你要构建的机器学习任务重要的特征是有用的。
图 5.9 展示了代表性主动迁移学习的过程和架构,展示了如何重新训练你的模型以预测未标记项是更类似于你的当前训练数据还是更类似于你的模型的应用域。

图 5.9 我们可以构建一个模型来采样与当前训练数据最不相似的项。首先,我们从与训练数据相同分布中获取验证数据,并给它一个“训练”标签。然后,我们从我们的目标域中获取未标记数据,并给它一个“应用”标签。我们训练一个新的输出层来预测“训练”和“应用”标签,使其能够访问模型的全部层。我们将新模型应用于未标记数据(忽略我们在其上训练的未标记项),并采样那些最自信地预测为“应用”的项。
如图 5.9 所示,与不确定性采样的主动迁移学习相比,差异很少。首先,忽略原始模型的预测。验证和未标记数据可以直接给予标签。验证数据来自与训练数据相同的分布,因此被赋予“训练”标签。来自目标域的未标记数据被赋予“应用”标签。然后,模型在这些标签上训练。
其次,新模型应该能够访问更多层。如果你正在适应一个新的领域,你可能有很多在训练数据中尚未存在的特征。在这种情况下,你现有模型包含的唯一信息是这些特征存在于输入层作为特征,但之前模型中的任何其他层都没有贡献。更复杂的架构类型将捕捉到这些信息。
5.3.2 自适应代表性采样的主动迁移学习
就像代表性采样(第四章)可以是自适应的,代表性采样的主动迁移学习也可以是自适应的,这意味着你可以在一个主动学习周期内进行多次迭代,如图 5.10 所示。

图 5.10 由于我们的采样项目将在之后获得人工标签,我们可以假设它们成为训练数据的一部分,而无需知道标签是什么。首先,我们从与训练数据相同的分布中获取验证数据,并给它一个“训练”标签。我们从目标域中获取未标记数据,并给它一个“应用”标签。我们训练一个新的输出层来预测“训练”和“应用”标签,并让它访问模型的全部层。我们将新模型应用于未标记数据(忽略我们在其上训练的未标记项目),并采样那些最自信地预测为“应用”的项目。我们可以假设这些项目将后来获得标签并成为训练数据的一部分。因此,我们可以取这些采样项目,将它们的标签从“应用”改为“训练”,并在新的数据集上重新训练我们的最终层(们)。
图 5.10 中的过程与非自适应版本类似。我们创建新的输出层来分类一个项目是否在现有训练数据中或在目标域中,采样那些最自信地预测为“应用”的项目。为了将这个过程扩展到自适应策略,我们可以假设采样项目将后来获得标签并成为训练数据的一部分。因此,我们可以取那些采样项目,将它们的标签从“应用”改为“训练”,并在新的数据集上重新训练我们的最终层(们)。这个过程可以重复进行,直到没有更多对“应用”域项目的自信预测,或者直到您达到在这个主动学习迭代中想要采样的项目最大数量。
5.3.3 代表性采样中主动迁移学习的优缺点
代表性采样中主动迁移学习的优缺点与第四章中更简单的代表性采样方法相同。与这些方法相比,优点可能更加积极,因为您正在使用更强大的模型,但一些缺点,如过拟合的风险,可能成为更大的潜在错误。
再次总结这些优势和劣势:代表性采样在当你拥有新领域中的所有数据时是有效的,但如果你正在适应尚未采样的未来数据,你的模型可能会陷入过去。这种方法也是本书中所有主动学习策略中最容易受到噪声影响的。如果你有新的数据,比如损坏的文本——来自不属于你的目标领域的语言文本,损坏的图像文件,由不同相机使用产生的伪影等等——这些因素中的任何一个都可能与你当前的训练数据不同,但不是以有趣的方式。最后,如果你在不确定性采样之后迭代使用代表性采样,主动迁移学习可能会产生比好处更多的坏处,因为你的应用领域将有更多远离决策边界的项目,而你的训练数据则没有。出于这些原因,我建议你仅在与其他采样策略结合使用的情况下部署主动迁移学习进行代表性采样,正如你在 5.1 节所学的那样。
5.4 主动迁移学习自适应采样
本书中的主动学习最终算法也是最强大的;它是一种可以在主动学习单次迭代中自适应的不确定性采样。你在第三章学到的所有不确定性采样技术都是非自适应的。在一个主动学习周期内,所有这些技术都存在从问题空间的一个小部分采样项的风险。
自适应采样主动迁移学习(ATLAS)是一个例外,它允许在一个迭代中自适应采样,而不需要使用聚类来确保多样性。ATLAS 在此处引入时有一个前提,即它是本书中在出版时测试最少的一个算法。我在 2019 年底发明了 ATLAS,当时我意识到主动迁移学习具有某些可以利用的特性,使其变得自适应。ATLAS 在我所实验的数据上取得了成功,但它尚未在工业界广泛应用或在学术界经过同行评审。正如你对待任何新方法一样,准备好进行实验,以确保这个算法适合你的数据。
5.4.1 通过预测不确定性使不确定性采样自适应
如你在第三章所学,大多数不确定性采样算法都有相同的问题:它们可以从特征空间的一部分采样,这意味着在主动学习的一次迭代中,所有样本都是相似的。如果你不小心,你最终可能只会从特征空间的一个小部分采样项。
如你在 5.1.1 节所学,你可以通过结合聚类和不确定性采样来解决此问题。这种方法仍然是开始你的主动学习策略时推荐的思考方式;在有了这个基线之后,你可以尝试 ATLAS。你可以利用主动迁移学习在不确定性采样中的两个有趣特性:
-
你预测的是模型是否正确,而不是实际的标签。
-
你通常可以正确预测训练数据项的标签。
这两项加在一起意味着你可以假设你的样本项稍后会正确,即使你目前还不知道标签(见图 5.11)。

图 5.11 因为我们的采样项稍后会被人工标记并成为训练数据的一部分,我们可以假设模型稍后会正确预测这些项,因为模型通常在它们训练的实际项上最准确。首先,验证项由模型预测,并根据它们是否被正确分类分为“正确”或“错误”的类别。模型的最后一层被重新训练以预测项是“正确”还是“错误”,有效地将这两个类别转换为新的标签。我们将新模型应用于未标记的数据,预测每个项将是“正确”还是“错误”。我们可以采样最有可能被标记为“错误”的项。然后我们可以假设这些项稍后会被标记,并成为训练数据的一部分,这将由预测相同数据的模型正确标记。因此,我们可以将这些采样项的标签从“错误”改为“正确”,并在新的数据集上重新训练我们的最终层。
图 5.11 中的过程与非自适应版本类似。我们创建新的输出层来分类一个项是“正确”还是“错误”,采样那些最有可能被预测为“错误”的项。为了将这种架构扩展到自适应策略,我们可以假设那些采样项稍后会被标记,并成为训练数据的一部分,并且它们在获得标签后将被正确预测(无论标签是什么)。因此,我们可以将这些采样项的标签从“错误”改为“正确”,并在新的数据集上重新训练我们的最终层。这个过程可以重复进行,直到我们没有更多关于“错误”域项的信心预测,或者达到我们在这个主动学习迭代中想要采样的最大项数。将 ATLAS 作为主动学习的不确定性采样包装器实现,只需要 10 行代码。
列表 5.9 主动迁移学习用于自适应采样
def get_atlas_samples(self, model, unlabeled_data, validation_data,
➥ feature_method, number=100, limit=10000, number_per_iteration=10,
➥ epochs=10, select_per_epoch=100):
"""Uses transfer learning to predict uncertainty within the model
Keyword arguments:
model -- machine learning model to get predictions from to determine
➥ uncertainty
unlabeled_data -- data that does not yet have a label
validation_data -- data with a label that is not in the training set, to
➥ be used for transfer learning
feature_method -- the method for extracting features from your data
number -- number of items to sample
number_per_iteration -- number of items to sample per iteration
limit -- sample from only this many items for faster sampling (-1 = no
➥ limit)
"""
if(len(unlabeled_data) < number):
raise Exception('More samples requested than the number of unlabeled
➥ items')
atlas_samples = [] # all items sampled by atlas
while(len(atlas_samples) < number):
samples =
➥ self.get_deep_active_transfer_learning_uncertainty_samples(model,
➥ unlabeled_data, validation_data, feature_method,
➥ number_per_iteration, limit, epochs, select_per_epoch)
for item in samples:
atlas_samples.append(item)
unlabeled_data.remove(item)
item = copy.deepcopy(item)
item[3] = "seen" # mark this item as already seen
validation_data.append(item) # append so that it is in the next
➥ iteration
return atlas_samples
关键代码行在每次循环后将样本项的副本添加到验证数据中。如果你对灾难响应文本分类任务感兴趣,尝试使用 ATLAS 的新方法进行实现:
> python active_learning.py --*atlas*=100 --verbose
由于你默认选择 10 个项(number_per_iteration=10)并且总共需要 100 个,你应该在采样过程中看到模型重新训练 10 次。尝试使用每次迭代更小的数字以获得更多样化的选择,这将需要更多时间来重新训练。
尽管 ATLAS 只向您最初学习的用于不确定性采样的活跃迁移学习架构中添加了一步,但要理解它可能需要一点时间。在机器学习中,你可以在没有人工审查的情况下自信地为未标记的项目分配标签的情况并不多见。诀窍在于我们没有为我们的项目分配实际的标签;我们知道标签将在以后到来。
5.4.2 ATLAS 的优缺点
ATLAS 最大的优点是它通过一种方法解决了不确定性采样和多样性采样问题。这种方法相对于其他不确定性采样方法还有一个有趣的优点:它不会陷入特征空间中固有的模糊部分。如果你有固有的模糊数据,这些数据对你的模型来说将继续保持高不确定性。在你进行一次主动学习迭代并标注数据后,你的模型可能在下一次迭代中仍然在这部分数据中找到最大的不确定性。在这里,我们的模型(错误的)假设它将在以后正确处理这些数据,这有助于我们。我们只需要看到几个模糊的项目,ATLAS 就会开始关注我们特征空间的其它部分。在模型犯错有帮助的情况下并不多见,但这种情况是其中之一。
最主要的缺点是其反面:有时,你不会从特征空间的一个部分中获得足够的标签。除非你得到实际的标签,否则你无法确定你需要从特征空间的每个部分获取多少项目。这个问题等同于在结合聚类和不确定性采样时决定从每个簇中采样多少项目。幸运的是,如果你知道你将在以后有更多的主动学习迭代,那么低估这个问题是安全的。
其他缺点大多源于这种方法尚未经过测试,并且具有最复杂的架构。你可能需要相当数量的超参数调整来构建最准确的模型来预测“正确”和“错误”。如果你不能自动化这个调整而需要手动进行,这个过程就不是自动自适应的过程。因为模型是一个简单的二进制任务,你没有重新训练所有层,所以模型不应该需要太多的调整。
5.5 高级主动学习速查表
为了快速参考,图 5.12 和 5.13 展示了 5.1 节中高级主动学习策略和 5.2、5.3、5.4 节中主动迁移学习技术的速查表。

图 5.12 高级主动学习速查表

图 5.13 主动迁移学习速查表
5.6 活跃迁移学习的进一步阅读
正如你在本章中学到的,关于使用一种方法采样大量项目,而另一种方法用于细化样本的高级主动学习技术,现有的工作很少。关于结合不确定性采样和多样性采样的学术论文主要关注结合两种方法的单一指标,但在实践中,你可以简单地串联这些方法:应用一种方法得到一个大样本,然后用另一种方法细化这个样本。学术论文倾向于将组合指标与独立的方法进行比较,因此它们不会给你一个关于它们是否比串联方法更好的想法(第 5.1 节)。
本章中提到的主动迁移学习方法比目前在学术或行业论文中报道的方法更为先进。在出版本书之前,我已经就这些方法发表过演讲,但所有这些演讲的内容都包含在本章中,因此别无他处可以阅读到它们。我直到 2019 年底在创建与本章配套的 PyTorch 库时,才发现了将主动迁移学习扩展到自适应学习的可能性。本书出版后,请寻找引用 ATLAS 的最新研究论文。
如果你喜欢 ATLAS 将主动学习本身转化为一个机器学习问题的事实,你可以找到一份长长的有趣研究论文列表。自从主动学习存在以来,人们一直在思考如何将机器学习应用于为人工审查采样项目的过程。我推荐的一篇很好的近期论文是“从数据中学习主动学习”,作者是 Ksenia Konyushkova、Sznitman Raphael 和 Pascal Fua(mng.bz/Gxj8)。寻找这篇论文中最被引用的工作以及引用这篇论文的更近期的作品,以了解使用机器学习的主动学习方法。为了深入了解,请参阅 NeurIPS 论文的第一作者 Ksenia Konyushkova 的博士论文,其中包含全面的文献综述。
对于一篇较旧的论文,该论文探讨了结合不确定性和代表性采样的方法,我推荐“使用互信息进行乐观主动学习”,作者是 Yuhong Guo 和 Russ Greiner(mng.bz/zx9g)。
摘要
-
你有多种方式可以将不确定性采样和多样性采样结合起来。这些技术将帮助你优化你的主动学习策略,以采样对模型精度最有帮助的项目。
-
将不确定性采样和聚类结合起来是最常见的主动学习方法,在你学习本书到目前为止的所有内容之后,相对容易实现,因此它是探索高级主动学习策略的一个好起点。
-
活跃的迁移学习用于不确定性采样允许你构建一个模型来预测未标记的项目是否会被正确标记,使用你的现有模型作为不确定性预测模型的起点。这种方法允许你在不确定性采样过程中使用机器学习。
-
活跃的迁移学习用于代表性采样允许你构建一个模型来预测未标记的项目是否比你的现有训练数据更接近你的目标领域。这种方法允许你在代表性采样过程中使用机器学习。
-
ATLAS 允许你扩展活跃的迁移学习用于不确定性采样,这样你就不需要从特征空间的一个区域过度采样项目,将不确定性采样和多样性采样的方面结合到一个机器学习模型中。
(1.)“通过采样估计误差减少实现最优主动学习”,作者:尼古拉斯·罗伊和安德鲁·麦卡卢姆 (dl.acm.org/doi/10.5555/645530.655646).
6 将主动学习应用于不同的机器学习任务
本章涵盖
-
计算目标检测的不确定性和多样性
-
计算语义分割的不确定性和多样性
-
计算序列标注的不确定性和多样性
-
计算语言生成的不确定性和多样性
-
计算语音、视频和信息检索的不确定性和多样性
-
选择合适数量的样本进行人工审查
在第 3、4、5 章中,示例和算法主要集中在文档级或图像级标签上。在本章中,你将学习如何将不确定性采样和多样性采样的相同原则应用于更复杂的计算机视觉任务,例如目标检测和语义分割(像素标注)以及更复杂的自然语言处理(NLP)任务,如序列标注和自然语言生成。一般原则是相同的,并且在许多情况下,没有任何变化。最大的不同之处在于你如何采样主动学习选择的项,这将取决于你试图解决的现实世界问题。
大多数现实世界的机器学习系统使用比文档级或图像级标签预测更复杂的任务。即使听起来简单的问题,当你深入研究时,往往需要高级的主动学习技术。想象一下,你正在构建一个计算机视觉系统来帮助农业。你拥有带有摄像头的智能拖拉机,需要区分幼苗和杂草,以便拖拉机可以高效准确地施用肥料和除草剂。尽管除草是历史上最常见和重复的任务之一,但你需要图像内的目标检测,而不是图像级标签,来自动化这项任务。
此外,你的模型有不同的混淆类型。在某些情况下,你的模型知道一个物体是植物,但无法决定该植物是幼苗还是杂草。在其他情况下,由于各种小物体都可能进入田地,你的模型不确定某些新物体是否是植物。你需要不确定性采样来区分幼苗/杂草,并结合多样性采样来识别新物体。
最后,你的相机在每张图像中捕捉多达 100 种植物,因此你必须决定如何解决图像级混淆与对象级混淆。当图像中的一个对象非常难以识别或当 100 个对象有点难以识别时,你是否优先考虑人工审查?你是否优先考虑对象的正确标签或对象轮廓的准确性?任何这些类型的错误都可能对你正在解决的问题至关重要,因此你需要决定如何将你的现实世界问题映射到正确的采样和评估策略。因此,尽管你正在自动化历史上最常见和重复的任务之一,但你仍需要高级的主动学习技术来解决问题。
6.1 将主动学习应用于目标检测
到目前为止,我们研究的是相对简单的机器学习问题:对整个图像(图像标注)或整个文本片段(文档标注)进行预测。然而,对于许多问题,需要更精细的预测。
你可能只想在图像中识别某些对象,例如,因此你更关心对象的不确定性和多样性,而不是背景。本章开头我们的例子就是这样:你更关心识别杂草,而不是识别围绕它们的田野。在关心背景的程度上,你只关心这一点,以便你能区分杂草和不同的背景。
对于这些示例,你希望采用也关注你所关心区域的主动学习策略。有时,这种关注是免费的;你的模型正在关注你所关心的区域,因此你通常不需要改变你在图像和文档标注中学习的方法。在其他情况下,你需要裁剪/遮蔽你的数据到你所关心的区域,并确保在这个过程中没有引入偏差。在接下来的几节中,我们将讨论一些机器学习问题,并看看你已学到的主动学习策略如何适应这些问题。
图 6.1 说明了在目标检测任务中识别不确定性和多样性的问题。假设这个任务使用的是第三章中的相同示例图像,但在第三章中,我们只想预测图像的标签,而现在我们想要识别图像中的特定对象并在这些图像周围放置边界框。如图 6.1 所示,我们关心的对象——自行车——只是围绕它的边界框中像素的一小部分。

图 6.1 展示了在目标检测任务中识别不确定性和多样性的问题。我们关心的对象——自行车——是其周围边界框中像素的一小部分。即使是微量的上下文也是像素数量的两倍,整个图像的像素数量是边界框的 10 倍。因此,如果我们试图在整个图像上计算不确定性和多样性,我们可能会风险关注大量无关信息。
对象的边缘往往是信息最丰富的地方,但通过增加 20%的上下文几乎会翻倍我们关注的像素总数。整个图像的像素数量是边界框的 10 倍。因此,如果我们试图在整个图像上计算不确定性和多样性,我们可能会风险关注大量无关信息。尽管我们可以使用在第四章和第五章中学到的不确定性采样和多样性采样技术,但我们希望将这种不确定性和多样性集中在我们最关心的区域。
本节的其余部分将介绍如何计算不确定性和多样性。你可以从你的模型中很容易地获得不确定性;最高不确定性往往在于你的对象,而不是背景。对于多样性,你应主要关注那些也是不确定的区域。
6.1.1 目标检测的准确性:标签置信度和定位
你在这里有两个任务:目标检测和目标标注。你应该将不同类型的不确定性和多样性应用于这两个任务:
-
标注每个对象(自行车、人类、行人等)
-
识别图像中对象的边界
每个任务的置信度是
-
对象标签置信度(标签正确的置信度)
-
对象定位置信度(边界框正确的置信度)
如果你从你的目标检测算法中获得一个置信度分数,你的置信度分数很可能是仅目标标签的置信度。今天使用的绝大多数目标检测算法都使用卷积神经网络(CNNs)并依赖于回归来确定正确的边界框。所有这些算法都会返回标签置信度,但很少返回到达边界框本身的回归分数。
你可以通过查看 F 分数或曲线下面积(AUC)的某种变化来确定标签准确性,就像你在前面的章节和附录中学到的那样:通过查看预测边界框和实际边界框相交的区域面积,除以这两个框覆盖的总面积。交集与并集(IoU)是确定定位准确性的最常用指标。如果你之前从事过计算机视觉工作,你早已知道 IoU。图 6.2 展示了 IoU 的一个示例,计算准确性的方法是将预测边界框和实际边界框相交的区域面积除以这两个框覆盖的总面积。

图 6.2 使用 IoU 测量边界框准确性的示例。准确性是通过预测边界框与实际边界框相交的面积除以两个边界框并集的面积来计算的。
IoU 也用于主动学习中的目标检测,因此在跳入不确定性采样和多样性采样之前,学习(或更新你的知识)是很重要的。就我们之前讨论的准确度指标而言,IoU 更为严格,因为它往往在相同的数据上具有更低的值。将 IoU 视为正确或错误预测的面积(或像素)的数量:

与 F-score 类似,IoU 结合了两种类型的错误:误报和漏报。除了 100%准确性的简单情况外,IoU 总是低于 F-score。F-score 在 NLP 中更为流行,而 IoU 几乎仅用于计算机视觉。你会在大多数机器学习领域的文献中看到 AUC,尽管 AUC 在 NLP 和计算机视觉中并不像应该的那样常用。
你还会在计算机视觉文献中看到平均平均精度(mAP)。mAP 是一种与 AUC 不同的曲线,但具有类似的想法。对于 mAP,你按精度对项目进行排名,然后按召回率绘制,创建一个精度-召回曲线,平均精度是该曲线下的面积。这种 mAP 的应用需要一个阈值来定义一个物体是否“正确”——通常是一个 IoU 值为 0.5 或 0.75。mAP 的确切阈值计算往往会有所不同,并且通常为不同的数据集和用例专门定义。对于像自动驾驶这样高度校准的任务,显然你需要比 0.50 的 IoU 值更高的准确度来认为预测是正确的。对于这本书来说,了解任何 mAP 的计算都不是必要的;重要的是要意识到这种其他常见的准确度指标,它将根据任务而特定。
对于主动学习,你通常希望采用一种策略,从定位置信度和标签置信度中采样。你需要确定你想要关注每种类型的程度。尽管你的标签和 IoU 准确性将帮助你确定需要最关注的地方,但你的关注点也将取决于你正在构建的应用程序。
假设你正在部署我们的示例模型以检测道路上的行人、汽车、自行车和其他物体。如果你的应用程序旨在预测碰撞,定位最为重要;错误地标记并不重要,重要的是你的物体边界是否准确。然而,如果你的应用程序旨在识别不同的交通流量,那么物体的精确边界并不重要,但标签很重要,因为你需要精确地知道看到了多少汽车、行人和其他物体。
因此,你可以在相同的位置部署相同的模型,但根据用例,你可能需要将你的主动学习和数据标注策略集中在本地化或置信度上。确定对你用例最重要的因素,并相应地集中你的主动学习策略。
6.1.2 对象检测中标签置信度和定位的不确定性采样
你可以使用标签置信度进行不确定性采样,就像你在第三章中为图像级标签所做的那样。你的目标检测模型将给出一个概率分布,你可以应用最小置信度、置信度范围、置信度比率、熵或集成模型来确定标签预测的不确定性。
对于定位置信度,集成模型是你的最佳选择,它将多个确定性预测组合成一个可以解释为置信度的单一预测。图 6.3 显示了示例。你可以使用两种方法中的任何一种:真正的集成或一个模型内的 dropout,这两种方法你都在第三章中学过。

图 6.3 对一个对象的预测热力图示例,显示了低变化(左侧)和高变化(右侧)。高变化是模型中更多不确定性的证据;因此,右侧示例是人工评估的良好候选。你可以通过使用集成模型、从多个模型中获得预测并改变参数、使用特征子集或项目子集,或以其他方式在模型中引入随机变化来生成多个预测。在单个模型中,你可以通过在每个预测中使用随机选择的神经元的 dropout 来为单个项目生成多个预测(称为蒙特卡洛 dropout)。你还可以结合两种方法:创建一个模型集成,并为每个模型进行多次预测使用 dropout。
对于真正的集成,你从多个模型中获得预测,并确保这些预测会因不同模型的超参数而有所不同,为每个模型训练特征子集,为每个模型训练项目子集,或者以其他方式(如打乱训练项目的顺序)在训练运行中引入随机变化。
对于单个模型,你可以通过在每个预测中使用随机选择的神经元的 dropout 来生成多个预测(即蒙特卡洛 dropout)。这种方法比构建多个模型更快、更简单,而且出奇地有效。你也可以结合两种方法:训练一些具有不同参数的模型,然后对每个模型应用 dropout。
不确定性是从所有预测的平均 IoU 计算得出的。这种计算自然给出一个[0, 1]的范围,因此不需要归一化。除以模型的数量,而不是预测的数量。一些模型可能不会做出预测,这个信息很重要:将所有非预测视为 IoU=0。
现在你为每个边界框都有一个不确定性分数,你可以采样具有最大不确定性的边界框以供人工审查。如果你使用集成方法或 dropout 进行定位,你可以将它们用于标签置信度,代替或补充其他不确定性采样方法。
6.1.3 对象检测中的标签置信度和定位的多样性采样
对于多样性采样,我们需要解决本章开头提出的问题:我们更关心对象而非背景的多样性。最简单的解决方案是将图像裁剪到预测的边界框,然后应用多样性采样,但还有更复杂的变体,我们将在本节中介绍。第四章介绍了三种类型的多样性采样:
-
基于模型的异常值采样
-
基于聚类的采样
-
代表性采样
-
真实世界多样性的采样
对于基于模型的异常值和真实世界多样性,你不必做任何超出你已经为图像级标签学习到的事情:
-
你可以将基于模型的异常值检测应用于目标检测问题,就像你将其应用于图像标注问题一样。
-
你可以在目标检测问题中为真实世界多样性进行采样,就像你在图像标注问题中进行采样一样。
对于基于模型的异常值,隐藏层同时关注标注和定位问题,因此你的神经元主要捕捉关于对象和标签的信息。你可以将图像裁剪到预测的对象,然后寻找基于模型的异常值,但专门用于背景的少量神经元可能对多样性很有趣,因此在这种情况下你可能会失去一些东西。
对于多样性采样,第四章中的原则也适用。你需要结合所有主动学习方法,以确保跨真实世界人口统计数据的数据公平性。在这种情况下,背景也很重要,因为如果你不小心,你可能会错误地建模对象的上下文而不是对象本身。(参见以下侧边栏。)对于目标检测,你可能希望确保你的数据试图平衡包括相机类型、缩放、一天中的时间和天气在内的各种类型的对象。即使是高度控制的设置,例如医学成像,我也看到系统仅限于从少量患者和仅一种成像设备的数据中进行训练,从而引入了不受欢迎的真实世界偏差。
你的模型真的忽略了背景吗?
本书假设你的模型专注于对象而不是背景。然而,有时你的模型可能会错误地使用背景信息。例如,如果你只拍摄了自行车道上的自行车照片,你的模型可能会预测自行车道,而对其他环境中的自行车视而不见。或者,它可能只在车道存在时依赖自行车道,这仍然不是理想的,因为模型没有将这些环境中对自行车的知识推广到其他背景。
一篇关于模型可解释性的有影响力的近期论文提出了另一个例子。作者创建了一个看似准确的模型,用于区分狼和哈士奇¹,但只使用了雪中的狼和不在雪中的哈士奇的照片。他们展示了该模型预测的是背景中是否有雪,而不是实际的动物!这个问题在图像级标签中更为严重,因为在目标检测中,你也在明确地迫使模型学习对象本身的轮廓,这使得模型难以专注于背景。但这个问题在任何需要控制上下文的机器学习问题中都可能以某种程度发生。
解决方案是更好地采样以实现现实世界的多样性,确保所有你关心的标签和对象之间的上下文尽可能多样化。如果你担心你的模型存在这个问题,以下是诊断方法:使用一种方法找出哪些像素对于你的预测是重要特征(例如 LIME,哈士奇/狼论文中的方法,或者截至 2019 年 10 月的 PyTorch 中的 Captum 可解释性库),然后测量有多少像素落在你的验证数据上的边界框之外。得分最高的图像最有可能存在问题。查看这些图像以识别模型在边界框之外关注的任何模式。

图 6.4 图像中一个对象——自行车的例子,其中 99%的图像不是自行车。用虚线捕获的自行车及其直接上下文应该足以识别该对象是自行车。使用一些策略,如代表性采样和聚类,我们需要裁剪或遮罩图像以针对这些区域。
对于基于聚类的采样和代表性采样,重点应放在对象本身上,而不是背景上。如果你的背景占图像的 90%,例如图 6.1 中的例子(在图 6.4 中重复),它将占决定聚类或代表性的 90%的影响。图 6.1 还包含一个相对较大的对象,占据了框架高度的一半。但在许多情况下,例子更像是图 6.4 中的第二幅图像,其中对象只占像素的不到 1%。
在图 6.4 中,自行车本身及其直接上下文足以识别该对象为自行车。一些框外的信息可能有助于确定自行车出现的规模和上下文,但这并不重要。
因此,每个预测对象的周围区域应该被裁剪。因为你的模型并不完全准确,你需要确保你捕捉到了对象。使用你的不确定性采样方法(集成或 dropout)进行多次预测。然后执行以下操作之一:
-
在给定的阈值处裁剪。 例如,你可能创建一个最小的裁剪,以捕捉到对象预测边界框的 90%。
-
使用同一对象的每个预测框,并对框进行加权。 你可能对每个预测框应用代表性采样,然后对所有代表性采样进行平均,其中加权平均由每个框与其他所有框的平均 IoU 确定。
作为裁剪图像的替代方案,你可以忽略上下文框外的像素——这个过程称为掩码。你可以将针对像素输入训练的模型的掩码视为第一层的 dropout,因为你正在忽略一些输入神经元(像素)。
上下文有多重要?
在计算机视觉中存在一些例外情况,其中上下文确实很重要。我在多次场合中只遇到过这些例外情况之一:识别空超市货架以帮助补货。一个空的空间(对象)也需要上下文,例如相邻的物品和空货架下的价格标签。否则,模型无法确定货架是故意留空的,还是应该有产品放在货架上。
除非你有这样的用例,即根据上下文基本标记一个孔,否则请尽可能保持框紧,以便进行聚类和代表性采样。通过使用整个图像的一些多样性采样,你可以捕捉到更广泛的环境多样性。
根据你的使用案例,你可能还需要调整图像的大小。如果你在计算机视觉领域工作,你已经有你选择的用于程序化调整大小的工具。例如,我们的自行车在照片底部可能并不重要,因此你可以通过裁剪每个预测以使整个图像为基准来规范化你的数据,然后通过将所有样本图像缩放到相同的尺寸来进一步规范化。作为一个一般规则,根据你想要如何编码数据以进行聚类和代表性采样来做出裁剪/掩码的决定:
-
如果你正在使用像素作为特征或使用单独的工具来创建特征,请裁剪图像,并考虑是否也应该调整它们的大小。
-
如果你正在使用与用于对象检测的同一模型中的隐藏层,你可以对图像进行掩码处理,而不移动或调整它们的大小。你的特征可以捕捉到不同位置和尺度上对象的相似性。
现在你已经裁剪或遮罩了图像,可以用于聚类和代表性采样!在图像中的每个裁剪或遮罩对象上,你可以应用聚类或代表性采样。你应用基于聚类的采样和代表性采样,就像你在第四章中学到的那样。
确保你采样了具有不同图像中对象数量的图像。如果你发现你只采样了具有少量或大量对象的图像,你无意中在你的过程中引入了偏见。在这种情况下,分层你的采样。你可能采样 100 个具有 1 个预测对象的图像,100 个具有 2 个预测对象的图像,依此类推。
6.1.4 对目标检测的主动迁移学习
你可以将主动迁移学习应用于目标检测,就像你将其应用于图像级标签一样。你还可以将主动迁移学习应用于自适应采样(ATLAS),在单个主动学习周期内进行调整,因为你假设你首先采样的对象将由人工标注员稍后纠正,即使你不知道那些标签是什么。
无论你使用哪种神经网络架构进行目标检测,你都可以使用隐藏层(s)作为你基于验证数据训练的二进制“正确”/“错误”模型的特征。作为一个有趣的扩展,你可以在二进制“正确”/“错误”任务之外,计算验证数据的 IoU 并创建一个预测 IoU 的模型。也就是说,你可以预测一个连续值而不是二进制的“正确”/“错误”。这个过程可能只是将最终层改为回归任务而不是分类任务,并让这个回归任务模拟每个验证项的 IoU。这个扩展可能只需要从第五章的 ATLAS 示例中更改一或两行代码。
6.1.5 设置低目标检测阈值以避免持续偏见
无论你使用什么方法进行目标检测,都要设置低置信度阈值。你不想只找到与你数据中已经存在的对象相似的对象,这会持续这些类型对象的偏见。
你可能会发现低阈值产生了过多的候选对象。你可能会在 50%或更高的置信度下得到 100 个预测图像,但在 10%的置信度下得到 10,000 个,其中大多数是背景(不是对象的假阳性)。所以你可能会想在这个情况下提高阈值。不要这么做。
除非你确信你已经正确设置了阈值以在预测中获得接近完美的召回率,否则你仍然有可能在你的模型中持续偏见。相反,按置信度分层,并从每个分层中采样:
-
在 10-20%的置信度下采样 100 个预测图像。
-
在 20-30%的置信度下采样 100 个预测图像。
-
在 30-40%的置信度下采样 100 个预测图像,依此类推。
图 6.5 显示了按置信度分层的通用策略示例。

图 6.5 按置信度分层:在 0-10%、10-20%置信度等,一直分层到 90-100%置信度,抽取等数量的项目。在这个例子中,从标签 A 的每个 10%置信度区间中抽取一个项目。当标签之间存在较大的不平衡时,按置信度分层非常有帮助。
如图 6.5 所示,您可以在不同的置信度区间抽取相同数量的项目。这种策略对于像对象检测这样的任务很有帮助,因为您的许多图像可能不包含您关心的对象。使用按置信度分层的抽样策略,您将花费大部分时间抽样高置信度对象,同时仍有一些低置信度对象的选择。请注意,尽管识别非对象似乎浪费时间,但这对于您的机器学习算法来说并非如此。学习不是对象但当前以非平凡置信度预测为对象的识别,对于您的模型精度的重要性与学习新对象一样重要。
这种分层对于避免数据中的偏差非常重要。您也可以尝试在每种置信度内随机抽样的方法组合作为替代。
-
从具有 10-20%置信度的 10,000 个对象中选取,应用聚类,并从样本中抽取质心来获取其中最多样化的 100 个对象。
-
从具有 10-20%置信度的 10,000 个对象中选取,并应用代表性抽样以获取与您的目标领域最相似的 100 个对象。
-
从具有 10-20%置信度的 10,000 个对象中选取,并对基于模型的异常值进行抽样,以获取与当前训练数据最不相似的 100 个对象。
注意,您可以将这种方法应用于按置信度分层的任何类型任务,而不仅仅是对象检测。
6.1.6 创建与您的预测相似的代表性抽样训练数据样本
由于您正在裁剪或遮罩您的未标记图像,如果您正在实施代表性抽样,您应该对训练数据执行相同操作。如果您只使用训练数据中的完美边界框,但随后使用未标记数据的不可预测的预测,那么“代表性”样本可能会变成不同框大小和裁剪策略的结果,而不是实际的对象。以下有四种选项,按优先顺序排列:
-
对训练数据进行交叉验证。您可能将训练数据分成 10 个相等的数据集。迭代地对每组九个数据集进行训练,并在每个保留的数据集上进行边界框预测。将所有预测组合起来,并将组合作为代表性抽样语料库的训练数据部分。
-
使用与您的训练数据具有相同分布的验证数据集,对验证集进行边界框预测,并将这些验证边界框作为您语料库中代表性抽样的训练数据部分。
-
在训练数据上预测,然后随机扩展或收缩框,使它们具有相同的平均预测变化。
-
使用你的训练数据中的实际框,然后随机扩展或收缩框,使它们具有相同的平均预测变化。
选项 1 和 2 在统计上同样好。如果你有一个保留的验证集,这个过程比重新训练整个模型要简单一些,但它不会是训练集中确切的数据,尽管它尽可能接近。
对于选项 3 和 4,虽然你可以增加边界框的大小,使平均值为相同,但你无法匹配预测中出现的错误类型。预测的边界框错误不会随机分布;它们将取决于图像本身,这在创建人工噪声时很难复制。
6.1.7 对象检测中图像级多样性的采样
就像任何其他方法一样,你应该始终随机采样一些图像进行审查。这个样本提供了你的评估数据,并为你提供了一个基准,以衡量你的主动学习策略的成功程度。
对于少量样本,你可以使用图像级采样,这有助于多样性,并且比本节中介绍的其他方法更容易防止偏差。如果你在整张图像级别应用聚类,并发现包含少量或没有现有训练样本的整个簇,那么你有很好的证据表明,你应该对这些簇中的某些项目进行人工审查,因为你可能遗漏了一些东西。
如果你向模型引入新的数据类型(也许你正在使用新的相机或从新的位置收集数据),图像级别的代表性采样可以帮助你更快地适应。这种策略也有助于你在尝试结合新数据时,比仅尝试实现对象级主动学习时具有更少的偏差。
如果你尝试在不同类型的数据上使用对象级方法,很难避免偏向于你已经看到的对象,因为其中一些对象可能仍然低于你使用的阈值。置信度阈值通常对域外数据最不可靠。
6.1.8 使用多边形时考虑更紧密的掩码
如果你使用的是图 6.6 中所示的多边形而不是边界框,所有的方法仍然适用。你有一个额外的选项:你可以在边界框外部而不是在最近的边缘一定距离处进行掩码。在我们的自行车示例中,这种方法更接近捕捉自行车本身,而不是那么多的空地。

图 6.6 使用多边形而不是边界框进行目标检测的示例。你可以为边界框和多边形使用相同的主动学习方法,并且对于多边形还有一个额外的选项:可以在多边形最近边缘的一定距离处进行掩码。
由于同样的原因,错误检测可以更加精确,尤其是对于形状不规则的物体。你可以想象,像图 6.6 中的自行车,在许多照片中可能会有把手伸出。仅为了捕捉那个把手而扩展的边界框可能会轻易地占据盒子面积的一半,这为像素错误提供了很大的空间,而这些像素并不属于物体本身。在图像识别中,在边界框和多边形之后,下一个复杂度级别是语义分割。
6.2 将主动学习应用于语义分割
语义分割发生在整个图像都被赋予标签,并且所有物体周围都有准确的多边形边界时。由于这种技术为图像中的每个像素都贴上了标签,因此它也被称为像素标签。图 6.7 展示了这样一个例子。

图 6.7 展示了语义分割的一个例子,其中每个像素都被标注。这类彩色照片是许多语义分割工具的外观:一种填色练习。我们将在本书的后面部分介绍这些工具,特别是在第十章。如果你以黑白形式查看这张图像,对比的灰色阴影应该能给你一个很好的颜色图像概念。如果物体被赋予标签(例如,四棵树被分别标注),那么这项任务就被称为实例分割。
如果你试图估计延伸到其他物体背后(遮挡)的物体,那么更常见的是使用你在 6.1 节中学到的边界框类型的物体检测。使用语义分割将所有物体涂成单一类型,而不是分别识别每个物体,这种情况也很常见。例如,图 6.7 中的每棵树都是相同的颜色,但图像并没有区分不同的树。然而,这些共性并不是一成不变的:有些情况下,忽略遮挡的边界框被使用,语义分割试图捕捉遮挡,语义分割区分物体(称为实例分割)。如果一个模型结合了所有这些方法,有时它被称为全景分割,识别物体和背景像素。本章中的所有方法都应该足够通用,可以应用于边界框或语义分割的任何变化。
这些方法可以应用于其他类型的传感器数据,例如来自激光雷达、雷达或声纳的 2D 和 3D 图像,这些都是自动驾驶汽车中常见的。在农业中,收集红外线和紫外线的图像也很常见,然后将这些结果转换成可见颜色以供人工标注,这也是常见的。搜索“红外森林”或“紫外花卉”照片,你就会明白为什么:很多有用的信息都超出了人类的可视范围!如果涉及到额外的维度和传感器信息,本节中的原则仍然适用。
6.2.1 语义分割的准确性
语义分割的准确性是在每个像素级别上计算的。有多少像素被正确分类,相对于保留的测试集?你可以使用你迄今为止学到的所有准确性指标:精确度、召回率、F 分数、AUC、IoU 以及微观和宏观分数。机器学习准确性的正确选择取决于你的用例。
对于确定不确定性,宏观 F 分数或宏观 IoU 通常最有用。与我们的边界框示例一样,在语义分割中,我们通常有很多我们不关心的空间,例如天空和背景。如果你有很多不连续的区域,你可能会遇到麻烦。例如,图 6.7 在叶子和天空之间可能有超过 100 个独立的天空区域。从整体大小和总数来看,这些天空区域将主导基于像素或区域的微观分数,而树叶混淆将主导我们的不确定性采样策略。所以假设你关心所有标签,但不关心该对象在图像中占据多少空间,使用宏观分数:每个标签每个区域的平均 IoU 或每个标签每个像素的平均 F 分数。
你也可能决定忽略一些标签。也许你只关心人和自行车,因此你可以选择一个宏观准确性值,只查看这些标签。你仍然会从区分人和自行车与背景、地面和天空的错误中获取输入,但不会是那些无关标签之间的错误。请注意,具体是什么重要将取决于你的具体用例。如果你的任务是识别森林覆盖率,那么叶子和天空之间的区域将最为重要!
使用你部署的机器学习模型准确性作为计算不确定性的指南。你应该根据你为准确性计算加权的标签,以两种方式之一进行此计算:
-
如果你不对你的标签进行加权(你要么 100%关心,要么不关心每个标签是否等于绝对权重),使用你用于模型准确性的相同指标来确定采样位置。如果你只关心模型准确性中的两个标签的混淆,则只对涉及一个或两个这些标签的混淆预测进行主动学习采样。
-
如果你有一个加权的准确性指标,请不要使用与模型准确性相同的指标。相反,使用你在第三章中学到的分层采样方法。图 6.8 显示了一个示例。
如图 6.8 所示,按标签进行分层采样有助于将你的主动学习策略集中在最重要的像素上。虽然你可以为任何机器学习问题使用分层采样,但语义分割是其中可以提供帮助的最清晰的例子之一。

图 6.8 层次抽样在分割中的应用示例。对于这个示例任务,假设我们更关心与人和自行车像素相关的错误,而不是与树木和天空像素相关的错误。我们的主动学习样本将包括 90:10 的分割:90%将是我们最关心的标签中最令人困惑的样本,10%将是我们不关心的标签。请注意,天空和树木边缘的像素数量远远超过人和自行车边缘的像素数量,因此层次抽样有助于我们关注我们最关心的错误。因此,你的抽样策略可能与你的准确度评估策略不同,在准确度评估策略中,你可以简单地应用 90%和 10%的相对权重到高值或低值错误。不确定性抽样指标并不容易进行这种加权,所以除非你对自己的统计技能足够自信以调整你的加权策略,否则使用这种层次抽样方法。
注意,层次抽样可能与你的模型准确度评估策略不同。假设你关心标签 A 比标签 B 多九倍。计算你的模型准确度为 90% × 标签 A 的 F 分数 + 10% × 标签 B 的 F 分数(加权宏 F 分数)。这种策略对于模型准确度来说是可行的,但不幸的是,你不能以类似的方式应用权重到不确定性分数,因为你的加权几乎肯定只会将标签 A 的项目排在最高位,将它们唯一地置于排名的顶部。相反,使用这些权重作为样本数量的比例。例如,你可能采样 90 个最不确定的标签 A 项目和 10 个最不确定的标签 B 项目。这种技术比尝试在标签之间创建加权抽样策略简单得多,而且效果更佳。如果你不关心某些标签,仍然可以考虑采样少量样本,特别是使用基于模型的异常值和代表性抽样,因为它们可能是你关心的标签的假阴性。
6.2.2 语义分割的不确定性抽样
大多数语义分割算法都是基于 CNN 的变体,使用 softmax 在可能的每个像素的标签上生成概率分布。因此,你可以使用你在第三章学到的方 法,按每个像素计算不确定性。你的模型不太可能对每个像素进行预测,这将是不高效的,而是预测区域,并在被迫时仅选择小的(可能是像素大小的)区域。确切地知道你的预测置信度来自哪里。
与边界框一样,从你的模型中得到的置信度可能反映了你的标签置信度,而不是你对象边界的置信度。如果是这样,你可以从像素置信度中推导出定位置信度:你知道哪些像素是相邻不同标签的像素,因此所有边界像素的聚合置信度就是定位置信度。你可能对几个像素的误差可以接受;如果是这样,使用这个误差范围来确定你计算置信度的位置。例如,如果你通过原谅所有小于 3 像素的错误来衡量你的机器学习模型的准确性,那么对不确定性也做同样的事情,测量距离边界 3 像素的像素的平均不确定性。
由于某种原因,你可能正在使用一个不提供给定标签概率分布的模型。在这种情况下,你可以使用集成方法和/或 dropout 来创建多个预测,并将不确定性计算为预测中标签一致性的数量。
现在你只采样你关心的像素,并且每个像素都有一个不确定性分数,你可以应用任何不确定性采样算法。计算整个图像的不确定性的最简单方法是从你关心的每个像素中取平均值。如果你主要关心边界,你可以在其他标签的几个像素内采样项目。
根据你的任务,如果你(例如)想给图像一个不确定性分数,这个分数是任何单个区域的最高不确定性,你可以尝试除了平均值以外的其他指标。你只关注图像内区域的能力部分取决于你的注释设置。是否需要注释整个图像,或者他们是否只能注释你关心的标签?这些问题在第九章从注释的角度进行了讨论。
6.2.3 语义分割的多样性采样
由于模型基于异常值采样不能直接从你的模型中采样,就像在对象识别中那样,因此这种方法适用于对象识别,因为你是迫使模型关注你关心的区域,但语义分割算法必须对每个像素进行分类。因此,你应该遮罩或裁剪图像,只包含你关心的预测标签,如第 6.1 节所述,然后应用基于模型的异常值。
对于聚类和代表性采样也是同样的道理:裁剪或遮罩图像到你关心的区域,然后应用聚类和/或代表性采样。对于现实世界的多样性,策略与边界框相同:使用你在主动学习中所知道的所有技术,以采样你关心的跨和内部人口统计数据的多样性。关于这些方法,请参阅第 6.1 节关于目标检测的更多内容。
6.2.4 语义分割的主动迁移学习
你可以将主动迁移学习应用于语义分割,就像你应用于图像级标签一样,但你应该使用自适应方法:ATLAS。如果你不使用此算法的自适应版本,你可能会仅在你不关心的区域采样混淆,例如当你主要关心地面上的物体时,叶子和天空之间的划分。请注意,ATLAS 不会完全解决这个问题;它可能会最初采样你不关心的混淆类型。但它会快速适应,假设这些类型的混淆已解决,因此也会覆盖你关心的区域。如果你考虑你的数据中存在多少成对的标签集以及你实际上关心这些对中的百分比,你将会有一些关于 ATLAS 即插即用成功率的想法。
要充分利用 ATLAS 进行语义分割,你可以策略性地设置你的验证数据以用于迁移学习。例如,如果你不关心叶子和天空之间的错误,你可以在运行验证数据通过原始模型以生成你的“正确”/“错误”标签时忽略这些错误。这样,你的模型现在只预测你关心的标签类型的错误。
6.2.5 语义分割中图像级多样性的采样
与目标检测一样,你可能想从整个图像中采样少量项目(特别是如果你正在引入来自新位置、相机类型等的数据),这样你可以快速适应并找到你关心的标签的假阴性。如果你在结合方法时,你也可以尝试放宽裁剪或遮罩的限制。你可以对整个图像进行代表性采样,以找到最具代表性的新领域或图像类型的图像,然后对最具代表性的图像进行采样,对这些样本应用遮罩/裁剪,并对这些样本进行聚类以实现多样性。这种技术为你提供了从整个图像中关于你关心的领域最具代表性的项目最多样化的选择。
6.3 将主动学习应用于序列标注
序列 标注是将机器学习应用于序列内的标注,是 NLP 中最常见的任务之一。假设你有这个句子(序列):
“首次在旧金山的超市发现大肠杆菌疫情”
如果你正在实现一个从文本报告中追踪疫情爆发的模型,你可能想从句子中提取信息,例如疾病的名称、数据中的任何位置以及重要的关键词,如表 6.1 所示。
表 6.1 一个示例序列标签:关键词检测和两种类型的命名实体,疾病和地点。标签 B(开始)应用于跨度的开始,标签 I(内部)应用于跨度内的其他单词,使我们能够明确地区分相邻的跨度,例如“旧金山”和“超市”。这个过程被称为 IOB 标记,其中 O(外部)是非标签。(O 从表中省略以增强可读性。)

在文献中,你最常见的标签是用于跨度的 IOB 标记,如表 6.1 所示。请注意,你可能需要根据不同类型的标签以不同的方式定义跨度。名为“大肠杆菌”的命名实体是一个单词,但当我们提取关键词时,它变成了短语“大肠杆菌爆发”。尽管“旧金山”既是实体(地点)也是关键词,但普通名词“超市”是关键词但不是实体。严格来说,这个过程被称为IOB2 标记,其中 IOB 只在单个跨度中有多个标记时使用 B。IOB2 是你在文献中最常见的处理方法,有时简称为 IOB。
其他编码方式标记跨度的结束而不是开始。这种编码方式在整句分割任务中很常见,例如标记每个单词和子词跨度的结束以及每个句子的结束。对于句子,标记结束是因为识别句子结束(通常用标点符号)比识别开始要容易一些。本章中的方法适用于任何类型的序列编码,因此本章将坚持使用 IOB2 示例,并假设如果您的编码系统不同,它很容易适应。
你也可能将一些标签视为同一任务的天然组成部分。我在命名实体识别(NER)方面做了很多工作,它将识别“地点”和“疾病”视为同一任务的一部分,但将关键词识别视为不同的任务。即使在同一任务中,标签的定义也可能有很大的变化。一些流行的 NER 数据集只有四种实体类型:“人物”、“地点”、“组织”和“杂项”。相比之下,我曾经帮助一家汽车公司构建了一个拥有数千种实体类型的实体识别系统;每种类型的引擎、车门甚至头枕都有多种类型和名称。
尽管你可能在 NLP 中执行各种序列标注任务,但它们都归结为在序列中识别文本跨度。这类序列标注任务在文献中被称为信息提取,通常是更复杂的多字段信息提取任务的构建块。如果你有一个包含一个疾病和多个位置的句子,你也会确定疾病被检测到的位置,如果有的话。在本章中,我们将坚持识别单个跨度的示例,并假设你可以将它们扩展到更复杂的信息提取任务。
6.3.1 序列标注的准确性
序列标注的准确性指标取决于任务。对于命名实体,通常是整个跨度的 F 分数。因此,将“旧金山”预测为位置将占准确性的 100%,但将“Francisco”或“旧金山超市”预测为位置将占准确性的 0%。
在某些情况下,这种严格的准确性可能被放宽,或者与更宽容的指标(如每词准确性,称为per-token,因为并非所有标记都是精确的单词)一起报告。在其他情况下,准确性可能针对实体与非实体进行报告,实体的类型(如疾病或位置)将单独报告。
你可能不会关心序列任务中的“O”标签。F 分数将捕捉其他标签与“O”之间的混淆,这可能已经足够。就像在目标检测和语义分割中,你更关心每个数据项的某些部分而不是其他部分。专注于这些数据部分进行主动学习将导致更好的样本。
就像在计算机视觉示例中一样,你应该使用与测量你的 NLP 模型准确性一致的指标进行主动学习采样。对于许多 NLP 任务,上下文比目标检测更重要。你知道“旧金山”是一个地点,而不是一个名称中包含“旧金山”的组织,因为整个句子的上下文。因此,在预测序列周围有一个更广泛的上下文更安全,通常也是可取的,因为上下文可以是一个重要的预测因素。
6.3.2 序列标注的不确定性采样
几乎所有的序列标注算法都会为你提供标签的概率分布,通常使用 softmax,这样你就可以直接计算每词的不确定性。除了(或与)softmax 置信度之外,你可以使用集成模型和/或 dropout 来生成多个预测,并将不确定性作为这些预测之间的一致性或熵的水平来计算。这种方法类似于计算机视觉中的目标检测示例。
同样,就像在计算机视觉示例中一样,你的置信度将关于每个标记的标签置信度,而不是整个跨度或跨度的边界。但如果你使用 IOB2 标记,你的“B”标签将联合预测标签和起始边界。
你可以决定如何计算整个跨度的不确定性。所有信心值的乘积是(从数学上讲)最正确的联合概率。然而,你还需要对标记的数量进行归一化,这可能很复杂。因此,跨度中所有标记的平均或最小信心可能比乘积更容易处理。
对于跨度外的标记,不确定性可能很重要。如果我们错误地预测“Francisco”不是位置,我们希望考虑到它可能曾是位置的事实。表 6.2 展示了这样一个例子。
表 6.2 展示了与每个标签相关的位置识别和信心示例。表中显示了一个错误,即只有“San”来自“San Francisco”是位置,但“Francisco”的信心相当高。因此,我们想要确保在计算信心时考虑到预测跨度之外的信息。

表 6.2 显示了一个错误,其中只有“San”来自“San Francisco”被预测为位置。然而,“Francisco”是一个假阴性,但它的信心(0.46)相当高。因此,我们想要从预测跨度之外计算不确定性;我们想要确保边界也是正确的。
在表 6.2 中,我们可以将“Francisco”视为 1 - 0.46 = 0.54,这将降低我们对跨度边界的信心。相比之下,在预测的开始阶段,“a”的信心为零。所以 1 - 0 = 1,这将增加我们的信心。“B”标签也有助于提高初始边界的信心。
6.3.3 序列标注的多样性采样
对于你的机器学习模型,你几乎肯定使用了一个架构和/或特征表示,它能够捕捉广泛的上下文窗口。在某些模型中,你直接编码了这个表示。如果你使用基于 transformer 的方法,那么上下文(注意力)是作为模型本身的一部分被发现的,你可能只提供了一个最大尺寸。为了帮助确定在主动学习中使用上下文,选择一个与你的预测模型使用的上下文一致的采样窗口。第四章介绍了四种类型的多样性采样:
-
基于模型的异常值采样
-
基于聚类的采样
-
典型采样
-
现实世界多样性的采样
我们将首先从最简单的方法开始,即与对象检测一样:
-
你可以将基于模型的异常值检测应用于序列标注问题,就像你将其应用于文档标注问题一样。
-
你可以在序列标注问题中进行现实世界多样性的采样,就像你在文档标注问题中进行采样一样。
对于基于模型的异常值,隐藏层专注于你关心的跨度。也就是说,你的神经元将主要捕捉信息以区分你的跨度与非跨度(“B”和“I”来自“O”)以及跨度标签的不同。因此,你可以直接应用基于模型的异常值,而无需截断句子到每个预测跨度的直接上下文。
你可以在图 6.9 中看到不同的特征表示:one-hot 编码、非上下文嵌入(如 word2vec)和上下文嵌入(如 BERT)。如果你在 NLP 领域工作过,你可能使用过这些常见的特征表示。在所有三种情况下,我们想要提取预测的文本跨度并创建一个单独的特征向量来表示该跨度。主要区别在于我们使用求和而不是使用最大值(尽管最大值可能也行得通),以及在使用上下文嵌入时不需要在预测跨度之外进行采样,因为上下文已经包含在向量中。在提取短语之前计算上下文嵌入。对于其他方法,你提取短语是在计算向量之前还是之后并不重要。对于多样性采样,第四章中的原则也适用:你需要结合所有主动学习方法以确保跨真实世界人口统计数据的公平数据。

图 6.9 展示了三种用于主动学习的预测跨度编码方式:使用 one-hot 编码将每个标记编码为其自己的特征(左上角);使用非上下文向量(嵌入)如 word2vec(右上角);以及使用上下文嵌入如 BERT(底部)。你也可以尝试使用平均池化(avepool)代替或与最大池化(maxpool)一起使用。
到目前为止,你可以看到序列标注中的多样性采样与目标检测中的多样性采样有很多相似之处。你关心对象/跨度上下文,但对于基于模型的异常值,你不必过于担心,因为你的模型已经将大部分神经元集中在你最关心的图像/文本部分。
对于基于聚类采样和代表性采样,我们希望将模型集中在跨度本身上,而不是在任一侧的上下文中太远。如果你使用的是标记的上下文向量表示,你可能不需要额外的上下文;那个上下文已经包含在你的向量中。
前后文本应在有意义的距离和单词或句子边界(或如果你有这些信息,在短语边界)处裁剪。因为你的模型不是 100%准确的,你需要确保你捕捉到了完整的跨度:
-
在给定的阈值下裁剪。如果跨度是位置,则将选择扩展到预测位置之前或之后的单词,其中位置至少有一些低(例如,10%)的置信度。
-
设置一个宽阈值,可能是整个句子,并按每个单词或子单词序列是跨度的组成部分的概率来加权每个单词或子单词。
并非所有算法都允许你以有意义的方式对特征进行加权。如果你无法做到这一点,可以使用与目标检测相同的策略:从集成或 dropout 中生成多个跨度。然后尝试对每个预测进行代表性采样,根据它们与其他预测跨度的平均重叠程度进行加权。你可以直接使用每个跨度中的单词和子单词进行聚类和代表性采样,就像你在第五章中所做的那样。
如果你正在裁剪文本并使用模型的隐藏层进行基于聚类的采样、基于模型的异常值或代表性采样,请在裁剪文本之前获取这些隐藏层。完整的句子上下文对于获取跨度中每个单词的准确上下文表示是必要的。当你拥有句子中每个单词或子单词的神经元激活向量时,你可以将选择裁剪到跨度。
你需要解决的最后一个问题是如何组合每个单词或子单词的向量。如果你的所有跨度长度相同,你可以将它们连接起来。如果不相同,你需要将它们组合起来——这是一个称为池化的过程,用于神经网络向量。向量往往是稀疏的,所以最大池化可能是最好的(在每个向量索引中取每个单词或子单词的最大值),但你也可以尝试平均或其他池化方法来观察差异。
无论你是使用单词、子单词还是向量表示,你都可以像在第四章中学到的那样应用基于聚类的采样和代表性采样。你可以采样质心、异常值和随机聚类成员,你也可以从你的目标领域中采样最具代表性的项目。
6.3.4 序列标记的主动迁移学习
你可以将主动迁移学习应用于序列标记,就像你应用于文档级标签一样。你还可以应用 ATLAS,在单个主动学习周期内进行调整,因为你可以假设你最初采样的序列将被人类标注员后来纠正,即使你不知道那些标签是什么。
无论您使用哪种类型的神经网络架构进行序列标注,您都可以使用隐藏层(s)作为在验证数据上训练的二进制“正确”/“错误”模型的特征。您需要决定在验证数据中什么算作“正确”和“错误”。如果您对某些序列比对其他序列更关心,您可能只想将那些序列的错误视为“错误”,专注于您最关心的错误类型。您还需要决定是否按每标记错误或整个序列来计算错误。作为一个起点,使用与您在机器学习模型中计算准确率相同的方法来计算错误是有意义的,但您可能想尝试其他方法。
6.3.5 按置信度和标记进行分层采样
无论您使用什么方法预测跨度,都要将阈值设置得低一些。您不希望只找到与您数据中已经存在的跨度相似的跨度,这将导致偏差的持续。您可以使用与目标检测相同的按置信度分层的采样方法(第 6.1.5 节),例如,在 0%-10%置信度、10%-20%置信度等处采样相同数量的跨度。
此外,您还可以根据标记本身对样本进行分层。您可以将“旧金山”(或任何其他序列)的跨度样本限制在最多 5 个或 10 个实例,从而在总体上采样更多样化的标记。
6.3.6 为代表性采样创建与您的预测相似的训练数据样本
如果您正在为代表性采样裁剪未标记的文本,您应该对训练数据做同样的事情。如果您只使用训练数据中的完美跨度标注,但使用未标记数据中的不完美预测,那么“代表性”样本最终可能是不同裁剪策略的结果,而不是实际的跨度差异。
第 6.1.6 节介绍了一些裁剪训练数据和未标记数据以减少偏差的策略。这些策略也适用于跨度,因此如果您正在对跨度应用代表性采样,请查看这些方法。
与目标检测类似,您应该考虑在未裁剪的文本上使用一些采样方法。您可能在这里做更多的事情,因为跨度的上下文通常是上下文中相关的语言片段,这些片段被优化以编码信息;而目标检测的背景更有可能是世界中的随机垃圾。
一些简单的代表性采样方法可能很有效,您可能不需要构建模型。您甚至可以选择只关注那些尚未出现在您的训练数据中的预测跨度。
6.3.7 完整序列标注
对于 NLP 中的一些任务,您希望对文本中的每个项目进行标注。例如,词性标注(POS)标记,如表 6.3 所示。
表 6.3 全序列解析示例,显示名词、动词、副词(Adv)、专有名词(PRP)等 POS 标签(标签)

你可以将这个任务视为与文本内部的序列标记相同,但它在简化方面有所简化,因为你不必太担心裁剪文本或忽略“O”标签。按标签分层可能有助于表 6.3 中那样的案例,例如选取 100 个最不确定的名词、100 个最不确定的动词、100 个最不确定的副词等等。你可以使用这种抽样方法结合宏 F 分数来评估模型精度。
6.3.8 序列标记中文档级别多样性的抽样
与任何其他方法一样,你应该始终随机抽样文本进行审查。这种做法提供了你的评估数据,并为你提供了一个评估主动学习成功与否的基准。如果你在全文级别应用聚类,并发现存在大量或没有现有训练项的整个集群,那么你有很好的证据表明,你应该对这些集群中的某些项目进行人工审查,因为你可能遗漏了一些东西。
在文档层面上,也可能存在现实世界的多样性考虑:文本的类型、创建者的流畅性、语言(们)等等。对于这些情况,分层抽样在文档层面上可能比在序列层面上更有效。
6.4 将主动学习应用于语言生成
对于某些自然语言处理任务,机器学习算法正在生成类似于自然语言的序列。最常见的用例是文本生成,这是本节中的示例用例。大多数手语和口语语言生成都是从文本生成开始的,然后作为单独的任务生成符号或语音。机器学习模型通常是通用的序列生成架构,可以应用于其他类型的序列,如基因和音乐,但这些比文本更不常见。
即使如此,也只有在迁移学习最近取得进展的基础上,全文生成系统才达到了足够准确的水平,使我们能够开始在现实世界应用中开始使用它们。
最明显的例外是机器翻译,这在学术界和工业界已经流行了一段时间。机器翻译是一个定义明确的问题,它从一个语言中取一个句子,并产生一个新的语言的句子。从历史上看,机器翻译有很多现有的训练数据可以借鉴,这些数据是以书籍、文章和网页的形式存在的,它们在语言之间被人工翻译。
问答,即对一个问题的回答给出一个完整的句子,作为文本生成的例子,越来越受欢迎。另一个例子是对话系统,如聊天机器人,根据交互产生句子。摘要又是另一个例子,从更长的文本中产生更少的句子。然而,并非所有这些用例都必然使用全文生成。许多问答系统、聊天机器人和摘要算法在从输入中提取重要序列后,使用模板输出创建看似真实的通信。在这些情况下,它们使用文档级标签和序列标签,因此,您已经学过的用于文档标签和序列标签的主动学习策略将足够。
6.4.1 计算语言生成系统的准确率
语言生成的一个复杂因素是很少有一个正确的答案。这种情况通常通过在评估数据中包含多个正确答案,并允许最佳匹配作为使用的分数来解决。在翻译任务中,评估数据通常包含几个正确的翻译,准确率是通过将翻译与其中任何一个的最佳匹配来计算的。
在过去几年中,神经机器翻译的主要进步是全句子到句子的生成;机器学习接受两种语言中相同句子的示例,然后训练一个可以直接从一句话翻译到另一句话的模型。这个功能非常强大。以前,机器翻译系统需要多个步骤来解析不同语言之间的输入和输出,并对齐两个句子。每个步骤都使用自己的机器学习系统,并且这些步骤通常与元机器学习系统一起组合起来。新的神经机器翻译系统只需要平行文本,并且可以处理整个流程,它们仅使用大约 1%的早期拼凑系统的代码,并且更加准确。唯一的缺点是,与它们的非神经前辈相比,神经机器翻译系统现在更难以解释,因此更难在模型中识别混淆。
6.4.2 语言生成的不确定性采样
对于不确定性采样,你可以查看多个预测之间的变化,就像你在序列标注和计算机视觉任务中所做的那样,但这个领域的研究相对较少。如果你正在构建用于文本生成的模型,你很可能使用的是生成多个候选算法。可能可以通过查看这些候选之间的变化来测量不确定性。但是,神经机器翻译模型通常通过使用称为 beam search 的方法生成少量候选(大约 5 个),这不足以准确测量变化。最近的研究表明,扩大搜索范围可能会降低整体模型精度,这显然是你想要避免的。²
你可以尝试使用集成模型或从单个模型中去除一些神经元来模拟不确定性。在机器翻译中,测量集成模型之间的一致性水平是确定不确定性的长期实践,但这些模型训练起来成本高昂(通常需要几天或几周),因此仅仅为了采样不确定性而训练多个模型可能会非常昂贵。
在句子生成过程中使用 dropout 可以帮助通过从单个模型中获得多个句子来生成不确定性分数。我在撰写本书期间发表的一篇论文中首次尝试了这种方法。³最初,我打算将这项研究包括在内,这项研究专注于语言模型中的偏差检测,并将其作为本书最后一章的例子。然而,鉴于该内容已在论文中,以及本书中的灾害响应示例在撰写期间因 COVID-19 大流行而变得更加相关,因此我将第十二章中的示例任务替换为跟踪潜在食源性疾病爆发的任务。
6.4.3 语言生成的多样性采样
对于语言生成,多样性采样比不确定性采样更直接。如果你的输入是文本,你可以像在第四章中为文档级标注实现的那样实现多样性采样。你可以使用聚类来确保你有一组多样化的输入,代表性采样来适应新领域,以及基于模型的异常值来采样当前模型感到困惑的内容。你还可以根据任何现实世界的人口统计特征对样本进行分层。
多样性采样通常一直是机器翻译的主要关注点。大多数机器翻译系统都是通用型的,因此训练数据需要覆盖你语言对中的尽可能多的单词,每个单词在尽可能多的上下文中出现,特别是如果该单词根据上下文有多个翻译的话。
对于特定领域的机器翻译系统,通常使用代表性抽样来确保任何对领域重要的新单词或短语都有翻译。例如,当您将机器翻译系统适应新的技术领域时,增加该领域的术语样本是一个很好的策略,因为这些术语对于正确性至关重要,并且不太可能被更通用的机器翻译系统所知晓。
对于文本生成的多样性抽样,最令人兴奋的应用之一是为其他任务创建新的数据。一种长期存在的方法是回译。如果您有一段被标记为负面情绪的英文文本,您可以使用机器翻译将该句子翻译成多种其他语言,然后再将其翻译回英文。文本本身可能会改变,但负面情绪的标签可能仍然正确。这种训练数据生成的方法,称为数据增强,包括一些关于人机交互机器学习方面的最新进展,我们将在第九章中介绍。
6.4.4 语言生成的主动迁移学习
您可以将主动迁移学习应用于语言生成,方式与其他本章中的用例类似。您还可以应用 ATLAS,在单个主动学习周期内进行调整,因为您可以假设您最初采样的序列将被人类标注员后来纠正,即使您不知道那些标签是什么。
您需要仔细定义在验证数据中什么算作“正确”或“错误”的预测。通常,这项任务涉及设置一个准确性阈值,超过该阈值,句子就被认为是正确的或错误的。如果您可以按每个标记计算准确性,您可以选择将所有标记的准确性汇总以创建一个数值准确性值。您可以选择预测一个连续值而不是二元的“正确”/“错误”,就像在第 6.1.1 节中对象检测的 IoU 示例中那样。
6.5 将主动学习应用于其他机器学习任务
第 3、4、5 章中的主动学习原则可以应用于几乎任何机器学习任务。本节从高层次上概述了更多内容。本节不会深入到您在计算机视觉和 NLP 示例中学到的实现细节水平,但它将让您了解相同的原理如何应用于不同的数据类型。
对于某些用例,根本无法收集新的未标记数据,您将需要找到其他方法来衡量您的准确性。 有关此类方法之一的更多信息,请参阅以下侧边栏:合成控制。
合成控制:在没有评估数据的情况下评估您的模型
埃莱娜·格罗瓦尔博士的专家轶事
如果你在部署一个无法进行 A/B 测试的应用程序时,如何衡量你的模型的成功呢?合成控制方法是在这种情况下你可以使用的一种技术:你找到与你在部署模型的地方在特征上最接近的现有数据,并使用这些数据作为你的对照组。
我第一次了解到合成控制是在研究教育政策分析时。当一所学校尝试一些新方法来改善学生的学习环境时,不能期望只有一半的学生生活得到改善,以便另一半可以作为一个统计对照组。相反,教育研究人员可能会创建一个与学生在人口统计和表现方面最相似的学校的合成控制组。我采取了这种策略,当我领导 Airbnb 的数据科学团队时,我们应用了这种方法。当 Airbnb 在新的城市/市场推出产品或政策变化,并且无法进行实验时,我们会创建一个最相似的城市/市场的合成控制组。然后我们可以衡量我们的模型与合成控制组在参与度、收入、用户评分和搜索相关性等指标上的影响。合成控制使我们能够采取数据驱动的方法来衡量我们模型的影响,即使我们没有评估数据。
Elena Grewal 是 Data 2 the People 的创始人兼首席执行官,这是一家利用数据科学支持政治候选人的咨询公司。Elena 之前领导了 Airbnb 的数据科学团队,并在斯坦福大学获得了教育学博士学位。
6.5.1 信息检索的主动学习
信息检索是一组算法,驱动着搜索引擎和推荐系统。可以使用多个指标来计算返回多个结果的查询检索系统的准确性。今天最常用的这些指标之一是折现累积增益(DCG),其中 reli 是排名位置 p 处结果的分级相关性:

log()函数用于降低低值项的权重。也许你希望第一个搜索结果是最准确的;你对第二个搜索结果关心得稍微少一些;对第三个搜索结果关心得更少一些;以此类推。最初引入对数时,这种使用是一种相当随意的加权,但一些相对较新的理论表明,它具有数学上的有效性。⁴
现实世界的搜索系统是当今人机交互机器学习中最复杂的用例之一。想想在线商店的一个简单搜索。商店正在使用一种机器学习形式来检索搜索结果。它使用第二种机器学习形式来识别你的搜索字符串中的关键词和实体。它使用第三种机器学习形式从结果中的每个产品中提取相关的摘要文本。产品被分类为产品类型(电子产品、书籍等),以帮助第四种机器学习形式的搜索相关性。商店还可能使用第五种机器学习形式来决定理想的展示图像(纯背景或情境中)。许多现代搜索引擎也试图最大化多样性,返回不同类型的产品,而不是同一产品的 10 个版本。因此,可能有六个或更多不同的机器学习系统对你的搜索结果做出贡献,甚至在任何模型尝试为你量身定制结果之前。每个机器学习系统都需要自己的训练数据。其中一些数据可以来自人们的点击,但大部分来自离线标注者提供的反馈。
你可能没有意识到你在网上购物时正在使用最前沿的机器学习,但幕后有很多事情在进行。事实上,这个用例是为什么最知名的众包平台,亚马逊的 Mechanical Turk,被发明出来的原因:为了清理在线商店中产品的目录信息。
信息检索也倾向于使用比其他机器学习应用更多的现实世界准确性指标。尽管 DCG 在离线评估搜索相关性方面很受欢迎,但系统使用者的结果通常优化为面向商业的指标:一个人购买的商品数量,从搜索到购买之间的点击/秒数,客户未来六个月的客户价值等。因为这些指标是关于模型的使用,所以它们有时被称为在线指标,与 F-score 和 IoU 不同,后者是离线指标。这些指标与 F-score 和 IoU 不同,并且更加以人为中心,因此其他用例可以从信息检索社区中学到很多。
6.5.2 视频的主动学习
大多数针对静态图像的解决方案也适用于视频中的目标检测和/或语义分割。关注视频中最关心的区域,并使用它们作为样本。如果你的模型只关注你关心的对象或标签,你可以实现不确定性采样和基于模型的异常值,而不必 necessarily 裁剪或遮罩你的视频到你所关心的对象。如果你正在应用多样性采样,你几乎肯定想要首先裁剪或遮罩到那些对象。
视频和静态图像之间最大的区别是,你有很多来自同一视频的几乎相同的图像帧。最明显的解决方案就是最好的解决方案:如果你有多个来自你的模型认为相同的对象的帧,就采样不确定性最高的帧。在新的对象上重新训练的迭代过程可能会在之后给你一些或所有其他高置信度的帧。
多样性采样应该已经减少了在不同帧中选择相同对象次数,因为对象在帧之间看起来是相同的。如果对象改变了形态,你可能想以不同的形态采样它,所以这种情况是可行的。一个例子是手语。你并不是在追踪一个对象,而是在尝试解释一条信息流,所以你的主动学习策略可能看起来更像文本和语音,而不是对象检测。
注意,如果你在视频对象检测中不使用多样性采样,你可能会发现你最不确定的样本是连续帧中的相同对象。我所见过的多数公司都会每隔N帧采样一次,或者按视频采样精确数量的帧,通常是第一帧、最后一帧和一些中间帧。这种分层采样的方法并没有什么问题,但通过聚类和自适应代表性采样来增加多样性通常会得到更丰富的样本。你可能还需要对某些视频进行过采样,以获取更多包含某些罕见标签的帧,从而提高现实世界的多样性。如果你每部视频都取每一帧,那么你会有很多单独的图像,因此你也可以先对整个图像进行大规模聚类,并使用视频总数作为指导:
-
如果你拥有的聚类数量少于视频总数,可以将相似的视频合并成一个聚类,以实现有针对性的多样性。
-
如果你拥有的聚类数量多于视频总数,最终你应该有一些视频被分割成多个聚类,理想情况下是内容更丰富的视频。
这种方法为你提供了很大的空间,可以将本书中涵盖的主动学习方法结合起来,以尽可能快地标注视频。
6.5.3 语音的主动学习
就像文本或手语一样,语音可以是一个标注任务,一个序列任务,或者一个语言生成任务。你对待每个用例的方式与对待文本或图像的方式相同。
如果你是在整个语音行为(如果你正在标注对智能设备或类似对象发出的命令,称为意图)级别进行语音标注,那么你的模型已经专注于你关心的现象,就像对象检测和序列标注一样。因此,不确定性采样和基于模型的异常值检测应该可以在你的语音数据上工作,而无需裁剪。
如果你正在将语音转录成文本,或执行一些查看整个录音错误的任务,这个过程更类似于文本生成,其中你希望关注多样性以采样尽可能多的语音行为。在世界上几乎每一种语言中,书写系统都比口语更标准化。因此,当你试图捕捉每一个可能的口音和语言变化时,与处理文本相比,多样性变得更加重要。
在数据收集技术的重要性方面,语音介于文本和图像之间。麦克风的质量、环境噪声、录音设备、文件格式和压缩技术都可能产生模型可能错误学习而不是实际信息的伪影。
在这里讨论的所有数据类型中,语音在感知结构和实际物理结构之间的差异最大。例如,你可能会感觉到单词之间的间隙,但这种感知是一种错觉,因为真实的语音几乎总是将单词连在一起。几乎每个声音都会在即时语境中发生变化。英语的复数形式是 s 或 z,这取决于前面的音素(cats 和 dogz),但你可能认为复数后缀只有一个声音。当你采样语音数据时,请注意不要仅仅依赖于该语音的文本转录。
6.6 选择合适数量的项目进行人工审查
对于高级主动学习技术,你已经学到的原则同样适用。你可以在主动学习迭代中使一些主动学习策略,如代表性采样,自适应,但大多数技术组合在用新标注的数据重新训练模型时仍然能产生最大的效益。
你可能需要从一定数量的聚类或分层中抽取一定数量的样本,以反映现实世界的受众。你每次迭代的最大样本数量将根据数据类型而变化。你可能每小时可以标注 1,000 条简短文本消息的位置,但在同一时间段内可能只能完成 1 张图像的完整语义分割。因此,你的决策中一个重要因素将是你的数据类型以及你正在部署的标注策略——这一点我们将在第七章至第十二章中讨论。
6.6.1 对完全或部分标注数据的主动标注
如果你的机器学习模型可以从部分标注的数据中学习,你将使你的系统变得更加高效。继续我们在这本书中一直使用的例子,想象你正在为城市街道实现一个目标检测模型。你的模型可能足够准确以识别汽车和行人,但可能不足以识别自行车和动物。
你可能拥有数千张自行车和动物的图像,但每张图像平均也有几十辆车和行人。理想情况下,你希望只标注那些图像中的自行车和动物,并且不超过 10 倍的资源来确保所有车和行人也被标注在同一图像中。然而,许多机器学习架构不允许你部分标注数据;它们需要每个对象都被标注,否则,那些对象将错误地计入背景。
你可能会选择那些最大化混淆和多样性的 100 辆自行车和动物进行采样,但随后会花费大部分资源标注它们周围的 1,000 辆车和行人,而得到的额外收益相对较少。没有捷径可走:如果你只采样没有很多车或行人的图像,你就是在使数据偏向某些不具代表性的环境,这些环境不能代表你的整个数据集。如果你遇到需要为每张图像或文档进行完整标注的系统,你想要格外小心,确保每次都采样价值最高的项目。
越来越容易结合不同的模型或拥有异构的训练数据。你可能能够为行人和车辆训练单独的模型,然后通过迁移学习将它们结合起来。
6.6.2 将机器学习与标注相结合
在设计你的标注和模型策略时,你应该考虑这些选项,因为你可能会发现,一个略微不精确的机器学习架构,当你不受限于完全或不标注图像时,最终会产生更精确的模型。
解决在大图像/文档中仅需要标注少数对象/跨度的最佳方法是将机器学习融入标注过程。进行语义分割时,标注整个图像可能需要一个小时,但接受/拒绝每项标注可能只需 30 秒。当结合预测和人工标注时,危险在于人们可能会被引导去信任一个不正确的预测,从而延续现有的偏差。这种情况是一个复杂的人机交互问题。第九章、第十章和第十一章介绍了以最有效的方式结合模型预测和人工标注的问题。
6.7 进一步阅读
关于计算序列标注和序列生成的置信度,请参阅 Jan Niehues 和 Ngoc-Quan Pham 的“在序列到序列模型中建模置信度”(mng.bz/9Mqo)。作者们研究了语音识别,并通过在源文本标记上计算置信度(不确定性)而不是仅预测标记,以有趣的方式扩展了机器翻译问题。
有关机器翻译活动学习技术的概述,请参阅“神经机器翻译活动学习技术的实证评估”,由 Xiangkai Zeng、Sarthak Garg、Rajen Chatterjee、Udhyakumar Nallasamy 和 Matthias Paulik 所著 (mng.bz/j4Np)。本文中的许多技术可以应用于其他序列生成任务。
摘要
-
在许多用例中,您希望在图像或文档中识别或提取信息,而不是对整个图像或文档进行标记。相同的活动学习策略可以应用于这些用例。了解正确的策略有助于您了解可以应用活动学习的问题类型以及如何为您的用例构建正确的策略。
-
您需要裁剪或遮罩您的图像和文档,以充分利用某些活动学习策略。正确的裁剪或遮罩策略会产生更好的样本供人工审查,了解何时需要裁剪或遮罩您的项目有助于您选择适合您用例的正确方法。
-
活动学习可以应用于许多超出计算机视觉和自然语言处理的任务,包括信息检索、语音识别和视频。了解活动学习应用领域的更广泛景观将帮助您适应任何机器学习问题。
-
在高级活动学习的每一轮中,为人工审查选择的项目数量非常具体,取决于您的数据。了解适合您数据的正确策略对于部署最有效的人机交互机器学习系统对于您的问题至关重要。
^(1)“我应该信任你的预测吗?”:解释任何分类器的预测,由 Marco Tulio Ribeiro、Sameer Singh 和 Carlos Guestrin 所著 (www.kdd.org/kdd2016/papers/files/rfp0573-ribeiroA.pdf。
^(2)“分析神经机器翻译中的不确定性”,由 Myle Ott、Michael Auli、David Grangier 和 Marc’Aurelio Ranzato 所著 (arxiv.org/abs/1803.00047。
^(3)“使用部分合成数据生成检测独立代词偏差”,由 Robert (Munro) Monarch 和 Alex (Carmen) Morrison 所著 (www.aclweb.org/anthology/2020.emnlp-main.157.pdf)。
^(4)“NDCG 类型排名度量理论分析”,由 Yining Wang、Liwei Wang、Yuanzhi Li、Di He、Wei Chen 和 Tie-Yan Liu 所著 (arxiv.org/abs/1304.6480。
第三部分 标注
标注将人类引入了人机交互的机器学习过程中。为机器学习创建具有准确和代表性标签的数据集通常是机器学习应用中最被低估的组成部分。
第七章介绍了如何寻找和管理合适的人员进行数据标注。第八章涵盖了标注质量控制的基礎,介绍了计算整个数据集以及标注者、标签和每个任务层面的整体准确性和一致性的最常见方法。与机器学习准确度不同,我们通常需要调整随机机会准确性和人类标注者的协议,这意味着在评估人类表现时,评估指标更为复杂。
第九章涵盖了标注质量控制的先进策略,从激发主观标注的技术开始,然后扩展到用于质量控制的机器学习模型。本章还涵盖了广泛的方法,包括基于规则的系统、基于搜索的系统、迁移学习、半监督学习、自监督学习和合成数据创建,以半自动化标注。这些方法是当今人机交互机器学习领域最激动人心的研究领域之一。
第十章首先通过一个连续值标注的例子(提示:不如许多人想象的那么常见)来探讨群体智慧在数据标注中的应用频率。本章涵盖了标注质量控制技术如何应用于不同的机器学习任务,包括目标检测、语义分割、序列标注和语言生成。这些信息将使您能够为任何机器学习问题制定标注质量控制策略,并思考如何将复杂的标注任务分解成更简单的子任务。
7 与标注你的数据的人员合作
本章涵盖了
-
理解内部、合同和按任务付费的标注劳动力
-
使用三个关键原则激励不同的劳动力
-
在非货币性补偿情况下评估劳动力
-
评估你的标注量需求
-
理解标注员为特定任务所需的培训和/或专业知识
在本书的前两章中,你学习了如何为人工审查选择合适的数据。本部分章节涵盖了如何优化这种人工交互,从如何找到和管理能够提供人工反馈的正确人员开始。机器学习模型通常需要成千上万(有时甚至数百万)个人类反馈的实例来获取必要的训练数据以确保准确性。
你需要的劳动力类型将取决于你的任务、规模和紧迫性。如果你有一个简单的任务,比如确定社交媒体帖子是正面还是负面情绪,并且你需要尽快获得数百万个人类标注,那么理想的工作力不需要专业技能。但理想情况下,该工作力可以并行扩展到数千人,并且每个人可以短时间被雇佣。
然而,如果你有一个复杂任务,比如在密集的金融术语中识别金融文件中的欺诈证据,你可能希望找到在金融领域有经验或能够被训练以理解该领域的标注员。如果文件使用的是你不懂的语言,找到和评估能够标注数据的正确人员将会更加复杂。
通常,你希望有一个结合不同类型工作力的数据标注策略。想象一下,你在一个大型金融公司工作,你正在构建一个系统来监控可能表明公司价值变化的金融新闻文章。这个系统将成为一个广泛使用的应用程序的一部分,人们使用这个应用程序来做出关于在股市上市的公司买卖股票的决定。你需要对数据进行两种类型的标注:每篇文章是关于哪个公司以及每篇文章中的信息是否暗示了股价的变化。
对于第一种标签——公司识别——你可以轻松雇佣非专家标注者。你不需要理解财经新闻来识别公司名称。然而,理解哪些因素可以改变股价是很复杂的。在某些情况下,如果内容明确(例如,“预期股价将暴跌”),对语言的普通流畅度就足够了。在其他情况下,上下文可能并不那么明显。例如,“Acme 公司符合调整后的第三季度预期”这句话,对于一个公司来说,符合调整后的季度预期是积极的还是消极的?你需要理解调整的上下文。对于包含财务缩写的复杂语言,没有接受过金融领域培训的人是无法理解的。
因此,你可能决定你需要三种类型的工作团队:
-
众包工作者,当新闻文章发布时,他们可以最快地扩展和缩减规模,以识别正在讨论哪些公司
-
合同工,他们可以学习财务术语来理解股价的变化
-
内部专家,他们可以标注最困难的边缘案例,裁决冲突的标签,并为其他工作者提供指导
无论合适的人选是谁,当他们得到公平的报酬、对自己的工作有安全感,并且对正在完成的工作有透明度时,他们都会做得最好。换句话说,管理工作团队最道德的方式也是对你组织最有利的。本章涵盖了如何选择和管理任何标注任务合适的团队。
7.1 标注简介
标注 是为你的模型创建训练数据的过程。对于几乎所有预期能够自主运行的机器学习应用,你需要比一个人实际标注的数据标签更多,因此你需要选择合适的工作团队来标注你的数据,以及最佳的管理方式。图 7.1 中的人类在循环图显示了标注过程,它从未标记数据开始,输出标记的训练数据。

图 7.1 数据标注 是创建未标记数据的过程,无论是通过标记未标记数据还是审查从模型生成的标签。
在本章和随后的章节中,我们将深入探讨图 7.1 中的标注组件,展示运行标注项目所需的子过程和算法。一条建议:从你的算法策略开始制定你的数据策略。完善标注策略和指南所需的时间与创建算法架构和调整超参数所需的时间一样长,你的算法和架构的选择应该基于你预期的标注类型和数量。
7.1.1 良好数据标注的三个原则
你对标注你数据的人表示的尊重越多,你的数据就越好。无论这个人是在职的主题专家(SME)还是只为你标注几分钟的外包工作者,这些基本原则都将确保你获得最佳可能的标注:
-
工资—公平支付。
-
安全—定期支付。
-
所有权—提供透明度。
三种主要类型的工作队伍总结在图 7.2 中,显示了随时间推移所需工作量的不均衡。众包工作者最容易被扩大或缩小规模,但他们的工作质量通常最低。内部工作者最难扩大规模,但他们通常是中小企业,提供最高质量的数据。外包工作者介于两者之间:他们拥有众包工作者的一些灵活性,并且可以被训练到高水平的专长。这些差异应该影响你对工作队伍(们)的选择。我们将在接下来的章节中更详细地介绍每种工作队伍,并扩展每个工作队伍的薪酬、安全和所有权原则。

图 7.2 概述了你可以用来标注数据的三种主要类型的工作队伍:内部工作者、合同工作者和众包工作者,其中主要的权衡是灵活性对专长。
监督机器学习工作涉及人员管理
如果你使用人工标注的数据,你就在进行人员管理。大多数现实世界的机器学习应用都使用为该目的而标注的数据进行监督学习。你无法避免对你为你标注数据的人所承担的责任:如果他们的工作被用于你创建的模型中,你对他们就负有照顾的责任。
许多数据科学家认为他们的工作就像纯粹的研究。公司中的许多高级数据科学家不必管理其他研究人员,正是因为人员管理被认为会妨碍在研究中进行“真正的”工作。不幸的是,对于那些人来说,即使你的组织有一个独立的数据标注团队或已外包标注,你也没有办法外包你对标注数据的人的责任。
本章可能看起来更像管理建议而不是技术建议,但这种关注是有意为之的,因为知道如何管理分布式的团队是任何数据科学家的重要技能。正如本章所述,良好的管理对于确保为为你的模型做出贡献的每个人提供公平的工作条件也是必要的。
你的职责包括与注释你数据的那些人进行交流。我怀疑你遇到过只在项目开始时给员工提供指导而不邀请反馈的好经理。当存在权力不平衡时,获取反馈可能会很复杂,因此你需要深思熟虑并充满同理心地实施沟通渠道。
7.1.2 注释数据和审查模型预测
在本书中,术语“标注”被广泛使用。在某些情况下,它意味着标注原始数据;在其他情况下,它意味着由机器学习模型辅助或与之交互的人类。
我们将在第十一章中回到用户界面和质量控制。现在,请理解,当您计算标注所需的工作量时,您需要考虑您可能用于标注的数据的不同呈现方式以及所需的不同工作量。
7.1.3 机器学习辅助的人类标注
对于许多任务来说,目标是协助人类过程。实际上,许多模型可以根据应用进行自动化或协助人类。例如,您可以训练一个碰撞检测算法来驱动一辆完全自主的车辆或提醒驾驶员。同样,您可以训练一个医学影像算法来进行诊断或告知医疗从业者的决策。
本章节适用于两种类型的应用。我们将在 7.5.1 节中介绍将最终用户作为标注者的概念。正如该节所述,即使您的应用程序在协助人类任务时免费获得许多标注,您可能仍然希望雇佣除最终用户之外的标注者。
对于机器学习辅助的人类,有一点与就业安全和透明度原则相关:明确您的目标是协助最终用户的工作,而不是训练他们的自动化替代品。但如果您知道您正在获得最终用户反馈以自动化特定任务,您必须对此事实保持透明,以便期望是现实的,并且您应该相应地补偿这些人。
7.2 内部专家
对于大多数机器学习项目来说,最大的劳动力是内部员工——与构建算法的人在同一组织中工作的人。尽管如此,与外包和众包工作者相比,质量控制和工作管理对于内部标注者的研究最不充分。大多数关于标注的学术论文都集中在外包和(特别是)按任务付费的众包工作者上。显然,如果模型构建者和标注者都在同一组织中,您将获得很多好处,因为他们能够直接沟通。
内部工作的优势在于领域专业知识和对敏感数据的保护。如果您从事分析财务报告或诊断医学图像等复杂问题,您的内部团队成员可能是世界上少数几个具备标注您所需数据技能的人之一。如果您的数据包含敏感信息,内部员工也为您提供了数据的最私密和安全保护。
对于某些用例,你可能因为监管原因而被迫将数据保留在内部。第十章中我们将涵盖的数据生成工具可以帮助你处理这些情况。即使你的合成数据不是 100%准确,也有很大可能性你的合成数据不会像你的真实数据那样敏感。因此,当你无法与外包工作人员分享实际数据时,你有机会雇佣外包劳动力来过滤或编辑合成数据,以达到你期望的准确度。
虽然内部员工通常比其他员工拥有更多的专业知识,但认为这意味着他们代表了将使用你应用程序的完整人群范围可能是错误的。请参阅以下侧边栏,了解更多关于最佳小型专家的信息。
家长是完美的小型专家
阿亚娜·霍华德的专家轶事
关于人的模型很少能准确反映数据中未代表的人群。许多人口统计偏差可能导致某些人群代表性不足,例如能力、年龄、种族和性别。通常还存在交叉偏差:如果人们在多个人口统计数据中代表性不足,有时这些数据的交叉点可能比各部分的总和还要重要。即使你确实有数据,也可能很难找到具有正确经验的人来正确标注它。
在为有特殊需求的孩子制造机器人时,我发现检测儿童情绪、检测来自代表性不足的种族的人的情绪以及检测自闭症谱系人群的情绪的数据不足。没有沉浸式经验的人往往在识别这些孩子的情绪方面表现不佳,这限制了能够提供表示孩子快乐或不开心的训练数据的人。甚至一些受过训练的儿科医生在处理能力、年龄和/或种族的交叉性时,在准确标注数据时也会遇到困难。幸运的是,我们发现孩子自己的父母是他们情绪的最佳评判者,因此我们为父母创建了快速接受或拒绝模型对孩子情绪预测的界面。这个界面使我们能够获取尽可能多的训练数据,同时最大限度地减少父母提供反馈所需的时间和专业技术。这些孩子的父母最终证明是调整我们的系统以满足他们孩子需求的最完美的小型专家。
阿亚娜·霍华德是俄亥俄州立大学哥伦布分校工程学院院长。她曾是乔治亚理工学院互动计算学院的院长,也是 Zyrobotics 的联合创始人,该公司为有特殊需求的孩子制造治疗和教育产品。她曾在美国宇航局工作,并拥有南加州大学的博士学位。
7.2.1 内部员工的薪酬
你可能不会设定你公司内标注员们的薪水,因此这个原则是免费的:他们已经同意了他们所获得的薪水。如果你确实设定了你内部标注员的薪水,确保他们得到与其他员工相同的尊重和公平待遇。
7.2.2 内部员工的安全保障
内部员工已经有一份工作(按定义),因此安全保障来自于他们能够保持这份工作,即在你有工作给他们的时候——也就是说,在你确保他们能够保持这份工作的时候。如果你的内部员工的雇佣和组织职位因为他们是临时工或合同工而提供较少的工作保障,可以使用一些外包员工的原则。例如,对于合同工,尽量使可用的工时量尽可能一致,并明确他们的雇佣将持续多长时间。关于工作流动性要透明。一个人能否成为正式员工或转移到其他角色?
7.2.3 内部员工的所有权
透明度通常是内部员工最重要的原则。如果员工无论是否创建标注都能得到报酬,你需要确保这项任务本身是有趣的。
使任何重复性任务变得有趣的最佳方式是明确这项工作的重要性。如果你的内部标注员能够了解他们的工作是如何改善公司的,这些信息可以成为很好的动力。事实上,标注可以是向组织贡献最透明的方式之一。如果你有标注数量的每日目标或可以分享训练模型中的准确性如何提高,很容易将标注工作与公司目标联系起来。标注员更有可能通过提高准确性做出贡献,而不是实验新算法的科学家,因此你应该与标注员分享这一事实。
除了看到标注如何帮助公司从数量上提高日常动力之外,内部标注员应该清楚他们的工作是如何对公司整体目标做出贡献的。一个花费 400 小时标注支持新应用的数据的标注员应该感受到与花费 400 小时编码它的工程师一样的所有权。
我看到公司经常错误地理解这个概念,让他们的内部标注团队对他们的工作对日常或长期目标的影响一无所知。这种失败是对从事工作的人的不尊重,导致动机低下、高流失率和低质量的标注,这对任何人都没有帮助。
此外,你还有责任确保工作对内部员工持续可用。你的数据可能因你无法控制的原因而突发涌入。例如,如果你正在对新闻文章进行分类,那么在特定时区新闻文章发布的时间段,你将拥有更多数据。这种情况适合采用众包标注劳动力,但你可能决定延迟一些数据标注。图 7.3 展示了一个示例,其中最关键的数据在到达时立即标注,其他数据则稍后标注。

图 7.3 为内部员工优化工作流程。当数据因你无法控制的原因而突发涌入时,可以进行平滑处理,首先标注最关键的数据,然后逐步标注其他数据。底部图表显示了标注工作量的平滑情况。
数据标注需要越一致,管理标注过程就越容易。当试图平滑工作量时,你可以随机化哪些数据先来,但你还有其他可以实验的选项。例如,你可以首先将所有数据聚类,并确保所有质心首先被标注,以确保多样性。或者,你可以选择应用代表性抽样,首先标注看起来最新颖的项目。所有这些方法都是平滑所需标注量度的良好方式,同时尽可能快地从数据中获得最大收益。
7.2.4 小贴士:始终运行内部标注会话
无论你使用何种工作组合,我都建议尽可能在最具多样性的内部员工群体中运行标注会话。这种方法有以下几个好处:
-
由内部人员创建的高质量标注可以成为你的(人工)训练示例,并成为你质量控制数据的一部分(参见第八章)。
-
你的内部标注会话有助于早期发现边缘情况,例如那些由于当前标注指南未涵盖而难以标注的数据项。理解这些边缘情况将帮助你完善任务定义和向标注你数据的人员的指导。
-
这个过程是一个很好的团队建设练习。如果你将组织中的每个部门的员工召集到一个房间里(如果他们需要长时间工作,可以提供食物和饮料),这个过程会非常有趣,并允许公司中的每个人都为机器学习应用做出贡献。让每个人都至少标注一个小时的数据,同时讨论他们遇到的边缘情况。在我工作过的许多公司中,“标注小时”是许多人一周中最喜欢的时光。
这个练习也可以是建立一个内部专家团队来为你的更大标注团队创建和更新指南的好方法。特别是如果你有随时间变化的数据,你将希望定期更新你的标注指南并提供当前的示例标注。
你也可以使用一些外包标注者作为专家,偶尔,一位出色的众包工作者可能能够帮助这个过程。许多专注于标注的组织对其创建指南和培训材料的最佳方式有内部专业知识。相信他们的专业知识,并考虑邀请外包组织的人士参加你的内部标注会议。
图 7.4 展示了将专家标注者整合的一些例子,从完全忽略专家标注者的模型(仅推荐用于试点)到更复杂的流程,这些流程优化了专家在数据随时间变化时如何帮助确保质量控制。
如果你在一个试点中实施图 7.4 中的第一种方法,排除那些令人困惑的项目,而不是将它们与可能不正确的标签一起包含。如果你的 5%的项目无法被标注,排除这 5%的项目从你的训练和评估数据中,并假设你有 5%的额外错误。
如果你将由于标签错误而产生的噪声数据包含在训练和评估数据中,将很难衡量你的准确性。不要相信包含难以标注项目的噪声训练数据是可以接受的。许多算法可以在噪声训练数据上保持准确性,但它们假设可预测的噪声(随机、均匀、高斯等)。如果项目难以标注,这些项目可能不是随机分布的。
图 7.4 中的第二个例子在工业界最为常见,对于难以处理的例子,会将其转交给专家进行人工审核。如果数据在时间上相对一致,这种方法是可行的。
如果数据变化迅速,图 7.4 中的第三种方法更为推荐。在第三种方法中,专家标注者在主要标注团队之前查看新数据,使用主动学习策略尽可能多地揭示边缘案例,以确保指南不会落后于实际数据。如果你有定期到来的数据,这种方法允许你比让他们响应第二例中那样的临时难以处理的例子更可预测地安排内部工作人员。

图 7.4 内部标注的三个工作流程。顶部的工作流程仅推荐用于试点;它不使用内部标注员,并忽略了难以标注的项目。第二个例子在行业中最为常见:难以处理的例子被转交给专家进行人工审核。如果你的数据在时间上相对一致,这种方法效果很好。如果你的数据变化很快,建议使用第三种方法。在这种方法中,专家标注员在主要标注过程开始之前,通过多样性采样和不确定性采样寻找潜在的新边缘情况;然后这些例子和更新后的指南被传递给主要的标注团队。这是唯一确保指南不会落后于实际数据的方法。专家标注员还随机标注了一些项目,以进行质量控制,我们将在第八章中讨论这一点。
你可以将第二种和第三种方法结合起来,尽可能提前应对新的用例,同时仍然允许难以处理的例子被转交给专家进行人工审核。你可能只需要在数据特别难以标注的情况下,或者在标注的早期迭代中这样做,在你发现所有主要边缘情况之前。
7.3 外包工人
外包工人是数据标注增长最快的劳动力。在过去五年中,我看到外包公司(有时称为业务流程外包商)的工作量增长速度超过了其他类型的标注劳动力。
外包本身并不是什么新鲜事。在技术行业中,一直都有外包公司,拥有大量可以承包不同类型任务的员工。最著名的例子是呼叫中心。当你给银行或公用事业公司打电话时,你很可能是联系到了一个外包公司,该公司受雇于你打电话的公司,而你正在与该公司雇佣的员工交谈。
越来越多的外包公司专注于机器学习。一些公司只专注于提供劳动力;而另一些公司则在其更广泛的提供中提供一些机器学习技术。大多数情况下,外包公司的员工位于生活成本相对较低的世界各地,这意味着工资也较低。成本经常被引用为外包的主要原因;外包比雇佣内部员工做工作更便宜。
可扩展性是使用外包工人的另一个原因。通常,调整外包工人的规模比调整内部工作团队的规模要容易得多。对于机器学习来说,这种灵活性在你不知道你的应用程序是否成功,直到你拥有大量训练数据之前非常有用。如果你与外包公司正确设定了期望,这种方法对每个人来说都更有效:你不必扩大期望工作更长时间的内勤工人的规模,外包公司可以为其员工规划任务转换,他们经常这样做,并且这应该纳入他们的薪酬方案中。
最后,并不是所有外包工人都应该被视为低技能。如果一个标注员已经从事自动驾驶车辆的标注工作多年,他们是一个高技能的个人。如果一个公司是自动驾驶车辆的新手,外包工人可以是一个宝贵的专业知识来源;他们从多年的经验中获得了关于应该标注什么以及对于模型来说什么重要的直觉。
如果你无法平滑内部工人的标注量需求,你可能会找到一个中间地带,你可以足够平滑地标注,以便使用外包工人,他们可以比内部工人更快地循环上下(但不如众包工人快)。图 7.5 展示了示例。

图 7.5 为外包工人平滑工作。如果你无法完全平滑数据量,你可能能够足够平滑以适应外包工人可以上下调整的规模。
7.3.1 外包工人的薪酬
外包工人的雇主应提供公平的薪酬,但你仍有责任核实这种补偿是否公平。你对任何为你工作的人都有照顾义务,即使他们是另一家公司提供的承包商。这种照顾义务源于一种权力动态,你处于最强大的位置。你不希望外包公司通过压低工人工资来以更低的价格赢得你的业务。特别是如果你使用的是一个你不熟悉的外包公司,你应该提出以下问题:
-
每位工人每小时/每天的报酬是多少,这种报酬与他们在当地公布的最低工资和最低生活成本相比如何?
-
工人在接受任务培训的时间是否会得到报酬,或者只有在他们进行标注时才会得到报酬?
-
工人在项目之间或在你项目工作量较少时是否得到报酬,或者只有在他们直接参与项目时才会得到报酬?
你可以深入探讨这些问题中的任何一个。例如,关于薪酬,你可以询问诸如医疗保健、退休和带薪休假等福利。
计算工人在工作地点的生活成本补偿是否公平,考虑到项目之间的任何减少或缺失的工资。请注意,您也是这个方程的一部分;如果您能为您的项目提供持续的工作流,那么当个别工人等待您的数据到来或在他们之间切换项目时,他们的空闲时间将会更少。
如果外包组织不能给出具体的答案,那么这很可能不是一个好的选择。最坏的情况是,该组织可能只是在其他外包公司或众包工人之上运营一个管理层,您不希望与您的注释员有太多的步骤距离,因为您不太可能获得高质量的注释。最坏的情况是,该组织可能正在掩盖它支付剥削性工资的事实。
注意补偿方面的文化和国家差异。大多数欧洲国家的工人享有良好的国家医疗保障,可能不会考虑雇主提供的医疗保障的重要性,例如,而美国的工人可能不会期待有产假福利。情况也可能相反:如果您在美国,您不需要坚持要求在拥有良好国家医疗保障选择的国家工作的工人也有雇主提供的医疗保障。
我的建议是,在提问时多问一些问题,如果您的提问显得文化上不敏感,事后道歉。与其因为害怕提问而让任何人的补偿不公平,不如冒犯那些得到公平报酬的人,并从那次经历中成长。
7.3.2 外包工人的安全
外包工人的工作保障来自他们的直接雇主。除了询问他们的薪酬外,您还应该询问工作保障和晋升机会。
许多外包公司在其组织中都有明确的晋升路径。注释员可以成为一线经理,然后是场地经理,等等。他们也可能有专业化的领域,例如被信任执行特定的困难注释任务和敏感数据,这些任务的报酬会更高。
如果您的工人在组织中没有晋升机会,考虑他们是否应该因为执行您的任务而得到更多的补偿,考虑到他们可能需要自费支付培训和教育以提升他们的职业生涯。如果有人作为专业注释员感到满意,不想进入管理层或专业角色,这也是完全可以接受的。如果这个人在一个积极的环境中工作,得到公平的报酬,并感到对所做工作的所有权,那么这是一份有尊严的工作。
7.3.3 外包工人的所有权
外包员工最有可能全职担任标注员。因此,透明度很重要,这样这些员工就知道他们正在为你的组织做出贡献。就像内部员工一样,如果外包员工了解他们标注数据的原因,他们将会更有动力。例如,如果他们正在标注城市公园的场景,他们应该知道用例是否专注于行人或植物。了解目标大大提高了数据的准确性,并让员工有了一种他们正在为重要任务做出贡献的感觉。
如果可能的话,让你的外包员工感觉到他们直接为你的公司做出了贡献。一些公司积极避免将他们的外包员工视为组织的一部分。从品牌的角度来看,这种做法可能是可以理解的(担心另一家公司的员工可能会对你的公司造成误解),但如果目标是隐藏业务流程外包的事实,那么可能就不公平了。
无论你的组织政策如何,全职作为承包商工作的人在给定的一天里所做的贡献与全职在公司内部工作的人一样多,他们应该有这样的感觉。在尽可能的范围内,让这些员工知道他们是如何为你的组织做出贡献的,但也让他们知道他们不能公开谈论这一点。通常有一个中间地带,你可以向外包员工公开他们所创造的价值,但明确指出他们只能私下讨论。你可能有一些不能公开谈论他们工作内容的内部人员。
外包员工对你的公司目标可能比内部员工有更少的直觉。你的公司可能是一家大型跨国公司或热门的社区初创公司,但并不能保证外包员工知道这个事实,所以不要假设太多。当外包员工了解他们完成工作的背景时,这是一个双赢的局面:他们会以更快的速度完成高质量的工作,获得更高的报酬,并对这个过程感觉更好。在你与他们一起工作时,尽量保持与标注员的沟通渠道。
7.3.4 小贴士:与你的外包员工交谈
如果你正在运行一个机器学习项目,你应该与负责日常标注的线管理人员直接沟通。这种沟通可以是电子邮件、论坛,或者(理想情况下)在线聊天。与标注员本人直接沟通可能会更加丰富,但根据规模和隐私问题,这种互动可能不被允许。
作为中间方案,你可能与一线经理保持开放渠道,并与标注者定期举行全体大会。如果你有定期会议,要明确告诉外包公司,这段时间是可以收费的时间,标注者应该得到报酬。在标注工作中,总会出现一些问题,比如你没有考虑到的边缘案例和你做出的没有在指南中明确说明的假设。此外,与标注者直接沟通他们为之人创建数据的人是尊重的。
我通常看到外包工作者与构建机器学习模型的人相隔四到五层。数据科学家可能会雇佣内部人员来管理数据;那位数据经理与外包公司的客户经理合作;那位客户经理与公司的标注领导合作;标注领导与一线经理合作;最后,一线经理与单个标注者合作。这是沟通任何指南或反馈的五个步骤!
记住,除了支付标注者的费用外,你实际上是在支付所有中间人的费用。在某些行业中,50%的开支用于这种管理开销。如果你被迫使用低效的管理结构,你的沟通不必遵循那条路径。与标注者或他们的直接管理者建立直接关系。
7.4 群众外包工作者
按任务付费的群众外包工作者是数据标注中最受关注的工作群体,但他们是人数最少的一群。我在拥有两个最大的群众外包标注工作市场的公司工作过,即便如此,我使用的还是外包工作者(他们得到了公平的小时工资),而不是群众外包工作者。
群众外包工作的在线市场通常允许你发布你的标注工作;然后人们可以选择以每项任务发布的单价来完成这项工作。如果提供奖金或按比例的小时工资,这些金额是每项任务价格的补充。工作者通常是匿名的,这种匿名性通常由平台在技术和条款条件上强制执行。
因为群众外包是一个通用术语,它还包括数据收集,标注也被称为微任务。由于工作是按数据项支付的,这个过程也被称为按任务付费,或者更普遍地,被认为是零工经济的一部分。在所有情况下,它都指的是工作最大的灵活性,但也最容易受到剥削。
使用群众外包工作者的最大优势是他们可以快速地扩大或缩小规模。如果你只需要几分钟的工作,但需要来自数千人,按任务付费的群众外包工作者是理想的。
在大多数公司中,任何大型、持续的机器学习项目依赖众包工作者的情况很少见,众包工作者更常用于快速实验以验证在新的任务上达到一定准确度是否可行。当需要快速完成标注且时间紧迫时,也会使用众包工作者,尽管一些外包公司提供 24/7 的工作团队,可以同意更短的完成时间。
由于学术研究更常关注不同用例的快速实验,而不是单一用例的持续准确性提升,因此众包工作者已成为许多学术部门的标注工作首选。这项工作的突出地位是为什么众包工作有时会被错误地视为工业界标注的普遍方法。参见第 7.4.3 节中的“不要将研究生经济学应用到你的数据标注策略”以了解更多关于学术界与众包之间关系的视角,以及它如何影响现实世界的机器学习。
在工作者一方,有合理的理由解释为什么一个人会选择成为众包工作者而不是为外包公司工作。最大的原因是可能没有外包公司能在他们的所在地雇佣他们。只要有互联网连接,你几乎可以从任何地方成为众包工作者。
对于可能面临歧视的人来说,众包工作可以成为一种平衡器。匿名性使得工作者基于种族、性别、犯罪记录、国籍、残疾或其他常限制人们就业的原因受到歧视的可能性大大降低。他们的工作将根据其固有的优点来评估。
有些人更喜欢众包工作,因为他们受限或更喜欢按任务付费的工作。也许他们由于其他承诺,如照顾家人或全职工作(这允许他们有时间进行额外的众包工作)而每次只能贡献几分钟。这个领域是确保公平最困难的一个领域。如果一个工作者需要 60 分钟来完成大多数人只需 15 分钟就能完成的任务,那么只支付他们 15 分钟的费用是不公平的;他们应该得到 60 分钟的费用。如果这笔费用超出了你的预算,那么在在线声誉系统中不要以任何负面方式反映他们,排除他们接受你未来任务的资格。
众包工作者是最容易被剥削的劳动力。预先预测某些任务需要多长时间是困难的,因此即使任务设置有良好的意图,按任务付费的补偿也可能不足以支付给某人。此外,有人很容易设置任务而不带好意图,要么错误地表示完成任务所需的时间,要么提供剥削性的工资。
我看到有人提出论点,认为对于有闲暇时间且没有其他收入来源的人来说,低薪工作(比如每小时 1 美元)总比没有好。但这种论点是不正确的。支付给某人低于他们生活所需的薪资在道德上是错误的。除此之外,它还加剧了同样的不平等。如果你有一个只能通过剥削性工资才能盈利的商业模式,你正在拖垮整个行业,而其他行业要保持竞争力,只能通过采取同样的做法。因此,你正在帮助创造一个只能通过持续剥削性工资模式来生存的行业,这对任何人都没有帮助。
7.4.1 集体外包工人的薪资
你应该始终公平地支付集体外包工人的薪资。所有主要的集体外包平台都会告诉你有人为你的任务工作了多长时间,但这个数字可能不准确,因为它依赖于浏览器来跟踪时间,并且可能不包括工人在开始工作之前研究任务所花费的时间。
我建议根据他们所在的世界位置和该地点的公平薪资发布数据,支付他们完成工作的公平时薪。每个集体外包市场都允许你通过奖金结构有效地支付时薪,即使不可能直接将时薪纳入支付流程。如果你无法计算出某人花费的确切时间,你应该直接询问工人,而不是冒低估他们薪资的风险。也有软件可以帮助你。¹
如果你认为有人在你预算范围内没有为你完成集体外包工作,每个集体外包平台都会允许你将他们排除在未来的工作之外。你仍然应该支付他们完成的工作。即使你 99%确信他们的工作并不真诚,你也应该支付他们,这样 1%的人就不会不公平地错过机会。
每个主要的集体外包平台都允许你限制工作给某些工人。这种限制可能以你可以授予的资格或工人 ID 列表的形式实施,但结果是一样的:只有那些人将被允许在你的任务上工作。在你找到能够很好地完成你任务的人之后,你可以将你的最重要的工作限制给他们。
每个主要的集体外包平台也实施了一些“可信工作者”类别,这些类别自动评估某人过去的表现,通常基于他们完成并验证的工作量。然而,这些系统很容易被不良行为者控制的机器人诈骗,因此你很可能需要自己培养一个可信工作者池。
制定良好的说明比其他工作群体更困难,因为你通常无法直接互动。此外,工作者可能不会说你的语言,并在浏览器中使用机器翻译来遵循你的指示。如果人们不是为了阅读说明而获得报酬,他们更有可能浏览它们,如果他们不得不不断滚动过去,他们可能会感到烦恼,因此,拥有准确、简洁且翻译成其他语言时仍然有意义的说明非常重要。这并不容易,但这也是一种尊重的做法;如果你是按任务而不是按小时支付人们,你应该尽可能使你的界面高效。我建议将任务分解成更简单的子任务,这不仅对你的质量有益,而且可以让按任务获得报酬的工作者尽可能高效,从而每小时赚取更多。
7.4.2 众包工作者的安全性
众包工作者的工作保障主要来自市场本身。完成任务的人知道在他们完成任务后,还会有其他工作可用。
对于短期安全性,如果你表明有多少工作可用,这有助于工作者。如果工作者知道他们可以连续工作许多小时、几天或几个月来处理你的任务,他们更有可能开始你的任务,但如果你将任务分解成更小的作业,工作者可能不会明显感觉到工作保障。如果你在某个任务中只有 100 个需要标注的项目,但总共将重复同样的任务数百万个,请在任务描述中包含这一事实。当工作者知道更多他们熟悉的工作即将到来时,你的任务对他们来说更有吸引力。
通常,你应该考虑到工作者在按任务支付的工作中没有获得任何福利,并且可能会花费大量时间(通常是 50%或更多)在没有报酬的情况下寻找要工作的项目并阅读说明。相应地支付人们报酬,并为短期、一次性任务支付额外费用。
7.4.3 众包工作者的所有权
类似于外包工作者,众包工作者在尽可能多的透明度下通常会感到更强的所有权感,并产生更好的结果。透明度是双向的:你应该始终从众包工作者那里征求关于你的任务的反馈。一个简单的评论字段就足够了。
即使出于敏感原因你不能识别你的公司,你也应该分享你的标注项目的动机以及它可能带来的好处。当人们知道他们正在创造价值时,他们会感觉更好。
不要将研究生经济学应用到你的数据标注策略中
太多的数据科学家将他们在大学中的数据标注经验带到工业界。在大多数计算机科学课程中,数据标注不被视为一门科学,或者至少不像算法开发那样被高度重视。同时,学生被教导不要重视自己的时间;对于学生来说,花几周时间解决一个可能以几百美元外包的问题是可以接受的。
一个复合因素是,研究生通常几乎没有用于人工标注的预算。他们可能可以访问计算机集群或云服务提供商的免费信用额度,但他们可能没有简单的方法来获取资金以支付人们标注新数据。
因此,按任务付费的众包平台在试图从数据预算中获得最大收益的研究生中很受欢迎。他们也愿意花大量时间进行质量控制,而不是支付给更有专业知识的人以确保数据质量,因为相同的预算限制。由于他们的任务通常数量很少,他们很少成为垃圾邮件发送者的目标,因此质量似乎人为地很高。
因为标注本身不是学生希望推进的科学的一部分,标注通常被视为达到目的的手段。在职业生涯的早期,数据科学家也常常带着这种同样的心态来处理标注。他们希望忽略数据,认为这不是他们的问题,并用自己的资源培养合适的低薪工作者,而不是支付更高的工资给更好的工作者,以便更准确地标注数据。
小心不要让研究生经济学错误地影响你的数据标注策略。本章中的许多建议,例如举办内部数据标注会议和与外包注释员建立直接沟通,将有助于你的企业文化,并确保你以对所有人都有益的方式接近数据标注。
7.4.4 小贴士:创建一条确保工作和职业发展的路径
有很大可能性,你最终会希望一些注释员能够全职工作,即使你最初只需要兼职工作者。如果有一条成为全职工作者的途径,你应该在任务描述中包含这一事实,以吸引最优秀的工作者。
然而,你需要根据个人业绩来构建全职工作的可能性,而不是使情况具有竞争性。如果人们知道他们可能会在一个竞争环境中错失机会,那么工作将存在太大的权力不平衡,这可能导致人们为了未来的工作承诺而做出过多的妥协。简单来说,不要说“前 10 名最佳人员将获得 3 个月的合同”之类的话。如果你不能做出这样的承诺,就什么也不要承诺,以免无意中建立一个剥削性的环境。
如果市场提供反馈和评论,请使用它!任何工作表现良好的人都应得到这种认可,这有助于他们的未来工作和职业发展。
7.5 其他劳动力
你迄今为止看到的三个劳动力——内部员工、外包员工和众包员工——可能覆盖了你所从事的大多数机器学习项目,但其他类型的劳动力可能介于这些类别之间。外包公司可能会在类似众包的结构中雇佣分包商,或者你可能拥有在远程地点作为合同工的内部注释员。你可以为这些配置应用适当的薪酬、安全和所有权的原则组合,以最尊重这些劳动力并确保你获得最佳质量的工作。
在经营较小的公司时,我发现直接雇佣人员而不是使用外包公司往往能取得很多成功。一些在线市场为合同注释员提供了对其过去工作的透明度,当你直接与他们工作时,这更容易确保你公平地支付他们,并公开沟通。这种方法并不总是能够扩展,但对于较小的单一注释项目来说,它可以取得成功。
你还可能涉及其他一些劳动力:终端用户、志愿者、玩游戏的人和计算机生成的注释。我们将在以下部分简要介绍它们。
7.5.1 终端用户
如果你能够从你的终端用户那里免费获取数据标签,你将拥有一个强大的商业模式!从终端用户那里获取标签的能力甚至可能是决定你需要构建哪些产品的一个重要因素。如果你可以从不花费任何成本的数据标签中获得你的第一个工作应用,你就可以稍后再考虑运行注释项目。到那时,你也将拥有良好的用户数据,可以通过主动学习来抽样,以集中你的注释工作。
对于许多应用来说,用户提供的反馈可以推动你的机器学习模型。然而,许多看似依赖终端用户进行训练数据的应用,仍然使用大量的注释员。最明显、最普遍的例子是搜索引擎。无论你是搜索网站、产品还是地图上的位置,你的搜索结果选择都有助于该搜索引擎在未来更智能地匹配类似的查询。
很容易假设搜索系统只依赖于用户反馈,但这并不是事实。搜索相关性是雇佣注释员的最大用例。付费注释员通常负责组件。一个产品页面可能被索引为产品类型(电子产品、食品等),从页面中提取关键词,并自动选择最佳显示图像,每个任务都是一个单独的注释任务。大多数可以从终端用户那里获取数据的系统都花费大量时间在离线状态下注释相同的数据。
用户提供的训练数据最大的缺点是用户实际上在驱动你的采样策略。你在第三章和第四章中学习了如何通过标注错误的数据样本来轻易地偏置你的模型。如果你只采样在特定一天看起来对你用户最有兴趣的数据,你就有可能得到缺乏多样性的数据。可能性是,你用户中最受欢迎的交互可能并不等同于随机分布中的交互,或者对于你的模型来说,了解这些交互是最重要的,因此你可能会得到比随机采样更差的数据。你的模型可能只对最常见的用例准确,而对其他所有用例都表现不佳,这可能会在现实世界中产生多样性的影响。
如果你有一大池原始数据,最好的方法是使用代表性采样来发现你从用户提供的标注中遗漏了什么,然后为通过代表性采样采样的项目获取额外的标注。这种方法将减轻你的训练数据中的偏差,如果它过度采样了用户认为重要的内容而不是对模型最好的内容。
获取用户生成标注的一些最聪明的方法是间接的。CAPTCHA 就是你可能每天都会遇到的例子。一个A CAPTCHA(完全自动化的公开图灵测试,用于区分计算机和人类)是你要完成的测试,以向网站或应用程序表明你不是机器人。如果你完成了一个要求你转录扫描文本或识别照片中对象的 CAPTCHA,那么你很可能正在为某个公司创建训练数据。这种用例很巧妙,因为如果机器学习已经足够好以完成这项任务,那么最初就不需要这些训练数据。这种任务的人力资源有限,除非你所在的组织提供这种人力资源,否则这可能不值得追求。
即使你不能依赖用户进行标注,你也应该使用他们进行不确定性采样。如果没有数据敏感性问题,定期查看你的模型在部署时预测不确定的示例。这些信息将增强你对模型不足之处的直觉,并且采样的项目在标注时将有助于你的模型。
7.5.2 志愿者
对于具有固有利益的任务,你可能能够让人们作为志愿者众包工人来贡献。2010 年,我运行了最大的灾难响应众包。海地发生地震,立即造成 10 多万人死亡,留下超过一百万无家可归的人。我负责灾难响应和报告系统的第一步。我们设立了一个免费电话号码 4636,海地任何人都可以发送短信请求帮助或报告当地情况。海地的大多数人只说海地克里奥尔语,而进入海地的国际灾难响应社区的大多数人只会说英语。因此,我招募并管理了来自 49 个国家的 2000 名海地侨民志愿者来帮忙。当有人向海地的 4636 发送短信时,志愿者会将其翻译成英文,对请求进行分类(食物、药品等),并在地图上标出位置。在地震后的第一个月,超过 45,000 份结构化报告被发送给讲英语的灾难响应人员,平均周转时间不到 5 分钟。
同时,我们将翻译内容与微软和谷歌的机器翻译团队共享,以便他们可以使用这些数据来启动针对海地克里奥尔语的机器翻译服务,这些服务在灾难响应相关数据方面是准确的。这是人类在回路中机器学习首次被用于灾难响应。这种方法自那以后变得更加普遍,但很少在志愿者参与而不是雇佣工人时成功。
我所见过的其他高调、由志愿者驱动的项目是在科学领域,例如基因折叠项目 Fold It²,但这些项目通常是例外而不是规则。一般来说,很难让众包志愿者项目起飞。海地是一个特殊情况,有一大批受过良好教育的人愿意从远方贡献他们能做的一切。
如果你正在寻找志愿者,我建议你通过强大的社会联系找到并管理他们。许多人试图通过社交媒体上的公开呼吁来启动志愿者众包活动,但其中 99%的人都没有达到所需的人数。更糟糕的是,志愿者来去匆匆,他们可能没有达到正确的准确水平就离开了,并且为培训消耗了大量资源。对于那些提供大量工作的志愿者来说,看到这么多人来来去去也是令人沮丧的。
当你直接联系人们并在少数志愿者周围建立社区时,你更有可能成功。你会在开源编码项目和像维基百科这样的项目中看到相同的模式;大部分工作都是由少数人完成的。
7.5.3 玩游戏的人
将工作游戏化介于有偿工人和志愿者之间。大多数尝试从游戏中获取训练数据的尝试都失败了。你可以使用这种策略,但我不建议将其作为获取注释的方式。
我在游戏中取得的最大成功是在流行病追踪工作中。在欧洲发生大肠杆菌疫情期间,我们需要人们注释关于受影响人数的德语新闻报道。我们在众包平台上找不到足够的德语使用者,而这一事件发生在专门从事机器学习注释的外包公司之前。我们最终在在线游戏《农场小镇》中找到了德语使用者,并在游戏中用虚拟货币支付他们来注释新闻文章。所以,在德国室内的人被支付虚拟农业货币来帮助追踪在德国田野外发生的真实农业疫情。
这个案例是一个一次性用例,很难看出它可能具有剥削性。我们为每个任务支付了少量金钱,但玩游戏的人得到了在游戏中完成这项工作所需 10 倍时间的补偿。
我还没有看到除了游戏本身或专注于学术研究的 AI 之外,能够生成有趣训练数据的游戏。人们花费了难以置信的时间玩在线游戏,但现在这个潜在的工作力量在很大程度上还未被挖掘。
注意,我不建议你将有偿工作游戏化。如果你强迫某人在类似游戏的环境中完成有偿工作,如果这项工作感觉不是最有效率的注释数据的方式,那个人会很快感到厌烦。想想你自己的工作。如果它有你在游戏中遇到的那种人工障碍,会更有趣吗?
也有大量证据表明,如提供排行榜等策略总体上是负面的,只能激励少数顶尖的领导者,而使大多数不在排行榜前列的人失去动力。如果你想从游戏行业吸取任何东西应用到有偿工作中,请使用透明度的原则:让人们知道他们的个人进度,但要以他们为组织做出的贡献来衡量,而不是他们与同龄人的比较。
7.5.4 模型预测作为注释
如果你可以从另一个机器学习应用中获取注释,你可以以较低的成本获取大量注释。这种策略很少会是获取注释的唯一策略。如果一个机器学习算法已经能够产生准确的数据,为什么你需要为新模型提供注释呢?使用现有模型的高置信度预测作为注释的策略被称为半监督机器学习。
第九章更详细地介绍了使用模型预测作为注释。所有自动标记策略都可能延续您模型的现有偏见,因此它们应与人工注释标签结合使用。所有显示无额外人工标签的领域适应的学术论文都局限于狭窄的领域。
图 7.6 展示了在尽可能避免延续过去模型中的偏见和限制时,如何开始使用计算机生成的注释的示例。首先,您可以使用现有模型自动生成注释,并仅选择那些置信度高的注释。正如您在第三章中学到的,您不能总是仅信任置信度,尤其是如果您知道您正在将模型应用于新的数据领域。如果现有模型是一个神经网络,并且您可以访问其 logits 或隐藏层,还应排除在模型中整体激活度低的预测(基于模型的异常值),这表明它们与模型训练的数据不相似。然后使用代表性抽样来识别您无法自动标记的项目,并对这些项目进行抽样以供人工审查。

图 7.6 使用计算机生成的注释并通过代表性抽样进行增强。如果您为您的任务有单独的模型,您可以使用该模型自动生成标签。最好专注于高度置信的预测(如果可以访问)以及网络中激活度高的预测:基于模型的异常值。然后使用代表性抽样来识别您无法自动标记的项目,并对这些项目进行抽样以供人工审查。
对于一个稍微复杂一些的方法,您可以使用自适应代表性抽样来减少您需要抽样的项目数量。通过更多的复杂性,您可以使用聚类和代表性抽样的组合,正如您在第五章中学到的。如果您要解决的问题在数据集的特征空间中本质上是异质的,那么结合聚类和代表性抽样是理想的。
使用计算机生成的注释可能是您模型的最大推动力,也可能是最大的陷阱,这取决于您的数据和现有可用模型的质量。为了确定这种方法是否适合您,要考虑人类注释组件的全部成本。如果您已经需要花费大量时间来完善正确的指令、整合和培训人力,那么通过减少工人需要注释的数量来节省的钱可能并不多。也就是说,优势可能没有您想象的那么大。
在某些情况下,例如机器翻译,使用现有模型是最好的起点。为大量数据获取人工翻译的成本很高,因此几乎总是更经济高效地使用一个以最初机器翻译的数据集开始的模型。
另一个可以使用计算机生成的标注作为起点的情况是,当您正在将遗留系统适应到更新的机器学习模型时。假设您有一个包含大量手动编写的规则或手动调整的系统来提取正确特征的老旧系统,并且您希望将该系统适应到一个不需要手动编写的规则或特征的较新的神经机器学习系统中。您可以将遗留系统应用于大量原始数据,并使用生成的预测作为您的标注。这个模型可能不会立即达到您想要的准确度,但它可以是一个好的起点,并且额外的主动学习和标注可以在此基础上进行。第九章涵盖了将模型预测与人工标注相结合的许多方法——这是一个令人兴奋且快速发展的研究领域。
7.6 需要标注的量估计
无论您使用哪种劳动力,您通常都需要估计标注数据所需的总时间。随着标注数据的增加,将您的标注策略分为四个阶段是有用的:
-
有意义的信号—优于随机准确度。您的模型准确度在统计学上优于随机水平,但参数或起始条件的小幅变化会导致模型在准确度和正确分类的项目上有所不同。在这个阶段,您已经有了足够的信号来表明更多的标注会增加准确度,并且这种策略值得追求。
-
稳定的准确度—一致但低准确度。您的模型准确度仍然较低,但它是稳定的,因为参数或起始条件的小幅变化会产生在准确度和正确分类的项目上相似的模型。您可以从这个阶段开始信任模型的置信度和激活,充分利用主动学习。
-
部署的模型—对于您的用例来说足够高的准确度。您有一个足够准确以用于您的用例的模型,并且您可以从将其部署到您的应用程序开始。您可以从部署的模型中开始识别不确定的项目或代表新、未见过的示例,调整您的模型以适应其遇到的变化数据。
-
最先进的模型—行业领先的准确度。您的模型在您的行业中是最准确的。您继续在部署的模型中识别不确定的项目或代表新、未见过的示例,以便在变化的环境中保持准确度。
在我所看到的每个行业中,赢得长期胜利的最先进模型都是因为更好的训练数据,而不是因为新的算法。因此,更好的数据通常被称为数据护城河:数据是阻止你的竞争对手达到相同精度水平的障碍。
7.6.1 需要标注数量的数量级方程
考虑到你的项目所需的数据量,最好的思考方式是按数量级来考虑。换句话说,为了使模型精度指数级增长以达到某些里程碑,所需的标注数量。
假设你有一个相对简单的二分类预测任务,例如本书第二章中预测灾害相关和非灾害相关信息的例子。你可能得到一个类似这样的进展,假设 N=2(见图 7.7):
-
100(10^N)个标注——有意义的信号
-
1,000(10^(N+1))个标注——稳定精度
-
10,000(10^(N+2))个标注——部署的模型
-
100,000(10^(N+3))个标注——最先进的模型

图 7.7 训练数据的数量级原理。估计比有意义信号到稳定精度再到部署模型和最先进模型多一个数量级的数据。在开始标注数据并看到实际精度提升之前,使用这个原理作为基准来估计你需要的数据量。
你将能够通过主动学习和迁移学习减少需要标注的项目数量,但步骤函数仍然大约是指数级的,尤其是在 N 较低的情况下(例如,N=1.2)。同样,对于需要大量标签或复杂任务(如全文生成,N=3)的任务,可能需要更多的标注。在这种情况下,你应该假设步骤函数仍然是大约指数级的,但 N 值更高。
当实际标注开始到来时,你可以开始绘制你的真实精度提升,并更好地估计你需要多少数据。绘制的精度提升(或如图 7.7 所示的错误减少)被称为你的模型的学习曲线,但这个名字有双重含义:人们经常将单个模型收敛时精度的提升也称为学习曲线。如果你的机器学习框架显示了学习曲线,请检查该名称是否指的是随着数据量的增加而增加的精度,还是指模型收敛到一定量的数据时的精度增加。这两种情况是不同的。
即使你有自己的数据进来,也要记住图 7.7 中显示的收益递减。当你的准确度随着前 100 或 1000 个标注快速上升时,这可能会令人兴奋,但在此之后准确度提高的速度会慢得多。这种体验很典型。不要急于尝试玩弄算法架构和参数,因为那正是你最熟悉的。如果你发现随着数据的增加,准确度在提高,但增长速度呈指数级放缓,那么这个模型可能正在按预期运行。
7.6.2 预计标注培训和任务细化需要一到四周
你的机器模型已经准备好了,你已经证明它可以用一个流行的开源数据集工作。现在你准备好为你的应用打开真实标注数据的洪流了!
如果你没有并行设置你的标注策略,你可能会感到惊讶:你可能需要等待几周。等待是令人沮丧的,但正如我在本章开头所建议的,你应该同时开始你的数据和算法策略。如果你发现数据与你在最初试点时使用的开源数据集差异太大(可能某些标签非常罕见或数据的多样性要高得多),无论如何你都需要回到你的机器学习架构的草稿上。不要急于标注,但如果必须为了快速结果而加快速度,要做好准备,因为缺乏质量控制,这些标注可能会出现太多错误。
在与你的数据标注领导进行多次迭代以正确制定说明、调查任何系统性错误以及适当细化你的指南之前,你才能自信地打开数据洪流来标注大量数据。
预计需要几周时间才能使标注过程顺利运行,而不是几天(尽管不应该需要你很多个月才能使标注过程顺利运行)。如果任务很简单,比如用相对较少的标签标注照片,那么可能接近一周;你需要清晰定义每个标签的计数标准,但这应该不会花费太多时间来细化。如果你有一个更复杂的任务,涉及不寻常的数据和标注要求,那么细化你的任务和标注员在培训中逐步提升可能需要接近一个月的时间,并且随着更多边缘情况的发现,你将不断细化你的任务。
当你等待你的标注团队接受培训时,如果需要立即获取数据,你可以自己开始标注数据。这将让你对你的数据有更深入的了解,这将对你的模型和标注指南都有帮助。
7.6.3 使用你的试点标注和准确度目标来估算成本
当你将注释过程精炼到足以自信你的指南全面且注释者已经接受了你的任务培训时,你可以估算成本。考虑你的准确度要求,使用第 7.6.1 节中的量级指南来估算所需的总注释数量。你需要最先进的技术吗?如果是这样,你可以将实现最先进结果所需的量级乘以每个注释的成本,并估算总成本。结果可能有助于确定你的产品策略。如果你没有预算达到最初计划的最先进准确度,你仍然可能能够获得足够高的准确度以满足你的用例,这可能会改变你的产品开发策略。对你自己和你的利益相关者诚实地评估你能够达到的准确度是很重要的。如果你的模型在开源数据集上是最先进的,但由于预算限制,它将无法达到该准确度,那么你需要为你的项目中的所有利益相关者设定期望。
我们尚未涉及的一个变量是每个项目注释者的数量。你通常会将相同的任务分配给多个人,以在他们之间找到共识,并产生比任何单个注释者能创造的更准确的学习数据。我们将在第八章中介绍这种质量控制方法。现在,只需了解你可能为每个项目获得多个注释,并且这些结果需要成为你预算的一部分。
当然,你的标签预算可能从一开始就是固定的。在这种情况下,确保你仔细实施良好的主动学习策略,以便从每个注释中获得最大收益。
7.6.4 合并工作团队类型
将工作团队合并的一个常见原因是质量控制。工作流程和选择标签工作团队的方式是确保你为数据获取准确标签的常见方法(第八章)。其他常见原因包括数据敏感性和复杂性,这意味着某些数据过于敏感或复杂,不能外包,而某些数据则可以,从而导致多个工作团队的产生。
当在大型公司工作时,我通常同时与多家数据标注公司合作,以降低我的管道风险,不依赖任何供应商成为数据标签的唯一来源。如果你最终拥有多个工作团队,显然你需要为每个工作团队制定预算,并将预算合并以获得整个项目的总支出。
摘要
-
标注的主要工作团队类型有三种:内部、外包和众包。了解这些工作团队将帮助你选择最适合你任务的工作团队或组合。
-
激励注释者的三个关键原则是薪酬、安全和透明度。了解如何将这些原则应用于不同的工作团队,将确保通过拥有最快乐的团队来获得最佳可能的工作成果。
-
你可以考虑一些非货币补偿系统,包括应用终端用户、志愿者和计算机生成数据/标注。当你受预算限制或需要特殊资质时,你可能需要考虑这些替代劳动力。
-
不要将研究生经济学应用到你的数据标注策略中。
-
数量级原理让你可以估算你的总标注量需求。这个原理帮助你规划标注策略,并使用有意义的早期估计,随着你继续进行可以对其进行细化。
(1.)一个最近的例子是论文“公平工作:一行代码的众包最低工资”,作者为 Mark Whiting、Grant Hugh 和 Michael Bernstein (mng.bz/WdQw).
(2.)“与公民科学家合作构建从头开始的冷冻电子显微镜结构”,作者为 Firas Khatib、Ambroise Desfosses、Foldit Players、Brian Koepnick、Jeff Flatten、Zoran Popovic´、David Baker、Seth Cooper、Irina Gutsche 和 Scott Horowitz (mng.bz/8NqB).
8 数据标注的质量控制
本章涵盖
-
计算标注者与真实数据之间的准确性
-
计算数据集的整体一致性和可靠性
-
为每个训练数据标签生成置信度分数
-
将主题专家纳入标注工作流程
-
将任务分解成更简单的子任务以改进标注
您的机器学习模型已经准备就绪,您也安排了人员来标注您的数据,所以您几乎可以部署了!但您知道,您的模型将只与它所训练的数据一样准确,所以如果您无法获得高质量的数据标注,您将不会有一个准确的模型。您需要将相同的任务分配给多个人,并取多数人的意见,对吧?
不幸的是,您的标注任务可能要困难得多。我见过标注被低估的情况比机器学习循环中任何其他部分都要多。即使您有一个简单的标注任务——比如决定一张图片是否包含行人、动物、骑自行车的人或标志——当所有这些标注者都看到了不同的任务组合时,您如何决定标注者之间多数一致性的正确阈值?您如何知道当整体一致性如此低时,您需要改变您的指南或定义任务的方式?即使在简单的标注任务中计算一致性的统计方法也比大多数神经模型背后的统计方法更高级,因此理解它们需要时间和实践。
本章和接下来的两章使用预期和实际标注准确性的概念。例如,如果有人对每个标注随机猜测,我们预计他们会得到一定比例的正确答案,因此我们将实际准确率调整以考虑随机机会的基础线。预期和实际行为的概念适用于许多类型的任务和标注场景。
8.1 将标注与真实答案进行比较
测量标注质量的最简单方法也是最强大的方法之一:将每个标注者的响应与一组已知答案(称为真实答案)进行比较。一个标注者可能会标注 1,000 个项目,其中 100 个有已知答案。如果标注者正确地回答了其中 80 个已知答案,那么您可以估计他们在 1,000 个项目中的准确率是 80%。
然而,你可以以许多方式错误地实现真实数据的创建,而且不幸的是,几乎所有错误都会使你的数据集看起来比实际更准确。如果你在创建评估数据和训练数据的同时没有良好的质量控制,你将在训练数据和评估数据中遇到相同类型的错误。结果模型可能在某些上下文中预测错误的标签,但真实数据评估将具有相同类型的错误,因此你可能直到部署你的应用程序并失败之前都不会意识到你有错误。
错误的最常见原因是采样了错误的项目作为真实数据。三种一般的采样策略识别出应该成为真实数据的项目:
-
数据的一个随机样本——你应该评估你的单个标注者在随机数据上的准确性。如果随机选择不可行,或者如果你知道随机样本不能代表你的应用程序所服务的群体,你应该尝试获取尽可能接近代表性的样本。
-
与正在标注的数据批次具有相同特征和标签分布的数据样本——如果你正在使用活动学习,这个样本应该是你当前活动学习迭代的随机样本,这允许你计算每个数据样本的(人工)准确性,以及由此推断出整个数据集的准确性。
-
在标注过程中找到的数据样本,这些样本对于标注指南非常有用——这些指南通常举例说明了重要的边缘情况,这些情况对于教导标注者尽可能准确非常有用。
在我们的人类在环架构图中,如果我们放大查看标注组件,我们会发现工作流程比图 8.1 中展示的高级图要复杂一些。

图 8.1 标注的信息流。除了根据我们当前的活动学习策略采样的数据外,我们还采样了一组随机或代表性的数据以及一些标注者已经看到的数据。采样随机/代表性数据使我们能够以使确定标注者在数据集间的可靠性以及他们是否是晋升为专家的候选人为易的方式计算标注者的准确性。在当前的活动学习批次中进行采样,使我们能够计算特定数据集的准确性。在标注过程中进行采样,找到对标注指南和专家裁决最有用的项目。
为了确保你的真实标签尽可能准确,你需要借鉴本章以及可能的后两章中的许多方法。你必须确信你的真实标签错误很少;否则,你会创建误导性的指南,并且不会有可靠的准确度指标,从而导致训练数据质量差。你不能走捷径。如果你的真实标签只是那些达成高度一致的项目,你很可能会过度采样最容易标注的项目,这会使你的准确度看起来比实际更好。
当你有一个可以用来评估每个标注员的真实标签数据集时,你可以调整你的标注项目以使其质量更高、效率更高。使用标注员间的一致性进行质量控制,在有少量但可靠的真实标签数据集的支持下,也会变得更加有效。正如第九章所示,当你知道他们的错误模式时,即使是最不准确的标注员也能提供可靠的信号。

图 8.2 在本章的剩余部分以及第九章和第十章中,我们将使用这个示例数据。五位标注员——名为 Alex、Blake、Cameron、Dancer 和 Evan——根据图像中的对象标注了一张图片。我们将假设这张图片与之前章节中使用的图片类型相同,有四个标签:“动物”、“骑自行车的人”、“行人”和“标志”。在这个例子中,Alex 看到了七张图片(任务 1、3、5、6、7、8 和 9);将前三张标注为“行人”;将剩下的每张标注为“骑自行车的人”、“行人”、“动物”或“标志”。右边的图片显示了标注界面的可能外观。
在本章和第九章中,我们将使用图 8.2 中显示的示例数据。尽管你的数据集可能比图 8.2 中的 11 行包含更多的项目,但这 11 行足以让你学习可能实施的质量控制类型。在本章中,我们将使用图 8.2 中数据的正确答案的不同变体,但保持注释与图中的相同。对于本节,让我们假设我们为这些示例中的每一个都提供了真实标签。
你应该如何称呼标注员?
对于创建训练和评估数据的人,有许多术语,包括评分员、编码员、裁决员、代理、评估员、编辑、裁判、标签员、先知、工人和Turker(来自 Mechanical Turk 平台,有时用于其他软件)。在工业界,标注员可能以他们的职位名称,如分析师,他们使用的技能,如语言学家,或他们的就业状态,如承包商或零工经济工作者来称呼自己。在其他情况下,标注员被称为主题专家,有时缩写为专家或缩写词SME(发音为“smee”)。
如果您正在寻找额外的阅读材料,请确保尝试不同的名称作为搜索词。您可能会找到关于注解员间一致性、评分者间一致性和编码者间一致性等类似论文。
本书使用“注解员”这个术语,因为它最不可能与其他角色混淆。如果您与注解数据的人合作,请使用您组织中该人员的正确头衔。本书还避免使用“训练”注解员(以消除与训练模型混淆)的说法,并使用诸如“指南”和“说明”之类的术语代替“培训材料”。再次提醒,请使用您组织中该过程的首选描述来教授注解员特定任务的说明。
8.1.1 注解员与真实数据的一致性
标签任务中与真实数据一致性的基本数学很简单:注解员正确评分的已知答案的百分比。图 8.3 给出了我们示例数据中每个注解员的假设准确度。

图 8.3 注解员准确度与真实数据对比的示例。假设真实数据列包含每个任务的已知答案(图像标签)。我们计算每个注解员的准确度为他们正确回答的比例。
通常,您希望根据随机猜测的基线调整如图 8.3 所示的结果。我们可以为我们随机机会标签计算三个基线。假设 75%的图像是“行人”,10%是“标志”,10%是“骑自行车的人”,5%是“动物”。这三个基线是
-
随机—注解员猜测四个标签中的一个。在我们的示例数据中,这个基线是 25%,因为我们有四个标签。
-
最频繁的标签(众数标签)—注解员知道“行人”是最频繁的标签,因此他们总是猜测这个标签。这个基线是 75%。
-
数据频率—注解员根据每个标签的频率进行猜测。他们 75%的时间猜测“行人”,10%的时间猜测“标志”,等等。这个基线可以计算为每个概率平方的和。
图 8.4 显示了计算过程。

图 8.4 通过随机机会预期不同准确度的三种计算,显示根据我们使用的基线,预期准确度范围广泛。
调整后的准确度将注解员的分数进行标准化,使得随机猜测的基线变为 0。假设某人的总体准确度为 90%。他们的实际准确度,经过机会调整,如图 8.5 所示。

图 8.5 展示了在测试注释者与真实数据对比时,从随机猜测或机会调整的准确性中建立不同基线预期的方式。顶部:我们如何归一化结果。如果有人随机选择标签,他们有时会选中正确的标签,所以我们用随机准确性和 1 之间的距离来衡量准确性。底部:不同的调整准确性在我们的示例数据中的外观。请注意,总是猜测“行人”的 60%准确率的归一化分数与 90%的原始准确率分数或根据标签数量归一化时的 86.7%不同。这个例子突出了为什么正确的预期准确性基线如此重要。在某些情况下,这三个基线中的每一个都是更好的选择,因此了解所有三个都是很重要的。
如图 8.5 所示,我们有不同的方法来归一化注释计数。在统计学界最常用的方法是数据频率,这是一种以数据为中心的方式来思考预期行为。它总是在随机选择和最频繁之间,因此它具有作为安全中间选项的优良特性。
因为预期的基线变为零,任何小于零的结果都意味着该人猜测的结果比随机机会更差。通常,这个结果意味着注释者没有正确理解指示,或者以简单的方式欺骗系统,例如总是猜测一个最不频繁的响应。在任何这些情况下,将基线归一化到零为我们提供了一个简单的方法来设置任何任务的警报。无论任务是什么,调整随机机会后的负分都应该在你的注释过程中引发警报!
如果你熟悉关于注释质量控制的文献,你知道根据预期行为归一化的度量通常被称为机会校正或机会调整。在这本书的许多情况下,预期行为不是随机机会,例如当我们询问注释者他们期望其他注释者选择什么时(第九章)。对于这些情况,更一般的术语预期被使用,但对于客观标签任务,预期和机会意味着同一件事。
8.1.2 应该使用哪个基线来衡量预期的准确性?
对于预期的准确性三个基线——随机、数据频率和最频繁——计算所有三个度量将有助于你对数据的直观认识。用于归一化准确性的正确度量将具体取决于你的任务和标注数据的人的经验。
当一个人刚开始从事一项任务时,他们不会对哪个标签更频繁有直观的认识,因此他们更有可能接近随机标签。但过了一段时间后,他们会意识到其中一个标签比其他标签更频繁,并且在不确定时可能会感到安全地猜测那个标签。因此,第十一章完全致力于注释的用户界面。
我的实际建议是在标注员熟悉一项任务后再应用最严格的基线:最频繁的标签。您可以将任务的最初几分钟、几小时或几天视为标注员熟悉任务的预热期。当标注员对数据有强烈的直觉时,他们会考虑标签的相对频率。然而,如第 8.2.3 节所示,数据频率对于计算整个数据集层面的协议更为相关。因此,了解所有基线并在正确的时间应用它们是很重要的。
对数据标注进行高质量控制可能需要大量资源,并且应该纳入您的预算考虑。请参阅以下侧边栏,了解质量控制如何导致为项目聘请了不同的一组标注员。
考虑标注项目的总成本
马修·霍尼巴尔的专家轶事
与标注您数据的个人直接沟通是有帮助的,就像与您组织中的任何其他人一样。不可避免的是,您的一些指示在实际操作中可能不起作用,您需要与标注员紧密合作来完善它们。您也可能在生产开始后继续完善指示和添加标注。如果您不花时间考虑完善指示和丢弃错误标记的项目,很容易得到一个表面上看起来很便宜但实际上很昂贵的外包解决方案。
2009 年,我参与了悉尼大学和一家主要澳大利亚新闻出版商之间的联合项目,该项目需要命名实体识别、命名实体链接和事件链接。尽管当时学术界越来越多地使用众包工作者,但我们还是直接建立了一个小型标注员团队。从长远来看,这最终证明要便宜得多,尤其是在对于众包工作者难以应对的更复杂的“实体链接”和“事件链接”任务中,我们的标注员通过与我们的直接工作和沟通得到了帮助。
马修·霍尼巴是 spaCy NLP 库的创建者和 Explosion 的联合创始人。自 2005 年以来,他一直在从事 NLP 研究。
8.2 标注者间一致性
当数据科学家谈论他们的机器学习模型比人更准确时,他们通常意味着模型比普通人更准确。例如,语音识别技术现在在非技术性转录的常见口音中比普通英语说话者更准确。如果人类无法以这种准确度创建评估数据,我们如何评估这些语音识别技术的质量?
“群众的智慧”产生的数据比任何单个人类更准确。一个多世纪以来,人们一直在研究如何将多人的判断汇总成一个更准确的结果。在最早的例子中,有著名的研究表明,当多人猜测一头牛的重量时,所有猜测的平均值接近正确。这个结果并不意味着每个人的准确性都低于平均值:个人猜测牛的重量可能比平均值更准确,但平均猜测比大多数人更接近真实重量。
因此,当数据科学家吹嘘他们的模型比人类更准确时,他们通常意味着他们的模型比标注者之间的一致性更准确,这被称为标注者间一致性。模型准确性和标注者一致性是两个不同的数字,不应直接比较,因此请尽量避免犯这个常见错误。
然而,有可能创建比所有参与标注的个体更准确的训练数据,本章在介绍基础知识后,将在第 8.3 节回到这个话题。
8.2.1 标注者间一致性简介
标注者间一致性通常在-1 到 1 的范围内计算,其中 1 是完全一致,-1 是完全不一致,0 是随机标签。我们通过询问我们的协议比预期好多少来计算一致性,类似于我们之前提到的单个标注者准确度评分,但在此情况下是针对一致性。图 8.6 展示了示例。

图 8.6 展示了如何计算一致性指标。一致性通常在-1 到 1 的范围内,其中 1 是完全一致,-1 是完全不一致,0 是随机分布。这种一致性结果被称为实际一致性、调整后一致性或随机机会调整后的一致性。
图 8.6 展示了如何计算考虑随机机会一致性的方法。这种调整类似于根据真实答案调整准确度,但在此情况下,它是比较标注者。
本书涵盖了不同类型的标注者间一致性,包括整个数据集层面的总体一致性、标注者之间的个体一致性、标签间的一致性以及基于每个任务的特定一致性。这些概念相对简单,我们将从图 8.7 中的简单朴素一致性算法开始介绍。这个算法非常简单,以至于你不应该使用它,但它理解本章及下一章中方程的有用起点。

图 8.7 以一种天真方式找到每个标注者的协议、每个任务的协议以及整个标注集的整体协议。我们以随机选择四个标签中的一个来计算预期一致性。我们在中间的大表中计算每个任务的协议。我们从协议表中推导出每个人的和每个任务的协议。我们通过结合预期和平均任务级协议来推导出整体协议。尽管你不应该用这种方法处理你的实际数据,因为它太简单了,但这个图对于突出概念是有用的。
图 8.7 展示了三种类型一致性的基本思想。尽管所有这些计算都是合理的,但它们在某种程度上有所不足。以下是图 8.7 的一些不足之处,突出了计算一致性中的复杂性:
-
总体预期一致性基于标签数量,但有些标签比其他标签更常见。如果第五个标签从未被选择,那么由于这个原因降低总体预期一致性似乎是不合适的。
-
个人一致性似乎不公平地惩罚了人们在同一任务上犯的错误。例如,Evan 总是同意多数投票的标签,但他的一致性得分是第二低的。
-
任务一致性得分似乎过于乐观,因为它们没有考虑到个别标注者的准确性。
-
实际一致性平均了任务一致性,但如果我们决定通过平均个人一致性来计算,它将会低得多。正确汇总个人一致性以产生更准确的总体观察实际一致性的方法是什么?
-
任务 11 只有一个响应,所以将其计算为 100%一致似乎是不正确的;对于这个响应来说,没有什么可以达成一致的地方。
-
我们没有跟踪标签的一致性。例如,“行人”是否比“标志”更容易混淆?
-
我们没有考虑总的标注数量。特别是在标注数量相对较少的情况下,可能会有数据规模的艺术品效应(尽管这对于典型的包含数千个项目的训练数据集来说不太相关)。
你可以在这个电子表格中尝试这个实现,电子表格的链接是mng.bz/ E2qj。这个电子表格还包含本章中的一些其他方程式。
8.2.2 至 8.2.7 节专门讨论了处理这些问题的最佳方法。尽管数学计算比本书中之前看到的任何内容都要复杂,但请记住,它解决的是一个简单的问题:
我们如何公平地计算标注者间的一致性来评估我们数据集、单个任务、单个标签或个别标注者的准确性?
8.2.2 计算标注者间一致性的好处
你可以用标注者间一致性作为你人类在环机器学习策略的一部分,以多种方式使用:
-
您数据集的可靠性—标注者是否经常达成一致,以至于您可以依赖已经创建的标签?如果不是,您可能需要重新设计您的指示或整个任务。
-
最不可靠的标注者—是否有任何标注者与其他人太频繁地发生分歧?他们可能误解了任务,或者可能不具备继续参与的条件。无论如何,您可能想要忽略他们过去的标注,并可能获得新的判断。或者,一个不可靠的标注者实际上可能有一些有效但代表性不足的标注,尤其是在主观任务中(参见本列表后面的“测量自然变异”)。
-
最可靠的标注者—高度一致的标注者可能是您任务中最准确的人,因此识别这些人以获得潜在的奖励和晋升是有帮助的。
-
标注者之间的协作—是否有任何标注者几乎完美地达成一致?他们可能因为坐得很近而无意中共享笔记,在这种情况下,您需要从任何假设独立性的协议计算中移除这些响应。另一方面,这个结果可能是证据表明一个机器人正在复制一个人的工作,使得这个人错误地得到了两次报酬。无论根本原因是什么,了解两组答案实际上只是一组重复的答案是有帮助的。
-
标注者随时间的一致性—如果您在不同的时间给同一个人相同的任务,他们是否给出相同的结果?这个指标,被称为标注者内部一致性,可以证明标注者没有注意,您的任务有顺序效应,以及/或者任务本质上是主观的。此外,标注者可能随着看到更多数据而真正改变主意,这被称为概念演变。
-
为指示创建示例—您可以假设在大量标注者之间高度一致的项目是正确的,并让这些项目成为新标注者指南中的示例。因为您使用这种策略有两个风险——一些错误仍然会通过并传播,并且只有更容易的任务会通过更高的协议——因此您不应将其作为创建地面真实数据的唯一策略。
-
评估机器学习问题的内在难度—一般来说,如果任务对人类来说很难,那么对您的模型来说也会很难。这个信息对于适应新领域特别有帮助。如果您的数据历史上具有 90%的一致性,但来自新来源的数据只有 70%的一致性,这个结果告诉您,您的模型在来自那个新来源的数据上可能不太准确。
-
测量数据集的准确性—如果你知道每个注释者的个人可靠性以及有多少人注释了每个项目,你可以计算出任何给定标签被错误注释的概率。从这个结果中,你可以计算出数据的整体准确性。考虑个人注释者的准确性,与简单的注释者间一致性相比,为你提供了一个更好的模型准确性的上限。模型对训练数据中的噪声可能更敏感或不太敏感,所以这个限制并不是一个严格的限制。这个限制是一个严格的限制,即你如何精确地测量模型准确性的上限,因为你不能将模型的准确性计算得高于数据集的准确性。
-
测量自然变异—对于某些数据集,缺乏一致性是一件好事,因为它可以表明多个注释解释是有效的。如果你有一个主观的任务,你可能想确保你有多样化的注释者选择,这样就不会无意中导致数据存在偏见。
-
将困难任务提升到专家级别—这个例子在第七章中已经讨论过,我们再次在第 8.5 节中回到它。低资格的工人之间的低一致性可能意味着该任务应该自动路由给专家进行审查。
8.2 节剩余部分包含了计算数据集中一致性的最佳当前方法。
不要仅使用一致性作为准确性的唯一衡量标准
你不应该仅依靠注释者间一致性来找到数据的正确标签;始终将注释者间一致性与真实数据结合使用。许多数据科学家反对这种做法,因为这意味着失去了训练数据。例如,如果 5%的标记数据被留出用于质量控制,那么他们用于模型训练的数据就少了 5%。虽然没有人喜欢训练数据减少,但在现实世界中,你可能会有相反的效果:如果你仅依靠注释者间一致性来获取标签,你将使用超过 5%更多的人工判断,因为你可以使用真实数据来更好地校准你的一致性。
仅查看一致性也可能隐藏错误注释达成一致的情况。没有真实数据,你将无法对这些错误进行校准。
另一方面,一致性允许你将准确度分析扩展到仅使用真实数据无法实现的范围之外,因此当你将一致性与真实数据结合使用时,你会获得最大的好处。例如,你可以使用真实数据计算每个注释者的准确性,然后使用这个准确性作为你在聚合多个注释进行任务时的置信度。本章和第九章展示了根据你解决的问题,结合一致性和真实数据的许多示例,但它们是独立引入的,以解释孤立的概念。
8.2.3 使用 Krippendorff 的 alpha 进行数据集级别的一致性
Krippendorff 的 alpha 是一种旨在回答简单问题的方法:我的数据集中整体一致性如何?为了考虑到并非每个项目都会被每个注释者标注的事实,Krippendorff 的 alpha 在用于诸如测量调查和人口普查数据中的一致性水平等任务时,对现有的社会科学中流行的协议算法进行了重大改进。
Krippendorff 的 alpha 简单解释是它是一个 [–1,1] 范围,可以如下阅读:
-
>0.8—这个范围是可靠的。如果您将 Krippendorff 的 alpha 应用于您的数据,并且得到的结果为 0.8 或更高,您具有高度的一致性,并且可以用来训练您模型的可靠数据集。
-
0.67–0.8—这个范围可靠性低。可能有些标签非常一致,而有些则不是。
-
0–0.67—小于 0.67 时,您的数据集被认为可靠性低。您的任务设计或注释者可能存在问题。
-
0—随机分布。
-
–1—完全不一致。
Krippendorff 的 alpha 还有一个很好的特性,它可以用于分类、有序、层次和连续数据。在实践中,大多数时候您可以使用 Krippendorff 的 alpha 而不必了解算法的工作原理,并根据 0.8 和 0.67 阈值来解释输出。但是,为了理解底层发生的事情以及何时可能不合适,了解数学直觉是个好主意。如果您第一次没有完全理解所有步骤,请不要担心。当我重新推导这本书中的所有方程时,推导 Krippendorff 的 alpha 比任何主动学习或机器学习算法都花的时间更长。
Krippendorff 的 alpha 旨在计算与本章前面图 8.7 中的简单示例相同的指标:我们的实际一致性相对于预期一致性如何?我们将从一个适用于互斥标签的 Krippendorff 的 alpha 的部分实现开始,然后转向更通用的版本。
Krippendorff 的 alpha 的预期一致性是数据频率:对每个标签进行标注任务时每个标签频率的平方和。Krippendorff 的 alpha 的实际一致性来自每个注释与同一任务的其他注释的平均一致程度。Krippendorff 的 alpha 对平均值,即 epsilon,进行轻微调整,以考虑到有限注释数量导致的精度损失。
Krippendorff 的 alpha 是图 8.6 中预期一致性和实际一致性的调整协议。我们可以通过图 8.8 中的简化表示看到我们的示例数据中的 Krippendorff 的 alpha。

图 8.8 展示了简化的 Krippendorff 的 alpha,为我们的示例数据提供了注释者可靠性的总体得分。预期的协议是每个标签频率的平方和。实际的协议是每个注释与其他注释对该任务的协议的平均量,并对计算中的精度进行了小的调整(epsilon)。
图 8.8 中的协议比图 8.7 中的“天真协议”低得多(0.803 与 0.921 相比),这表明我们在计算协议时需要小心,并且我们假设的小变化可能会导致质量控制指标的大幅差异。
图 8.8 是 Krippendorff 的 alpha 的部分实现。完整方程考虑了您可能对某些类型的差异进行更严重加权的可能性。Krippendorff 的 alpha 的完整实现如图 8.9 所示。

图 8.9 展示了 Krippendorff 的 alpha,计算数据集中协议的整体水平,以确定它是否足够可靠用于训练数据。输入是白色区域:注释(左下角)和标签权重(右上角)。因为我们有互斥的标签,所以这个例子中每个标签只与自身加权。如果我们有层次结构、顺序或其他类型的数据,我们将输入不同的值作为标签权重。计算的上行包含随机机会的预期协议,计算的下行计算数据中的实际协议。这两行用于计算数据集的预期协议(pe)和实际协议(pa),从而计算出调整后的总体协议 alpha。
虽然图 8.9 显示了某些复杂的过程,但与图 8.8 的主要区别在于 Krippendorff 的 alpha 如何纳入标签权重。标签权重组件允许 Krippendorff 的 alpha 适应不同类型的问题,例如连续、顺序或其他任务,在这些任务中,多个标签可以应用于一个项目。
更多细节,请参阅第 8.2.1 节中介绍的电子表格中的实现。您可以看到,预期的协议和实际的协议需要一些矩阵运算来将权重纳入完整的 Krippendorff 的 alpha 实现中,与部分实现相比。此外,epsilon 调整考虑了权重,并且不仅仅是总计数量的倒数。简单实现和完整实现背后的基本思想是相同的:我们正在根据实际协议和预期协议计算一个调整后的协议。如果您记住这个概念,并理解到 Krippendorff 的 alpha 完整实现中的所有额外步骤都源于对不同类型注释的灵活性需求,那么您对如何应用它就有了正确的理解。
我什么时候需要计算 Krippendorff 的 alpha 的置信区间?
本书省略了 Krippendorff 的 alpha 在计算置信区间方面的扩展,因为置信区间预计的是 Krippendorff 的 alpha 设计的小型调查类型。大多数时候,你不需要对训练数据进行置信区间,因为置信区间的最大因素将是总的判断数量。因为你的训练数据可能包含数千甚至数百万个示例,置信区间将会非常小。
只有当你打算在一个小型数据集或数据集的小子集上使用 Krippendorff 的 alpha 时,你才需要担心置信区间。请注意,如果你因为前沿技术、轻度监督、少样本或数据增强技术而使用少量数据,你需要更好的统计知识来帮助确保你较小数据集的重要性。你可能认为数据越少,所需的支持基础设施就越容易构建,但事实正好相反。
即使在这些边缘情况下,我也不建议仅依赖置信区间。如果你只有少量训练示例,你应该包括其他类型的质量控制,包括专家的审查任务和包含已知的真实示例。否则,你的置信区间将会非常宽泛,这将使得基于数据的模型难以被信任。
Krippendorff 的 alpha 的替代方案
你可能在文献中遇到 Krippendorff 的 alpha 的替代方案,如 Cohen 的 kappa 和 Fleiss 的 kappa。Krippendorff 的 alpha 通常被视为那些早期指标的改进。差异在于细节,例如是否应该对所有的错误进行同等惩罚,正确计算预期先验的方法,处理缺失值的方式,以及如何汇总整体一致性(按注释汇总,如 Krippendorff 的 alpha,或按任务/标注者汇总,如 Cohen 的 kappa)。第 8.6 节中的附加阅读有一些例子。
你也可能遇到以不一致性而非一致性来表示的 Krippendorff 的 alpha,这在 Krippendorff 自己的出版物中也有体现。这些技术在数学上是等价的,并产生相同的 alpha 值。在其他指标中,一致性比不一致性更广泛地被使用,并且可以说是更直观的,这就是为什么这里使用一致性的原因。假设不一致性是一致性的补数:D = (1 – P)。当你查看文献和图书馆时,请记住这个假设,其中可能包含使用不一致性计算出的 Krippendorff 的 alpha 版本。
8.2.4 计算 Krippendorff 的 alpha 超出标签
这里有一些例子说明 Krippendorff 的 alpha 可以用于比互斥标签任务更复杂的任务。图 8.10 展示了我们如何改变 Krippendorff 的 alpha 方程中的标签权重来捕捉序数和旋转数据。

图 8.10 三种类型分类任务的示例以及如何使用 Krippendorff 的 alpha 的标签权重来完成这些任务。第一个例子重复了图 8.9 中的标签权重,展示了本章一直用作例子的互斥标签任务。第二个例子显示了一个从“差”到“优秀”的序量尺度,我们希望对相邻标注如“好”和“优秀”给予部分信用。第三个例子显示了旋转类别——在这种情况下,是罗盘指针。在这种情况下,我们对偏离 90 度的任何事物给予部分分数,如“北”和“西”,但对偏离 180 度的任何事物给予零分,如“北”和“南”。
本章的其余部分将坚持使用互斥标签。我们将在第九章中介绍其他类型的机器学习问题。
当 Krippendorff 的 alpha 用于训练数据时,它有一些不足之处,因为它最初是为了使用案例如学校随机将考试卷分发给多个评分者(标注者)而推导出来的。它没有捕捉到一些标注者将根据他们所看到的不同情况而有不同的预期一致性的事实。在创建训练数据时,我们有很好的理由非随机地分配标注,例如给额外的人提供困难示例以进行裁决。第 8.2.5 节至第 8.2.7 节在计算标注者、标签和任务级别的一致性方面与 Krippendorff 的 alpha 有显著的不同。
8.2.5 单个标注者一致性
在单个标注者级别上的一致性可以从多个方面有用。一方面,它可以告诉你每个标注者的可靠性如何。你可以在宏观层面上计算一致性,计算标注者在其所做每个响应中的可靠性,或者你可能想看看他们是否对某些标签或数据片段有更高或更低的一致性。这个结果可能会告诉你标注者更准确或更不准确,或者可能突出一系列有效的标注。
对于标注者之间的一致性,最简单的度量方法是计算每个标注者在给定任务中与大多数人达成一致的情况有多频繁。图 8.11 展示了示例。

图 8.11 每个任务中每个标注者与最常见标注的一致性(多数一致性)。这个例子表明,两个标注者,Blake 和 Evan,总是与多数人达成一致。这是计算标注者之间一致性的最简单方法;当每个任务有大量标注者时,这种方法可能有效,但由于预算限制,很少用于创建训练数据。这种方法可以提供对数据的洞察,但不应该是确定数据质量的唯一手段。
如图 8.11 所示,多数同意度考虑的是一个人同意每个任务中最常标注的标签的次数。这个结果也可以计算为一个人同意多数的次数的分数,但按每个标注的同意度进行归一化时,它会更准确一些。在图 8.11 和本章中的其他示例数据中,Cameron 和 Dancer 同意任务 3 是“自行车手”,尽管大多数人认为任务 3 是“行人”。相比之下,Alex 是唯一一个认为任务 9 是“标志”的人。因此,在我们的多数同意度表(图 8.11)中,Cameron 和 Dancer 在任务 3 上得到 0.5 分,而 Alex 在任务 9 上得到 0 分。
多数同意度可以快速检查你的标注者是否看到了更容易或更难示例。在本章前面的图 8.6 中的简单同意度示例中,Evan 的同意度次低(0.836),但在图 8.11 中,他们的同意度与最高(1.0)相同。换句话说,Evan 与其他人的平均同意度较低,但总是与多数人意见一致。这个结果告诉你,Evan 看到了其他人整体同意度较低的任务。因此,一个好的同意度指标应该考虑到 Evan 看到了更难的任务这一事实。
预期同意度是图 8.11 中缺失的最大部分。图 8.12 展示了计算预期同意度的一种方法,它表明如果他们总是选择“行人”,Evan 的预期同意度最低。

图 8.12 每个标注者的同意度是根据实际同意度(右下角)计算的,预期同意度是根据每个标注者计算的(中间顶部)。注意,Evan 的预期同意度仅为 0.15。换句话说,如果 Evan 每次都猜测最常见的标签“行人”,他们将与大约 15%的其他标注在他们的任务上达成一致。相比之下,Alex 每次都可以猜测“行人”并得到大约 51%的同意度。这种方法考虑到了 Evan 看到了同意度较低的任务,这些任务可能更难。
在 8.12 图中,首先要注意的是我们正在使用最频繁的标签(众数标签)来计算我们的基线。回想一下,Krippendorff 的 alpha 在数据中使用相同数量的标签,就像它们是随机分配的一样。在我们的例子中,有人可能会随机分配 13 个“行人”标签,7 个“标志”标签等等。虽然这个例子是(统计上的)期望分布的定义,但一个人类标注者在标注时不太可能对每个标签的概率有意识。更可能的情况是,标注者会对最频繁的标签(众数标签)有一个直觉。这种结果在数据标注中很常见。通常,一个标签明显比其他所有标签更频繁,感觉像是一个安全的默认选项。有方法可以减轻由于人们感到有压力在不确定时标注默认选项而导致的不良标签问题,我们将在第九章中介绍。在这里,我们将这个最常见的标签视为我们的期望基线。
8.12 图与标准 Krippendorff 的 alpha 计算的第二点不同在于,8.12 图计算的是每个任务的协议,而 Krippendorff 的 alpha 计算的是每个标注的协议。如果你每个任务都有相同数量的标注,那么这些数字将是相同的。在我们的示例数据中,任务 3 有五个标注,因此在 Krippendorff 的 alpha 中它实际上比其他任务有更大的权重。然而,在计算个别协议时,Krippendorff 的 alpha 给任务 3 与其他任务相同的权重。
由于许多原因,你不想为数据标注的不同任务赋予不同的权重。例如,你可能故意将相同的任务分配给更多的标注者以解决分歧,或者你可能根据标签或外部信息将较容易的任务分配给较少的人。在这两种情况下,Krippendorff 的 alpha 都会偏向于更困难的任务,从而给出一个人为的低分。如果你确实在任务之间有标注者的随机分布,并且某些任务最终有更多的标注是随机的,那么标准的 Krippendorff 的 alpha 方法是可以的。
不要通过迭代去除与最低一致性的标注者来 p-hack Krippendorff 的 alpha
通常,你希望忽略你最不准确的标注者的标注。通过去除表现最差的标注者并将他们的任务分配给其他标注者,你可以提高训练数据的整体协议和准确性。
然而,如果你迭代地去除表现最差的,直到你的数据集达到神奇的 k-alpha=0.8 数字,这表明高度一致,那么你将犯一个错误。将显著性阈值的本身作为去除人员的阈值,这就是 Regina Nuzzo 在 2014 年《自然》杂志上所说的 p-hacking(mng.bz/8NZP)。
而不是依赖 Krippendorff 的 alpha,你应该根据以下标准之一,按照优先顺序去除人员:
-
使用与 Krippendorff 的 alpha 系数不同的标准来决定谁是好或坏的绩效者。理想情况下,你应该使用标注者与已知真实答案的一致性。然后你可以使用这个标准来移除最差的绩效者。你可以在已知答案上设置一个准确性的阈值水平,或者决定移除一定比例的标注者(例如最差的 5%)。你应该在没有考虑 Krippendorff 的 alpha 系数的情况下做出关于阈值或百分比的决策。
-
移除那些在表现方面统计上异常低下的低绩效者。如果你对自己的数学技能有信心,可以使用这个技术。例如,如果你能计算出所有的一致性评分都落在正态分布中,你可以移除任何一致性评分低于平均一致性三个标准差的标注者。如果你不自信能够识别分布类型和适当的异常值指标,坚持第一个选项,并在必要时创建有已知答案的额外问题。
-
事先决定你预期的低绩效标注者的百分比,并只移除那些标注者。如果你通常发现 5%的表现不佳,移除表现最差的 5%,但如果你还没有达到目标协议,不要继续这样做。这种方法可能包含一点偏见,因为你仍在使用 Krippendorff 的 alpha 系数来计算最低的 5%。然而,这种偏见可能很小,在任何情况下,如果你可以使用前两种方法,你不应该使用这种方法。
如果你用 p-hack Krippendorff 的 alpha 系数,可能会得到糟糕的指示或不可能完成的任务,但你永远不会学到那个结果。你可能会最终只留下那些碰巧坐在一起并共享笔记的标注者。
如果你已经确定一个标注者不够可靠,不足以信任,你应该从你的协议计算中移除该标注者的判断。图 8.13 展示了我们的示例数据,假设我们移除了第一个人。

图 8.13 在移除第一个标注者后重新计算我们的标注者的一致性。注意,与图 8.12 相比,四个评分中的三个有所上升,但 Blake 的一致性略有下降,Evan 从第二高的一致性降至最低。
如图 8.13 所示,与图 8.12 相比,当你移除最不准确的人时,你通常期望整体一致性上升,但某些个别一致性分数可能仍然会下降(如 Blake 的情况),排名也可能发生很大变化,如 Evan 的情况。当我们计算图 8.11 中的多数一致性时,Evan 具有最高的共识,但在图 8.13 中移除 Alex 后计算机会调整的共识时,他具有最低的共识。这个图是为什么你需要小心使用一致性作为计算准确性的唯一方式的一个很好的例子:你的选择可以为个人产生不同的结果。

图 8.14 注释混淆矩阵:与我们示例数据中的真实数据(顶部)相比,以及与每个成对的一致或不一致(底部)相比
8.2.6 每标签和每人口统计一致性
理想情况下,你有一些数据集的真实标签,这样你就可以使用这些标签在混淆矩阵中绘制错误。这个混淆矩阵与用于机器学习模型的混淆矩阵相同,只是它用人类错误模式代替了模型错误。
你也可以使用混淆矩阵来表示一致性,绘制哪些注释与其他注释一起发生。图 8.14 显示了我们的示例数据中的矩阵。
这种混淆矩阵的第二种类型不会告诉你错误是什么——只会告诉你一致或不一致发生在哪里。使用任何一种矩阵,你都可以看到在你的注释中最大的成对混淆发生在哪里,这些信息应该有助于你改进对注释者的指令,以及指出哪些标签可能对你的模型预测最困难。
8.2.7 使用一致性扩展现实世界多样性中的准确性
当你想跟踪大量细粒度的人口统计时,使用一致性作为准确性的扩展特别有用。如果你想跟踪人口统计的交集,你可能会有太多的人口统计类别组合,以至于你无法收集足够多的真实数据。
考虑这样一个例子,我们怀疑夜间拍摄的照片比白天拍摄的照片更难注释。现在假设你还想跟踪 1,000 个地点的注释准确性。对于这 24,000 个时间/地点组合中的每一个,你不太可能都有大量的真实标签,因为创建如此多的真实数据会非常昂贵。
因此,查看每个 24,000 个时间/地点组合的一致性,是你了解每个人口统计交叉点难度的最佳窗口。一致性不一定总是与准确性完美相关,但这种方法可以揭示一些高度一致的区域,你可以对这些区域进行审查,并可能针对这些区域收集更多的真实数据。
8.3 聚合多个注释以创建训练数据
对于许多标注项目来说,任务级别的置信度是最重要的质量控制指标,因为它允许我们聚合(可能存在冲突的)每位标注者的标注,并创建将成为训练和评估数据的标签。
因此,了解如何组合多个标注以创建将成为实际标签的单个标签非常重要。在任务中聚合多个标注建立在本章中看到的其他类型的质量控制指标之上:我们希望在计算给定任务的总体一致性时考虑每位标注者的置信度,并且理想情况下,我们希望知道这个特定的任务是否本质上更容易或更难。
8.3.1 当所有人都同意时聚合标注
可以最容易地用出错概率而不是正确概率来考虑一致性。假设我们有三位标注者,他们每个人的准确率都是 90%。任何一位标注者犯错的概率是 10%。第二位标注者在同一任务上犯错的概率也是 10%,所以结合起来,两个人在同一项上犯错的概率是 1%(0.1 × 0.1 = 0.01)。对于三位标注者来说,这个概率变成了 0.1%(0.1 × 0.1 × 0.1)。换句话说,出错的可能性是千分之一,正确的可能性是 0.999。如果三位标注者的准确率都是 90%,并且他们都同意,我们可以有 99.9%的信心认为标签是正确的。让第i位标注者的准确率为a[i],那么标签正确的整体置信度是

不幸的是,这种方法存在局限性,因为它假设错误是独立的。如果第一个标注者犯了一个错误,第二个标注者是否仍然只有 10%的出错概率,或者错误倾向于聚集或发散?
很容易想象出错误模式非随机性的场景。最明显的是,有些任务比其他任务更难。如果 10%的所有任务会导致人们选择错误的标签,那么可能就是所有三位标注者都犯错的那个任务。如果你有一个具有大量标签的任务,这个问题就不太常见,因为人们不太可能选择相同的错误标签。你通常希望将任务减少到尽可能少的标注,以提高效率,因此在准确性和成本之间有一个权衡。
地面真实数据允许你计算以下内容:对于每个错误的标注,有多少百分比的任务标注也是错误的?让我们通过一个例子来分析。假设在我们示例数据中,每个项目的实际标签是本章 8.3 节中较早展示的图 8.3 所示的标签。以下表格显示了两个任务,3 和 9,其中错误用粗体表示:
| 任务 3 | 行人 | 行人 | 骑行者 | 骑行者 | 行人 |
|---|---|---|---|---|---|
| 任务 9 | 标志 | 动物 | 动物 | 动物 |
在任务 3 中,三个错误的“行人”标注都与另外两个“行人”标注一致,为我们提供了六个关于错误标签的总共识。注意这个数字来自 Krippendorff 的 alpha 中的列 sum(AW)。在任务 9 中,“符号”错误是唯一的,因此没有达成共识的错误。对于正确答案,我们在任务 3 中有两个共识(两个“骑自行车的人”标注相互一致)和三个“动物”标注中的每一个都相互一致。因此,当标注员正确时,他们之间达成共识的情况总共有八种,当标注员错误时,他们之间达成共识的情况有六种。为了计算错误标注达成共识的频率,我们计算
错误的相关性 = 6 / (8 + 6) = 0.429
因此,尽管我们的整体错误率是 10%,但标注错误同时发生的可能性是 42.9%——比四倍还高!在第一个错误发生后,我们应该假设错误以这种速率同时发生。当三位标注员达成一致时,我们对标签的整体信心将是
1 – (0.1 × 0.429 × 0.429) = 0.982
因此,我们不是有 99.9%的信心,而是在三位标注员达成一致时,我们有 98.2%的信心,从每 1,000 个项目中的一个错误降低到大约每 55 个项目中的一个错误。
相反的情况也可能发生,其中错误模式会发散。假设三位标注员各自仍然有 90%的准确率,但他们犯的错误不同。一位标注员在识别“符号”时犯的错误最多,而另一位标注员可能在识别“动物”时犯的错误最多。他们可能在不同的图像上犯错误,因此错误同时发生的概率是 2%:
1 – (0.1 × 0.02 × 0.02) = 0.99996
在这种情况下,如果你的标注员具有互补的技能,你可以有 99.996%的信心认为标注员之间的共识意味着你的标注是正确的,因此错误每 25,000 个项目中发生一次。
8.3.2 多样化的标注员和低共识的数学案例
标注员之间错误模式存在很大差异,正如第 8.3.1 节中的例子所示。我们可以通过这个例子来扩展数学证明,即拥有多样化的标注员将导致更准确的数据。
在每个标注的基础上,如果整体错误率相同,那么准确率最高的数据将具有最低的一致性,因为错误分散并创造了更多不一致的机会。因此,这个条件具有最低的 Krippendorff 的 alpha 分数,显示了为什么我们不能仅仅依赖 Krippendorff 的 alpha 分数,因为它可能不公平地惩罚多样性。你可以在我们的示例数据中看到这个结果,Krippendorff 的 alpha 分数为 0.803。然而,如果我们分散不一致,使得每个任务中不超过一个不一致,那么我们得到的 Krippendorff 的 alpha 分数为 0.685。所以尽管我们的数据每个标签的频率相同,而且大多数数据更加可靠,但我们的数据集看起来不那么可靠。
容易想象出一些意见一致聚集的场景:有些例子比其他例子更难,或者标注者有主观但相似的判断。也容易想象出意见不一致的场景:标注者多样化,为数据带来不同但合法的视角。
然而,很难想象出标注者在完全独立地犯错误的真实世界场景(除了可能因为疲劳之外)。然而,几乎所有的协议指标都做出了独立性的假设,这就是为什么它们应该谨慎使用。正如本节和第 8.3.1 节所示,我们的真实数据允许我们对给定数据集进行校准。第九章的高级方法更详细地介绍了数据驱动的协议指标。
8.3.3 当标注者意见不一致时的标注聚合
当标注者意见不一致时,你实际上是在将所有潜在标签的概率分布进行收敛。让我们扩展任务 3 的例子,并假设平均每个人准确率为 90%(图 8.15)。

图 8.15 使用每个标注者的准确率作为每个任务的协议概率
在图 8.15 中,我们有三位标注者将这个任务中的图像标注为“行人”,两位标注为“骑行者”。当不是所有标注者意见一致时,计算信心的最简单方法是将信心视为加权投票。假设我们正在计算任务 3 的信心,并且对每个标注者的信心为 90%:
行人 = 3 * 0.9 = 2.7
骑行者 = 2 * 0.9 = 1.8
行人信心 = 2.7 / (2.7 + 1.8) = 0.6
骑行者信心 = 1.8 / (2.7 + 1.8) = 0.4
另一种思考这种计算的方式是,因为我们在这个例子中对每个人都同样有信心,五分之三的标注者意见一致,所以我们有 3/5 = 60%的信心。
这种方法的一个问题是它没有为其他标签留下任何置信度。回想一下,当我们达成完全一致时,仍然存在错误的可能性,因此正确的标签可能是没有人标注的标签。我们可以通过将置信度视为概率分布,并假设所有其他标签都分得相同的权重,来纳入非标注标签可能正确的可能性,如图 8.16 所示。

图 8.16 将所有注释员的置信度扩展到给予所有标签一定的权重。我们每个注释员的置信度为 0.9,因此我们将剩余的 0.1 分配给其他标签。
此示例给出了对置信度的保守估计,大量权重分配给了未见过的答案。注意,这种方法并不是在完全一致的情况下我们所使用的。有几种方法可以得到更精确的注释概率分布,其中大多数涉及回归或机器学习模型,因为它们不能像这里使用的简单启发式方法那样计算。第九章涵盖了这些高级方法。这个例子足以支撑本章剩余部分的内容。
8.3.4 注释员报告的置信度
注释员通常对自己的错误以及哪些任务本质上比其他任务更难有很好的直觉。作为标注过程的一部分,您可以询问注释员在某个特定任务上的置信度低于 100%时的情况。使用我们的数据的一个例子可能看起来像图 8.17。

图 8.17 明确请求注释员的置信度是计算他们响应的准确性和/或一致性作为置信度的替代方案(或补充)。
您也可以请求整个概率分布,如图 8.18 所示。

图 8.18 以请求注释员对每个标签的置信度作为替代方案,而不是将剩余的置信度按程序分配给其他标签
使用图 8.18 所示的方法,您可以把输入的金额视为该注释员对该标签的概率,或者当注释员的置信度低于 100%时,您可以选择忽略所有注释。这种类型的界面可以扩展为询问注释员其他注释员可能如何回答该问题,这有助于提高准确性和多样性,尤其是在主观任务中。这些扩展在第九章中有所介绍。
输入此类信息可以大大增加简单标注任务(如我们的示例)的标注时间,因此您必须权衡捕捉此类信息的成本与它所增加的价值。
8.3.5 决定信任哪些标签:注释不确定性
当你有一个给定任务的标签的概率分布时,你需要设置一个阈值,以确定何时不相信标签,并决定如果不相信标签时该做什么。当你不相信标签时,你有三个选项:
-
将任务分配给额外的标注员,并重新计算置信度,以查看置信度是否足够高。
-
将任务分配给专家标注员以裁决正确的标签(更多关于这个主题的内容在第 8.4 节中)。
-
将此项目从数据集中排除,以防止潜在的错误在模型中产生错误。
通常,你想要避免第三种情况,因为你正在浪费投入到该任务中的努力。你也在风险将偏差引入你的数据,因为更难的任务不太可能是随机的。然而,预算或人员限制可能阻止你将相同的任务分配给许多人。
在你能够决定是否相信你的标签之前,你需要弄清楚如何计算你对标签的整体置信度。假设我们的概率分布是从本章中我们一直在使用的例子中得到的:
行人 = 0.553
符号 = 0.033
骑行者 = 0.380
动物 = 0.033
我们有不同方法来计算我们的整体置信度不确定性:只看“行人”的 0.553 置信度,考虑下一个最自信的标签(“骑行者”),或者考虑所有潜在的标签。
如果你从第三章回忆起来,这个场景与主动学习中的不确定性采样相同。你有不同的方式来衡量你的标注一致性的不确定性,每种方法都对你关心的事情做出了不同的假设。使用 PyTorch,这个例子可以表示为一个张量:
prob = torch.tensor([0.533, 0.033, 0.380, 0.033])
重新复制第三章中的方程,我们可以计算不同的不确定性分数,如图 8.19 所示。

图 8.19 计算概率分布的不确定性分数的不同方法。这些方法与在主动学习中从模型的预测中计算不确定性(或置信度)的方法相同,此处用于计算标注者之间的一致性的不确定性。
对于我们的例子,我们得到这些不确定性分数(记住 1.0 是最不确定的):
-
最小置信度 = 0.6227
-
置信度范围 = 0.8470
-
置信度比 = 0.7129
-
熵 = 0.6696
为了得到我们的整体置信度,而不是不确定性,我们从 1 中减去这些指标之一。
在你有了不确定性分数之后,你可以在你的真实数据上绘制不同分数的整体标注准确性。然后你可以使用这个图来计算给你数据带来所需准确性的准确度阈值(图 8.20)。

图 8.20 计算你可以信任的标注的阈值。在这个例子中,如果信任低于~0.65 的一致性不确定性的项目,那么在基准数据上计算出的期望标注准确率约为~0.96 将得以实现。
你可以为每个不确定性指标绘制如图 8.20 所示的曲线,作为决定哪个最适合你的数据的一种方法:哪种不确定性采样方法在正确的阈值下选择了最多的项目?
对于二元数据,不同不确定性分数的排序是相同的,所以如果你已经将任务分解为二元问题,你可以选择这些指标中的任何一个,而不用担心决定哪个最适合你的数据。
作为在图 8.20 中计算阈值的一种替代方法,你可以找到在数据不同阈值上训练时,你的机器学习模型准确性的最佳阈值。尝试不同的阈值以确定哪些项目可以忽略,然后观察每个阈值下模型的下游准确性。你的模型对训练数据中错误的敏感性可能会随着训练项目总数的增加而改变,因此你可能希望定期回顾过去的训练数据,并在每次添加新的训练数据时重新评估阈值。
8.4 专家审查质量控制
质量控制中最常见的方法之一是聘请领域专家对最重要的数据点进行标记。通常,专家比其他工作者更稀缺且/或更昂贵,因此你通常只给专家分配一些任务,通常有以下原因之一:
-
为了将部分项目标注为指南和质量控制的基准示例
-
为了裁决非专家标注者之间低一致性的示例
-
为了将部分项目标注为机器学习评估项目,其中人工标签的准确性更为重要
-
为了标注已知因外部原因而重要的项目。例如,如果你正在标注来自客户的数据,你可能希望专家标注者专注于为你创造最多收入的客户的示例
图 8.21 复制了第七章关于使用专家进行审查的图。它说明了前面列表中的前两个例子:为指南和质量控制创建基准示例,以及裁决具有低一致性的示例(混淆项)。

图 8.21 重复了第七章中关于专家内部标注的三个工作流程。底部两个工作流程展示了专家可能被纳入的不同方式:裁决标注者难以处理的项目和为标注者制定指南。这两个工作流程可能存在于同一个任务中,并且对于更复杂的工作流程可能有更多步骤。
在专家审查后汇总标注时,你可以将这位专家视为一个额外的标注员,或者你可以忽略之前的标注,并从专家(们)的置信度来计算置信度。如果你知道你的专家比大多数员工更可靠,请选择后者。
8.4.1 招聘和培训合格人员
正如我们在第七章中讨论的,内部拥有领域专家是很常见的,但你通常可以将这种专业知识外包出去。例如,一位已经从事自动驾驶车辆标注工作多年的标注员,其技能非常高超。有关为你的任务选择合适的劳动力,包括专家在内的更多信息,请参阅第七章。
8.4.2 培训人员成为专家
你可以采取数据驱动的方法来识别非专家标注员池中的专家。跟踪个别标注员的准确率,而不仅仅是整体数据集的准确率,将帮助你发现专家并将他们提升到该角色。
作为使一些标注员成为专家裁决者的垫脚石,你可能允许这些标注员审查但不裁决他人的工作。这种方法将使这些人获得关于人们常犯的常见错误的直觉。
你应该跟踪专家的人口统计数据,就像你跟踪标注员的人口统计数据一样,以确保多样性(除非跟踪违反了他们的隐私)。标注员的年龄、居住国家、教育水平、性别、语言流利度以及许多其他因素可能对任务很重要。如果你不跟踪标注员的人口统计数据,并使用一致性作为确定最佳标注员的一个指标,你可能会将标注员池中的偏见带入专家标注员池。因此,理想情况下,你应该从代表性数据中识别专家,而不是随机样本。
8.4.3 机器学习辅助的专家
对于中小企业来说,使用机器学习来增强日常任务是一种常见的用例。如果你还记得第一章的内容,人机交互的机器学习可以有两个不同的目标:通过人工输入使机器学习应用更加准确,以及通过机器学习的辅助来提高人工任务的效果。
搜索引擎是一个很好的例子。你可能是一位在某个科学领域具有专业知识的专家,正在寻找一篇特定的研究论文。在输入正确的搜索词后,搜索引擎会帮助你找到这篇论文,并通过你点击的内容来提高其准确性。
另一个常见的用例是电子发现。与搜索类似,但通常具有更复杂的界面,电子发现用于审计等场景,专家分析师试图在大量文本中找到某些信息。假设审计是为了检测欺诈的法律案件。欺诈检测的专家分析师可能会使用一个工具来找到该法律案件的相关文档和通信,该工具可能会根据分析师找到的内容进行调整,显示迄今为止已标记为相关的所有类似文档和通信。2020 年,电子发现是一个价值 1000 亿美元的行业。尽管您可能在机器学习领域没有听说过它,但它是最大的单一机器学习用例之一。
在这些情况下,您可以部署相同的质量控制措施:寻找专家之间的共识,采用高级专家的裁决,对照已知答案进行评估,等等。然而,专家很可能会使用支持他们日常任务的界面,而不是注释过程本身。界面可能没有针对收集训练数据进行优化,而且他们的工作流程可能会引入您无法控制的顺序效应。因此,第十一章中质量控制的用户界面在这些情况下将非常重要。
8.5 多步骤工作流程和审查任务
提高标签质量的最有效方法之一是将复杂任务分解成更小的子任务。将任务分解成更简单的子任务可以获得以下好处:
-
人们通常在更简单的任务上工作得更快、更准确。
-
对更简单的任务进行质量控制更容易。
-
您可以为不同的子任务聘请不同的劳动力。
主要缺点是管理更复杂工作流程的开销。您最终会有一大堆基于特定条件路由数据的自定义代码,而这些代码可能无法用于其他工作。我从未见过一个通过即插即用或下拉选项解决这些问题的标注平台:几乎总是需要编码或类似编码环境来完全实现复杂的条件组合。
图 8.22 展示了我们如何将对象标注任务分解成多个步骤,最后一个步骤是对前一个步骤的审查任务。

图 8.22 多步骤工作流程的示例。如果我们把步骤 2-4 分配给四种对象类型,我们总共有 13 个任务。步骤 1 中的个别响应和步骤 4 中的评估是二元任务。因此,尽管我们的目标是创建一个需要第九章高级质量控制指标的边界框,但我们可以使用本章的更简单的基于标签的质量控制指标。与一次捕获所有边界框的单个任务相比,我们可以期望更高的吞吐量和准确性,因为标注者一次专注于一个任务;如果我们按任务付费,预算会更简单,因为每个任务所需的时间变化会更小;如果只有一些标注者被信任执行最复杂的任务,任务分配给工作队伍也会更简单。
我见过的最复杂的流程大约有 40 个任务。这个流程是为自动驾驶汽车的计算机视觉任务设计的,除了语义分割外,对每种被跟踪的对象都有几个步骤。
简单的任务有一些用户体验权衡。通常,人们欣赏效率,但任务感觉更重复,这可能导致疲劳。此外,有些人,尤其是内部行业专家,可能会因为过去执行过的复杂任务被分解成简单任务而感到冒犯;他们可能将这种情况解释为暗示他们不够复杂,无法在一个界面中解决所有步骤。我们将在第十一章回到用户体验的主题。在这些情况下,你可以明确指出,工作流程的选择是由于获取良好的机器学习训练数据的限制,而不是因为标注者的专业知识。
8.6 进一步阅读
标注的质量控制是一个快速变化的领域,我们面临的问题中有许多尚未解决。一篇很好的高级概述是 Lora Aroyo 和 Chris Welty 所著的《真理是谎言:众包真理与人类标注的七个神话》(mng.bz/NYq7)。
对于与一致性相关问题的近期概述,我推荐 Alessandro Checco、Kevin Roitero、Eddy Maddalena、Stefano Mizzaro 和 Gianluca Demartini 所著的《让我们同意不同意:修复众包的一致性度量》(mng.bz/DRqa)。
自从 1970 年代开发以来,Klaus Krippendorff 已经在多篇文章和书籍中发表了 Krippendorff 的 alpha 系数。我推荐《计算 Krippendorff 的 Alpha 可靠性》,这是最近在 2011 年更新的,但请注意,它是以不一致性而不是一致性来计算的,正如这本书中所述(mng.bz/l1lB)。
一篇关于退回到专家的工作流程的好论文,其中包含关于标注者如何有效地向专家解释他们的决策过程的建议,是 Joseph Chee Chang、Saleema Amershi 和 Ece Semiha Kamar 合著的“Revolt: Collaborative Crowdsourcing for Labeling Machine Learning Datasets”(mng.bz/BRqr)。
想要了解标注者偏差的近期良好研究,请参阅 Mor Geva、Yoav Goldberg 和 Jonathan Berant 合著的“Are We Modeling the Task or the Annotator? An Investigation of Annotator Bias in Natural Language Understanding Datasets”(mng.bz/d4Kv)。
想要了解标注者多样性如何提高准确性但降低一致性的论文,请参阅 Leon Derczynski、Kalina Bontcheva 和 Ian Roberts 合著的“Broad Twitter Corpus: A Diverse Named Entity Recognition Resource”(mng.bz/ry4e)。
虽然不是免费的,但由 Nancy Ide 和 James Pustejovsky 编辑的《Handbook of Linguistic Annotation》是一本涵盖了许多 NLP 任务且用例多样化的综合书籍。如果你不想购买这本书,可以考虑给你感兴趣的章节的作者发邮件;他们可能会分享他们的贡献。
摘要
-
真实示例是具有已知答案的任务。通过为数据集创建真实示例,你可以评估标注者的准确性,为这些标注者制定指南,并更好地校准其他质量控制技术。
-
你有多种方法在数据集中计算一致性,包括总体一致性、标注者间一致性、标签间一致性和任务级别的一致性。理解每种类型的一致性将帮助你计算训练和评估数据的准确性,并更好地管理你的标注者。
-
对于任何评估指标,你应该计算一个随机机会下预期发生的结果作为基线。这种方法允许你将你的准确性/一致性指标标准化为考虑随机机会调整的分数,这使得分数在不同任务之间更容易比较。
-
当使用真实数据和标注者间一致性时,你会得到最佳结果,因为真实数据的一致性允许你更好地校准你的一致性指标,并且一致性指标可以应用于比仅使用真实数据更实际的更多标注。
-
你可以将多个标注聚合起来,为每个任务创建一个单独的标签。这种方法允许你创建机器学习模型的训练数据,并计算每个标签正确的可能性。
-
专家审查的质量控制是解决标注者之间分歧的一种常见方法。由于专家通常很少见且/或昂贵,他们可以主要关注困难边缘案例和将成为其他标注者指南一部分的案例。
-
多步骤工作流程允许您将注释任务分解成一系列相互衔接的简单任务。这种方法可以更快、更准确地创建注释,并允许实施更易于操作的质量控制策略。
9 高级数据标注和增强
本章涵盖
-
评估主观任务的标注质量
-
使用机器学习优化标注质量控制
-
将模型预测视为标注
-
将嵌入/上下文表示与标注相结合
-
使用基于搜索和基于规则的系统进行数据标注
-
使用轻度监督机器学习来引导模型
-
通过合成数据、数据创建和数据增强来扩展数据集
-
将标注信息纳入机器学习模型
对于许多任务,简单的质量控制指标是不够的。想象一下,你需要为“骑自行车的人”和“行人”这样的标签标注图像。有些图像,如某人推着自行车,本质上具有主观性,标注者不应因持有有效但少数派的观点而受到惩罚。一些标注者可能对不同的数据项更熟悉或不太熟悉,这取决于他们对图像中位置的熟悉程度以及他们自己是否是骑自行车的人。机器学习可以帮助估计哪个标注者在特定数据点上可能更准确或不太准确。机器学习还可以通过展示候选标注来自动化一些标注过程,以便更快地进行人工审查。如果某些上下文中骑自行车的人很少或没有,你可能需要合成新的数据项来填补空白。鉴于在整个数据集中完美的标注很少见,你可能在基于该数据构建模型之前删除一些项目,或者将不确定性纳入下游模型。你也可能想在不需要构建下游模型的情况下对数据集进行探索性数据分析。本章涵盖了处理所有这些高级问题的方法。
9.1 主观任务的标注质量
对于给定的任务,并不总是只有一个单一的正确标注。你可能有一个本质上具有主观性的任务;因此,你期望得到不同的响应。我们可以使用第八章的示例数据,如图 9.1 所示,这里展示了可能具有多种正确标注的项目。

图 9.1 来自第八章的图像副本,展示了由于“行人”和“骑自行车的人”之间的歧义,任务 3 可能存在多种有效解释。
为什么一个标注者比另一个标注者更喜欢“行人”或“骑自行车的人”,可能有多个原因,包括
-
实际上下文—此人目前正在路上,或者此图像是视频中此人上下自行车的片段。
-
隐含上下文—此人看起来像是在上下自行车。
-
社会影响下的变化—在世界不同地区,地方法律可能对骑自行车的人和非骑自行车的人有不同的对待。不同的法律规定了自行车是否可以在人行道、道路上或专用自行车道上行驶,以及人们是否可以在这些地方推自行车而不是骑自行车。每个注释员所熟悉的法律或常见做法可能会影响他们的解释。
-
个人经验—我们可能预计自己是骑自行车者的人给出的答案与不是骑自行车者的人给出的答案不同。
-
个人差异—不考虑社会影响和个人经验,两个人可能对行人与骑自行车者之间的区别有不同的看法。
-
语言变化—骑自行车者可以严格解释为“任何骑自行车的人”,而不是“目前正在骑自行车的人”,特别是如果注释员不把英语作为第一语言(这在众包和外包注释员中很常见),并且将“骑自行车者”翻译成他们的第一语言(们)的定义与英语中的定义不同。
-
顺序效应—一个人可能会根据之前注释中看到的一种类型或另一种类型更多,而将此图像解释为骑自行车者或行人。
-
希望符合正常性—一个人可能自己认为这张照片是骑自行车者的,但也认为大多数人会称之为行人。他们可能会选择他们不相信的答案,以免之后受到惩罚。
-
感知到的权力不平衡—认为你收集这些数据是为了帮助骑自行车者安全的人可能会选择“骑自行车者”,因为他们认为你更喜欢这个答案。这种注释员和任务创建者之间的这种适应和权力不平衡对于具有明显负面答案的任务(如情感分析)可能很重要。
-
真正的歧义—照片可能是低分辨率或模糊不清的。
可能会有关于如何解释我们的示例图像的详细指南,这意味着有一个客观正确的答案。然而,并非所有数据集都会是这样,而且通常很难提前预见到所有边缘情况。因此,我们通常希望以最佳方式捕捉主观判断,以确保我们收集到所有可能的响应的全面多样性。
在本章的示例中,我们将假设存在一组正确答案。对于开放式任务,这个假设要困难得多,在这些情况下,专家审查尤为重要。参见以下专家轶事,了解在开放式任务中没有考虑主观性可能导致的问题。
在我们的示例数据集中,从我们的示例图像中我们知道“动物”和“标志”不是正确答案,因此我们希望有一种主观质量控制方法,能够将“行人”和“骑自行车者”识别为有效答案,而不是“动物”和“标志”。
标注偏差不是玩笑
丽莎·布拉登-哈德尔的专家轶事
数据科学家通常低估了收集高质量、高度主观数据所需的努力。在没有坚实的事实数据的情况下尝试标注数据时,人类对相关任务的同意并不容易,并且只有当目标、指南和质量控制措施得到充分沟通时,才能成功吸引人类标注员,这在跨语言和文化工作尤其重要。
我曾经接到一个来自美国个人助理公司扩展到韩国的请求,要求提供韩式敲门笑话。对话不是为了向产品经理解释为什么这不会奏效,以及为他们应用程序找到文化上合适的内 容;它揭示了许多假设的知识。即使在韩国语使用者中,创建和评估笑话的标注员也需要与目标客户来自相同的群体。这个案例是为什么减轻偏差的策略将触及您数据管道的每一个部分的一个例子,从指南到针对最合适的标注工作力的补偿策略。标注偏差不是玩笑!
丽莎·布拉登-哈德是圣克拉拉大学全球社会效益研究所的导师。她是巴特勒山集团(Butler Hill Group)的创始人兼首席执行官,该集团是最大的、最成功的标注公司之一;在此之前,她曾担任 IBM 的程序员,并在普渡大学和纽约大学完成了计算机科学学位。
9.1.1 请求标注员期望
当存在多个正确答案时,理解可能答案的最简单方法就是直接询问标注员,而最好的任务框架方式就是询问标注员他们认为其他标注员可能会如何回答。图 9.2 展示了示例。

图 9.2 询问人们他们期望其他标注员会选择哪些答案。在这里,标注员表示他们认为图像是行人,90%的标注员会同意他们,但 10%的人会认为它是骑自行车的人。这种方法鼓励人们给出诚实的回答,并提供数据以帮助您决定何时多个回答是有效的。反过来,我们可以捕捉到比任何单个标注员提供的答案更多的正确答案的多样性。
界面与第八章中的示例类似,我们在其中要求标注员为每个标签给出自己的信心度,但在这里,我们是在询问他们关于其他标注员的问题。这种相对简单的变化有几个可取的特性:
-
任务设计明确允许人们给出他们认为不是多数答案的答案,这鼓励了多样化的回答,并减少了从众的压力。
-
您可以克服注释者多样性的一些限制。可能不可能让每个您关心的群体中的注释者查看每个单独的项目。使用这种方法,您只需要有对全面多样性反应有正确直觉的注释者,即使他们不共享每个解释。
-
由于您询问了其他注释者的看法,因此感知到的权力动态问题减少了,这使得报告负面反应更容易。当您认为权力动态或个人偏见正在影响反应时,这种策略可能是一个好策略。询问大多数人会如何反应,而不是询问注释者认为会如何。
-
您可以创建数据来区分有效答案和非有效答案。如果我们将每个人的实际答案评分设为 100%对于观察到的,并且知道他们将预期数字分配到多个标签中,他们将为他们预期的实际响应给出低于 100%的评分。因此,如果一个标签的实际评分超过了预期评分,我们可以相信这个标签,即使它在实际和预期的整体百分比中占比较低。
最后是贝叶斯推理的一个不太为人所知的原则:人们往往低估自己反应的概率。因此,在 9.4.1 节中,我们将探讨一个称为贝叶斯真理血清的流行方法。
9.1.2 评估主观任务的可行标签
为了开始分析可行的标签,我们可以计算在给定参与该任务的注释者数量的情况下,我们可能会看到每个标签在实际注释中的可能性。这些信息将帮助我们决定哪些标签是有效的。如果一个有效标签预计只会在任务的 10%注释中出现,但我们只有一两个注释者,我们就不期望看到该标签的实际注释。
我们通过计算预期概率的乘积来计算我们应该看到每个标签的概率。就像我们计算一致性时一样,我们使用预期注释百分比的补集。预期百分比的补集是计算没有人注释给定标签的概率,至少有一个人选择该注释的概率是补集。图 9.3 显示了我们的示例数据的计算。

图 9.3 测试一个主观标签是否可行。在这里,五位注释者报告了他们对该标签的注释以及他们认为有多少人会选择每个标签。布莱克认为该标签是“行人”,90%的人会选择“行人”,5%的人会选择“骑自行车者”和“动物”。通过计算补集的乘积,我们可以得到在这么多注释下遇到这个标签的概率,我们可以将其与我们是否看到这个标签进行比较。
图 9.3 显示,对于这个任务,标注员选择了两个最可能的标签:“行人”和“骑自行车者”(与我们的示例数据相同),并且人们认为“标志”和“动物”将被 0%或 5%的人选择。您可以在图 9.3 中找到电子表格的副本,以及本章中所有其他示例的电子表格,链接为mng.bz/Vd4W。
首先,让我们想象一下,没有人选择“行人”作为实际标注,但人们在他们的预期得分中仍然给予“行人”一些权重。以下是图 9.3 中的计算结果:
预期:[0.8, 0.9, 0.35, 0.2, 0.6]
不期望:[0.2, 0.1, 0.65, 0.8, 0.4]
不期望的乘积 = 0.004
被看到的概率 = 1 – 0.004 = 0.996
根据这些预期得分,我们有 99.6%的把握认为我们应该至少看到一个实际的“行人”。因此,我们可以相当确信这个结果是标注员感知上的错误。当根据预期标注,一个标签有很高的概率被看到,但实际上没有被看到时,我们可以更有信心将其排除为可行的标签。
现在,让我们看看图 9.3 中一个不太预期的标签:“动物”。尽管三位标注员相信有些人会将图像标注为“动物”,但有 14.3%的可能性,五位标注员中的一人会选择“动物”。到目前为止还没有人选择“动物”的事实并不一定排除它。如果我们信任这些数字,我们不会期望看到有人选择“动物”,直到大约有 20 位标注员看到这个项目。我们可以采取几种方法来发现“动物”是否是一个可行的标签,每种方法都越来越复杂:
-
添加更多标注员,直到“动物”被看到,或者看到的概率如此之高,以至于我们可以排除“动物”作为一个可行的标签。
-
当这位专家标注员有经验排除个人偏见时,信任这位专家标注员来决定“动物”是否是一个可行的标签。
-
找到在真实数据中将项目正确标注为“动物”的标注员,当这种标注很少但正确时,将这项任务分配给他们(一种找到最佳非专家的程序化方法)。
虽然第一个选项最容易实现,但它只在你对标注员的多样性有信心时才有效。可能会有一些人会正确选择“动物”,但他们不在你的标注员中,所以这种情况从未出现。另一方面,选择“动物”可能是客观上不正确的,但这个例子很难,预计有 5%的人会答错。在这种情况下,你可能不想选择“动物”。
因此,当关于一个标签是否适用于主观任务存在歧义时,你将希望找到另一个标注员(可能是专家),可以信任他们理解可能的多样化响应。
9.1.3 信任标注员理解多样化的响应
我们可以通过查看单个注释者预期的注释与所有注释者计算的实际注释之间的差异来计算我们对单个注释者预期注释的信任度。基本概念很简单。如果一个注释者预期两个标签之间的注释是 50:50 的分割,并且正确地指出确实存在 50:50 的分割,那么该注释者应该在这个任务上得到 100%的分数。
如果注释者的数量是奇数,那么 50:50 的分割是不可能的,因此我们需要考虑有限注释者数量下的可能精度。图 9.4 展示了稍微复杂一点的例子。

图 9.4 一个注释者通过比较给定标签的实际注释分数与注释者预期的注释数量来估计所有注释者响应范围的准确性。对于我们的示例数据,这对应于 Cameron 预计 65%的人会选择“Cyclist”这个任务,而实际上选择它的人占 40%。
在图 9.4 中,注释者高估了注释者的数量为 0.25。在 0.15 到 0.65 之间的每个值都更接近实际数量 0.4,而 0.65 – 0.15 = 0.5。所以 50%的可能预期值都更接近 0.4。然而,如果有足够的注释者,那么真实实际值将高于 0.4,因此我们通过最小精度 0.2 进行调整,得到 0.5 * (1 – 0.2) + 0.2 = 0.6。注释者的准确度分数是 60%。
图 9.5 给出了我们示例数据中每个注释者每个估计的计算方法。为了得到一个注释者的整体准确度,你需要平均他们在数据集中每个主观任务上的准确度。

图 9.5 展示了每个注释者每个估计的计算方法,然后平均这些分数以得到这个任务每个注释者的分数。Cameron 在估计预期分布与实际分布的接近程度方面准确度为 80%。Evan 是最准确的,得分为 97%,而 Blake 是最不准确的,得分为 73%。
在图 9.5 中,epsilon 与第八章中 Krippendorff 的 alpha 所使用的 epsilon 相同。当时它并不重要,因为 Krippendorff 的 alpha 是在数据集中所有注释的总数上计算 epsilon 的。在这里,我们是在单个任务内的注释上计算 epsilon。通过比较原始分数和调整后的分数,你可以看到 epsilon 有很大的影响,调整结果达 20%。
如果特别重要的是要知道你的注释者如何准确地估计实际分布,你可以使用几种变体和扩展。对于某些任务,0 分是不可能的,因为每个注释者的预期注释分布总和必须为 1;因此,他们不能总是为每个标签提供最差的估计。(在图 9.5 中,如果注释者预期只有“动物”或“标志”会被选择,最坏的可能分数是 0.44。)你可以为此基线进行归一化,就像在第八章中为真实准确性和一致性那样。
交叉熵是计算预期分布和实际分布之间差异的另一种方法。尽管交叉熵是机器学习中比较概率分布的常见方法,但我从未见过它被用来比较训练数据的实际和预期注释。这项技术将是一个有趣的研究领域。
9.1.4 贝叶斯真理血清法用于主观判断
9.1.3 节中的方法专注于每个注释者预测不同主观判断频率的准确性,但分数没有考虑每个注释者的实际注释——只有他们的预期分数。贝叶斯真理血清法(BTS)是一种结合两种方法的方法。BTS 由麻省理工学院的 Dražen Prelec 创建(参见 9.9.1 节中的Science论文)并且是第一个将实际和预期注释结合成一个单一分数的度量标准。
BTS 从信息论的角度计算分数。这个分数不能直接让你解释注释者或标签的准确性。因此,BTS 寻找比相同注释者集体预测更常见的响应,这些响应不一定是最频繁的响应。图 9.6 展示了示例。

图 9.6 中,BTS 将个人的实际注释与预期注释的预测结合成一个单一分数。Info 是信息论分数(预期 × log(实际 / 预期))。每个注释者的分数显示 Cameron 的分数最高。对于预期和实际注释,分数都是基于信息理论的。分数不仅关于每个注释者的准确性;还关于每个注释者提供的信息量。
在图 9.6 中,Cameron 从 BTS 的角度来看得分最高,主要是因为选择“Cyclist”作为实际标注提供了高信息量。也就是说,“Cyclist”的实际标注频率高于与“Pedestrian”相比的期望频率。Blake 得分最低,主要是因为预测只有 0.6 的标注将是“Pedestrian”,而实际上有 0.9 的标注是——“Pedestrian”——这是所有预测中最大的误差。因此,本节中的数据集是一个很好的例子,说明较少出现的标签提供了比频繁出现的标签更多的信息。然而,在某些情况下,最高频率的实际标签可以提供最多的信息。
图 9.6 也是一个很好的例子,说明了信息与准确性的不同。回想一下,在图 9.5 中,Evan 得分最高,因为 Evan 的期望标注频率与实际标注频率最接近。对于 BTS,Cameron 最终得分最高,尽管 Cameron 的准确性不如 Evan,但 Cameron 对“Cyclist”(一个可能被忽视的较少出现的标签)的预测更有价值。
如果你持续发现通过 BTS 获得最高信息分数的标注者并不是在预测期望标注频率方面最准确的标注者,这一发现可以成为你标注者多样性不足的证据。检查一下 BTS 分数最高的标注者是否通常选择较少出现的标签;如果是这样,那么你有证据表明你的标注者池更频繁地选择最频繁出现的标签,这比随机或代表性人群更常见。
在对 BTS 的一个有趣扩展中,发明者观察到,当实际标注的百分比超过某个标签的平均期望百分比时,这一发现是证据,表明这个意外受欢迎的标签是正确的,即使它不是多数。但这个结果依赖于有足够的标注者,至少有一位标注者选择了该标签,当你每个任务只有少数标注者时,对于罕见但有效的标签,这种情况不太可能发生。
注意,我们在图 9.6 中没有调整 BTS 分数,因为只有五位标注者,所以只有 0.2 的倍数是可能的(图 9.5 中的 epsilon)。本节中的例子是 BTS 的原始计算,出于教育目的,它在这里以文献中的形式呈现。添加这个调整是可以的,但请注意,BTS 有一个很好的对称性,你可能会失去这种对称性;如果期望和实际分数的权重设置为 1,就像我们的例子中那样(权重相等),BTS 分数总是加起来为 0。如果你调整了精确度,情况就不会是这样,因此你将无法利用这种对称性进行这种修改。有关 BTS 扩展的更多信息,请参阅第 9.9 节。
9.1.5 将简单任务嵌入更复杂的任务中
如果之前的主观数据技术都不奏效,一个简单的解决方案是为你的任务创建一个额外的非主观问题,并假设如果标注者正确回答该问题,他们的主观标签也是有效的。图 9.7 展示了这样一个例子。

图 9.7 一个带有附加客观问题的主观任务。这个例子通过假设如果一个人正确回答了客观问题,他们的主观判断也是正确的,而不是错误,从而使得质量控制更容易。
在图 9.7 中,我们询问了一个关于信息中是否可以看到天空的附加问题。与物体类型不同,这个问题应该是明确和客观的:天空要么可见,要么不可见。因此,我们可以通过嵌入已知答案来测试人们是否正确回答了产品问题,或者通过使用本章讨论的技术寻找标注者之间的共识,来轻松地测试人们是否正确回答了这个问题。然后我们假设人们在主观任务上的准确性是相同的。
在使用这种方法时,我们依赖于这样一个假设,即简单客观任务的准确性将与主观任务的准确性高度相关,这将在很大程度上取决于你的数据。作为一个一般原则,问题与相关内容越接近,这种相关性应该越强。在我们的例子中,我们询问的是物体的上下文,因此准确性应该高度相关。
当实际任务耗时较长时,这种方法最为有效。如果你要求某人键入一段长文章的摘要,这通常需要很多分钟,那么询问关于文章的附加客观问题几乎不会增加额外的标注成本。
9.2 标注质量控制的机器学习
由于大多数数据标注的质量控制策略都是基于统计的决策过程,因此机器学习可以用于质量控制过程本身。实际上,本章和第八章中的大多数启发式方法都可以建模为在保留数据上训练的机器学习问题。这里介绍了四种由机器学习驱动的质量控制类型,所有这些类型都使用标注者在真实数据上的表现和/或共识作为训练数据:
-
将模型预测视为一个优化任务。使用标注者在真实数据上的表现,找到一个概率分布,该分布优化了损失函数。
-
创建一个模型来预测标注者的一次标注是正确还是错误。
-
创建一个模型来预测标注者的一次标注是否可能与其他标注者达成一致。
-
预测标注者是否实际上是机器人。
一些方法可以独立使用或组合使用。以下各节将依次介绍这些方法。
9.2.1 将标注置信度计算作为一个优化任务
在第八章中,你学习了你可以取所有标签的平均置信度。如果一个标注者的标注置信度低于 100%,剩余的置信度会分散到标注者未选择的标签上。我们可以通过查看所有标注者在真实数据上的标注模式来构建这种方法,然后将我们的置信度视为一个优化问题。图 9.8 展示了示例。

图 9.8 将在真实数据上的性能用作计算模型置信度的优化任务。在真实数据上,当 Alex 将项目标注为“行人”时,实际上 91%的时间是“行人”,“标志”1%的时间,“骑自行车的人”4%的时间,以及“动物”4%的时间。当我们看到 Alex 将一些新项目标注为“行人”时,我们可以假设相同的概率分布。当 Dancer 将一个项目标注为“骑自行车的人”时,我们知道实际上有 72%的时间是“行人”,显示出对这些类别的混淆。
图 9.8 显示了真实数据上标注的实际分布。如果你只有少量真实数据,你可能需要考虑使用简单的平滑方法(如添加常数)来平滑这个数字(拉普拉斯平滑)。
与第八章中的方法相比,这种方法的一个优点是你可能不需要丢弃低准确度标注者的所有标注。在图 9.8 中,Dancer 大多数时候都是错误的,因为他们在将项目标注为“骑自行车的人”时只有 21%的时间是正确的。然而,在“行人”是正确答案的 72%这一事实中,也存在有用的信息。所以,我们不是因为 Dancer 的低准确度而将其从我们的标注中移除,我们可以保留他们的标注,并通过模拟他们的准确度让他们为我们的整体置信度做出贡献。
为了计算整体置信度,你可以取这些数字的平均值,这将给出“行人”68.4%的置信度,“标志”2.6%的置信度,“骑自行车的人”27.2%的置信度,以及“动物”1.8%的置信度。然而,平均值只是计算整体置信度的一种方法。你也可以将这个任务视为一个优化任务,找到最小化距离函数(如平均绝对误差、平均平方误差或交叉熵)的概率分布。如果你来自机器学习背景,你会认出这些方法为损失函数,你可以将这个问题视为一个机器学习问题:你通过找到一个最佳匹配数据的概率分布来优化最小损失。
如果你在我们示例数据上尝试不同的损失函数,你会发现它们与平均值的差异不大。将这个问题变成机器学习问题最大的好处是你可以将除了标注本身之外的信息纳入你的置信度预测中。
9.2.2 当标注者意见不一致时收敛到标签置信度
在将汇总作为机器学习问题处理的基础上,我们可以使用真实数据作为训练数据。也就是说,我们不是优化从真实数据中提取的概率分布,而是构建一个使用真实数据作为标签的模型。图 9.9 展示了第八章中的真实数据示例如何扩展以显示每个真实项目的特征表示。

图 9.9 稀疏特征表示,以真实数据作为训练数据。我们可以对真实数据集上的每个标注进行计数,并将实际的标注作为特征,将真实数据标签作为机器学习模型的标签。然后我们有一个可以预测正确标签并给出与该预测相关的置信度的模型。
如果我们用图 9.9 中的数据构建模型,我们的模型将学会根据标注者在真实数据上的整体准确度来信任标注者。我们没有明确告诉模型标注的值与标签相同;模型自己发现了相关性。
这种方法的最大的缺点是,标注了更多真实数据的人会被赋予更高的权重,因为他们的特征(标注)出现在更多的训练数据中。你可以在标注过程中尽早标注大部分真实数据(无论如何都是一个好主意,以确定准确性和微调其他过程)以及在构建模型时,每个训练周期中为每个标注者采样相同数量的标注来避免这种结果。你还可以通过汇总标签数量但忽略谁进行了标注来克服这一缺点,如图 9.10 所示。

图 9.10 密集(汇总)特征表示,以真实数据作为训练数据。特征是每个标签的计数,从而忽略了标注者的身份。我们可以对真实数据集上的每个标注进行计数,将每个标注作为特征,并使用真实数据标签作为机器学习模型的标签。当你没有很多标注者的真实标签时,这个例子比图 9.9 中显示的例子更稳健。
如果你的模型期望特征值在[0–1]范围内,你可能需要将图 9.10 中的条目进行归一化。对于图 9.9 中的稀疏表示和图 9.10 中的聚合信息,你可以尝试使用你对每个预测的信心而不是将每个注释计为 1。这个信心分数可以是注释者自我报告的信心,如第八章所示,或者是一个预期的分布,如第 9.1 节中的主观判断。你可能还会有一个基于注释者过去工作的信心指标。无论你实验的是哪个数字,确保它不是从你即将训练的同一天真数据中得出的,这会导致你的质量预测模型过拟合。
就像稀疏示例一样,一个单独的神经元或线性模型应该足以给出图 9.10 的可靠结果,而不会对密集表示的数据过拟合。在任何情况下,你应该在尝试任何更复杂的事情之前,从一个更简单的模型开始。
在这个阶段,你可能想知道为什么你不能将稀疏和聚合信息都作为特征包含在模型中。你可以做到这一点!你可以创建一个模型,使用这些特征以及任何可能相关的其他特征来计算我们能够有多自信地聚合多个注释。但即使你决定采取“把所有东西都扔进模型”的混合方法来进行聚合,在开始尝试更复杂的模型和超参数调整之前,你也应该使用图 9.9 和 9.10 中的特征表示作为基准。
为了评估这个模型的准确性,你需要将你的真实数据分成训练数据和评估数据,这样你就可以在保留数据上评估信心。如果你使用比线性模型或单个神经元更复杂的东西,即你正在进行超参数调整,你还需要进一步分割以创建一个用于调整的验证集。稀疏和聚合表示都可以与使用模型的预测作为注释者一样使用。对于聚合表示,你可能需要考虑你是否希望将模型预测与人类注释分开进行聚合。
9.2.3 预测单个注释是否正确
使用机器学习进行注释质量控制最灵活的方式是将它作为一个二元分类器来预测单个注释是否正确。简单分类二元任务的优点是你可以使用相对较少的数据来训练模型。如果你正在使用真实数据进行训练,你不太可能有很多数据来训练,因此这种方法允许你最大限度地利用你拥有的有限数据。
如果每个项目只有少数标注者,这种方法特别有用。你可能只有预算让一个标注者查看大部分项目,尤其是如果标注者是可靠的领域专家(SME)时。在这种情况下,你想要识别 SME 可能出错的小部分案例,但你没有帮助识别这些案例的协议信息,因为你大部分时间只有一个标注。
最简单的实现方式是从标注者的身份和他们的注释作为特征开始,如图 9.9 所示。因此,这个模型将告诉你哪些标注者在真实数据中的特定标签上最强或最弱。
你可以考虑可能提供额外背景信息以确定标注者是否可能犯错误的其他特征。除了标注者身份和注释之外,你可能尝试在模型中使用的特征可能包括
-
同意该注释的标注者数量或百分比(如果存在)
-
关于被标注项的元数据(时间、地点和其他类别)以及标注者(相关人口统计信息、资质、在此任务上的经验等)
-
预测模型或其他模型的嵌入
元数据特征可以帮助你的模型识别可能存在偏见或注释质量中的有意义趋势的区域。如果元数据特征捕捉到了照片拍摄的时间,你的模型可能会学会夜间拍摄的照片通常更难准确标注。对于标注者也是如此。如果你的标注者本身是骑自行车的人,他们可能会对包含骑自行车者的图像有偏见,模型可以学会这种偏见。
这种方法也适用于主观数据。如果你有多个正确答案的主观数据,这些正确答案中的每一个都可能适用于二元模型。这项技术相当灵活;它也适用于许多类型的机器学习问题,如第十章所述。
向标注者展示正确的真实答案
当标注者答错时,你可以选择向他们展示正确答案。这次审查应该提高该标注者的表现,但也会使评估该标注者的准确性更难。在设计上存在权衡:你是否每次都告诉标注者他们犯的错误,从而使该标注者更准确,或者你保留一些或全部真实答案匿名,以便你可以更好地控制该标注者的表现?你可能需要找到一个平衡点。
对于基于真实数据的模型,在使用标注者已经学会正确答案的项目时要小心。例如,一个标注者可能对有一个人推自行车的真实数据项目犯了错误。然而,如果该标注者被告知了那个错误并给出了正确答案,那么该标注者不太可能后来犯同样的错误。因此,你的质量控制模型可能会错误地预测该标注者在他们现在高度准确的项目类型上的错误。
9.2.4 预测单个标注是否达成一致
作为预测标注者是否正确的一种替代方法,你可以预测标注者是否与其他标注者达成一致。这种方法可以增加训练项的数量,因为你可以训练一个模型来预测所有由多个人标注的项目的一致性,而不仅仅是那些在真实数据中的项目。这个模型可能更强大。
预测一致性对于揭示预期会有分歧但未发生的情况是有用的。也许是因为随机机会,少数标注者彼此达成了一致。如果你可以自信地预测分歧本应该发生,即使是由没有参与该任务的标注者,那么这一发现可以成为需要对该项目进行额外标注的证据。
你可以尝试两种方法:构建一个模型来预测标注者何时正确,以及构建一个独立的模型来预测标注者何时会与其他标注者达成一致。然后,当预测到标注是错误或预测到与其他标注者不一致时,你可以审查任务或引发额外的标注。
9.2.5 预测标注者是否为机器人
如果你与匿名标注者合作,并发现其中一名标注者实际上是一个在欺骗你工作的机器人,你可以创建一个二元分类任务来识别其他机器人。如果我们发现我们的标注数据中的 Dancer 是一个机器人,我们可能会怀疑同一个机器人正在冒充其他人类标注者。
如果你确信某些标注者子集是人类,他们的标注可以成为你模型的训练数据。这种方法实际上允许你训练一个模型来询问标注者,“我们是人类,还是我们是 Dancer?”
有时,机器人可以作为标注团队的一个很好的补充。机器学习模型可以标注数据或自主创建数据,或与人类结合创建数据。本章的其余部分致力于介绍自动化或半自动化数据标注的方法。
9.3 模型预测作为标注
半自动化标注的最简单方法是将模型的预测当作标注者。这个过程通常被称为半监督学习,尽管这个术语已经被应用于几乎任何监督和无监督学习的组合。
你可以信任模型的预测,或者将模型的预测作为众多标注员中的一个。这两种方法对你如何处理模型置信度和可能实施的审查模型输出的工作流程有不同的影响,因此它们被分别探讨。你还可以使用你的模型预测来寻找噪声数据中的潜在错误,这将在第 9.3.3 节中介绍。
我们会取代人工标注员吗?
自 1990 年代以来,每隔几年就有人声称解决了自动化标注问题。然而,三十年后,我们仍然需要为超过 99%的监督式机器学习问题标注数据。
关于自动标注的许多学术论文存在两个常见问题,无论是使用模型置信度、基于规则的系统还是其他方法。首先,它们几乎总是将自动标注方法与随机抽样进行比较。正如你在第二章中看到的,即使是一个简单的主动学习系统也能迅速提高你模型的准确性,因此与这些论文中的主动学习相比,评估其益处可能很困难。其次,这些论文通常假设评估数据已经存在,这在学术数据集中是正确的。然而,在现实世界中,你仍然需要设置标注流程来创建你的评估数据,管理标注员,制定标注指南,并在标注上实施质量控制。如果你为你的评估数据做所有这些,为什么不在标注组件上投入额外的努力来创建训练数据呢?
事实很少是全有或全无的解决方案。尽管我们无法从大多数监督式机器学习系统中移除人工标注员,但我们有一些令人兴奋的方法来改进我们的模型和标注策略,例如使用模型预测作为标签、嵌入和上下文表示、基于规则的系统、半监督机器学习、轻度监督机器学习以及合成数据。所有这些技术都有有趣的人机交互影响,并在本章中介绍。
9.3.1 信任自信模型预测的标注
使用模型作为标注员最简单的方法是信任模型预测作为标签,信任超过一定置信度阈值的预测作为标签。图 9.11 展示了示例。

图 9.11 将最自信的预测作为标签。模型预测项目为标签 A 或标签 B,最自信预测的项目被视为正确标签。这个例子允许我们快速构建模型,但有一个缺点:模型是从远离决策边界的项目构建的,这为可能存在的边界留下了大量错误。
图 9.11 展示了预测模型如何自动标记项目。我们可以从那个起点启动我们的模型。如果你有一个现有的模型但没有访问到该模型训练的数据,这种方法是合适的。这种情况在机器翻译中很常见。Google 发布了第一个主要的机器翻译系统,从那时起,每个主要的机器翻译系统都使用了来自 Google 引擎的翻译数据。尽管这种方法比直接标注数据不太准确,但它可以以较低的成本快速启动。
这种半监督学习,有时被称为自举半监督学习,在将现有模型适应新类型数据时很少单独工作。如果你可以自信地正确分类某物,你的模型从它已经自信的项目中获得的额外信息很少,而且你面临放大偏差的风险。如果某物真正新颖,模型可能不会自信地分类它,或者(更糟)可能会错误分类它。然而,当与主动学习技术结合使用以确保有足够代表性的数据时,这种方法是有效的。图 9.12 展示了将模型预测作为标注的典型工作流程。

图 9.12 展示了使用自信预测作为标注的工作流程。模型用于预测大量未标记项目的标签(可能是所有项目)。人工标注员审查一些标签,接受的标签成为训练数据的标注。人工标注员还使用这个过程来调整可以将标签自信地转换为标注的阈值。
这里有一些使用自信模型预测来创建标注的技巧:
-
置信度边际和置信度比率可能是最好的置信度度量,因为你想相对于其他标签有最高的置信度。所以这些指标是好的起点,但你也可以测试其他不确定性采样指标,看看什么最适合你的数据。
-
在每个标签的基础上设置置信度阈值,或者为每个标签采样前N个预测,而不是尝试为所有标签设置一个置信度阈值。否则,你最有信心预测的项目可能只来自少数几个容易预测的标签。
-
在每个迭代中训练两个模型:一个在所有标注上训练,另一个只在人工已看到的标注上训练。当第一个模型的置信度很高而第二个模型的置信度很低时,不要信任预测。
-
跟踪人工标注和自动标注的项目,并确保一定数量的训练周期只使用人工标注的项目,以防止你的模型偏离太远。(这种策略通常被称为伪标签)。
-
在你的主动学习下一次迭代中使用不确定性采样来关注你的新决策边界。
-
使用代表性抽样来找到与先前模型训练数据不同的数据(有关在结合人类和机器标签时使用代表性抽样的更多信息,请参阅第 7.5.4 节)。
使用模型预测来生成人类审查的候选对象,而不是完全信任它们,如果标注任务耗时较长,可能会有效。如果我们有一个有数百个标签的分类任务,标注者接受或拒绝预测标签作为二元分类任务会比手动从数百个标签中选择要快得多。这种情况在其他类型的机器学习中更为常见,如序列标注和语义分割,而不是标注。第十章将更详细地介绍如何使用模型预测来解决这些用例。
类似于图 9.12 中的审查工作流程可能会导致偏差,因为人类过于信任模型,从而持续甚至放大错误。我们将在第十一章讨论用户体验和标注界面时,介绍减轻这些错误的方法。
9.3.2 将模型预测视为单个标注者
将机器学习融入标注过程的第二种方法是包括来自下游模型的预测,就像它们是一个标注者的标注一样。假设我们例子中的标注者 Evan 不是人类;它是我们下游的机器学习模型。查看图 9.13,我们可以看到 Evan 的准确性相当高,除了任务 3,Evan 错误地将“Cyclist”预测为“Pedestrian”。因此,如果我们把 Evan 的预测当作一个人类标注者,我们可以应用完全相同的方法来达成正确的共识。

图 9.13 将模型的预测作为标注纳入其中。从我们的示例数据中,我们可以假设 Evan 实际上是一个预测模型,而不是人类标注者。对于任何考虑每个标注者准确性的方法,在这个工作流程部分将模型预测作为人类标注纳入通常是完全可以接受的。
你可以将模型的预测结果纳入其中,就像纳入任何其他标注者的标注一样。通过应用第 9.2.1 节中的技术,我们在计算最终概率分布时考虑了标注者的准确性,我们正在使用模型在真实数据上的准确性。
你可能需要考虑不同的工作流程,这取决于一个项目是如何被采样以进行标注的。如果你认为 Evan 是通过过去的交互训练并基于该知识行动的,那么 Evan 将受到过去交互和训练数据的影响,并将模仿那些人类行为,除非 Evan 变得对人类具有对抗性。
因此,如果一个样本与过去的训练数据相似,并且被 Evan 自信地分类,你可能会要求另一位标注员确认该标注,而不是使用你通常使用的最少标注员数量。这种方法介于我们信任自信预测和将模型视为标注员之间的策略。
9.3.3 通过交叉验证查找错误标注的数据
如果你有一个现有的标注数据集,并且不确定所有标签是否正确,你可以使用该模型来找到需要人工审核的候选标签。当你的模型预测的标签与已标注的标签不同时,你有很好的证据表明该标签可能错误,并且应该由人工标注员审核该标签。
然而,如果你正在查看现有的数据集,你的模型不应该在评估数据上训练,因为你的模型将过度拟合这些数据,并可能错过许多案例。如果你进行交叉验证,例如将你的数据分成 10 个部分,其中 90%作为训练数据,10%作为评估数据,你可以在不同的数据上训练和预测。
尽管关于在噪声数据上训练模型的大量文献,但其中大部分假设人类无法审核或纠正错误标注的数据。同时,文献假设可以花费大量时间调整模型以自动识别和解释噪声数据(参见第七章的毕业生经济学)。在几乎所有实际应用场景中,你应该能够标注更多的数据。如果你知道你的数据是噪声的,你应该至少为你的评估数据设置一个标注流程,以便你知道你的实际准确率。
有一些合法的理由,你可能会遇到无法避免的噪声数据。数据可能本身具有歧义,你可能会获得大量免费但噪声标签,或者你可能有一个为了提高吞吐量而牺牲一点准确性的标注界面。我们将在稍后讨论如何处理噪声数据的方法,但前提是在几乎所有用例中,拥有准确的学习数据都是更好的。
9.4 嵌入和上下文表示
目前许多机器学习研究集中在迁移学习:将一个模型从一个任务调整到另一个任务。这项技术为标注策略开辟了一些有趣的途径。如果你的标注任务特别耗时,例如语义分割,你可能能够以某种方式标注数量级更多的数据,然后使用这些数据在一个适应语义分割任务的模型中。
由于迁移学习是目前的一个热门研究领域,因此有很多术语在变化。如果一个模型是专门构建来适应新任务的,它通常被称为预训练模型,该模型中的信息被称为嵌入或上下文表示。图 9.14 展示了使用上下文嵌入的一般架构。

图 9.14 转移学习的示例。我们有一个预测项目是“A”还是“B”的任务,我们认为我们现有的预测“X”、“Y”或“Z”的模型由于两个任务之间的相似性,将包含有用的信息。因此,我们可以使用“X”、“Y”或“Z”模型的神经元作为我们预测“A”或“B”的模型中的特征(表示)。这个例子与书中早些时候的例子类似,那些例子使用隐藏层作为聚类的特征,并使用迁移学习来适应现有模型以适应新任务。在某些情况下,我们可能会忽略“输入 A”和“B”,只使用预训练模型作为我们新模型的表示。
你可能想尝试图 9.1 中架构的变体。你可以选择只使用表示中的某些层,尤其是当你担心维度过多时。或者,你可能只想使用预测标签,而不是任何模型内部表示,如果你只能访问模型预测,这将是你唯一的选择。这种做法在文献中可能被称为“使用另一个模型的预测作为特征”,而不是表示。
你还可以决定是否要调整现有模型或将其用作新模型中的特征。我们在第五章中实现了后者,用于自适应迁移学习,正如该章节所指出的,一个模型输入另一个模型(如图 9.14 所示)相当于调整一个具有冻结权重的模型。如果你正在训练所有模型而不使用现有模型,另一个选择是使用多任务模型;你有一个具有共享层但具有不同输出层或转换头的模型,用于不同任务。如果你从一个预训练模型开始,在适应实际任务之前先使用相邻任务来适应它,这个过程被称为中间任务训练。
你还可能决定在你的最终模型中使用多个模型表示,第十二章中的一些实际例子实现了这一点。
迁移学习、预训练模型、表示或嵌入?
机器学习社区尚未就不同迁移学习方法的名称以及它们在无监督到监督模型谱系中的位置达成共识。嵌入(Embeddings)在历史上是无监督学习的产物,但所有变种的监督版本很快便出现了。最近,自然语言处理(NLP)研究人员开始使用带有巧妙方法获取“免费”标签的监督模型,例如预测句子中的缺失单词以及预测两个句子在源文档中是否连续。因为这些模型是在上下文中预测单词或句子,所以它们通常被称为上下文表示或上下文嵌入,而模型则被称为上下文模型。因为这些模型是专门针对迁移学习进行训练的,所以它们也被称为预训练模型。
最近的一些监督方法有时被称为无监督方法,要么是因为嵌入在历史上一直是无监督的,要么是因为研究人员在预测从现有句子中移除的单词时不需要付费创建训练数据。在文献中,你可能会遇到任何组合的迁移学习、预训练模型、上下文表示和嵌入,以及描述为监督、无监督、半监督或自监督的学习方法。这些方法导致的标注工作量减少通常被称为单次、少量或零次学习,这取决于需要多少次额外的标注迭代以及模型适应新用例需要多长时间。
这些术语无疑会在本书出版后发展和增加,所以请仔细阅读任何论文中研究人员所讨论的内容。
这里有一些你可以在你的标注过程中使用嵌入和上下文表示的方法:
-
使用现有的嵌入或为你的部署模型调整预训练模型。
-
使用你数据中的固有标签来训练一组定制的嵌入。
-
在与你的实际任务相邻的任务上更高效地获取人工标注,然后从这些标注中构建上下文模型。
我们将在第 9.4.1 节至第 9.4.3 节中依次介绍这些示例。
9.4.1 从现有模型进行迁移学习
在使用神经网络模型的传统迁移学习方法中,是将一个为某个任务设计的模型适应到另一个任务的过程。在计算机视觉中,最著名的任务是将 ImageNet 模型适应到其他任务。你可能已经尝试过这种类型的迁移学习,这是第五章中主动迁移学习所使用的类型,所以我们在这里不再详细讨论。
你可能没有见过的一种变体是使用像 ImageNet 这样的数据集来进行比图像级标注更复杂的机器学习任务,例如语义分割。假设我们在图像上进行语义分割,以识别“动物”、“骑自行车的人”、“行人”和“标志”等在我们的示例用例中。还假设我们有 200 万张图片,标注每张图片需要大约一个小时(某些任务的典型时间),并且有相当于六年全职标注的预算。
完成语义分割需要 40 小时 * 50 周 * 6 人 = 12,000 张图片。也就是说,训练数据将包含大约 12,000 张图片(或略少,因为其中一些将作为评估数据保留)。尽管 12,000 是训练可接受的物品数量,但它并不大,不到可用数据的 1%。即使有良好的主动学习,某些稀有标签的示例也可能只有 1,000 个。
然而,你知道 ImageNet 有数百万个关于人、自行车和动物类型的示例。因此,你使用现有的 ImageNet 数据库,知道该模型中的神经元将包含每个对象类型的表示。因此,你知道仅用 12,000 个示例训练的语义分割模型可以利用在数百万个示例上训练的 ImageNet 中的表示。这种表示可能有助于你的模型,并且这个原则可以应用于其他类型的表示。我们将在第 9.4.2 节中基于这个观察结果。
9.4.2 来自相邻易于标注任务的表示
使用像 ImageNet 这样的现有模型的缺点是它是在不同的标签上训练的,并且很可能是用不同类型的图像训练的。你可以将一部分你的标注预算用于根据你在语义分割任务中使用的相同标签对你的数据进行图像级标注。尽管语义分割耗时,但你可以为诸如“这张图片中是否有动物?”等问题创建一个简单的标注任务,每个图像只需 20 秒,因此比完整分割更快。
如果你将六人年的预算中的一年移至图像级标注,你将得到每分钟 3 个 * 60 分钟 * 40 小时 * 50 周 = 360,000 个不同对象类型的图像级标签。然后你可以在这些标签上训练一个模型,知道该模型将包含每个对象类型的表示,并且它覆盖的多样性比语义分割标注(现在从 5 人那里有 10,000 个)要多得多。
如果你为图像上有 360,000 个相关标签,但仅减少了 2,000 个语义分割,你可以在你的模型中提供更丰富的信息。如果你的模型架构允许高效的嵌入,这种策略是一个值得考虑的策略。
这种策略还有额外的优势:它更容易在标注任务上实施质量控制,并且您将能够利用更广泛的劳动力,这些人可能无法进行语义分割,但可以进行标注。
难以预测的是,从移除 2,000 个语义分割训练数据项以添加 360,000 个图像级标签来为您的预训练模型带来的净收益。您可能想先从小规模开始实验。回想一下第八章中使用的图像级标注任务的工作流程示例,首先询问“这张图片中是否有自行车?”如果您有类似的流程,您已经正在生成可用于模型创建嵌入的数据。在您需要分配任何资源之前,这是一个开始实验的好地方。
9.4.3 自监督:使用数据中的固有标签
数据可能具有固有的标签,您可以用这些标签免费创建其他上下文模型。与数据相关的任何元数据都是构建模型的潜在标签来源,并且该模型可以用作您实际任务的表示。
在我们的示例数据中,假设我们在某些光照条件下存在准确性问题,但手动根据光照条件标注每张图片的成本太高,而且某些光照条件很少见。您的大多数图片都有时间戳,因此您可以使用这些时间戳自信地将一百万张图片过滤到不同时间段的桶中(可能是按小时或白天和晚上的桶)。然后您可以训练一个模型来根据一天中的时间对图像进行分类,知道该模型将包含光照的表示。无需让人类分析数据,您就有了一个近似预测光照条件的模型,可以用作其他任务的表示。这些如何结合嵌入的三个示例在图 9.15 中展示。

图 9.15 说明了如何使用迁移学习来提高模型的准确性以及它可能如何影响标注策略。在这里,三个其他模型正在向一个语义分割模型输入。顶部示例是适应在 ImageNet 上训练的模型,这是最常见的迁移学习类型。第二个模型是在我们关心的对象的 300,000 个图像级标签上训练的。第三个模型使用图像的时间戳来训练一个预测一天中时间的模型。因为顶部三个模型训练的数据量比语义分割模型多得多,只有 10,000 个训练项,它们应该有更丰富的图像表示,这有助于语义分割任务。
自由标签很有吸引力,你的数据可能有一些选项。即使是噪声标签也可能有所帮助。每个社交媒体公司都使用从标签构建的模型来处理计算机视觉和自然语言处理(NLP)任务。尽管不同的人使用标签的方式不同,但在预测这些标签时,有足够的信号可以帮助下游的计算机视觉和 NLP 任务。你的最终模型将上下文模型作为输入嵌入,并相应地加权,因此错误不一定传播。以下是一些你可能在数据中找到的例子:
-
用户生成的标签,例如标签和用户定义的主题
-
有意义的时期,例如白天/夜晚和周内/周末
-
关于数据或创建数据的人的地理信息
-
(特别是对于计算机视觉)创建数据的设备类型
-
(特别是对于网络文本)链接文本的域名或 URL
-
(特别是对于自然语言处理)上下文中的单词或标记,如许多预训练模型中所用
-
(特别是对于自然语言处理)两个句子或段落是否紧接着出现
-
(特别是对于计算机视觉)在上下文中视频帧的像素值
简而言之,如果任何元数据或链接数据可以成为标签,或者如果你可以有意义地删除数据的一部分并在上下文中预测它,那么这些数据可能是有用的内在标签的候选者,你可以使用它们来构建表示。这些将自由相邻标签纳入模型的方法自从搜索引擎在 21 世纪初首次使用它们以来就非常流行,并且随着神经模型的出现而最近再次受到关注。
注意,尽管标签是自由的,但维度是一个问题,尤其是在标注过程的早期,当你没有很多标注用于你的实际任务时。这个问题的一部分超出了本书的范围;维度是机器学习中的一个广泛问题,许多论文都探讨了在有限数据上构建模型时如何解决这个问题。但可以通过设计你的上下文模型来减轻一些问题。如果你模型中的接近最终层是你将用作表示的部分,你可能希望将该层设置为比你的训练数据项数量小一个数量级。你那个上下文模型的准确性可能会下降,但信息现在被浓缩到更少的维度(更少的神经元)中,这可能会提高你下游模型的准确性。查看有关模型蒸馏的文献,以了解如何在不损失太多准确性的情况下减少你模型的维度。你还可以使用经典统计方法,如 PCA(第四章)。
9.5 基于搜索和基于规则的系统
基于规则的系统在统计机器学习之前就已经存在,尤其是在自然语言处理(NLP)领域,并且仍然是研究的一个活跃领域。基于规则系统最大的优势之一是它们给标注者带来的所有权和代理感,尤其是那些是行业专家的标注者,使他们感觉自己处于驾驶座。我之所以在机器学习系统之上构建基于规则的系统,正是因为使用该系统的分析师想要一种直接将他们的专业知识输入系统的方式。在注释界面中提供这种级别的用户体验并不容易,我们将在第十一章回到这个问题的计算机-人交互方面。
小心基于规则的系统中的范围扩张
我看到许多人因为渐进式的范围扩张而陷入基于规则的系统,难以逃脱。一家流行的智能设备公司使用机器学习将语音转换为文本,但随后使用基于规则的系统将文本分类为不同的命令或问题(意图)。当公司在有限的几个问题上测试系统时,基于规则的途径是有意义的,但随着产品的推广,需要新的功能和对更多语言的支持,这种方法变得越来越困难。公司最终雇佣了数百人并行编写新的规则,以确定某些关键词组合如何映射到不同的命令。公司在花费超过一年时间并行构建机器学习能力的同时,几乎无法维持系统的运行,并且难以扩展所有规则及其相互作用的管理。公司得出结论,规则提供的快速启动最终并不值得;即使是一个简单的机器学习模型,只要有良好的训练数据,也会是一个更好的起点。
9.5.1 使用规则进行数据筛选
手工构建的基于规则的系统在数据筛选中被广泛使用。对于分层抽样,这种方法可以非常有意义。为了继续本章的例子,如果你在户外对图像进行分类,并且关心光照条件,你可以创建一个基于规则的系统,从一天中的不同时间采样相同数量的图像,以使数据更加平衡。
另一方面,如果规则是基于未经检验的直觉来筛选数据,你可能会得到有偏差的数据,并且当应用于现实世界数据时,系统可能表现不佳。这种情况在语言任务中尤其可能;任何基于关键词的规则都可能对罕见拼写有偏见,对语言素养较低的人可能犯更多错误,或者规则制定者可能不知道同义词。
即使你可以使用基于规则的系统进行标记任务并且不需要注释(除了你的评估数据),你仍然可能更倾向于使用基于规则的系统来自动注释数据,然后在那些注释上构建机器学习模型,而不是在生产中使用基于规则的系统。将上下文模型添加到基于规则的系统中是困难的,因此创建你基于规则的系统的机器学习版本将使其更容易与预训练模型集成。
9.5.2 训练数据搜索
搜索引擎界面在基于规则的系统和机器学习系统之间提供了一个很好的中间地带。一个领域专家可以搜索他们认为属于某个类别(标签)的项目,并快速接受或拒绝由该搜索返回的项目。如果领域专家知道某些项目对模型来说可能会很棘手,或者对于他们的应用来说本质上很重要,他们有快速深入相关数据的方法。这个例子类似于我们的工作流程,其中专家审查早期的注释,但在这个情况下,专家是推动整个过程的。
训练数据搜索可以被视为一种注释者驱动的多样性采样,其中负责找到所有相关数据以进行采样的个人也在创建注释。如果那个人将数据路由到其他人进行注释,这个过程几乎像是专家审查工作流程的反向。这个过程从领域专家开始,他们手动找到最重要的数据点;然后非专家注释者完成更耗时的注释任务。
允许利益相关者进行搜索功能,而不仅仅是领域导出,有它的优势。注释者可以通过允许搜索这些数据来获得他们正在注释的数据类型的好印象。机器学习科学家可以快速测试他们对哪些特征将在他们的模型中重要的假设。这种形式的数据探索性分析在轻度监督系统中也非常有价值。
9.5.3 遮蔽特征过滤
如果你通过规则或搜索快速构建一个训练数据模型,你应该考虑在训练模型时屏蔽你用来生成训练数据的特征。如果你快速构建一个情感分析分类器,并且通过搜索或过滤出表示“快乐”和表示“愤怒”的文本来创建初始训练数据,那么考虑在你的特征空间中屏蔽“快乐”和“愤怒”这些术语。否则,你的模型可能会轻易地过拟合“快乐”和“愤怒”这些术语,而无法学习到应该对文本情感有贡献的周围词语。
你可以考虑不同的掩码策略。例如,你可能在 50%的训练轮次中掩码这些单词,这样你的模型就需要花费 50%的时间学习那些不是搜索或规则策略一部分的单词。这种方法可以被视为针对从你的数据收集方法中传播的偏差的针对性变体。如果你将进行后续的主动学习迭代,你可以在早期迭代中移除这些单词,在早期过程中最小化它们的偏差,同时知道后续迭代的模型将包括它们,以最大化部署到你的应用程序的模型的准确性。
9.6 对无监督模型进行轻量级监督
探索性数据分析最广泛使用的方法之一是允许注释者,通常是行业专家,与无监督模型进行交互。第十二章中的一个例子是实现探索性数据分析。图 9.16 展示了针对多样性采样(第四章)的聚类方法的简单扩展。
图 9.16 中有许多变体,你可能想要尝试。除了聚类,你还可以使用相关的主题建模技术,特别是对于文本数据。除了基于距离的聚类,你还可以使用余弦距离(第四章)、基于邻近度的聚类,如 K-最近邻(KNN)或基于图的聚类。

图 9.16 轻量级监督的一个示例。数据被聚类,并且从每个聚类中采样少量项目。对于所有标签都相同的聚类,整个聚类都被赋予那个标签。可以在所有项目上构建监督模型,忽略在存在分歧的聚类中没有获得标签的项目。
9.6.1 将无监督模型调整为监督模型
图 9.16 中的聚类算法通过假设所有只有一个标签的聚类对所有的项目都有那个标签,扩展了第四章中的聚类示例。将此类模型转换为完全监督模型的其他方法包括:
-
对包含多个标签的项目的聚类进行递归聚类。
-
在最初使用图 9.16 中的方法之后,切换到不确定性采样。
-
随时间减少或移除自动标记的项目。
9.6.2 人类引导的探索性数据分析
有时,数据科学家的目标是纯粹的探索,不一定是为了构建一个监督分类模型。在这种情况下,注释者可能没有预定义的标签集。科学家可能使用聚类或其他无监督技术来寻找数据中的趋势,并根据这些趋势决定可能适用的标签。
搜索和基于规则的系统可以与无监督方法和基于时间趋势的方法一起使用。监督系统可用于标记数据和对分析进行分段。例如,一个人可能希望在将社交媒体消息分为正面和负面情绪之后对它们进行聚类,以查看每个情绪极端内的趋势。
9.7 合成数据、数据创建和数据增强
当原始数据不可用且从头开始创建数据比标注数据更便宜时,合成数据很有用。对于语音识别等用例,通常使用创建的数据。如果你为医院创建一个语音识别系统,你可能让人们阅读一份与医疗相关的单词或句子列表。在通常可用的语音数据语料库中找到每个相关医疗单词在每个你关心的口音或语言中的音频录音是不切实际的,因此数据创建被使用。
9.7.1 合成数据
小型手动创建的评估数据很常见。你可能为每个构建的模型创建一个包含已知病态边缘情况的评估数据集。或者你可能构建一个包含一些易于分类示例的小型评估数据集,并将在这个数据集上实现 100%的准确率作为发布新模型的先决条件——这是机器学习对软件开发人员单元测试的等效。纯合成训练数据,通常通过编程而不是手动创建,在以下一种或多种情况下最有用:
-
存在约束性问题,例如,数据最初以结构化格式开始,但最终以可预测的噪声类型结束的数据重构。
-
获取足够数据存在障碍(例如成本或稀有性)。
-
使用真实数据时存在隐私或安全问题。
-
当模型失败时,有可接受的回退方案供人类使用。
我只知道一个纯合成数据在机器学习中被广泛使用的案例:扫描信用卡号码。如果你已经将信用卡号码添加到手机上的应用程序中,你可能已经注意到可以选择拍照信用卡而不是输入数字。识别你的信用卡号码的模型几乎肯定是在没有任何人工标注的纯合成数据上构建的。它符合上述所有四种情况。你的信用卡号码最初是结构化数据,但它被打印在实体卡上,然后拍摄了该打印数字的照片,这是一个重构 16 个数字的约束性问题。没有扫描信用卡的大规模公开数据仓库。如果数据科学家和标注者能看到实际卡片的所有扫描图像进行标注,将引发隐私和安全问题。最后,如果扫描不成功,最终用户通常可以手动输入他们的卡号。
大多数使用合成数据的应用仍然包括一些数据标注,因此以下策略通常用于补充人工标注。如果你能够通过编程创建模型所需的所有数据,那么你可能一开始就不需要机器学习。
9.7.2 数据创建
解决数据缺乏的一个有效方法是要求标注者创建数据。这种方法是创建语音数据(第十章)的常见方法。对于文本数据,这种方法可以有效地解决数据中的空白。尽管不如自发文本真实,但这种方法可能比没有数据更好。
疾病爆发数据
当我开始写这本书时,我包括了一个基于观察的数据创建示例,即北美关于疾病爆发的新闻标题很少。遗憾的是,在 COVID-19 期间,这种情况不再成立。
在数据集创建任务中,我要求标注者想象他们正在经历疾病爆发,并使用基于规则的系统为每位标注者生成不同的提示。规则通过他们是否直接经历、目睹或间接听说爆发;感染或暴露的人数等因素来变化。这种方法旨在尽可能多地获得多样性,以克服人工文本在自发文本中的局限性。
我将这个数据集从书中排除,并考虑在疫情结束后发布。届时可能会很有趣地看到某人的生活经历如何影响他们当时创建示例数据的现实程度。
一些有趣的自动化数据创建技术结合了数据创建和合成数据,包括用于图像的生成对抗网络(GANs)和用于文本的语言模型。如果你想看自行车的图片,你可以训练 GANs 在现有的自行车图片上创建新的但逼真的自行车图片。同样,你可以训练语言模型来创建包含特定短语或关于特定主题的新句子。这些模型通常是用于上下文嵌入的预训练模型。在两种情况下,数据很少达到 100%的准确性,因此人工审查可以帮助筛选哪些生成数据是真实的。
当数据由人类或自动化过程创建时,这有助于解决训练数据的敏感性。你可能有一个基于从网络抓取的数据构建的语言模型,该模型有效地捕捉了一些敏感数据,例如人们的地址,这可能会使模型容易受到逆向工程的影响,从而暴露这些地址。然而,如果你可以使用语言模型重写所有序列并测试新序列是否出现在原始数据中,那么你可以在这些新数据上构建第二个模型。该模型应该更难被逆向工程以发现敏感信息。数据敏感性超出了本书的范围,但在这里将其标记为一个重要领域,其中人机交互的机器学习可以帮助。
9.7.3 数据增强
如果你从事计算机视觉工作,你应该熟悉数据增强技术,如翻转、裁剪、旋转、变暗等,这些技术通过修改一些训练数据项以创建更多项目或在这些项目内增加多样性。在自然语言处理(NLP)中,也存在类似的技巧,即用同义词数据库中的同义词或通过具有相似嵌入的词语替换原词。
在机器翻译和其他用例中,反向翻译是一种流行的数据增强方法,即将句子翻译成另一种语言,然后再翻译回原语言,以创建可能新颖但同义的句子。如果你将“这太棒了”翻译成法语再翻译回英语,句子可能变成“这非常好。”你可以将“这非常好”视为另一个有效的翻译。这种方法也适用于其他用例。如果你正在实施情感分析,并且将“这太棒了”作为标记为积极情感的语料库数据点,你可以使用反向翻译来创建“这非常好”作为另一个标记为积极情感的语料库数据项。
使用预训练模型的掩码语言建模是一种类似的技术。回想一下,常用的预训练模型可以预测上下文中的缺失词语。这项技术可以用来创建类似的句子。你可以取句子“亚历克斯开车去商店”并要求系统预测句子“亚历克斯 MASK 去商店。”中的 MASK。这个例子可能产生句子如“亚历克斯去了商店”、“亚历克斯步行去商店”以及具有相似意义的句子,这样就可以快速有效地创建一个更大的数据集。
9.8 将注释信息整合到机器学习模型中
你无法总是避免错误标记的数据。但即使你知道并非所有标签都是正确的,你仍然可以使用几种策略来获取尽可能准确的下游模型。
9.8.1 根据对标签的信心过滤或加权项目
最简单的方法是删除所有低标注置信度的训练数据项。你可以使用保留的验证数据调整要删除的正确数量。这种方法几乎总是可以提高模型的准确性,但往往被忽视,因为人们想要使用尽可能多的标注。如果你正在删除某些项目,请确保你至少检查你正在删除的内容,这样你就不会在数据中产生偏差。某些内容可能因为来自代表性不足的人口群体而置信度低。在这种情况下,使用多样性采样来帮助重新平衡数据。
而不是删除低置信度项目,你可以在模型中降低它们的权重。一些模型允许你作为其输入的一部分以不同的方式对项目进行加权。如果你的模型不是这种情况,你可以根据你对标签的置信度,在训练周期中编程选择项目。你应该能够使用验证数据调整这个过程,以便获得最佳的预测精度,同时仍然有一个包含标注者身份的模型。
9.8.2 在输入中包含标注者身份
将标注者的身份作为模型中的一个特征可以增加模型的预测能力,尤其是在预测不确定性方面。你可以包含额外的二进制字段,指示哪个标注者对标签做出了贡献。这种方法类似于在标注者意见不一致时将标注者身份包含在模型中,以收敛到正确的标签,但在这里,我们是在包含标注者身份的下游模型中部署新数据。
显然,你的未标记数据没有与之关联的标注者。你可以从模型中获得预测,而无需为实际预测设置任何标注者字段。然后,你可以通过设置不同的标注者字段来获得额外的预测。如果预测根据不同的字段而改变,那么你的模型正在告诉你不同的标注者可能会对数据点进行不同的标注。这个信息对于识别标注者之间可能达成一致的项目非常有用。
如果你引入一个字段来捕捉标注者身份,整体模型的准确性可能会下降。在这种情况下,你可以将一些训练项目的所有标注者字段设置为 0,无论是在数据本身中还是在某些训练周期中的掩码。你应该能够使用验证数据调整这个过程,以便获得最佳的预测精度,同时仍然有一个包含标注者身份的模型。
9.8.3 将不确定性纳入损失函数
在下游模型中使用标签不确定性的最直接方法是将它直接纳入损失函数。对于许多机器学习任务,你将把你的标签编码为全或无的一热编码:
| 动物 | 骑自行车的人 | 行人 | 标志 |
|---|---|---|---|
| 0 | 1 | 0 | 0 |
假设,然而,这是你从标注中得到的实际标签置信度:
| 动物 | 骑自行车的人 | 行人 | 标志 |
|---|---|---|---|
| 0 | 0.7 | 0.3 | 0 |
与将“骑行者”声明为正确标签并将其编码为 1 不同,您的模型可能允许您的目标函数将 0.7 作为损失函数试图最小化的值。也就是说,您要求模型收敛到 0.7 而不是 1.0,在这个例子中。如果您有置信区间,您有更多的选择。假设我们的置信度为 0.7,加减 0.1:
| 动物 | 骑行者 | 行人 | 标志 |
|---|---|---|---|
| 0 | 0.7 (±0.1) | 0.3 (±0.1) | 0 |
在这种情况下,如果模型收敛到“骑行者”0.6 到 0.8 之间的任何值,我们可能都会感到同样高兴。因此,我们可以修改我们的训练以考虑这个结果。根据您的架构,您可能不需要更改损失函数本身的输出;您可能能够在模型预测“骑行者”在 0.6 到 0.8 之间时跳过任何训练周期的这一项。
如果您对标签置信度有更精细的理解,您可以修改损失函数本身的输出。如果您对标签的置信度为 0.7,但在这 0.7 数字的两侧有高斯程度的确定性,您可能能够将不确定性的程度纳入您的损失函数,对一些损失进行宽恕,而不是全部宽恕,因为预测更接近 0.7。
您可以通过编程方式尝试本节中的方法,因此尝试将注释者和注释不确定性纳入您的模型的不同方式应该相对容易,以查看它们对您的任务如何工作。
9.9 高级注释的进一步阅读
本章主要使用了相对简单的图像和文档级别的标签示例,并对语义分割和机器翻译进行了一些扩展。第十章讨论了这些方法如何应用于许多类型的机器学习问题。相同的原理适用,但某些技术在某些问题上的效果更好或更差。
本节的一些进一步阅读假设的任务比标签更复杂,因此根据论文的不同,您可能需要在返回文献之前先阅读第十章。
9.9.1 主观数据的进一步阅读
在 2017 年,Dražen Prelec、H. Sebastian Seung 和 John McCoy 发表了“解决单问题群体智慧问题的方案”(mng.bz/xmgg),特别关注那些实际响应率比预测响应率更受欢迎的答案,即使它不是整体上最受欢迎的答案。(这篇论文不是公开的。)Dražen Prelec 为主观数据编写的 BTS 原始手稿可在economics.mit.edu/files/1966找到。后来发表在《Science》上的简短版本可在mng.bz/A0qg找到。
对于解决本章中提出的一些担忧的 BTS 有趣扩展,请参阅 Goran Radanovic 和 Boi Faltings 的“用于非二元信号的鲁棒贝叶斯真理血清”,www.aaai.org/ocs/index.php/AAAI/AAAI13/paper/view/6451。
9.9.2 关于机器学习用于注释质量控制的进一步阅读
关于结合机器和人类置信度的计算置信度方法,请参阅 Gagan Bansa、Besmira Nushi、Ece Kamar、Walter Lasecki、Daniel Weld 和 Eric Horvitz 的“超越准确性:心理模型在人类-人工智能团队绩效中的作用”,mng.bz/ZPM5。
对于 NLP 任务中注释者偏差的问题,请参阅 Mor Geva、Yoav Goldberg 和 Jonathan Berant 的“我们在建模任务还是注释者?对自然语言理解数据集中注释者偏差的调查”,他们建议评估数据(测试集)应由创建训练数据的不同注释者创建,mng.bz/RX6D。
Ashish Khetan、Zachary C. Lipton 和 Anima Anandkumar 的“从有噪声的单标签数据中学习”,详细介绍了通过使用注释者性能和模型预测来估计注释置信度的方法,mng.bz/2ed9。
关于使用模型预测作为标签的最早和最有影响力的论文之一是 Xiaojin Zhu 和 Zoubin Ghahramani 的“从标记和无标记数据中学习,使用标签传播”,mng.bz/1rdy。两位作者继续发表与主动学习和半监督学习相关的论文,这些论文也值得一看。
9.9.3 嵌入/上下文表示的进一步阅读
与本书中介绍的任何其他机器学习研究相比,迁移学习的文献似乎对过去的探索最少。嵌入技术始于 20 世纪 90 年代和 21 世纪初的信息检索中的潜在语义索引(LSI)方法,以支持搜索引擎。2000 年代见证了 LSI 的许多监督变体,通常采用巧妙的方法来获取免费标签,例如查看文档之间的链接。监督嵌入在 2010 年代初在计算机视觉中变得非常流行,特别是从像 ImageNet 这样的大型计算机视觉数据集中进行迁移学习,以及在 2010 年代末的自然语言处理(NLP)中。然而,NLP 和计算机视觉科学家很少相互引用或早期信息检索工作。如果你对这个主题感兴趣,我建议你研究这三个领域。
你可以从 1990 年的开创性论文“通过潜在语义分析进行索引”开始,由 Scott Deerwester、Susan Dumais、George Furnas、Thomas Landauer 和 Richard Harshman 撰写,mng.bz/PPqg。
关于如何通过在相邻任务上具有更多标签的上下文模型来帮助的最新研究,请参阅 Yada Pruksachatkun、Jason Phang、Haokun Liu、Phu Mon Htut、Xiaoyi Zhang、Richard Yuanzhe Pang、Clara Vania、Katharina Kann 和 Samuel R. Bowman 的“使用预训练语言模型的中间任务迁移学习:何时以及为什么它有效?”(mng.bz/JDqP)。作为这篇论文在多语言环境中的扩展,请参阅同一作者团队,以 Jason Phang 为首席研究员的这篇论文:“英语中间任务训练改善零样本跨语言迁移”(mng.bz/w9aW)。
9.9.4 基于规则系统的进一步阅读
关于基于规则系统的当前研究,请参阅亚历山大·拉特纳(Alexander Ratner)、斯蒂芬·H·巴赫(Stephen H. Bach)、亨利·埃伦伯格(Henry Ehrenberg)、贾森·弗赖斯(Jason Fries)、森武(Sen Wu)和克里斯托弗·雷(Christopher Ré)的“Snorkel:使用弱监督快速创建训练数据”(mng.bz/q9vE),以及他们网站上列出的应用和资源:www.snorkel.org/resources。
对于深入探讨这些技术的非自由资源,请参阅拉塞尔·朱尼(Russell Jurney)即将出版的(在出版时)书籍《弱监督学习:用更少的数据做更多的事情》(O’Reilly)。
9.9.5 将标注的不确定性纳入下游模型的进一步阅读
关于在下游模型中建模标注不确定性的最近研究,“从噪声单标签数据中学习”(第 9.9.2 节)是一个良好的起点,它解决了在标注者之间信息很少且错误很多的情况下出现的困难任务。
摘要
-
主观任务包含具有多个正确标注的项目。你可以从标注者那里引出人们可能给出的有效响应集合,然后使用 BTS 等方法发现所有有效响应,并避免惩罚正确但较罕见的标注。
-
机器学习可以用来计算单个标注的置信度,并解决标注者之间的分歧。对于许多标注任务,简单的启发式方法不足以准确计算标注质量或聚合不同人的标注,因此机器学习为我们提供了更强大的方法来从人类标注中创建最准确的标签。
-
模型的预测可以作为标注的来源。通过使用模型中最自信的预测,或者将模型视为众多标注者之一,你可以减少所需的人类标注总数。这种技术在你想将旧模型的预测用于新模型架构,并且标注与接受或拒绝模型预测相比是耗时任务时,尤其有帮助。
-
嵌入和上下文表示允许您将现有模型的知识适应到目标模型中,作为特征嵌入或调整预训练模型。这种方法可以指导您的标注策略。例如,如果您能找到一个比目标任务快 10 倍或 100 倍的相关任务,那么如果您将一些资源投入到这个简单的任务中,并使用它作为实际任务中的嵌入,您可能会得到一个更精确的模型。
-
基于搜索和基于规则的系统允许您快速过滤和可能标注数据。这些系统在快速标注模型,特别是使用噪声数据标注模型以及寻找重要的低频数据标注时特别有用。
-
在无监督模型上进行轻量级监督是标注者,尤其是 SMEs(行业专家),从少量标签中启动模型或当目标是提高人类对数据的理解而不是监督模型时进行探索性数据分析的常见方法。
-
合成数据、数据创建和数据增强是相关策略,它们创建新的数据项,特别适用于可用的未标记数据不包含所需数据多样性时,通常因为数据稀缺或敏感。
-
将标注不确定性融入下游模型的方法有几种:过滤掉或降低标签准确度不确定的项的权重,包括标注者在训练数据中的身份,以及在训练过程中将不确定性纳入损失函数。这些方法有助于防止标注错误成为模型中的不希望出现的偏差。
10 不同机器学习任务的标注质量
本章涵盖
-
将标注质量控制方法从标注扩展到连续任务
-
管理计算机视觉任务中的标注质量
-
管理自然语言处理任务的标注质量
-
理解其他任务中的标注质量
大多数机器学习任务比标注整个图像或文档要复杂。想象一下,你需要以创造性的方式为电影生成字幕。创建口语和手语语言的转录本是语言生成任务。如果你想用粗体文本强调愤怒的语言,那么这个任务就是一个额外的序列标注任务。如果你想像漫画中的文字泡泡一样显示转录本,你可以使用目标检测来确保文字泡泡来自正确的人,你也可以使用语义分割来确保文字泡泡放置在场景中的背景元素上。你可能还想要预测某个人对电影的评价作为推荐系统的一部分,或者将内容输入到一个可以找到类似励志演讲等抽象短语的搜索引擎。
对于这个简单的应用,为视频添加字幕,你需要许多类型的标注来训练你的模型。第八章和第九章介绍了标注的入门和高级技术,在大多数情况下以图像或文档级别的标注作为示例任务。本章涵盖了管理其他类型机器学习任务的标注质量的方法。
你很可能会单独使用这些方法,并可以直接跳到感兴趣的章节。然而,如果你有一个更复杂的任务,比如电影示例,或者你对适应不同类型的标注技术感兴趣,了解所有机器学习问题的方法是有价值的。真实数据、标注者间一致性、机器学习驱动的方法和合成数据都很有用,它们在机器学习任务中的有效性和实际实施设计各不相同。因此,本章的每个部分都突出了标注质量控制策略的优缺点。我们将从最简单的任务开始,即简单的标注之外的标注连续数据,并扩展到更复杂的机器学习场景。
10.1 连续任务的标注质量
如果你正在标注连续数据,那么许多质量控制策略与图像/文档级别的标注相同,但在什么是真实数据、一致性、主观性和(尤其是)聚合多个判断方面存在重要差异。我们将在以下各节中依次介绍每个主题。
10.1.1 连续任务的真实数据
对于持续任务,真实值通常实现为一个可接受的响应范围。如果您有一个基于 0-100 刻度的情感分析任务,并且有一个正面项目,您可能接受 80-100 范围内的任何注释为正确,而低于 80 的为不正确。这种方法允许您将质量控制视为标记,因此可以应用第九章中所有的方法。
可接受的范围将取决于您的具体任务。如果您要求人们读取图像中的数字——例如时间、温度或电池充电量——您可能只允许精确匹配。
如果您已经确定了一个可接受的答案范围,您可以像为标记任务那样计算单个标注者的准确性:计算他们每次落在每个真实响应的可接受范围内的频率。
10.1.2 持续任务协议
如果您的数据是序数的——例如三个点的“差”、“中性”、“好”刻度——您还应该查看第八章中关于序数值的 Krippendorff 的 alpha 示例。您只需要更改标签权重输入,以从标记任务适应到持续任务。
与真实值数据一样,您可以将彼此在可接受范围内的两个注释视为一致,并使用第九章中的方法计算标记任务的协议。对于预期协议,您可以计算有多少注释会随机落在给定范围内。如果您接受情感任务的 80-100 范围,您将计算所有注释中 80-100 范围内的注释数量(图 10.1)。

图 10.1 展示了在持续任务中计算预期协议的两种方式:随机数字落在该范围内的概率,以及整个数据集中落在该范围内的注释百分比
如果您的数据集大部分是负面情感,如图 10.1 中 80-100 范围的示例,预期协议可能较小。对于 10-30 范围内的响应,其中有很多响应,预期协议将高得多。
数据的分布特性允许更详细的协议计算。如果您有一个正态分布,您可以使用标准差而不是我们示例中的范围。所以如果您对自己的统计能力有信心,请查看第 10.1.3 节的数据分布特性。
10.1.3 持续任务中的主观性
持续数据集可以是确定性的或主观的,或者数据集可能对某些项目是确定性的,而对其他项目则不是。图 10.2 展示了示例。

图 10.2 确定性和非确定性连续任务的示例:从里程表图像估计汽车的速度。想象一下,你有两个标注,73 和 78。对于左侧的图像,图像是数字的,所以你知道有一个正确答案。也许图像模糊,使得 3 看起来像 8。所以正确的策略是选择更好的标注(73 或 78)。但对于右侧的模拟里程表,73 和 78 都是合理的估计,75.5 的平均值可能更好。所以正确的策略是汇总标注。
如图 10.2 所示,你甚至可能在同一个数据集中拥有确定性和非确定性数据。因此,这本书不能给你一个适用于所有可能数据集的技术;你需要估计你的数据集中有多少是主观的,并将这个估计纳入你的质量控制策略中。
对于本质上模糊或主观的项目,你可以要求标注者提供一个范围而不是单一值。你可以通过询问标注者认为其他人会标注的范围来减少适应偏差,就像在第九章中讨论的类别标注的主观性(第 9.1 节)一样,但在这个情况下是针对范围。
10.1.4 将连续判断汇总以创建训练数据
对于连续变量,可以使用群体智慧进行汇总。经典的例子是猜测一头牛的重量或罐子中弹珠的数量;通常,平均猜测比大多数人的猜测更接近正确值。图 10.3 显示了这样一个分布。

图 10.3 群体智慧的示例。尽管 20 个标注者的平均分数(虚线)不正确,但它比 20 个标注者中的 15 个个人分数更接近正确的(地面真实)分数。因此,平均数比大多数标注者更准确。
如图 10.3 所示,我们期望平均标注比大多数标注者的标注更好,但有两条注意事项:
-
虽然平均值可能比大多数人更好,但这并不一定是最佳选择,也不一定在所有情况下都比选择最佳标注更好。
-
在某些情况下,对于一项任务来说,平均值可能不如大多数人,这更可能在只有少数人标注每个项目时发生。
这个第二点对于训练数据来说尤为重要。大多数研究连续任务的群体智慧的学术论文都假设存在一个群体!让数百人标注每一个数据点将过于昂贵;更常见的情况是只有五人或更少的人参与。因此,当人们谈论与众包相关的群体智慧时,它最不适用于典型的众包标注系统。
作为一般准则,如果你有不到五位标注者,你应该考虑选择最佳标注者;如果你有成百上千位标注者,你应该取平均。对于介于两者之间的任何情况,你将不得不为你的数据和问题选择正确的策略。图 10.4 说明了何时应用群体智慧方法。

图 10.4 对于群体智慧,你需要群体。这张图显示了标注者的平均分数有多经常比大多数标注者的分数更接近真实分数。如果有三位标注者,大约 70%的时间,这些标注者的平均分数将比至少两位标注者的分数更接近实际分数。在创建训练数据时,每个项目通常不会超过十位标注者,这张图显示,当有十位标注者时,平均标注比大多数标注者的标注好大约 90%的时间。
图 10.4 展示了在假设数据集呈正态分布的情况下,群体智慧分布看起来是什么样子。在这个例子中,对于三位或更多标注者,你仍然最好选择平均分数,而不是随机选择其中一位标注者的分数。这个示例数据假设标注者的正确分数是平均分、中位数和众数。你自己的数据分布可能不太可靠,平均(平均)标注可能来自非正态分布,这些分布往往会高于或低于真实分数。因此,你应该像图 10.4 中那样计算自己的图表,使用你的真实数据,并看看你能否可靠地使用平均分数来处理连续数据。你可能发现选择一位标注者的分数比取平均更可靠,尤其是如果你只有少数几位标注者。
对于图 10.4 中的正态分布以及大多数其他分布,大多数情况下至少有一位标注者比平均标注更接近真实值,这为你的聚合策略设定了竞争性的观察:
-
大多数情况下,平均标注会比随机选择任何单个标注更好。
-
大多数情况下,至少有一位标注者的标注会比平均标注更好。
你可以根据你拥有的标注数量以及你对单个标注者的信心来调整你的策略。如果你的数据看起来像图 10.4,而你只有两位标注者,你应该随机选择这两位中的任意一位,而不是取平均。如果你有三位标注者,并且不确定其中任何一位是否比其他标注者更准确,你应该使用平均分数。如果你有三位标注者,并且有超过 73.34%的把握认为其中一位标注者比其他标注者更准确,你应该选择那位标注者的分数而不是平均分数。
如果你的数据本质上是非确定性的,你可能选择根本不进行聚合;你可能包括你信任的每个注释作为训练项。在训练数据中拥有有效的响应范围也将有助于防止你的模型过拟合。
10.1.5 将连续任务聚合以创建训练数据的机器学习
连续任务非常适合机器学习驱动的质量控制。你可以应用第九章中用于标签任务的几乎所有机器学习技术,但你的机器学习模型可以使用回归来预测连续值,而不是预测标签。
要使用稀疏特征预测正确的注释,你应该能够直接编码实际的注释。特征空间将与标签数据大致相同,但除了 1 或 0 的值,你将拥有每个注释者标注的实际数字。如果一个注释者在真实数据中经常标注过高,模型在预测正确注释时会考虑这一事实。根据你的架构,你可能需要将注释缩放到 0-1 的范围,但通常可以在不进行额外处理的情况下包含这些稀疏特征。如果你有大量的注释者,你的数据可能过于稀疏,并且与标签任务一样,你可以聚合一些注释以获得更密集的表示。
如果你的数据在可能的范围内是同质的,通过将注释编码为相对于平均分数,你可能会得到更好的结果。图 10.5 展示了示例。

图 10.5 使用机器学习预测注释中正确数字的绝对编码和相对编码的比较。在这里,Alex、Blake 和 Cameron 对一个真实值为 0.55 的地面真实项分别标注了 0.3、0.4 和 0.8。我们可以使用地面真实值作为标签(目标值)来编码注释的绝对值。或者,我们可以取注释者的平均值,即 0.5,并编码这个值应该比平均值高 0.05 的事实。我们同样通过注释与平均值的差异来编码每个注释。相对编码的另一种思考方式是,它编码的是我们平均值的误差而不是值。
如果你的数据是同质的——例如,如果你的数据中 0.05 的错误在所有部分中同样可能,那么图 10.5 中的相对编码可能对机器学习辅助质量控制来说是一个更准确的表现。你还可以将这些所有特征组合成一个模型:绝对特征、相对特征、聚合(密集)特征、元数据、模型预测、模型嵌入等。与分类数据示例一样,你需要意识到你最终会有多少维度,因为你可能只有有限的训练数据真实标签。从简单的模型和少量聚合特征开始,建立基线,然后在此基础上构建。
10.2 目标检测的标注质量
目标检测通常分为目标标注(识别对象的标签)和目标定位(识别该对象的边界)。在我们的示例中,例如第六章中关于目标检测的主动学习,我们假设使用边界框进行定位,但其他类型也是可能的,例如多边形或标记中心的点。
目标标注遵循与图像标注相同的质量控制方法,第八章和第九章的主要示例。由于实际原因,目标定位标注的质量控制通常通过工作流程完成:评估可能花费几分钟绘制的边界框的质量只需几秒钟。因此,通过将审查步骤添加到边界框标注的工作流程中,你通常只会为标注任务增加不到 10%的时间和成本。这种方法通常比实施自动化质量控制更有效。第八章中的示例工作流程,在图 10.6 中重复,就是这种情况之一。

图 10.6 一个审查任务,其中注释者正在评估一个边界框(通常由不同的注释者创建)是否正确或错误。当程序化质量控制困难或需要更多资源时,审查任务构成了许多质量控制策略的核心。
包含如图 10.6 所示的审查任务可以降低整体成本,因为你不需要将边界框绘制任务分配给许多人。然而,具有简单接受/拒绝区分的审查任务不会告诉你错误有多大,因此在某些情况下,仍然可以比较边界框与真实数据边界框。此外,查看注释者之间的协议对于第八章中概述的所有原因,特别是识别可能含糊不清的项目,也是有用的。在流程中审查任务之外,通常对目标检测注释进行一些统计质量控制是个好主意。
接下来,我们将回顾第六章中引入的模型不确定性度量,将其应用于人类质量和不确定性。请注意,本节中的一些内容与第六章中关于对象检测的主动学习部分重复,因为人类质量的不确定性度量与模型不确定性相同。由于你可能是在顺序之外或中断后阅读这些章节,因此这里重复了一些重要的度量。
10.2.1 对象检测的地面真实
对象检测的地面真实示例通常由少数几位专家标注者创建。为了对齐激励,当你希望获得尽可能精确的边界框时,通常最好按小时支付报酬,因为获取尽可能精确的边界框可能是一个耗时的过程,而按任务支付报酬并不能使有效的小时补偿与良好的数据需求相一致。
你也可以将创建地面真实数据作为工作流程的一部分。图 10.7 展示了如何将图 10.6 扩展,以便专家标注者可以将非专家标注转换为地面真实示例,仅在必要时编辑实际框。

图 10.7 将图 10.6 中的审查任务扩展,以便专家标注者可以编辑非专家标注者创建的边界框。这种方法是创建地面真实数据的一种方式。
在将标注与地面真实示例进行比较时,通常允许一定的误差范围,因为边界在几个像素级别上可能是不明确的。你可以使用专家来校准你数据的误差范围。如果专家标注者相对频繁地不同意 3 个像素以内,那么可能可以原谅任何 3 个像素或更小的错误。当人们估计的对象边界不在视野内(被另一个对象遮挡)或超出画面时,你可能还需要允许更宽的误差范围。
与标注任务一样,你可能希望特别采样地面真实项目以实现多样性。除了标签和现实世界的多样性之外,样本可能还包括对象大小、对象维度以及对象在图像中的位置多样性。
交并比(IoU)是计算标注者与地面真实之间的准确性的最常用度量。图 10.8 展示了 IoU 的一个示例。准确性是通过预测边界框和实际边界框相交的面积除以这两个框覆盖的总面积来计算的。

图 10.8 用于测量边界框(位置精度)准确性的 IoU 示例。准确性是通过将标注者的边界框与地面真实边界框相交的面积除以两个框的并集面积来计算的。
对象检测中很少对随机猜测进行 IoU 的校正。如果物体相对于图像大小较小,差异可能无关紧要,因为猜测一个有意义的重叠框的概率很低。然而,你可能有一些情况,其中物体占据了图像的大部分,特别是如果你有要求人们在放大图像上添加或编辑框的工作流程。
如果你想调整随机概率,可以将图像中在框内的百分比作为基线。假设一个标注的 IoU 为 0.8,且物体占据了图像的 10%:
调整后的 IoU = 0.8 – (0.1 / (1 – 0.1)) = 0.6889
这种调整计算与整个图像被认为是对象的情况相同,因为与整个图像相比,10%图像的 IoU 是 10%。
IoU 比精确率、召回率和 F-score 更严格,因为它在相同的数据上往往有更低的值。将 IoU 视为正确或错误预测的面积(或像素)的数量:

IoU 在计算机视觉中更常用,它不允许在那些使用精确率、召回率或两者组合(如 F-score,精确率和召回率的调和平均值)的任务上直接与准确率进行比较。如果你使用精确率、召回率和 F-score 而不是 IoU,你应该仍然使用整个图像对象作为调整随机概率的基础,但请注意,你将得到不同的数值。假设对于占据图像 10%的同一物体,标注的 F-score 为 0.9:
预期精确率 = 0.1
预期召回率 = 1.0
预期 F-score = (2 * 0.1 * 1.0) / (0.1 + 1.0) = 0.1818
调整后的 F-score = 0.9 – (0.1818)/(1 – 0.1818) = 0.6778
你可以看到,尽管我们最初在 IoU 和 F-score(0.8 和 0.9)的准确率上存在 10%的差异,但在调整随机概率后,它们最终相差 1%左右(0.6889 和 0.6778)。你可以通过实验你的数据集来查看两种准确率方法之间是否存在显著差异。
10.2.2 对象检测的一致性
对象检测的标签一致性与图像标注相同;你可以计算每个标签之间的一致性水平,并根据随机猜测这些标签的基线进行调整。与图像标注一样,你需要决定哪种基线计算最适合你的数据:随机标签、数据频率或最频繁的。(参见第 8.1 节中的定义。)
两个标注者之间的定位一致性是通过他们两个框的 IoU 计算的。整个对象的一致性是所有成对 IoU 的平均值。图 10.9 显示了为一张图像标注的多个边界框的示例。

图 10.9 多个标注者标注的多个边界框的示例。整体一致性是通过所有框的平均成对 IoU 计算的。
你可以使用与用于真实值的相同调整来处理随机性,但请注意,这种做法很少见;大多数人通过仅使用未调整的 IoU 来查看目标检测中的协议。
10.2.3 目标检测中的维度和精度
由于问题的维度,目标检测可能产生低于其他机器学习任务的分数。如果一个标注者的框在每一边都比真实值大 20%,那么在每个维度上就大了 40%。对于两个维度,140%² = 196%,使得误差几乎翻倍,因此标注者的 20%误差可以变成大约 51%的 IoU 分数。这个数字会随着维度的增加而上升。一个在所有维度上比真实值大 20%的 3D 边界框会产生大约 36%的 IOU。
这个例子突出了标注精度对于目标检测可能如此困难的一个原因:我们用于比较的指标会放大错误。这种误差范围对于某些任务来说可能很重要。假设你正在尝试预测用于物流或超市货架补货的纸箱体积。如果你在 5%的误差范围内原谅标注者,这听起来像是一个合理的误差,但标注者在所有维度上超出了 5%,那么总体体积会增加 33%(110%³ = 133.1%)!如果你的模型是在包含 33%误差的数据上训练的,那么你无法期望它在部署时能预测得更加准确。因此,在设计任务和决定可接受的标注精度水平时,你应该格外小心。如果你正在跟踪标注者在不同类型工作(如图像级标注)中的精度,那么将标注者在目标检测中的精度与其他任务分开跟踪可能更简单,而不是让他们的低目标检测结果拉低他们的总体精度得分。
10.2.4 目标检测的主观性
你可以将目标检测的主观性处理方式与处理连续任务的主观性方式相同:你可以询问标注者一个对象是否可能有多个可行的框,并要求他们标注这些框。你可以将每个这样的框视为一个可行的标注,并最终可能为每个对象得到多个框。
你也可以询问标注者他们认为其他人会如何标注,以激发更多样化的回答,并使标注者更舒适地标注一个有效但少数派解释。
10.2.5 将目标标注聚合以创建训练数据
将多个标注聚合到一个单一边界框中的问题与连续值的问题类似:无法保证平均边界框是正确的,或者任何单个标注者拥有的边界框是正确的。例如,如果你正在围绕一个背着背包的“行人”放置边界框,包含或排除背包可能是正确的,但半个背包的平均值是不正确的。
您可以使用多种策略来聚合边界框。以下列表大致按从最有效到最无效的策略顺序排列:
-
为专家添加一个任务来审查或裁决每个框。
-
使用平均边界框(但请注意局限性)。
-
使用最准确的标注者的框。
-
创建一个最小框,该框包围了N个标注者的框。
-
使用机器学习预测最佳框(第 10.2.6 节)。
对于您特定的数据集,最有效的策略可能不是第一个。您可能需要结合使用多种策略而不是单一策略。对于第四种策略,您还需要决定N应该是多少。如果您有四个标注者,您应该通过包围两个或三个标注者注释的最小框来聚合吗?可能没有正确答案。
重叠对象也可能在聚合边界框时提出一个难题。图 10.10 显示了两个标注者具有不同数量框的重叠边界框的示例。

图 10.10 重叠边界框的示例。很难区分来自不同标注者的哪个框适用于同一对象。一个标注者(长虚线)标注了两个对象。另一个标注者(短虚线)标注了三个对象。
您可以使用多种方法来确定图像中某个区域内的对象数量,通常这些方法会组合使用:
-
创建一个单独的任务来询问出现多少个对象。
-
为专家添加一个任务来审查和裁决重叠的框。
-
使用贪婪搜索技术来组合来自不同标注者的框。
您有不同的聚合选项,如第三种策略中所述。一个简单的选项是使用最大 IoU 作为确定下一个要组合的两个框的标准。您可以假设每个标注者每个对象一个框(尽管可能存在错误)和一个 IoU 阈值,低于该阈值您不会进行组合。
贪婪搜索不一定是最优的,所以从理论上讲,您可以将这种策略扩展到对您数据的更彻底搜索。在实践中,如果您无法通过简单的贪婪搜索解决重叠对象,您应该使用单独的审查或裁决任务。
10.2.6 对象标注的机器学习
使用机器学习进行边界框标注的最强大方式是预测每个标注框的 IoU。这种方法使我们能够为每个注释获得一个置信度分数,该分数将比取每个标注者的平均 IoU 更准确。
对于标注者在真实数据上创建的每个边界框,该边界框的 IoU 成为您模型预测的目标。除了图像本身之外,您还可以编码与每个注释相关的特征,这可以包括
-
每个标注者的边界框
-
每个标注者的身份
-
标注者在他们的注释中提供的标签
这些功能将帮助模型权衡标注者的相对准确性,考虑到他们在不同类型的图像上可能更准确或更不准确。在编码了训练数据后,你可以使用连续输出函数来训练你的模型以预测 IoU。将此模型应用于预测由标注者创建的任何新边界框的 IoU,以获得该标注者对该边界框的 IoU 估计。
你还可以在单个模型内进行模型集成和/或蒙特卡洛抽样的实验,以获得每个边界框的多个预测。这种方法将为你提供对该标注者对该图像可能 IoU 范围的更清晰了解。请注意,你需要对你的采样策略有信心,因为你在使用这些图像作为模型的一部分。地面真实数据中的任何偏差都可能导致预测每个标注者置信度的技术出现偏差。
通过查看你的标注者的预测 IoU 及其一致性,你可以调整你的整体工作流程。例如,你可能会决定信任所有预测 IoU 超过 95%的标注,让专家审查所有预测 IoU 在 70%到 85%之间的标注,并忽略所有预测 IoU 低于 70%的标注。确切的数字可以根据你的数据进行调整。
你还可以使用机器学习将来自不同标注者的边界框聚合到一个边界框中。尽管这种方法是聚合边界框最准确的方法,但你可能仍然需要一个专家审查的工作流程,因为通常自动化聚合过程以避免错误通过是非常困难的。
与连续数据一样,你可以通过使用绝对或相对编码来编码边界框的位置。图 10.11 显示了相对编码的一个示例。

图 10.11.边界框的相对编码。图像被裁剪并拉伸,以确保每个训练项具有相同的尺寸和位置。相对编码解决了图像中对象位置不同的问题,并使模型能够关注更少的功能以进行预测。
图 10.11 中的相对编码与第 10.1.5 节中介绍的绝对和相对编码的连续任务原理相同。如果你的数据是同质的——例如,如果你的图像所有部分的 5 像素误差可能性相同——那么相对编码可能是机器学习辅助质量控制的更准确表示。
你可以使用许多增强技术来提高聚合边界框的机器学习。这些技术包括翻转;旋转;调整大小;模糊;以及调整颜色、亮度和对比度。如果你在计算机视觉领域工作过,你可能会熟悉这些用于改进你的机器学习模型的技术。如果你没有在计算机视觉领域工作过,从以算法为重点的计算机视觉书籍中学习这些技术将是最好的开始。
10.3 语义分割的标注质量
在语义分割,也称为像素标注中,标注员会对图像中的每个像素进行标注。图 10.12 展示了从第六章重复的一个例子,在关于语义分割的主动学习部分(6.2 节)。有关目标检测和语义分割之间区别的更多信息,请参阅第六章。

图 10.12 一个语义分割的例子,其中每个像素都被标注为“人”、“植物”、“地面”、“自行车”、“鸟”或“天空”。这类彩色照片是许多语义分割工具的外观:一个填色练习。我们将在第十一章中介绍这些工具。如果你以黑白形式查看这张图片,对比度的灰色阴影应该能给你一个关于彩色图像的好印象。如果同一类别的不同物体收到一个标签(例如,四棵树分别标注),这个任务就被称为实例分割。
对于大多数你需要用于语义分割的质量控制,你只是简单地调整了图像级别标注的方法。但在这个情况下,你是在查看每个像素的准确度,而不是整个标签。你通常将每个像素的标注准确度平均,以获得图像的整体标注准确度。
10.3.1 语义分割标注的地面实况
将语义分割标注与地面实况数据进行比较就像在像素级别进行标注:相对于随机机会,被标注正确的人像素百分比。当错误标注的像素在具有正确标签的像素一定距离内时,你可能接受一个小缓冲区(例如几个像素)。你可以将这些错误视为正确,或者在准确度计算中忽略这些像素。
如果你原谅在正确答案附近几个像素内发生的错误,仔细寻找所有标注者在边界附近相同像素上犯的错误,因为这些错误可能是标注工具的结果。与任何其他机器学习任务相比,语义分割更多地使用智能工具,如魔法棒或套索工具来选择区域,以加快处理过程。这些工具通常基于简单的启发式规则,如相邻像素的对比度。如果标注者没有注意到使用这些工具产生的错误,你将教会你的模型工具的简单启发式规则,而不是标签之间的正确边界。工具错误可能发生在任何机器学习任务中,第十一章将更深入地探讨这些问题,但这个问题在这里被标记出来,是因为它在语义分割中发生的频率很高。
你观察了图像标注标签之间的错误模式,你也应该查看像素标签之间的错误模式。如果某些标签比其他标签更重要,你可以给它们更高的权重。例如,如果你对自行车的关注程度高于天空,你可以提高自行车的权重。取宏观平均是使所有标签权重相等的最常见方式。在某些情况下,你甚至可以在计算准确率时忽略一些标签,特别是当你有一个通用的背景标签,除了它与其他标签混淆时,你对其不关心。
10.3.2 语义分割的协议
你测量每个像素的协议与图像标注完全相同:测量标注者对该像素标签的协议。你可以用相同的三种方式计算预期的协议:该标签在所有数据中的频率、最常见标签的频率,或者标签总数的倒数。你应该为你的数据集选择最合适的预期频率。如果你有一个通用的背景标签,这个标签的整体频率可能是预期协议的好候选。
10.3.3 语义分割标注的主观性
在实践中,解决语义分割歧义最常见的方式是通过复查或裁决。如果一个区域被标注为不确定,或者标注者意见不一致,可以增加一个额外的标注者进行裁决。
在语义分割任务中,通常要求所有像素都获得标签,当标注者对某些区域不确定或存在多个有效解释时,这可能会带来问题。为了激发语义分割的主观性,最简单的方法是添加一个名为“不确定”的额外标签,标注者可以使用它来表示他们不知道该区域的正确标签。“不确定”区域可以是一个独立的区域,或者你可以要求标注者在完成的分割上叠加“不确定”区域,这样即使存在混淆,你也能知道最可能的标签是什么。
有关贝叶斯真理血清(BTS)如何扩展到标注任务之外的示例,请参阅第 10.7 节。我了解到没有将 BTS 扩展到主观语义分割任务的工作,但第 10.7 节中列出的论文将是开始的地方。
10.3.4 聚合语义分割以创建训练数据
从多个标注中聚合训练数据与标注任务相同,但在像素级别上。尽管所有相同的策略都是可用的,但是当只有少量不一致存在时,将整个图像交给额外的标注者是很昂贵的。因此,在这些情况下,使用工作流程来裁决图像的某些区域是一个更好的选择:
-
将整个图像上的一致性较低的图像交给额外的标注者。
-
使用专家来裁决图像中局部区域内一致性较低的图像。
图 10.13 展示了裁决过程的示例。

图 10.13 展示了通过工作流程进行语义分割聚合的示例。两位标注者在某个区域上存在分歧,该区域被传递给第三位标注者进行审查和裁决。有两种界面选项:裁决者可以从前两位标注者的两个区域中选择一个,或者他们可以直接在图像上标注,其中存在分歧的区域以未标注的形式呈现。
如图 10.13 所示,你可以将不一致区域定义为任何连续像素集,其中标注者之间的一致性较低。你可以在像素级别上以与标签相同的方式定义一致性:标注者之间的一致性百分比,可能还需要考虑你对他们准确性的信心。在实践中,你每张图像可能不会超过两个或三个标注者,因为语义分割是一项耗时的工作。你可能会简单地将任何不一致视为需要裁决的区域,而不是通过真实数据上的性能设置阈值。
假设你有限的时间内可以裁决不一致,你可以根据大小对数据集中的不一致进行排序,并从大到小进行裁决。你也可以考虑不一致的程度。
如果你更关心某些标签而不是其他标签,可以根据你对每个标签的关心程度对裁决进行分层。如果你对自行车的关心程度是天空的十倍,那么对于每一个可能被标记为“天空”的不一致,你可以裁决十个可能被标记为“自行车”的不一致。不要尝试将 10:1 的比例作为区域大小的权重来应用,因为这太难手动调整这些启发式方法了。
10.3.5 使用机器学习聚合语义分割任务以创建训练数据
您可以使用与标注相同的机器学习方法进行语义分割,但需在单个像素级别上操作。一个额外的复杂性是您可能需要解决像素块中不切实际的“拼贴”之间的分歧。如果图 10.13 中鸟的翅膀变成了“天空”和“鸟”像素的棋盘,那么这种结果可能比错误地将整个翅膀称为“天空”还要糟糕,因为您可能会错误地向您的下游模型传授棋盘图案是可能的。
为了简化机器学习的应用,您可以实现一个模型来预测每个像素的二元“正确”/“错误”区分。使用您的保留真实数据,构建一个模型来预测您的注释员标注错误的像素,应用所有您的新标注数据,并生成候选的“错误”区域供专家审查。
这种由机器学习驱动的方 法对于发现来自工具的错误(例如智能选择工具)特别有效。在某些情况下,由于工具的原因,两个或更多注释员可能会犯相同的错误,并且一致性的检查可能不会将这些区域识别为潜在的错误。然而,您的真实数据应该告诉您从工具中可以期望出现哪种类型的错误(也许“天空”被错误地称为“树木”太频繁了);因此,您的模型将在其他图像的相似部分预测错误。
10.4 序列标注的注释质量
在实践中,序列标注通常比标注更常使用人机交互方法。最常见的情况是识别稀有文本序列,例如长文档中的地点名称。因此,序列标注的注释界面通常呈现候选序列以供审查或生成带有自动完成的序列,而不是要求注释员标注原始文本。
在序列标注中,您可以使用不同类型的界面进行此类审查任务,第十一章将介绍它们。对于审查任务,质量控制可以像标注任务一样实施,这是序列标注方法的一个额外优势:在二元或分类标注任务上执行标注质量控制比在序列标注任务上更容易。
然而,您并不总是可以将序列数据作为审查任务进行标注,尤其是在项目开始时,您还没有一个可以用于预测未标记数据中序列候选者的模型。您还面临只展示现有模型候选者的风险,从而持续模型偏差。因此,在原始、未标记数据上运行一些标注仍然是有用的。
序列标注的质量控制方法遵循第六章中关于序列标注主动学习的许多方法。本节将回顾它们,假设您可能没有阅读关于主动学习的部分(或者不是最近阅读的)。让我们回顾一下该部分中的示例:
“E-Coli outbreak was first seen in a San Francisco supermarket”
如果你正在实现一个从文本报告中追踪爆发的模型,你可能想从句子中提取信息,例如每个词的句法类别(词性[POS]),“Nouns”(名词)、“Proper Nouns”(专有名词)、“Determiners”(限定词)、“Verbs”(动词)和“Adverbs”(副词),疾病名称,数据中的任何地点,以及重要的关键词,如表 10.1 所示。
表 10.1 序列标签类型:词性标注;关键词检测;以及两种类型的命名实体,疾病和地点。词性标注标签每个标记一个,可以类似于质量控制的标注任务。“B”(开始)应用于跨度的开始,而“I”(内部)应用于跨度内的其他单词。明确标记开始允许我们明确地区分相邻的跨度,例如“San Francisco”和“supermarket”。这种编码技术称为 IOB 标记,其中“O”(外部)是非标签。(“O”因可读性而从表中省略。)对于多跨度任务,如关键词和实体,质量控制比标注任务更复杂。

在文献中,你通常会看到跨度使用 IOB 标记,如表 10.1 所示。你可能为不同类型的标签以不同的方式定义多标记跨度。“E-Coli”作为一个实体是一个单词,但对于关键词短语“E-Coli outbreak”,则是两个单词。严格来说,表 10.1 中的注释约定称为 IOB2 标记,而 vanilla IOB 仅在单个跨度中有多个标记时使用“B”。
对于较长的序列,例如将文档拆分为句子或识别说话中轮流的人,你可能只想标注每个序列的开始或结束,而不是整个序列,以提高标注者的效率。
10.4.1 序列标注的真相
对于大多数具有多标记跨度的序列标注任务,质量控制是评估整个跨度的正确性。如果一个标注者将“San”识别为实体,但没有将“Francisco”识别为该实体的部分,则该标注者不会获得部分准确率。与计算机视觉中的目标检测不同,对于文本序列没有广泛使用的 IoU 等约定。
如果你有一个连续的任务,比如我们的命名实体示例,除了全跨度准确率外,查看每个标记的准确率也是有洞察力的。我的建议是在评估标注者准确率时,将标签任务与跨度任务分开:
-
按每个标记计算标签准确率。如果某人只将“San”标记为地点,则该标签正确,但“Francisco”对于地点来说将是假阴性,对于选择的任何其他标签将是假阳性。
-
在整个跨度上计算跨度准确率。如果某人只将“San”标记为地点,则该跨度获得 0%的信用。
这种区分使你能够将标注者对哪些单词属于哪些标签的实用理解与他们对指令中构成多词短语的句法理解区分开来。
你可以将每个标签的准确率与微观或宏观平均相结合,以计算该标注者的整体准确率。如果你有稀疏数据,特别是如果你正在计算微观平均,你可以从计算中省略“O”(非跨度),因为否则“O”标记将主导准确率。你可以根据你如何评估你的下游模型来做出这个决定:如果你在评估模型准确率时忽略“O”标记(除了在其他标签中的假阳性和假阴性之外),你可以忽略“O”标签来评估标注者质量。
如果你想要比较标注者在该任务上的准确性与他们在其他任务上的准确性,你需要包含“O”标签并调整随机性。虽然忽略“O”任务与调整随机性相似,但它不会产生相同的最终准确度分数,因为忽略“O”没有考虑到它的实际频率。
确保指令正确!
我为几乎每家主要科技公司以及包括公共卫生、汽车和金融在内的特定用例构建了命名实体数据集。在所有情况下,我们花费更多的时间来细化定义哪些内容可以包含在一个跨度中,而不是任务的任何其他部分,我们与标注者紧密合作,将他们的专业知识纳入决策过程。例如,当“San Francisco”被写成“San Francisco city”时,"city"是否应该是地点的一部分?如果它是“New York city”,又会怎样?我们经常看到“New York City”或缩写“NYC”,但不是“SFC”,所以这些案例可能不同。此外,在旧金山湾区,旧金山被称为“The City”。当这个名称被称作地点时——只有当它被大写时,那么在社交媒体上,它可能不会经常被大写,又该如何?其他语言又如何,它们很少或根本不使用大写来表示实体?
这些类型的案例是大多数序列任务中错误最常发生的地方,无论是标注还是机器学习模型。与标注者紧密合作以识别困难案例并将它们添加到指令中非常重要。你还可以将这些案例中的一些包含在真实数据集的非代表性部分中。
10.4.2 真实连续数据中的序列标注真实数据
与我们的连续序列文本示例不同,一些序列任务实际上是连续的。语音和手语是两个很好的例子。与文本不同,口语在大多数单词之间不留空隙,而手势者在做手势时也不会在单词之间停顿。在这两种情况下,我们的大脑从连续输入中在单词之间添加大多数空隙,所以并不总是有一个明显的点,一个单词结束而下一个单词开始。
这个例子与第 10.2 节中计算机视觉中的边界框示例类似,在那里使用 IoU 来衡量真实标签的准确度。然而,在大多数序列任务中,质量控制的传统做法是允许从真实标签示例中有一个误差范围,而不使用 IoU。
即使在语言数据中这不是惯例,但如果对于你特定的序列任务有意义,就没有理由不使用交并比(IoU)。在这种情况下,你可以使用第 10.2 节中关于真实标签准确性和一致性的方法。你还将获得一个优势:因为序列是 1 维的,误差范围的影响不会像计算机视觉中更常见的 2 维和 3 维标注那样严重。
10.4.3 序列标注的一致性
对于每个标记或预分割序列都分配标签的任务,例如词性标注,你可以将每个标记或分割视为一个单独的标注任务,并应用第八章和第九章中的标注方法。
对于具有稀疏标签的文本序列任务,例如关键词提取和命名实体识别示例,可以在每个标记的基础上或在整个跨度上计算一致性。我建议将跨度的预测与标签分开,与真实标签数据的划分方式相同:
-
在每个标记的基础上计算标签一致性。如果一个标注者只将“San”标注为地点,而另一个标注“San Francisco”,则标签的一致性为 50%。
-
在整个跨度上计算跨度一致性。如果一个标注者只将“San”标注为地点,而另一个标注“San Francisco”,则跨度的标签一致性为 0%。
使用审查和裁决任务来解决分歧。如果标注者在两个重叠跨度的边界上意见不一致,可以让另一个标注者解决这个分歧。通常,让大量标注者对整个文档进行标注以解决单个争议的成本过高,因此一个简单的裁决系统通常是最佳选择。
10.4.4 序列标注的机器学习和迁移学习
所有最先进的序列分类器都使用预训练的上下文模型。你应该为自己的序列任务尝试这些模型,同时记住,随着训练数据的增加,不同的预训练模型可能比其他模型更有用或不太有用。理解预训练模型如何帮助是很容易的。对于我们关于地点的例子,一个在数十亿句子上预训练的模型将学会“城市”、“乡村”、“镇”和其他地点名称在语义上是相似的,并且它们前面的单词更有可能是地点。但可能需要数百万份文档,你才能在足够相似的环境中看到足够多的“城市”、“乡村”和“镇”的例子,以便预训练模型能够进行这种泛化,而你不太可能对用于你的序列标注任务的数百万份文档进行标注。
如果你拥有预训练模型并且可以访问这些模型的训练数据,你应该将代表性采样作为你的主动学习策略之一,以采样与你的目标领域最相似的项目。如果你在目标领域中有大量未标记的数据,你也可以尝试调整预训练模型以适应你的领域。
如第 10.4 节所述,大多数现实世界的序列标注策略都使用模型预测作为人类审查的候选序列。模型用于预测候选序列,标注者可以将这些注释作为二进制任务接受或拒绝,这允许轻松的质量控制。确保你创建一些好和坏的示例的真相示例,这样你就可以在二元审查任务中评估标注者与真相,而不仅仅是查看一致性。
使用模型预测来生成候选序列存在偏差的风险。当模型错误时,标注者可能会被诱导信任模型预测。这种类型的偏差在第十一章中有详细说明。
使用模型预测的另一个潜在偏差来源是,你可能会错过模型没有以任何信心预测的序列。如果不小心,这种偏差可能会放大你模型中的偏差。一个很好的解决方案是,有一个简单的任务,其中所有文本都被评估是否包含序列。图 10.14 展示了用于位置实体的示例。

图 10.14 展示了询问序列是否存在于文本中而不要求标注者标注该序列的标注任务示例。这种方法特别适用于快速确保没有遗漏任何文本以供潜在实体使用,并且可以使用可能不太准确识别实体边界的更广泛的劳动力。
使用如图 10.14 所示的工作流程,并使用单独的任务获取实际序列范围,可以减少因序列不是模型候选而错过序列的机会。
使用任务来减少偏差和吸引更广泛的劳动力的一种潜在副产品是,你可以构建一个专门用于预测序列是否出现的模型。这个模型可以用作你的实际序列模型的嵌入,如图 10.15 所示。

图 10.15 展示了询问序列是否存在于文本中的标注任务示例,这创建了一个可以作为序列标注任务中嵌入的模型。这种方法在标注任务的数据量远大于序列任务的数据量(多十倍或更多)时特别有用,这可能是旨在减少偏差和吸引非专家标注者的工作流程的副产品。
如果你有一个大量标记为包含或不包含序列的数据集,如图 10.15 所示的结构可以提高你下游模型的准确性。请参阅第 9.4 节,了解在相邻任务上注释数据以创建迁移学习表示的策略。
10.4.5 用于序列标记的基于规则、基于搜索和合成数据
基于规则的、基于搜索的以及合成数据生成方法在生成稀疏数据中的候选者特别有用。以我们的位置示例识别“旧金山”这样的序列为例,有几种方法可以使用自动化注释来快速开始生成候选者。例如,你可以使用已知地名列表作为基于规则的系统,或者从该地名列表构建合成句子。
我已经使用过所有这些序列注释的方法,通常在随机抽样时将相关注释的比例保持在 100:1,接近初始的 2:1 比例。这些方法使得模型在初始数据很少的情况下能够快速启动。
使用合成数据也提高了覆盖率。例如,当我为组织构建命名实体系统时,我通常会确保至少有一些合成训练数据示例,包含所有对该组织重要的产品、人员、地点和其他实体的名称。
10.5 语言生成中的注释质量
对于大多数语言生成任务,质量控制通常由人工专家完成,而不是自动化。例如,当人类将一种语言的句子翻译成另一种语言时,质量控制通常由一位专家翻译员来执行,他们审查工作并评估翻译的质量。
这种情况也适用于模型本身。关于语言生成质量控制的大多数文献都是关于如何信任人类专家的主观判断。关于如何根据 1-5 的评分来判断机器翻译输出的质量,有大量的文献,知道每个 1-5 的判断都可能是一个主观任务。在这些情况下,数据采样对于评估数据也很重要,因为在这种情况下,人们需要花费时间手动评估输出,这是昂贵的。因此,在随机抽样的数据和/或代表模型部署的数据多样性的数据上评估尤为重要。
在创建语言生成任务的质量训练数据时,合适的劳动力是最重要的因素。正如第七章所述,确保你的注释员具有所需的语言流利性和多样性可能需要大量的精心规划。请参阅以下侧边栏,了解你可能需要走多远才能找到合适的人的故事。
关于语言来源的忏悔
丹妮拉·布拉加的专家轶事
在我们公司,我们自豪于走得更远,以确保我们获得最佳数据,这有时会导致一些令人捧腹的情况。对于文本和语音数据,最困难的问题通常是找到流利的说话者。找到具有正确资格并能说正确语言的人是机器学习中最为困难和被忽视的问题之一。
最近,我们为一个有特定语言需求的客户进行了一项主要项目收集工作。在几次尝试寻找合适的人选以解决稀有语言的问题后,我们其中一位员工去了一个他知道的可以找到符合要求的人的教堂。尽管他找到了我们客户所需的人,但他不小心在忏悔时间出现了。牧师认为他是为此而来,因此一如既往地,他做了完整的忏悔,包括关于寻找语言的事情。
丹妮拉·布拉加是 DefinedCrowd 的创始人兼首席执行官,该公司为语言和视觉任务(包括 50 多种语言中的文本和语音)提供训练数据。
10.5.1 语言生成的基准事实
当使用基准事实数据进行自动化分析时,通常存在多个可接受的基准事实答案,最佳匹配被使用。机器翻译数据集通常有多个相同句子的翻译,例如。机器翻译的句子与每个基准事实翻译进行比较,最佳匹配被认为是计算准确性的适当选择。
对于机器翻译,你有许多计算匹配的方法,最简单和最普遍的是双语评估助手(BLEU),它计算机器翻译与基准事实示例之间匹配子序列的百分比。大多数用于序列任务的自动化质量控制指标都使用像 BLEU 这样的简单方法,查看输出与一组基准事实示例之间的重叠百分比。
对于标注质量,你通常需要为评估数据创建多个基准事实示例。根据那种任务类型,这些示例可能是多个有效翻译的句子、多个对较长的文本的摘要,或者聊天机器人对提示的多个回复。
你应该要求标注者提出多个解决方案,除了将任务分配给多个标注者并行处理之外。为了更复杂的质量控制,你可以让专家对基准事实数据示例的质量进行排名,并将该排名纳入你的评估指标中。
10.5.2 语言生成的协议和聚合
在语言生成任务本身中很少使用标注者间一致性,尽管它可以用于评判生成文本质量的人。理论上,您可以通过查看标注者之间文本差异(使用 BLEU、余弦距离或其他指标)来追踪标注者何时与其他标注者意见不一致。在实践中,让专家快速审查他们的输出以评估质量要容易得多。
将多个语言生成输出汇总为单个训练数据项通常没有意义。如果模型需要一个文本片段,那么这项任务通常是通过从示例中选择最佳候选者来完成的。尽管这项任务可以程序化完成,但在实践中很少这样做。如果您有多个标注者为同一任务生成文本,让一位专家选择最佳方案只需额外花费很少的时间。
10.5.3 语言生成的机器学习和迁移学习
由于手动创建语言生成数据需要花费大量时间,因此您可以从机器学习中获得极大的加速。事实上,您可能经常使用这种技术的例子。如果您的手机或电子邮件客户端提供预测下一个单词或句子补全功能,您就是人机交互序列生成中的人类!根据技术,应用程序可能通过从通用的句子补全算法开始,并逐渐调整模型以适应您的文本来使用迁移学习。
您可以通过多种方式实现这种架构;它不需要像句子补全技术那样具有实时交互功能。如果您的序列生成模型能够产生大量潜在输出,您可以使用专家评审任务来选择最佳方案,这样可以大大加快速度。
10.5.4 语言生成的合成数据
合成数据在许多语言生成任务中很受欢迎,尤其是在可用原始数据的多样性存在差距时。对于翻译任务,您可以给标注者提供单词并要求他们创建包含该单词的原始句子和翻译。您可以使用其他标注者来评估示例句子的真实性。对于转录任务,您可以要求某人说出包含特定单词的句子并将其转录下来;对于问答任务,您可以要求某人提供问题和答案。在所有情况下,质量控制都成为评估生成示例质量的标注任务,可以遵循第八章和第九章中的质量控制方法。
图 10.16 展示了语言生成的流程图。标注员被提供了两种类型的数据,他们需要创建并使用这些数据来生成合成示例。对于机器翻译的例子,这两种类型可能是不在训练数据中出现的两个单词,标注员被要求使用这些单词及其翻译来创建多个句子。

图 10.16 展示了在没有未标记数据存在的情况下生成数据的流程图。这个流程图看起来与其他人工介入的流程图相似,但在数据创建方面没有自动化。人类查看现有示例,并被告知需要创建的示例类型(此处为 A 型和 B 型)。这些示例被添加到训练数据中。
合成数据生成的最难部分是多样性。提示人们使用某些单词或谈论某些事件相对容易。然而,当人们处于压力之下时,他们往往会使用比自然语言中更正式的语言和更短的句子,在自然语言中人们并不那么自我意识。第十一章介绍了一些获取尽可能自然的数据的技术。
10.6 其他机器学习任务的标注质量
使用真实数据、标注员间的一致性和机器学习驱动的标注的相同质量控制技术适用于许多其他机器学习任务。本节从高层次概述了更多内容,以突出重要的相似性和差异性。
10.6.1 信息检索的标注
信息检索是机器学习领域,涵盖了驱动搜索引擎和推荐系统的系统。许多标注员被雇佣来调整搜索引擎的结果。这些系统是一些最古老和最复杂的带有人工介入的机器学习系统。
在搜索引擎的情况下,模型准确性通常通过是否为给定查询返回相关结果来评估。为了使第一个结果比后续结果有更高的权重,信息检索通常使用如折现累积增益(DCG)等方法进行评估,其中 rel[i]是排名位置 p 的结果的分级相关性:

log()函数用于降低低级别条目的权重。你可能希望第一个搜索结果是最准确的;你对第二个搜索结果的关心稍微少一些,对第三个搜索结果的关心又少一些,依此类推。对于真实数据,标注员可以通过产生一个最大化 DCG 的候选响应排名来评估。换句话说,最佳排名是将最相关的放在第一位,第二相关的放在第二位,依此类推。一个好的标注员是那些排名最接近真实示例的人。
在信息检索中,DCG 很少因随机机会进行调整,通常是因为“大海捞针”搜索和推荐系统有如此多的潜在响应,随机机会很低。换句话说,数据是稀疏的,随机机会通常接近于零。
稀疏性也可能阻止有效的随机抽样。如果一个注释者在搜索引擎上搜索“篮球”,并需要在随机选择的页面上选择结果,那么所有结果都可能是不相关的。同样,如果一个注释者在购物网站上搜索“篮球”,并返回随机产品,所有结果可能都是不相关的。注释界面将使用现有模型来返回相关结果,而不是随机样本。
要获得注释者的 0-1 评分,可以计算归一化折现累积增益(NDCG)。NDCG 是注释者实际评分除以最高可能评分(注释者所看到的最佳排名,即从展示给注释者的真实数据中得出的完美排名)。这个评分基于注释者所看到的内容(可能是 10 到 15 个候选人)进行归一化,而不是所有可能的候选人,是信息检索中随机机会调整准确度的最流行替代方案。
由于它们对高概率候选人进行过采样,信息系统有可能放大偏差,因为只有高概率的项目被作为候选人返回。这种偏差可以通过添加少量低概率结果来平衡,以增加潜在选择的多样性。在这些情况下应使用 NDCG;否则,注释者的评分将人为地偏低。
如果通过最终用户的选取进行调整,信息检索系统也可能存在偏差,因为大多数查询往往涉及少数高频短语。被雇佣来调整模型的注释者也可以通过给予不成比例更多样化的短语来评估,以平衡训练数据。了解你的训练数据中有多少来自注释者或最终用户,也指导你的主动学习策略。
有时候,你不能通过要求注释者判断相关性来模拟信息检索的使用,因为你不是在优化相关性。在这些情况下,机器学习模型通常优化为面向商业的指标:一个人购买的数量,搜索和购买之间的点击次数或秒数,未来六个月内客户的价值等等。因为它们关于模型的实际使用,这些指标有时被称为在线指标,与 F 分数和 IoU 相对,后者是离线指标。
信息检索系统通常使用其他类型的机器学习来提供有助于信息检索系统的额外功能/元数据。例如,一部电影可能会被标记为电影类型,而推荐系统会建议你认为你会喜欢的电影类型。以下是一些向信息系统提供输入的任务示例:
-
根据主题对查询短语进行标注,例如将“basketball”搜索分类为“体育设备”类型,以缩小搜索结果
-
执行对象检测以允许搜索,例如允许某人通过上传该产品的照片来搜索产品
-
标注内容类型,例如将音乐分类为“振奋人心”和“阴暗”等类别,以制作适合用户口味的音乐推荐
-
在地图上标注位置类型,例如将商店分类为杂货店或零售店以改进地理搜索
-
从内容中提取序列,例如提取产品的名称、尺寸、颜色、品牌和类似特性,以支持高级搜索系统
在所有情况下,任务本身比信息检索本身要简单:标注、对象检测和序列标注。但这些组件被用于针对用户行为优化的信息检索系统,例如用户多久返回一次该公司的网站。在这些情况下,构建实际信息系统的个人会跟踪这些组件的重要性。
信息检索中的另一种有用技术是查询重构,这是大多数搜索引擎使用的增强技术策略。如果某人搜索“BBall”但没有点击任何结果,而是立即搜索“Basketball”,这一事实告诉你“BBall”和“Basketball”是密切相关的术语,并且“Basketball”的结果应该与“BBall”的结果相似。这种简单但聪明的技术产生了额外的免费训练数据,同时也使你的模型更接近最终用户的偏好交互。
10.6.2 多字段任务的注释
如果你的注释任务包含多个字段,你应该考虑将任务分解为子任务,并通过工作流连接这些子任务。无论如何,除了对整个任务进行评估外,还应该对各个字段进行质量评估。考虑以下从类似文本中追踪疫情的事例:
“大肠杆菌疫情首次在旧金山的超市被发现”
如果你明确想要捕捉关于这一事件的详细信息,注释可能看起来像这样:
疾病:大肠杆菌;位置:旧金山。
因此,你可以分别评估“疾病”和“位置”的准确性,也可以评估整个事件的准确性。请注意,我们的例子很简单,但并非所有文本都如此明显。考虑以下两个例子:
“大肠杆菌疫情首次在远离旧金山的超市被发现”
“在旧金山和奥克兰分别检测到大肠杆菌和李斯特菌”
在第一个例子中,我们不希望包括位置。第二个例子有两个我们想要分别捕捉的事件。任务不仅仅是将句子中的每个位置与每种疾病匹配;这是一个更复杂的标注和机器学习问题。你可以将这个任务分解成其子任务,并使用机器学习半自动化,使其成为三个标注任务:
-
标注句子是否讨论疾病爆发为是/否。
-
标注候选位置和候选疾病。
-
将位置和疾病的候选组合标注为同一事件。
通过正确的流程、界面、审查和裁决,复杂的标注事件系统可以变成一系列标注任务,其质量控制比整个事件的质量控制要容易得多。
大多数像这个例子一样更复杂的标注任务可以分解成更简单的任务。确切的接口、质量控制以及机器学习组件取决于你如何分解任务、使用的劳动力以及任务本身的性质。但大多数人可以遵循将复杂任务分解成更简单的机器学习预测审查任务的模式。
10.6.3 视频标注
大多数图像质量控制方法也适用于视频中的目标检测和/或语义分割。如果你需要识别视频中的时间点或片段,连续数据和序列标注的方法也适用。
对于目标跟踪,你正在结合定位(边界框)、序列标注(物体可见的帧)和标注(应用于物体的标签)的方法。正如那些例子所示,单独跟踪这些指标比尝试将它们组合成一个单一标注准确度分数要容易。
一些常见的视频标注任务可以纯粹被视为序列标注任务。例如,一个摄像机记录一个人开车,可以在他们似乎没有看路的时候进行标注。序列标注的方法可以应用于这些任务。
视频中的目标检测和/或语义分割的真实数据通常是在单个帧上计算的。如果你的视频长度差异很大,你可能想要从每个视频数据中抽取相同数量的帧,而不是随机抽取所有视频中的帧,这会偏向于较长的视频。
视频任务中的标注者间一致性是根据正在评估的子任务计算的:标注、目标检测、序列识别等。这些方法应适用于视频标注。与真实数据一样,我建议你单独跟踪一致性,而不是尝试将它们组合成一个单一的一致性计算。
视频标注非常适合机器学习自动化。例如,机器学习模型可以跟踪对象的移动,标注员只需要在预测错误时纠正帧。这种做法可以提供实质性的加速,但也可能使模型中的偏差持续存在。
合成数据对于视频标注也有效,但多样性有限。如果你在一个模拟的 3D 环境中自己创建对象,你已经有了关于这些对象移动的完美标注,并且可以比通过人工标注以相同预算创造更多数量级的数据。然而,合成数据可能缺乏多样性,并可能将病态错误引入数据,使模型在现实世界数据上的表现更差。你通常需要小心使用这种方法,并将其与真实世界数据结合使用,使用代表性采样确保你的标注员在真实世界数据上工作,这些数据与你的合成数据最不同。
10.6.4 音频数据标注
语音标注专业人士通常拥有高度专业化的标注工具。专业转录员使用脚控,例如,可以快速前后移动录音。语音分割和转录界面在计算机出现之前就已经存在,许多专门技术几乎一个世纪前就已经为磁带录音机开发了。我们将在第十一章中介绍质量控制与音频界面的交集。
根据标注要求,音频可以标注为标记任务、序列任务或生成任务。识别人类语音是否发生是一个标记任务,标注某人在何时讲话是一个序列任务,转录语音是一个生成任务。你可以将这些技术应用于这些任务。
合成数据在语音中很常见,尤其是在要求人类说出某些短语时。可用的公开数据中,关于人们说不同语言的录音并不多。在这些录音存在的地方,语音通常很敏感,因此即使是能够捕获大量语音数据的公司,如手机公司,通常也不应该捕获这些数据,并且应该小心谁可以听到这些数据来进行标注。因此,要求某人朗读文本通常是许多语音识别数据集创建的主要方式。
合成数据也用于确保语音的多样性。例如,某些音素(单个发音声音)在大多数语言中都很罕见。为了确保这些罕见的组合存在于训练数据中,人们通常会给出一些无意义的文本脚本,要求大声朗读;这些单词被仔细选择,以涵盖罕见的音素组合。这种方法可能需要为讲不同口音的人重复进行。
由于敏感性,制造智能设备的公司构建了完整的假客厅、卧室和厨房来收集数据。演员被雇佣与设备互动,在遵循诸如“坐在沙发上背对设备”的指示的同时发出许多命令。如果你已经在这个领域工作,我建议邀请你的朋友和家人参观这些工作室之一,而不要给他们任何背景信息。走进一个中心设有假客厅的大型、昏暗的仓库,里面充满了说些无意义话语的人,这种感觉就像变形外星人正在准备入侵地球,真是奇怪。
10.7 不同机器学习任务注释质量进一步阅读
与本书中其他主题相比,不同任务的质量控制文献较为稀少,但一些相关论文几乎讨论了章节中涵盖的所有内容。
10.7.1 计算机视觉进一步阅读
一篇关于数据质量评估的优秀论文是“使用 Krippendorff Alpha 评估计算机视觉应用中注释数据质量”,由 Joseph Nassar、Viveca Pavon-Harr、Marc Bosch 和 Ian McCulloh 撰写(mng.bz/7Vqg.)
展示没有一种接口适合所有计算机视觉任务的深入研究的论文之一是“两个工具胜过一:工具多样性作为提高总体众包性能的手段”,由 Jean Y. Song、Raymond Fok、Alan Lundgard、Fan Yang、Juho Kim 和 Walter S. Lasecki 撰写(mng.bz/mg5M)。这篇论文也是其他近期计算机视觉注释工作的良好参考资料。
对于计算机视觉中用于模型但也可应用于注释的数据增强技术,我强烈推荐 Richard Szeliski 所著的《计算机视觉:算法与应用》,第 2 版(szeliski.org/Book)。
对于自动化判断是否为特定图像绘制边界框或进行审查任务是否最优的有趣示例,请参阅“学习智能对话框进行边界框注释”,由 Ksenia Konyushkova、Jasper Uijlings、Christoph H. Lampert 和 Vittorio Ferrari 撰写(mng.bz/5jqD)。
10.7.2 自然语言处理注释进一步阅读
专门针对自然语言处理,“计算语言学中的编码者间一致性”,由 Ron Artstein 和 Massimo Poesio 撰写,这是一项良好的基础工作,特别是在讨论序列标签中的协议及其与重叠范围和识别标记或段落的复杂性方面表现突出(mng.bz/6gq6)。
对于语言生成,一篇不错的近期论文是“Agreement is overrated: A plea for correlation to assess human evaluation reliability”,作者是 Jacopo Amidei、Paul Piwek 和 Alistair Willis (mng.bz/opov)。请注意,他们讨论的是评估机器输出,因此论文侧重于评估数据,但这种方法可以应用于训练数据。
最近一篇关于使用利用预训练模型的优势的机器学习方法的自动评估文本生成的论文是“BLEURT: Learning Robust Metrics for Text Generation”,作者是 Thibault Sellam、Dipanjan Das 和 Ankur P. Parikh (mng.bz/nM64)。在论文中查看其他关于自动评估文本生成系统质量的新近工作的参考文献。
10.7.3 信息检索标注的进一步阅读
参见“Ittai Abraham、Omar Alonso、Vasileios Kandylas、Rajesh Patel、Steven Shelford 和 Aleksandrs Slivkins 的《How Many Workers to Ask?: Adaptive Exploration for Collecting High Quality Labels》”,mng.bz/vzQr。
摘要
-
所有机器学习任务都可以利用诸如真实数据、标注者间一致性、将任务分解为子任务、专家评审和裁决任务、合成数据以及通过机器学习的(半)自动化等标注策略。每种方法都有其优势和劣势,这取决于任务、数据以及你正在解决的问题。
-
连续任务可以接受一系列可接受的答案,在某些情况下可以使用群体智慧来确定是否接受最佳标注者的标注而不是项目的平均标注值。
-
目标检测任务应分别跟踪定位准确性和标签准确性。请注意,IoU 在维度较高时,对于相同的一般标注者性能水平,将产生较低的分数。
-
语义分割可以利用专家标注者可以裁决不同意见区域而不是重新标注整个图像的评审任务。
-
序列标注任务通常使用人类在环系统生成候选者,尤其是在重要序列相对罕见时。
-
语言生成任务通常有多个可接受的答案。这些答案可以针对每个项目进行多个真实示例的评估,或者由评估输出并对其准确性及一致性进行评估的人类进行评估。
-
其他机器学习任务,如信息检索,通常使用人类在环的标注系统,尤其是在随机样本数据很少出现相关项目时。
第四部分 机器学习的人机交互
最后两章通过深入研究有效注释的界面和三个具有人类操作员的机器学习应用示例来完成循环。这些章节汇集了你在本书中学到的所有内容,展示了界面设计策略如何受到你的数据采样和注释策略的影响。最优化系统是全面设计的,考虑到所有组件。
第十一章展示了人机交互原则如何应用于注释界面,以及不同类型的界面如何自动化注释过程的一些部分。本章涵盖了界面设计中的非平凡权衡,包括注释效率、注释质量、注释者的自主性和实现每种类型界面所需的工程工作量。
第十二章简要讨论了如何为具有人类操作员的机器学习应用定义产品,然后介绍了三个示例实现:一个用于短文本探索性数据分析的系统、一个从文本中提取信息的系统以及一个用于最大化图像标注任务准确性的系统。对于每个示例,列出了来自本书其他策略的一些潜在扩展,这将帮助你在部署第一个应用程序后批判性地评估如何扩展具有人类操作员的机器学习系统。
11 数据标注界面
本章涵盖
-
理解基本的人机交互原则
-
在标注界面中应用人机交互原则
-
结合人类和机器智能以最大化各自的优势
-
实现不同级别的机器学习集成接口
-
在不破坏现有工作习惯的情况下将机器学习添加到应用中
在过去的 10 章中,我们已经涵盖了关于人机交互机器学习的所有内容,除了人机界面的关键组成部分。本章涵盖了如何构建最大化标注效率和准确性的界面。本章还涵盖了权衡:没有一套统一的界面约定可以适用于每个任务,因此你必须就最适合你任务和标注者的用户体验做出明智的决定。
假设你需要从文本中提取有关疾病爆发的信息。如果你有已经手动完成这项任务的领域专家(SMEs),你可能希望在不打扰他们现有工作习惯的情况下,对该应用进行一些简单的基于机器学习的扩展。如果你与非专家标注者合作,你可能创建一个新界面,其中大多数标注者只需简单地接受或拒绝模型预测,因为这样的界面将最大化效率同时使质量控制变得更容易。如果你拥有这两种劳动力,你可能选择两种界面,为每个劳动力使用合适的界面。
对于任何界面,错误的设计都可能影响整个标注过程的质量和效率。因此,为正确的人建立正确的界面是一个复杂的问题,在你添加机器学习之前就已经如此。本章提供了设计正确界面(s)的基本工具,以适应你的标注任务。
11.1 人机交互的基本原则
首先,让我们看看一些构建标注工具的界面约定。这些约定和应用程序开发库已经被专注于用户体验和人机交互的专业人士优化,并且很难改进。在某些情况下,你需要从多个约定中进行选择。本节帮助你理解权衡。
11.1.1 介绍可用性、反馈和代理
可用性 是一个设计概念,认为物体应该以我们感知的方式运作。例如,在物理世界中,门把手应该看起来像可以旋转的东西,门应该看起来像可以打开的东西。在在线世界中,应用程序中的按钮应该看起来可以点击。在线系统中的其他例子包括页面顶部的菜单系统,当鼠标悬停时显示导航选项,点击+以展开隐藏内容,以及点击?以获取帮助。
反馈 是用户体验中可用性的补充。如果有人点击了一个按钮,一些动画、消息或其他事件应该让注释者知道他们的操作已被记录。反馈验证了可用性,告诉用户他们感知到的可用性是真实的,或者他们的感知是错误的(如果没有任何动作或指示表明该动作不合法)。
带有良好可用性和反馈的界面直观上感觉易于使用,因此你通常在违反常规时才会注意到它。当你点击按钮时没有任何动作的按钮感觉是损坏的,如果你看起来像是一个静态的框,你可能会错过按钮的存在。你可能在制作糟糕的网站上遇到过这类按钮——你不想在注释界面上犯的错误。(隐藏的书架门很有趣,因为它们打破了这些常规,但打破这些常规很少会让注释变得有趣。)
在 UI 框架内使用现有元素通常有助于良好的设计,包括可用性。如果你正在使用基于 Web 的界面,你应该在推荐的上下文中使用现有的 HTML 表单元素:单选按钮用于单选,复选框用于多选,等等。
使用现有的 UI 组件也有助于提高可访问性。如果你使用默认的 HTML 按钮元素而不是创建自己的,你将更好地支持那些翻译这些元素或从文本创建语音的人。
代理 是用户感知到的力量和所有权感。设计中的良好可用性和反馈给予注释者在个人行动中的代理权。"代理"还指更全面地指注释者体验。以下是一些你需要提出的问题,以确保注释者在工作中感到有代理权:
-
注释者是否觉得界面允许他们注释或表达他们认为重要的所有信息?
-
他们是否感觉到他们的工作正在帮助他们正在工作的项目?
-
如果他们正在使用机器学习辅助其注释的界面,他们是否认为机器学习提高了他们的工作效率?
本章提供了不同类型可用性和反馈的示例,并讨论了每种类型如何与注释者的代理权相关。
人们在使用注释界面时犯的最大错误之一是从游戏中借用常规。如第七章所述,我不建议你对有偿工作进行游戏化。如果你强迫某人在类似游戏的环境中完成有偿工作,如果它不是标注数据的最高效方式,工作会很快变得令人厌烦。请参阅以下侧边栏了解更多关于为什么你不希望对注释任务进行游戏化的原因。
好的界面给你的是质量,而不仅仅是数量
Ines Montan 的专家轶事
当我与人们谈论用于注释的可用界面时,反应往往过于简单:“为什么费那个劲?收集注释并不昂贵,即使你的工具速度快一倍,那也并不那么有价值。”这种观点是有问题的。首先,许多项目需要来自律师、医生和工程师等 SME(行业专家)的认可,他们将进行大部分的注释工作。更根本的是,即使你给他们的报酬不多,你仍然关心他们的工作,如果你让他们处于失败的状态,他们就无法为你提供优质的工作。不良的注释流程常常迫使工作者在示例、注释方案和界面之间切换焦点,这需要积极的注意力,很快就会变得疲惫不堪。
在我开始从事人工智能工作之前,我在网页编程方面工作过,因此注释和可视化工具是我开始思考的第一批人工智能软件。我特别受到游戏中无形界面的启发,这些界面让你思考该做什么,而不是如何去做。但这并不是将任务变得像游戏一样有趣的游戏化;这是使界面尽可能无缝和沉浸式,以便注释者有最好的机会完成他们的任务。这种方法会产生更好的数据,并且更加尊重创造这些数据的人。
Ines Montani 是 Explosion 的联合创始人,spaCy 的核心开发者,Prodigy 的主开发者。
11.1.2 设计注释界面
对于简单的标签任务,良好的可用性和反馈需要根据其推荐用途使用现有组件。你使用的任何框架都应该有单选或多选元素、文本输入、下拉菜单等元素。
你可能会在一些框架中找到一些更复杂的形式元素。例如,React Native JavaScript 框架除了更通用的表单输入外,还有一个自动完成组件。你和你的注释者可能已经在其他网络应用程序中使用了这种自动完成功能,并且熟悉了 React Native 界面的设计惯例,因此通过选择现有的框架而不是创建自己的自动完成功能,你可以获得更好的可用性。
习惯在演变,因此在实现你的界面时,要关注当前的惯例。例如,自动完成功能最近才流行起来。五年前使用大型菜单系统或单选按钮的许多网站现在都使用了自动完成功能。你的注释界面应该基于当前的惯例,无论这些惯例在构建界面时是什么。
对于序列标注任务,你很可能会选择键盘或鼠标标注,或者两者都使用。在键盘标注的情况下,箭头键应允许标注者在前向后退段落。在基于鼠标的标注情况下,标注者应能够悬停在段落上并/或点击段落。在这两种情况下,可利用的功能应确保处于焦点状态的段落以某种方式突出显示,以便标注的范围清晰可见。
对于目标检测和语义分割任务,最广泛使用的 UI 框架是不够的。没有标准的 UI 库允许你为 HTML 实现像素标注,例如。对于这些任务,你将使用来自图像编辑软件的约定。可利用的功能将来自诸如能够通过框、多边形和智能工具捕获相似像素区域的能力等预期。
如果人们在使用平板电脑或手机进行标注,那么可利用的功能包括能够通过捏合来放大图像以及通过滑动屏幕来导航。一些 Web 框架在平板电脑和手机上运行良好,而一些则不行。你可能需要考虑为手机和平板电脑构建原生于 Android 和 iOS 操作系统的界面,但这类标注界面很少见;大多数人如果需要长时间工作,更愿意在电脑上操作。
11.1.3 最小化眼动和滚动
尽量将标注任务的各个组成部分都保持在屏幕上,这样标注者就不需要滚动屏幕。同时,尽量将每个标注的所有元素(说明、输入字段、被标注的项目等)放在相同的位置。如果你的项目大小不一,可以使用表格、列和其他布局选项来确保输入字段和项目在不同大小的情况下不会移动或丢失。
你可能在网上阅读内容时经历过滚动疲劳。当人们不得不滚动以找到本可以首次加载时就能显示在屏幕上的内容时(称为折叠之上,因为报纸将重要内容优先放在报纸顶部,以便折叠时也能看到),他们就会变得不那么专注,并感到沮丧。同样的情况也适用于标注。如果所有内容都能适应屏幕,那么滚动对标注者来说将是一个更慢且更令人沮丧的体验。
标注的说明和指南可能会在屏幕上容纳所有信息时造成问题。您希望为注释者提供详细的说明,但这些说明会占用屏幕的大部分空间。此外,一旦注释者完成了足够多的任务以记住这些说明,说明就会变得冗余,因此对于注释者来说,不断滚动查看不再需要的说明可能会感到沮丧。最简单的解决方案是使说明可折叠,以便在需要时展开。另一个选项是将一些或全部说明移至相关字段,仅在那些字段获得焦点时显示它们。第三个选项是在单独的页面上放置说明,并允许注释者调整他们的浏览器窗口以显示单独的标注和说明窗口。请注意,如果您选择第三个选项,您需要在设计中考虑较小的标注窗口。
在考虑有效设计时,从不要做的事情的例子开始可能最容易。图 11.1 显示了违反大多数良好 UI 设计规则的示例界面。

图 11.1 标注界面不良的示例。此界面要求注释者不断在屏幕上移动注意力,输入数据的长度可能会改变屏幕上对象的布局,这会降低一致性。这个界面可能会降低标注的效率和准确性。
现在比较图 11.1 和图 11.2,后者具有更友好的注释者布局。尽管图 11.2 中的界面在实现上仅比图 11.1 中的界面稍微困难一些,但一些简单的更改,如将源文本放在输入字段旁边,解决了图 11.1 中的许多问题。

图 11.2 标注界面良好的示例。此界面将源文本放置在输入字段附近。它还提供了多个选项,让注释者可以访问说明,而这些说明不会打断任务的设计或布局。您可以预期这种布局将更高效、更易于使用,并且比图 11.1 中的界面产生更准确的数据。(您的界面也应具有明显的提交按钮和注释者反馈字段;这些按钮在此省略以保持示例简洁。)
除了图 11.2 中提到的其他好处外,两列布局比图 11.1 中的一列布局更可能适合水平显示器。然而,您需要假设您的注释者的机器的屏幕尺寸和分辨率,以及他们使用的浏览器。
根据您所使用的劳动力类型和参与时间的长短,考虑为您的标注员购买机器和/或屏幕。这些购买可能通过提高吞吐量和准确性来收回成本;它们还可能让您的工程师有更多时间来确保与每个可能的浏览器和屏幕配置的兼容性。
本节未涵盖关于页面布局的一些假设。例如,图 11.1 和图 11.2 在某种程度上偏向于从左到右的布局。对于从右到左语言的编写者来说,这些布局可能并不直观。我建议阅读专门关于良好网页设计的书籍(特别是 HTML 表单的良好设计),以深入了解此主题。
11.1.4 键盘快捷键和输入设备
键盘快捷键对于几乎所有标注项目都是核心的,但很容易被忽视。键盘快捷键有助于导航和输入。
使用鼠标导航比使用键盘慢得多,因此请注意输入的标签顺序(或标签索引)。在大多数应用程序中,按 Tab 键通常会将焦点从一个元素移动到下一个元素。在表单的情况下,这种移动通常是下一个表单输入。Tab 键是高效标注最重要的键盘快捷键,因此当用户按下 Tab 键时,输入在屏幕上获得焦点的顺序应该是直观的。图 11.3 显示了图 11.2 中示例界面的默认标签顺序。

图 11.3 展示了标签顺序的一个示例,显示了按 Tab 键时焦点从一个元素切换到下一个元素的顺序。此界面有九个可点击元素,这些元素将是基于 Web 界面的默认焦点顺序的一部分,但其中只有四个元素是标注任务的输入字段,因此可以通过定义不同的标签顺序来改进此任务。
您可能需要明确定义标签顺序,以便使此界面正常工作。例如,在图 11.3 中,在“病原体”输入之后预期的标签顺序是“位置”输入,但默认的 HTML 标签顺序可能将“位置”的信息链接作为下一个焦点。您可以通过使用tabindex=在 HTML 中本地按升序顺序定义标签顺序,或者通过使用 JavaScript 显式定义某些元素上按键的结果。
对于通过箭头键进行导航的情况也是如此。当用户按下键进行导航时(通常右箭头键与 Tab 键相同),将会有默认的焦点顺序,但您可能需要明确更改此顺序,以便对您的界面来说最为直观。
您可能需要决定是否要抑制某些默认键盘选项。如果您正在使用网页表单,按下 Enter 键会提交该表单。如果您有包含换行符或允许 Enter 键自动完成的文本输入,您可能希望抑制 Enter 键提交任务,除非提交按钮处于焦点状态。同样,如果您的表单主要由自动完成字段组成,并且人们期望使用 Tab 键完成字段,您可能希望仅通过箭头键或按下 Ctrl-Tab 键来允许基于 Tab 的导航。您可能需要进行几次测试迭代以正确设置焦点导航。
如果您无法将所有标注简化为键盘快捷键,您应该考虑为您的标注者提供最适合他们任务的鼠标或触摸板输入。对于其他输入也是如此,例如麦克风、摄像头以及专业转录员使用的脚踏板等专业工具,这些工具可以在保持双手自由打字的同时,在音频和视频记录中前后移动。您应该尝试使用您自己构建的任何东西一段时间——至少 15 分钟用于快速任务,如果平均每项标注时间超过几分钟,则更长。
11.2 有效打破规则
当您对实现遵循传统界面的接口感到舒适时,您可以打破设计规则。本节提供了三个不太常规但效果良好的注释界面示例:带有滚动的批量注释、作为输入的脚踏板和音频输入。请注意,您可能需要自己编程交互场景,包括任何可访问性考虑,因此您必须权衡实施成本与收益。
11.2.1 批量注释时的滚动
当存在数据不平衡时,滚动可以提高标注任务的注释效果。假设您想在成千上万张图片中找到自行车的图片,其中大部分不是自行车。滚动浏览大量图片比逐个查看它们更有效率,并减少了第 11.3.1 节中引入的一些重复启动问题。数据有时不平衡有很好的理由,包括随机抽样、在本质上不平衡的代表性数据上创建评估数据,以及检查您知道应用于不平衡数据的模型的预测。当您无法避免数据不平衡并且可以将任务简化为二元决策时,滚动成为一种良好的惯例。
11.2.2 脚踏板
脚踏板在计算机上并不常用,这无疑是一个错失提高注释效率的机会,考虑到脚踏板在操作车辆和音乐设备中的普遍性。脚踏板最初在音频领域被使用,以便人们能够在磁带录音机中前后移动(如第十章所述),并且至今仍受到转录工作者的青睐。在转录之外,脚踏板在注释中并不常用。对于任何视频或音频任务,都应可能使用脚踏板,以便注释者能够快速地前后扫描。如果您的注释者正在注释音频、视频或任何其他流式数据,并且需要来回导航,考虑为您的注释者购买脚踏板。USB 脚踏板广泛可用且相对便宜。学习曲线很短——大约几个小时,而不是几天或几周。
除了提供前后导航外,脚踏板还可以编程到特定的键。例如,按下脚踏板可以模拟按下 Ctrl 键,或者遍历菜单项。更改功能的方式类似于按下钢琴踏板改变音符的音调,遍历菜单项的方式类似于吉他手使用选择踏板遍历音效。这类脚踏板也广泛可用,并针对用户体验因素如按钮间距和(物理)便利性进行了优化,因此您可以将音乐行业的一些经过验证的传统应用到创建一些新颖有趣的注释界面中。如果您正在注释任何类型的数据,您可能想要考虑使用脚踏板来帮助加快处理速度,并通过将手和手腕的运动改为脚部运动来减少重复性动作的疲劳。
11.2.3 音频输入
如果您正在使用手操作键盘和鼠标,而您的脚上有脚踏板,那么您只剩下嘴巴了。音频输入对于创建语音识别数据是常见的(显然),但在其他地方并不广泛使用。
音频可以增强许多注释任务的标签组件。假设您正在为 100 个对象类别绘制边界框。没有菜单系统可以让注释者轻松导航以选择 100 个类别中的 1 个,而自动完成会分散他们的注意力。如果注释者可以说出标签,他们就不需要将注意力从注释过程中移开。除了标签之外,音频还可以通过如“下一项”、“上一项”、“缩放”或“增强”等命令进行导航。
提示:如果您允许基于语音的注释,请考虑使用较长的标签名称,因为语音识别在短词上的准确性较低。可能不值得投入资源仅为了注释创建定制的语音识别模型,这就是为什么许多语音界面的语音系统最终会退回到数字菜单系统。
11.3 注释界面中的启动
除了决定合适的界面外,你还需要考虑顺序效应和其他上下文因素可能如何影响标注。第七章、第八章和第九章介绍了识别合适的劳动力队伍和评估质量的方法。为了总结主要收获:你应该确保你的劳动力队伍接受正确的培训;跟踪与任务相关的标注员人口统计信息,而不是侵犯隐私;并采用质量控制方法,如真实数据和标注员间一致性,以确保偏差最小化。
如第一章所述,当标注可以受到上下文的影响时,包括任务设计和任务顺序,就会发生前置。前置通常被视为不好的事情,因为你不希望标注受到任务本身的影响。你希望每个标注尽可能客观,尽管在第 11.3.2 节中我们将讨论一些例外。前置可能独立于每个标注员的个人背景,或者对某些标注员的影响比其他标注员更强,因此仔细思考前置和标注员背景如何结合以增加标注的偏差是很重要的。
11.3.1 重复前置
标注中最显著的前置问题就是重复。标注员可能会根据他们之前看到的项来改变对某项的解释。重复前置在主观任务中很常见,例如情感分析;大多数标注员随着时间的推移,基于他们最近看到的项重新校准解释,他们的观点关于相邻类别(如负面和非常负面)之间的边界可能会发生变化。
在大量重复的情况下,注意力和疲劳也成为问题。数据缺乏多样性可能导致盲目点击相同的标注,即使它可能是错误的。在许多有序数据集中,相邻的项来自同一来源和/或时间,因此随机化项的顺序是减少这种影响的一种简单方法。
确保标注员有足够长的实践和训练期也有助于他们熟悉数据,这样在他们开始贡献训练和评估数据之前,就能对数据有更全面的了解。对于像情感分析这样的任务,你可能会要求标注员在开始标注之前先查看数千个示例,以便他们首先校准他们的评分决策。
当你拥有不平衡的数据时,随机化和延长的实践期可能不足以解决问题。在这些情况下,你可以实施一些多样性采样方法,以确保每个项目尽可能不同于前一个。对于标注任务,你可以使用预测标签来进行分层采样。基于聚类的采样也可以有所帮助,例如将数据分为 10 个簇,并按顺序从不同的簇中进行采样。
您也可以在标注后监控重复提示的效果。如果您在标注中遇到高度不一致的情况,您应该查看之前的标注序列,以确定标注者之间的一致性是否可能来自顺序效应。项目的顺序不应该是标注的预测因素。
11.3.2 提示伤害的地方
当标注需要主观或连续判断时,提示伤害最大。如果有固有的排名,例如在负面到正面的情感尺度上评分,一个人的解释可能会受到重复提示的影响。在第 11.4.3 节中,我们将讨论如何将此任务作为排名问题而不是评分问题来最小化这种类型的提示。尽管人们可能会随着时间的推移改变情感分数,但他们关于正面到负面情感排名的判断可能更稳定。
提示也可能伤害那些两个类别接近的分类任务。本书中的例子是一个人推自行车的例子,重复可能会提示某人根据他们最近标注的内容将图像标记为“行人”或“骑自行车者”。第一章提供了一个很好的关联提示的例子:当房间里有一个填充的袋鼠玩具或几维鸟时,人们更有可能将口音解释为来自澳大利亚或新西兰,即使任务本身没有提到这些玩具。
11.3.3 提示有助于的地方
在某些情况下,提示是一个好事。当标注者随着时间的推移因为对数据的熟悉度增加而变得更快时,这种效应被称为积极提示,这几乎总是有益的。
在某些情况下,由上下文(上下文或关联提示)引起的提示也是有利的。如果标注者正在转录与健康相关的音频,并且听到一个可能是病人或耐心的词,他们应该从直接上下文和任务主题中知道病人更有可能。在这种情况下,提示有助于任务。
当提示改变某人的情绪状态时,这种效应被称为情感提示。如果标注者对自己的工作感到更积极,他们更有可能工作得更快,更准确,这样每个人都能受益。尽管情感提示对于可能具有情感成分的主观任务(如情感分析)并不总是理想的,但它对于激励是有价值的。你会在工作时放音乐吗?如果是这样,你可以告诉人们你正在进行积极的自我情感提示以提高生产力。与其将提示视为总是负面的东西,不如将其视为一组需要你在标注和界面设计中留心并管理的非客观行为。
11.4 结合人类和机器智能
人类和机器有不同的优势和劣势。通过发挥每个的优势,你应该能够最大化两者的性能。一些差异是明显的。例如,人类可以以一种比我们在第 3、4、5、6 章中讨论的任何不确定性或多样性方法都要复杂得多的方式,给出关于他们在任务中困惑的简短纯文本响应。其他差异则更为微妙,需要更深入理解人机交互。正如讨论的那样,机器在预测连续任务中的值时是一致的,但人类由于启动效应而不一致,即使在重复任务时也会改变他们的评分。
标注者很快就会成为他们所处理数据的专家。研究人员对于是否存在长期启动效应存在分歧;有些人声称它不存在。如果长期启动效应确实存在,那么它是非常微小的。启动的长期影响较低对标注是有益的,因为这意味着标注者随着时间的推移在建立他们的专业知识,同时无论他们看到的具体数据项如何,都能保持高水平的主观性,只要他们看到了各种综合性的项目。因为标注者正在深入面对的问题中,提供和获取标注者反馈将提高你的任务。
11.4.1 标注者反馈
你应该始终提供一个机制,让标注者能够就他们正在工作的具体任务给你提供反馈。标注者可以对任务的许多方面提供反馈,例如界面的直观性、指示的清晰性和完整性、某些数据项的歧义性、他们对某些项目知识的局限性,以及你可能没有注意到的数据中的其他模式和趋势。
理想情况下,你应该包括让标注者在任务中提供关于任务的反馈的选项,可能通过一个简单的自由文本字段。你也可以通过电子邮件、论坛或实时聊天邀请反馈。在任务中包含反馈通常是确保反馈与被标注的项目保持联系的最简单方法,但在某些情况下,其他反馈机制可能更合适。例如,论坛可以让有相似问题的标注者看到回应。实时聊天允许标注者在难以标注的项目上进行协作,唯一的缺点是当标注者不是独立的时候,质量控制变得更加困难。(关于这一主题的更多信息,请参阅第 8 至 10 章关于质量控制的内容。)
反馈是双向的:你应该向标注者反馈标注的使用情况。当人们知道他们的工作正在产生影响时,他们更享受自己的工作。然而,如果标注后一段时间内没有重新训练下游模型,或者用例或模型的准确性敏感,提供反馈可能会很困难。尽管如此,你仍然应该能够讨论标注提供的一般价值。
在某些情况下,效果可能很明显,尤其是在机器学习辅助的人类任务中。在我们的从文本中提取关于疫情信息示例中,如果提取的数据本身是有用的,而不仅仅用于训练机器学习模型,那么这种有用性可以传达给标注者。
如果标注者对机器学习模型将要执行的任务有更好的了解,他们的标注准确性将会提高。对于在户外拍摄的照片上的语义分割任务,了解目标是计数树上的叶子还是树木只是前景应用中的背景,将有助于标注者。当有更多透明度时,每个人都能受益。
你还可以将反馈纳入标注任务中。如果你正在标注情感,你可以要求标注者突出显示哪些词有助于他们对积极或消极情感的解释。对突出显示的一个有趣扩展是要求标注者编辑这些词来表达相反的情感。这个过程——通过最少的编辑更改标签——被称为对抗性标注。经过编辑的项目可以成为额外的训练数据项,这有助于你的模型学习对标签最重要的词语,而不是过分重视恰好与最重要的词语一起发生的标签。
11.4.2 通过询问他人会如何标注来最大化客观性
在第九章中,我们介绍了激发标注者认为其他人会如何标注的方法。这种方法在贝叶斯真理血清(BTS)等指标中流行起来,帮助我们识别那些可能不是多数判断但仍然正确的标注。
一个好处是,这种方法减少了感知到的权力动态问题,因为你在询问其他标注者的看法,这使得标注者报告负面反应更容易。当你认为权力动态或个人偏见正在影响反应时,这是一个好的策略:询问大多数人会如何反应,而不是询问那个标注者认为会如何。
对于像情感分析这样的任务,标注者可能不愿意标注他们工作的公司负面情感。当这种犹豫源于感知到的权力不平衡,例如当标注者被补偿以创建训练数据时,这种影响被称为“适应”或“顺从”。询问其他人会如何解释情感,给标注者提供了从他们自己的数据解释中抽身而出的许可,因此可以给出更准确的自我判断反应。
注意,这个例子是对第九章中主观数据策略的限制。在那里,我们期望实际的标注得分高于预测的标注得分,以识别出并非一定是多数的有效标签。如果标注者存在感知到的权力不平衡,一个有效的标签可能具有比实际得分更高的预测得分。因此,所有具有高预测得分的标签都应被视为在这些情境中可能有效,无论它们是否高于实际得分。
11.4.3 将连续问题重新构造成排序问题
人们在对连续尺度进行判断时是不可靠的。一个人的 70%可能是另一个人的 90%。人们甚至对自己的判断也不可靠。对于情感分析,人们在第一次遇到某事物时可能将其评为“非常积极”,但在看到更多甚至更积极的例子后,他们可能会因为启动或其他个人情绪变化而将其评级改为“积极”。
尽管人们在绝对分数上可能不一致,但当要求对两个项目进行排序时,他们通常彼此之间以及对自己都是一致的。两位标注者可能对两条消息的情感评分不同,但一致地将一条消息排序为比另一条更积极。图 11.4 展示了这样一个例子。

图 11.4 使用排序作为替代绝对值标注连续值任务的示例。当要求对项目进行排序而不是给出绝对分数时,人们通常在彼此之间以及在不同时间对自己都更为一致。
如图 11.4 所示,一个简单的界面可以将连续任务转换为排序任务,这通常会导致更一致的标注。使用排序而不是绝对值有其优缺点。优点包括:
-
更一致的结果。结果将根据您的数据和任务而变化,但测试起来相当容易;您可以实施这两种技术并比较它们。
-
每个任务的用时更快。勾选框比输入、滑动或选择连续刻度更快。
-
对于需要标注连续值的任务,无论是客观任务还是带有 BTS 的主观任务,进行质量控制比连续任务更容易,对于二分类任务尤其如此。
但也存在缺点:
-
您只能获得排名,而不是实际的分数,因此您需要一些具有绝对分数的项目。您可能已经在您的指南中创建了 90%、50%、75%等项目示例。您可以要求标注员确定每个项目相对于这些示例的排名,并使用这些信息来插值其他项目的分数。
-
您需要解决循环排名问题,例如当项目 A 的排名高于项目 B,项目 B 的排名高于项目 C,而项目 C 的排名又高于项目 A 时。您可以使用审查和裁决任务,要求对所有项目进行强制排名,或者使用简单的方法,如迭代地移除最不可信的排名,直到循环消失。
-
对每个项目进行排名需要更多的任务。您需要对具有N个项目的数据集中的每个项目进行N log(N)次判断。这个算法本质上是一个排序算法,其中每次判断都是一个比较,您只需要N个标注来给每个项目打分。
最后一点,N log(N)的判断可能因为隐含的规模而显得是一个决定性的因素,因为当只提供评分时,您需要N log(N)个任务而不是N个任务。然而,二分类任务更快且更一致。此外,正如您在第十章中学到的,由于平均需要更少的标注员来计算标注者间的一致性,因此在二分类任务上实施质量控制比在连续任务上更容易,因此总成本甚至可能持平。
为了举例说明,假设我们要对 10 万个项目进行标注。对于一个数值评分界面,假设我们希望每个任务平均有四个标注员,并且每个任务平均需要 15 秒:
10 万个任务 × 4 个标注员 × 15 秒 = 1,667 小时
对于成对排名,假设每个任务平均只需要两个标注员,并且每个任务平均需要 5 秒:
100,000 × log(100,000)个任务 × 2 个标注员 × 5 秒 = 1,389 小时
因此,在相同的预算下,如果您使用排名方法,您很可能会得到一个更准确的数据集,尽管总的标注数量会更多。许多学术论文关注的是操作总数,而不是总时间,如果作为计算机科学家您研究过“大 O”算法方法,这一点同样适用。所以,在计算了所有因素的成本,包括每个任务的时间和质量控制难度之前,不要轻易排除不同类型的界面。
你可以使用机器学习来半自动化地处理标注界面,但排名界面也有一个优势,那就是它不太容易受到偏差的影响。如果你有一个机器学习预测,认为分数是 0.40,你可以在标注界面中预先填充 0.40 以加快标注速度。然而,预先填充 0.40 答案可能会让标注者认为在 0.40 或接近 0.40 的分数是正确的(这被称为锚定)。相比之下,如果你使用排名界面,你可以开始将项目与接近 0.40 的项目进行比较,以减少总的标注数量,但你不会使标注者偏向任何成对决策;他们不会知道他们在排名中接近 0.40,而且实际任务并没有指出应该优先考虑哪种排名顺序。因此,界面决策也对如何有效地将机器学习与标注任务相结合有影响——对于任何类型的机器学习问题,而不仅仅是标注和连续任务。下一节将更详细地介绍如何在不同的标注任务中整合机器学习。
11.5 智能界面以最大化人类智能
在一定程度上使用或减少机器学习来辅助标注时,你通常是在效率和准确性之间进行权衡,但也有一些例外。机器学习可以发现人可能会忽略的错误,例如,这可以同时提高效率和准确性。
除了效率和准确性之外,界面的选择还会改变标注者感知到的权力(即代理权)的大小,而且某些类型的界面在实现时可能需要比其他类型更多的工程资源。因此,你需要了解不同界面的优缺点,以便为你的任务选择合适的界面。
表 11.1 描述了机器学习在人类任务中的参与程度不断提高,从原始标注(没有机器学习输入)开始,到裁决(人类标注者接受或拒绝模型预测的审查任务)结束。
表 11.1 还显示了四个可以决定适合你任务的正确接口的因素。请注意,这些因素与正向或反向的效率都不一致,因此权衡是非线性的。例如,随着自动化的增加,质量通常会下降,但裁决并不是最差的,因为二元裁决任务的质量控制比任何其他标注任务都要容易得多。辅助标注接口提供了最多的自主权,因为它们只移除了最冗余的任务,但它们需要最多的工程来构建,并且通常需要为标注目的特别调整或重新训练的模型。预测标注接口早于现代机器学习方法,在基于规则的天然语言处理(NLP)系统中被广泛使用,通常称为预测编码。一个仍然是大型行业的用例是电子发现,分析师通过查看基于规则的模型生成的候选者来执行诸如审计组织的数字通信以查找潜在欺诈等任务。
表 11.1 一个随着机器学习参与标注的级别增加的量表。效率是标注者工作的速度。质量是标注的准确性(高质量等于错误更少)。自主权是标注者感知到的力量和所有权感。实施努力是实现接口所需的工程量。随着机器学习的自动化程度提高,效率会增加,但其他列并不遵循相同的顺序,每种方法都有权衡。正确的接口取决于你想要优化的因素。

为了更好地了解不同类型的接口,本节剩余部分将探讨机器学习任务的示例。我们将从语义分割开始,这是每个接口最著名的示例。即使你只对某一类问题感兴趣,我也建议阅读本节的所有子节,因为一个机器学习标注任务的见解可能有助于不同的任务。
11.5.1 语义分割的智能接口
如果你使用过像 Adobe Photoshop 这样的图像编辑工具,你对大多数语义分割标注工具的用户体验应该很熟悉。图像区域可以直接通过使用画笔或勾勒这些区域(用多边形或自由手绘)来标注。
大多数图像编辑软件也都有智能工具,可以通过类似颜色或边缘检测技术选择整个区域。在机器学习的背景下,一些模型试图预测精确的区域,因此这些模型可以用作适应特定任务的智能工具。
图 11.5 展示了语义分割界面的示例。这些示例使用整个图像,但(如第六章和第十章所述)我们可能只关注图像的一部分,尤其是在判断混淆时。在这两种情况下,都适用完整的标注界面选项。

图 11.5 语义分割界面。无辅助标注的语义分割界面看起来像简单的图像编辑软件:标注员使用画笔、铅笔和其他自由手绘工具为某些区域着色,这些区域被赋予一个标签(在这种情况下,是一个自行车)。大多数图像编辑软件(以及大多数语义分割标注工具)也具有辅助标注功能。
图 11.5 中的四个示例的标注员体验将大不相同。对于无辅助标注,标注员会感到完全掌控。但当显然是同一物体的一部分时,缓慢地标注一个大区域会感到很繁琐。由于标注员可能熟悉图像编辑软件,他们会知道更好的标注工具存在,但他们无法访问这些工具。因此,尽管他们拥有完全的控制权,但标注员不会感到最佳的自主性,因为期望的工具对他们来说不可用。
相比之下,在辅助标注的情况下,标注员除了可以手动标注图像外,还可以访问智能选择工具。因此,标注员的自主性比无辅助标注时更高。由于标注员在智能工具预测这些区域的边界之前就决定了区域,因此偏差也相对较小。
然而,智能工具的实现需要更多的努力,尤其是如果我们想使用现有模型实时预测点击的区域。我们可能需要训练一个专门用于预测标注员点击位置的区域的模型。(有关训练用于界面的模型,请参阅第 11.5.2 节。)
对于预测性标注,这是图 11.6 中的第三种选项,实现起来会更简单。我们可以预测所有区域(可能是在线预先预测)并允许标注员编辑任何错误的区域。然而,这种方法可能会引入偏差,因为标注员可能会信任错误的机器学习预测,从而持续这些错误,使模型在表现不佳的区域变得更差。因此,这种界面的质量比其他所有界面都要差。
修正机器学习模型的输出通常是对标注员来说最不有趣的任务。预测性标注的经验是,机器学习在正确处理简单部分方面获得了大部分赞誉,而标注员则被留下清理错误。纠正一个错误的边界通常比从头创建一个边界更耗时,这可能会增加标注员的挫败感。
一些工具介于语义分割中的辅助和预测标注之间。一个例子是超像素,它是像素的分组,可以使标注更快(图 11.6)。

图 11.6 超像素示例。图像被分割成区域,但未标记,这些区域比像素大(因此得名超像素),但足够小,以至于它们不会与需要标注的区域之间的许多重要边界重叠。在大多数标注工具中,标注者可以控制超像素的粒度以优化标注效率。
使用超像素,标注者可以快速选择哪些像素属于给定的对象并应用标签。由于超像素过度分割,这种技术最小化了编辑错误边界耗时的工作流程,这为标注者提供了更多的自主权,并改善了用户体验。
然而,超像素比标注者在显示任何建议边界之前评估图像的机器学习辅助方法更容易在边界处持续错误,因此效率的提高可能会以准确性为代价。
11.5.2 目标检测的智能界面
许多适用于语义分割的方法也适用于目标检测。一种流行的机器学习辅助界面可以从单次点击生成边界框。图 11.7 中的第二个界面是辅助标注。

图 11.7 不同类型的边界框标注界面。在无辅助标注界面中,标注者手动绘制框(或多边形)。在许多情况下,对于可以由人编辑或裁决的预测标注界面(底部行),框可以被猜测。对于辅助界面,标注者可以点击物体的中心,界面会预测该点击最可能的边界框。
在图 11.7 的辅助标注示例中,标注者点击了图像的中心,边界框自动从该点击生成。此类选择工具与用于语义分割的智能选择类似,并且与识别对象为多边形相同。
辅助体验可以通过预先计算边界框并在注释者点击其中时才使其出现来模拟。这种方法比预测性边界框赋予了注释者更多的自主权,但不如真正的辅助边界框检测准确,因为它并没有真正考虑到注释者的点击。结果是,当注释者点击后没有显示好的框时,他们不会感觉到自己的点击被考虑在内。你还在浪费一个宝贵的信息来源:注释者对物体中心的直觉。因此,建议构建一个模型,在预测边界框时特别考虑注释者的中心点击。你可以边走边获取训练数据:记录注释者的点击位置,并信任在初始点击之后编辑过的任何对象。
如果你已经有了现有的边界框注释,你也可以在框的中间附近合成生成点击。合成方法的唯一缺点是感知到的中间可能不同于框的实际中间。在我们的自行车示例中,边界框的中间通常是在车架上的一个间隙,而不是自行车的部分。你可以在开始从注释者那里获取实际点击之前,根据你数据中物体的规律性来决定合成点击是否足够开始。
点击物体的中间不会给出可以导致错误的尺寸,当点击可能参考多个候选对象时,所以这种方法的一个变体要求注释者点击物体的两个或多个边缘。更多的边缘对边界多边形最有帮助。如果注释者需要点击三个或四个边缘来创建一个框,那么这个过程并不比无辅助创建框快多少。
在这两种选项之间的是点击并拖动界面,其中注释者点击框的中间,当他们按下鼠标并拖动时,框会成功“吸附”到更大的潜在框。你可以边走边生成此界面的数据,或者用从现有数据中创建的合成示例来初始化界面的模型,这些数据只有边界框本身。为了最小化偏差,可以有一个无辅助的边界工具,带有热键以启用智能吸附。拖动框可能跟随光标到特定的像素,除非按下 Shift 键,在这种情况下,工具会吸附到光标附近最可能的框。
11.5.3 语言生成的智能界面
语言生成技术有一个众所周知的辅助界面:自动完成。如果你的手机或电子邮件客户端在你开始输入时建议单词或句子的其余部分,那么你已经使用了这种辅助语言生成技术。这种自动完成功能已经使用了多年,但仍在快速发展(参见附近的侧边栏)。
四十年的预测文本
如果你用汉字写作,你所有的写作可能都使用了预测文本。在中国,人们通常知道多达 1 万个汉字,并经常使用 2000 到 3000 个汉字——太多以至于无法全部放在键盘上。
因此,中文的预测文本技术自 1980 年代个人计算机开始以来就已经存在。当时,中国的科学家们开发了允许使用拉丁字母 QWERTY 键盘的用户输入映射到汉字的字符组合的方法。最早的方法,称为五笔字型输入法,至今仍然是任何语言中最快的打字方法之一。
20 世纪 90 年代,日本手机制造商引入了结合四种脚本和预测文本的输入和显示:平假名、片假名、汉字和拉丁字母。日本的预测方法影响了拉丁字母的 T9 输入系统,其中每个数字(0-9)映射到多个拉丁字母,手机将数字序列转换为所有可能的字符序列中最可能的单词。T9 和相关系统还帮助拉丁字母语言使用键盘上不常见的字符和重音符号。
在 2000 年代初,超过 100 种语言和十几种脚本支持预测文本,并部署在适应个别用户的系统中,通常使用简单的基于字典的查找。下一词预测也广泛用于手机和一些文字处理应用中。
在 2010 年代初,全句预测在客户服务等领域得到了广泛应用,在这些领域,少数几个回复就构成了客服代表需要输入的大部分内容,并且可以存储在知识库中。到了 2010 年代末,全句预测在消费者电子邮件客户端中变得普遍。
到了 2020 年代初,神经语言生成技术的进步将语言生成,这个在机器学习中被长期忽视的领域,变成了每个 NLP 会议最受欢迎的话题之一。语言生成是一种长期的人机交互技术,但仍在快速发展。
预测文本界面现在广泛用于创建用于摘要和翻译等用例的语言生成训练数据。图 11.8 展示了翻译的一个示例。

图 11.8 语言生成界面,以语言之间的翻译为例。除了无辅助输入外,辅助界面可以使用自动完成功能,预测界面可以展示可编辑的预测文本。裁判界面允许注释者接受或拒绝注释。
在语言生成的辅助标注示例中,相较于其他辅助标注的示例,机器学习辅助的标注存在更大的偏差潜力,因为标注者在看到自动补全建议之前可能还没有决定完整的文本段落。这个功能可以被调整,以便只有当自动补全有信心只有一个可能的响应或者一次只能自动补全这么多词时,才显示后续单词的序列。这种权衡的代价是效率的降低,这可以通过在句子竞争时不显示任何预测来测试,看看标注者是否会产生相同的文本。
预测性标注界面根据用例的有效性有所不同。在客户服务响应的情况下,一个包含正确信息的信息可能就足够了,并且会有许多可行的选项,因此可以有效地选择一个足够好的响应。然而,对于翻译来说,如图 11.8 所示,只有一个精确的翻译可能是正确的。在预测句子中进行一两个编辑的努力通常比在一个无辅助界面上输入一个句子要长。在翻译界,对机器翻译输出进行编辑被称为后编辑,据我所知,这是唯一拥有自己 ISO 标准的(ISO 18587:2017,如果你感兴趣的话)。如果你查看任何专业翻译者的在线论坛讨论,你会看到用户体验有多糟糕。大多数专业翻译者更喜欢无辅助或辅助标注界面。
为了减少实施工作量,你可以创建一个感觉像辅助界面的界面,其中文本序列是预先计算的,但只有在有人开始输入时才显示。如果无法自动补全,用户体验不会是负面的,因为用户可以继续无辅助地输入,而不会打断他们的工作流程。
图 11.8 中的裁决界面通常用于评估其他标注者的质量。如第十章所述,对于语言生成任务,自动质量控制是困难的,因此审查任务以裁决工作比使用地面实况示例或标注者间一致性更为常见。对于语言生成任务,使用人工审查或裁决来评估模型准确度是很常见的,因此你应该能够将人工标注和模型预测都通过相同的流程来评估人类和机器的输出。
11.5.4 序列标注的智能界面
对于序列标注,界面选项与边界框的选项类似。在集成尺度的末端,标注者可以在无辅助界面上高亮序列,并在尺度的另一端对预测序列进行裁决。在两者之间,辅助界面允许标注者选择一个序列的中间部分,模型将预测边界,而预测界面将预测序列并允许标注者接受或编辑它们。图 11.9 展示了示例。

图 11.9 不同类型的序列标注界面。对于无辅助界面,标注者从一边的边界开始高亮文本,到另一边的边界结束。对于辅助界面,标注者点击跨度中间的部分,模型预测边界。对于预测性标注,标注者会看到模型对跨度的预测,并可以接受或编辑它们。对于裁决,标注者正在确认或拒绝提出的跨度。
许多序列标注任务就像是针插在草堆里的问题,序列的数量远远少于无关序列。即使你像图 11.9 中那样过滤了与疫情相关的新闻文章,也只有不到 1%的单词可能是疫情的位置,因此通过结合机器学习可以显著提高效率。
预测性标注的一种方法是对候选序列进行高亮或下划线,但并不预先标注它们。以我们的例子来说,标注者可能会看到某个潜在位置被下划线标注,但他们仍然需要点击或高亮该序列来进行标注。这种界面设计方法可以减少偏差,因为标注者不能再被动地接受机器学习预测作为标签,而是被迫与数据互动。一个额外的优点是,如果标注者认为这些是建议而不是预先选择的标注,他们会对机器学习模型中的错误更加宽容(图 11.10)。

图 11.10 一种预测性标注界面,作为图 11.9 中界面的替代。在这个界面中,位置由模型预测,但用下划线标注而不是预先选择。因此,标注者需要高亮或点击位置来进行标注。与选择跨度相比,这种界面会减慢标注过程,但因为它减少了偏差,标注者不能被动地接受预测。这个界面还允许标注者有更丰富的体验,例如,虚线表示低置信度预测的信息。
通过在如图 11.10 所示的低置信度注释下划线,你可以通过调整下划线显示的频率来减少注释者的偏见。如果下划线文本只有 50%的时间是正确的,注释者就不会对任何预测产生信任或拒绝的先入之见,而是根据其优点来评估预测——这比预测界面有更大的优势,在预测界面中,编辑 50%的注释会耗费时间,并会对用户体验产生负面影响。
如果注释者只查看如图 11.10 所示的界面中的下划线候选者,他们可能会更容易错过未下划线的序列。因此,当你的候选者接近 100%的召回率但精确度足够低,以至于预测在没有考虑的情况下不被信任时,这种策略是最好的。
图 11.10 中界面的变化结合了所有类型的界面。你可以有一个系统,它从一个候选序列跳到下一个作为裁决界面,下划线表示低置信度的候选者,并在裁决表明错误时回退到辅助和无辅助交互。
11.6 机器学习辅助人类过程
我们在第一章中介绍了机器学习辅助人类任务和人类辅助机器学习任务之间的区别。本书中的几乎所有内容都同样适用于这两种用例,例如通过主动学习进行采样和质量控制的方法。最大的区别在于人机交互。对于机器学习辅助人类,有一个原则适用:
被机器学习辅助的人必须意识到他们的任务正在通过机器学习得到改进。
我们将在本节的剩余部分更详细地探讨这个原则,并介绍一些优化注释同时保持这一原则的解决方案。
11.6.1 效率提升的认知
认知到任务正在改进在几个方面都很重要。你可以从机器学习中获得更少的效率,只要这种效率不是认知到的。相反,如果一个人的效率得到了提高,但这种提高没有被感知到,那么这个人不太可能对将机器学习集成到他们现有的日常任务中产生积极的体验。
我亲身体验过这种效果多次。我推出过帮助医疗工作者更有效地管理信息的系统,但医疗工作者并没有意识到这种效率,因此该应用没有被采用。另一方面,当我推出带有辅助界面的对象跟踪系统时,即使它们比对照组慢,注释者也报告了更积极的用户体验,因为界面明显是在试图帮助他们,即使它错了。这些经历是关于结合人类和机器智能的系统测量性能和感知性能之间差异的重要教训。
通常,在添加机器学习之前,改变一个人的日常任务就已经很困难了。如果你为现有任务构建了新的应用程序,你知道变革管理是困难的:大多数人倾向于坚持他们已经使用的东西。你可能自己也有过这样的经历,当你的电子邮件客户端或你最喜欢的社交媒体平台更新其界面时。假设这些公司有很好的证据表明新界面是一个更好的体验,但这并不能帮助你适应突然的变化。假设界面正在改变,这个过程的一部分正在通过机器学习自动化,以至于用户可能会担心他们的工作可能会被机器接管。你可以看到为什么这种变化可能不受欢迎。
因此,辅助界面是向现有工作添加机器学习的良好起点。初始界面保持不变,标注者保持控制权,因为他们启动每个动作,机器学习加速这些动作。将本章前面讨论的辅助界面视为将机器学习预测集成到现有应用程序的起点。
11.6.2 通过主动学习提高效率
主动学习可以在不改变界面的情况下提高工作效率。如果你正在采样那些更有可能改进你的机器学习模型的项,你可能不需要以任何方式改变标注者的体验。如果你正在使用多样性采样,你甚至可能改善标注者的体验,因为项看起来不那么重复,这反过来又通过减少重复启动来提高准确性。然而,标注者对这种变化的感知将是微小的。模型可能因为主动学习而在幕后变得更聪明,但标注者不一定能基于采样策略感知到他们的工作速度更快。此外,如果标注者之前有确定工作顺序的能力,而现在主动学习为他们确定顺序,他们可能会感到失去控制权。因此,在引入主动学习时,要注意移除任何功能。
11.6.3 完整性可以通过错误比缺失更好来最大化
当字段是可选的时,完整性可能成为一个问题。标注者可能会为了方便而留下一些字段为空,尽管有有效的响应。这种情况可能对不试图为机器学习创建数据的业务流程来说并不重要。但如果相同的业务流程还需要创建训练数据,这可能会成为一个问题,因为如果不在意如何构建你的模型,空字段可能会成为错误的负面案例。
当你依赖最终用户作为标注时,这个问题很常见。如果人们在电子商务网站上销售衣服,该网站可能希望尽可能多地获取细节:衣服类型、颜色、尺寸、风格、品牌等等。你希望激励用户添加这些字段,但你激励他们的选择有限。为了帮助解决这个问题,你可以利用这样一个事实:人们更不愿意提供错误数据,而不是缺失数据,并使用预测界面预先填充字段。图 11.11 展示了这样一个例子,我们假设某人的工作是提取从文本中关于疫情爆发的信息。

图 11.11 一个预测性标注界面鼓励数据的完整性。人们更可能纠正错误,而不是添加缺失值,因此预先填充一个错误的答案可以比默认不标注值带来更完整的标注。
你可能听说过 Cunningham 定律,它指出,获取正确答案的最佳方式是在网上发布错误的答案。Cunningham 定律也适用于标注。如果你想确保标注者对一个可选字段给出正确答案,预先填充错误的答案可能比留空更成功。这个过程是一种平衡行为。如果人们失去对模型预测的信任,或者觉得他们因为纠正太多错误而变得缓慢,你将为了额外的数据而创造一个负面的用户体验。因此,这种方法在最终用户间歇性地添加数据时最有效,而不是作为标注者全职工作。
11.6.4 将标注界面与日常工作界面分开
如果无法从人们的日常工作中获取正确的数据量或平衡,你可能需要引入新的工作界面。不要试图在现有的工作流程中改变太多;将新的界面作为现有界面的补充引入,并确保它们可以以适应工作日程的方式使用。
你可能会发现你需要裁决界面来解决标注者之间的分歧,或者高效地标注大量机器学习预测。如果你取代了一个人强大的无辅助交互能力,并限制他们只能审查其他任务,你将减少他们的自主权。而不是取代另一个界面,使其成为附加的。这个人可以使用他们强大的界面,并拥有完成这项工作的完全自主权,但现在他们有一个额外的界面选项,允许他们快速进行标注。
将裁决界面放置在正确的位置,可以增加使用者的能动性,因为您是在作为行业专家请他们解决其他人或机器感到困惑的区域,同时不剥夺他们使用完整标注能力的能力。这个界面如何融入工作流程将取决于您的组织。标注者可能被给予在选择的时刻切换到裁决界面的选项,或者可能有专门的时间或劳动力用于不同的标注界面。只要保持透明度并且维护标注者的能动性,您应该能够以赋权的方式开始将机器学习融入日常任务。
11.7 进一步阅读
“人机交互指南”,由 Saleema Amershi、Dan Weld、Mihaela Vorvoreanu、Adam Fourney、Besmira Nushi、Penny Collisson、Jina Suh、Shamsi Iqbal、Paul Bennett、Kori Inkpen、Jaime Teevan、Ruth Kikin-Gil 和 Eric Horvitz 撰写,提出了适用于人机交互的 18 条普遍适用的设计指南,所有这些指南都适用于数据标注和/或机器学习辅助的人类任务(mng.bz/4ZVv)。这篇论文也是其他近期论文的极好资源。大多数作者都来自微软的适应性系统和交互小组,这是世界上此类研究的最前沿小组。
“在微任务众包环境中通过前置效应提高性能”,由 Robert R. Morris、Mira Dontcheva 和 Elizabeth Gerber 撰写(mng.bz/QmlQ),讨论了积极的情感前置效应,如播放音乐,如何提高众包工作者在创造性任务中的表现。
“高效对象标注的极端点击”,由 Dim Papadopoulos、Jasper Uijlings、Frank Keller 和 Vittorio Ferrari 撰写(mng.bz/w9w5),讨论了创建用于本书第十二章中使用的数据集之一的一个高效界面来创建边界框。同一作者的其他工作实验了其他标注策略。
摘要
-
人机交互的基本原则,如可用性和最小化滚动,适用于标注界面。理解这些原则可以帮助你提高标注任务的效率。
-
良好的可用性意味着元素应该按照它们看起来应该工作的那样工作,对于标注来说,这通常意味着使用现有的 HTML 表单元素来处理它们预期的数据类型。
-
对于大多数任务来说,键盘是最快的标注设备,因此标注工具应尽可能使用键盘快捷键并支持基于键的导航。
-
前置效应指的是任务上下文如何改变标注者对条目的解释。在标注中,前置效应最常见的问题发生在条目顺序改变感知时,尤其是对于主观任务,如情感分析。
-
知道何时打破规则。高容量批量标注打破了避免滚动和平衡数据的传统。然而,当你无法显示平衡数据时,滚动可以减少启动偏差并加快标注速度。
-
除了手动无辅助界面外,还有三种类型的界面可以使用机器学习:辅助、预测和裁决。每种类型在注释效率、注释者自主性、注释质量方面都有其优势和劣势,并且每种类型在实施上都需要不同的努力。
-
辅助界面向注释者展示项目,而不显示机器学习预测,仅使用机器学习来加速注释者发起的操作。
-
预测界面展示由机器学习模型预先标注的项目,并允许注释者进行编辑。
-
裁决界面向注释者展示由机器学习模型预先标注的项目,并允许注释者接受或拒绝这些标注。
-
对于机器学习帮助人们在日常角色中完成任务的情况,辅助注释界面通常是最成功的,因为它们给予注释者最大的自主性。
-
当将机器学习集成到现有应用中时,尽可能在当前界面和工作流程中做出最少的变化。
12 人机交互机器学习产品
本章涵盖
-
定义适用于人机交互机器学习应用的产品
-
创建一个用于短文本探索性数据分析的系统
-
创建一个支持人工流程的信息提取系统
-
创建一个图像标注系统以最大化模型精度
-
评估扩展简单系统的选项
这最后一章包含了三个关于人机交互机器学习产品的实际案例。利用你在前 11 章中学到的所有知识,你将实现三个示例。你可以将这些示例视为探索性数据分析新闻标题、从文本中提取食品安全信息以及标注包含自行车的图像等作为可以在几天内创建的初步系统。这些示例与第二章中的人机交互机器学习系统类似,但稍微复杂一些,建立在你在后续章节中学到的知识之上。
与第二章中的示例一样,这些示例可以作为你正在原型化的完整工作系统的起点。在所有情况下,你都可以构建许多组件作为下一步的潜在步骤。
12.1 定义适用于人机交互机器学习应用的产品
适用于人机交互机器学习应用的良好产品管理始于你为某人解决的问题:你实际支持的日常任务。理解你正在解决的人类任务将有助于你产品设计的各个方面:界面、标注和机器学习架构。本节为你快速介绍一些在本章中我们将使用的好产品管理技术,这将反过来帮助做出技术设计决策。
12.1.1 从你正在解决的问题开始
优秀的产品设计始于定义你试图解决的问题。一个常见的错误是开始谈论产品时,从你正在创建的技术角度出发,而不是从你试图解决的问题出发。如果你正在为电子邮件客户端创建自动完成功能,将问题定义为“人们希望在电子邮件中自动完成句子”过于简单。更好的定义方法是“人们希望尽可能高效地沟通。”从关注你正在解决的问题开始,有助于从为标注者创建指南到决定接下来构建或扩展哪些产品功能等各个方面。
在问题定义上也要具体。如果你正在为电子邮件自动完成产品针对营销人员,你可能会说,“营销人员希望尽可能高效地与潜在客户沟通。”如果你正在创建一个消费产品,你可能会说,“人们希望尽可能高效地与朋友和家人沟通。”这种方法将有助于塑造你在设计产品时的假设。
当你定义了你正在解决的问题时,你可以将这个一般问题分解成人们试图执行的具体任务。以电子邮件自动完成产品为例,任务可能包括“我希望每天向潜在客户发送的电子邮件数量翻倍”或“我希望在每天结束时清空我的收件箱,同时不缩短我的电子邮件回复的长度。”这些具体任务可以成为产品成功的一些指标。考虑到这些产品管理指南,以下是我们在本章中作为示例人类在环机器学习系统试图解决的三个问题:
-
数据分析师希望了解其新闻标题数据中信息的分布。
-
“我想看看有多少新闻标题与特定主题相关。”
-
“我希望跟踪新闻标题主题随时间的变化。”
-
“我希望导出与特定主题相关的所有新闻文章以进行进一步分析。”
-
-
食品安全专业人员希望收集有关在食品中检测到病原体或异物的事件的数据。
-
“我希望记录欧盟所有已记录的食品安全事件的完整记录。”
-
“我希望跟踪不同食品安全事件可能来自同一来源的时间。”
-
“我希望在可能存在尚未检测或报告的食品安全事件时向特定国家发出警告。”
-
-
交通研究人员希望估计在特定街道上使用自行车的乘客数量。
-
“我希望收集有关人们骑自行车下街频率的信息。”
-
“我希望从数千个摄像头中捕捉这些信息,而我没有足够的预算手动完成。”
-
“我希望我的自行车识别模型尽可能准确。”
-
12.1.2 设计系统以解决问题
对于这三个用例,我们可以从问题定义开始,设计一个解决这些问题的系统。正如第二章所述,我们将为每个示例构建一个完整的人类在环机器学习系统。将这些示例视为未来将更具可扩展性和鲁棒性的系统的概念验证(PoC)。
使用注释者间一致性进行质量控制
在本章中提供关于注释者间一致性的良好实际例子并不容易,因为这里的例子需要是独立系统,一个人可以独立工作,假设大多数人都是单独阅读这本书。因此,本章涵盖了本书前 11 章中除注释者间一致性之外的大部分重要内容。
为了给你一个注释者间一致性的示例,我将在这本书后面附上一篇关于注释者间一致性的免费文章,该文章使用第二章中的示例。该示例包括根据是否与灾难相关对简短文本进行注释,使用我为该章节创建的开源代码。该章节的代码收集了人们所做的注释以及(如果他们选择)他们的身份,使我们能够比较不同人的注释。
尽管我在撰写这本书时无法提供一个关于注释者间一致性的示例,但你的注释将有助于进行一项注释者间一致性研究,这项研究将帮助人们多年。
注意,我们的两个系统在机器学习问题上相似;一个是标记新闻标题,另一个是标记图像。但因为他们支持不同的用例——探索性数据分析和对物体计数——所以产生的系统将不同。
食品安全示例自动化了一个现有的人类流程,因此保持从事这项工作的人的自主性很重要。特别是,他们不应该感到,现在他们的工作除了是日常任务的一部分外,还需要为机器学习算法提供动力,而感到工作进度变慢。在这种情况下,模型准确性最不重要,因为如果辅助文本不起作用,人们可以简单地输入字段值,这正是他们已经在做的事情。表 12.1 总结了这些系统中最重要的因素。
表 12.1 三种示例系统设计中的因素及其相对重要性。我们将根据系统的使用方式优化不同系统中的不同因素,这些信息将影响我们的设计决策。
| 示例 | 代理 | 模型准确性 | 注释准确性 |
|---|---|---|---|
| 标题 | 中等 | 中等 | 低 |
| 食品安全 | 高 | 低 | 高 |
| 自行车检测 | 低 | 高 | 中等 |
在所有三种情况下,一些组件可以被更复杂的组件所替代——更活跃的学习采样方法、更复杂的机器学习模型、更高效的界面等等。当你与这三个示例互动时,思考每个案例中最有用的下一步。根据系统的目标、数据和任务本身,你可能会对每个用例中要扩展或添加的组件有不同的想法。
12.1.3 连接 Python 和 HTML
我们将为这些示例构建网络界面,因此我们需要将 Python 与 HTML/JavaScript 连接起来。我们将使用一个名为 eel 的 Python 库,它允许我们为 Python 应用程序构建本地 HTML 界面。有许多库可用于将 Python 连接到 HTML。如果你熟悉另一个库——flask、kivy、pyqt、tkinter 或任何其他可以轻松与 HTML 应用程序连接的库/框架,那么这个库可能更适合你创建原型。
我们在这里使用 eel,因为它轻量级且对 JavaScript 的了解要求很少。如果你没有编写过 JavaScript 但知道 Python 和 HTML,你应该仍然能够跟随本章中的所有示例。我们将使用 eel 的方式将大部分工作放在 Python 中,原因相同:本章假设你更熟悉 Python。如果你更熟悉 JavaScript,你可以考虑本章中哪些组件可以用 JavaScript 实现。
在本章的每个示例中,我们将有三个包含代码的文件:一个用于 Python (.py),一个用于 JavaScript (.js),一个用于 HTML (.html)。这种格式在教学目的上使事情保持简单。你的实际代码分布应该反映你组织的最佳实践。你可以通过 pip 安装 eel:
pip install eel
你可以使用命令 @eel.expose 在函数之前导入 eel 并将任何 Python 函数暴露给 HTML 文件中的 JavaScript:
import eel
@eel.expose
def hello(message):
return “Hello ”+message
此代码允许你在 JavaScript 中调用此 hello 函数:
<script type='text/JavaScript'>
async function hello(message){
let message = await eel.hello(message)(); # Call Python function
console.log(message)
}
</script>
如果你调用 JavaScript 函数 hello("World"),它将在 JavaScript 控制台中打印 "Hello World",因为 Python 函数在前面添加了 "Hello"。在你的 Python 文件中的两行额外代码确保你的 Python 脚本可以使用 JavaScript 与你的 HTML 文件通信:
eel.init('./') # Tell eel where to look for your HTML files
...
eel.start('helloworld.html')
在前面的代码片段中,我们假设我们的 HTML 文件名为 helloworld.html,并且它与 Python 文件位于同一目录中——因此,本地路径 init('./')。start() 调用将打开一个浏览器窗口以启动你的应用程序,所以你通常希望这个调用在 Python 脚本的末尾。
注意,尽管我们在 Python 和 JavaScript 中都命名为 hello() 的函数,但这并不是一个强制性的命名约定,因为你的 JavaScript 可以通过名称调用 Python 中暴露的任何函数。我们遵循在整个章节中使用相同函数名的约定,以便使代码更易于阅读。同样,在每个示例中,我们将使用相同的名称为我们的 Python、JavaScript 和 HTML 文件,以保持事情简单,只更改扩展名,尽管在 eel 中没有文件命名要求。
在常规 Python 代码中,唯一的额外更改是我们需要使用 eel 进行线程管理,这是库与 HTML 交互的副作用。因此,我们将使用 eel.spawn(some_function_()) 来调用 some_function() 作为一个新的 Python 线程,并使用 eel.sleep() 而不是 Python 内置的 sleep() 函数。这些函数的表现方式与您可能熟悉的内置线程和睡眠函数相同。我们不会以复杂的方式使用线程,但在所有三个示例中,我们将有一个线程与 HTML 界面交互,而另一个线程重新训练模型。
eel 库支持的功能不仅限于这里提供的演示。它还允许你从 Python 内部调用 JavaScript 函数,例如。我们将保持我们的架构简单,并让所有操作由用户触发。
12.2 示例 1:新闻标题的探索性数据分析
探索性数据分析(EDA)是快速开发的机器学习系统中最常见的用例之一。然而,由于它不关注机器学习准确性,因此在机器学习文献中引用的 EDA 研究相对较少。在工业界,数据科学家通常在决定要构建哪些模型和产品之前,想要更详细地了解他们的数据。在这种情况下,EDA 允许数据科学家快速浏览和筛选数据。在本节中,我们将讨论的特定 EDA 示例中,以下是我们的问题陈述和三个正在解决的问题:
-
数据分析师想要了解他们新闻标题数据中信息的分布。
-
“我想看看有多少新闻标题与特定主题相关。”
-
“我想跟踪新闻主题随时间的变化。”
-
“我想导出与某个特定主题相关的所有新闻文章以进行进一步分析。”
-
12.2.1 假设
我们设计这个产品的假设是
-
标题只使用英语。
-
预训练语言模型将有所帮助。
-
分析师将有一些关于良好关键词的启动想法。
你的数据是如何决定你的架构决策的?
数据本身可以影响你对架构每个部分的决策。我们正在使用 DistilBERT 预训练模型,该模型是在维基百科和一系列公共领域书籍的英文数据上训练的。维基百科包括与新闻标题相似的文章标题,还包括一些实际新闻文章的标题。因此,这个预训练模型适合我们的任务。
然而,这个决定可能会因数据略有不同而改变。在我写这本书的时候,我帮助的一个组织 Turn.io 想要对世界卫生组织 COVID-19 信息服务收到的短信进行探索性数据分析。这些短信使用多种语言,直接消息的写作风格与大多数预训练模型构建的网页数据不同。在这种情况下,使用基于更多数据域的多语言模型(如 XLM-R)更为合适,尽管这个模型比 DistilBERT 需要更多的处理时间。
考虑到这一点,不要将本章中的任何内容视为你正在处理的问题的必要第一步。即使是类似的任务,也可能需要不同的架构和不同的预训练模型来构建。
重要考虑事项:
-
机构——使用该系统的分析师应该有权通过关键词和年份浏览数据。
-
透明度——系统的准确性应该在整个数据集和按年份清晰可见。
-
密集/丰富布局—分析师应该能够在屏幕上获取尽可能多的信息,因此布局应该是信息密集的。
-
即时性—界面应该立即对分析师理解数据有所帮助,因此评估数据的创建应与训练数据的创建并行进行。
-
分层—分析师对每年的准确性感兴趣,因此我们除了跟踪整体准确性外,还想跟踪每年的准确性。
-
灵活性—分析师可能希望在不同的时间查看不同的标签。
-
可扩展性—分析师可能希望在以后将此任务扩展成更大规模的任务,因此他们希望跟踪有趣的标题示例,以便添加到未来的指南中。
12.2.2 设计与实现
这个任务是一个二进制标签任务,因此不确定性采样算法的选择并不重要。我们将使用最小置信度,并使用分层抽样以实现现实世界的多样性,针对特定年份的新闻标题。我们将允许分析师使用关键词来过滤正在标注的数据。
对于标注,我们将允许标注者对每个标题快速做出二进制选择以优化速度。我们不会将关键词抽取的项目包括在评估数据中,因为它们不会创建一个平衡的样本。
我们将使用两个机器学习模型。一个模型会随着每个新标注的增量更新,通过允许分析师立即在模型和结果预测上看到他们标注的结果,从而增加分析师的权限。然而,增量模型已知存在近期偏差,并且会收敛到局部最优。在主动学习场景中,近期偏差可能会被放大,因为最新项目不是随机抽取的,尤其是如果它们是通过关键词抽取的。因此,第二个模型将在定期的时间间隔内从所有训练数据从头开始重新训练。当这个模型在保留数据上更准确时,它将替换第一个模型。
对于两个机器学习模型,我们将从 DistillBERT 预训练模型中调整模型。DistillBERT 比 BERT 小得多,但具有可比的准确性。我们假设,即使准确性有所损失,更快的处理速度和更小的内存占用也将是净正面效果。此架构如图 12.1 所示。

图 12.1 示例系统的新闻标题分类架构
图 12.1 几乎与本书中的所有架构相同,但它有两个模型,我们可以针对实时训练进行优化,除了旨在最大化准确性的训练。您可以在github.com/rmunro/headlines中看到代码。有关实现细节和如何进行实验的更多信息,请参阅存储库中的 readme 文件。
12.2.3 可能的扩展
在与系统玩了一段时间后,思考你可能做出的改变。表 12.2 提供了潜在改进的示例。
表 12.2 中的每个示例都可以用少于 50 行代码实现,因此实现其中之一或两个几乎没有障碍。但实现所有更改并评估哪些是最有效的将是一项大量工作。因此,与系统交互应该能让你了解首先应添加的最有价值的改进。本例中有一个机器学习辅助人类的元素,这是我们将在下一个示例中加倍投入的。
表 12.2 本例及其在本书中涵盖的章节中可能的扩展
| 标注界面 |
|---|
| 批量标注(第 11.2.1 节) |
| 更强大的过滤(第 9.5 节) |
| 标注质量控制 |
| 将模型用作标注者(第 9.3 节) |
| 标注聚合(第 8.1-8.3 节) |
| 机器学习架构 |
| 自监督学习(第 9.4 节) |
| 调整模型以适应未标记数据 |
| 活跃学习 |
| 基于集成采样(第 3.4 节) |
| 多样性采样(第 4.2-4.4 节) |
12.3 示例 2:收集关于食品安全事件的数据
许多人日常工作的内容是从非结构化数据中构建结构化数据。这些工作者包括寻找消费者对产品某些方面表达的情感的市场专业人士,无论在线还是评论中;从书面电子病历中提取重要信息的医疗保健专业人士;以及我们例子中的食品安全专业人士。以下是问题陈述和正在解决的三个具体问题:
-
食品安全专业人士希望收集有关在食品中检测到病原体或异物的事件的数据。
-
“我想维护欧盟所有记录的食品安全事件的完整记录。”
-
“我想跟踪不同食品安全事件可能来自同一来源的时间。”
-
“当可能存在尚未被发现或报告的食品安全事件时,我想向特定国家发送警告。”
-
12.3.1 假设
我们设计此产品的假设是:
-
报告仅提供英文版本。
-
预训练语言模型将有所帮助。
-
食品安全专家拥有提取所需信息的领域专业知识。
-
食品安全专家已经在他们的工作中执行这项任务。
重要考虑因素:
-
代理—食品安全专家不希望他们的工作流程因机器学习集成而减慢。
-
透明度—食品安全专家应该能够理解在假设他们想查看每一份报告的情况下,还有多少报告尚未查看。
-
一致性和紧凑性—食品安全专家不应该需要滚动、使用鼠标或失去屏幕上元素的控制。
-
追踪趋势的能力—分析师对各国趋势感兴趣,因此我们希望跟踪提取的信息如何显示国家间移动的趋势。
12.3.2 设计与实现
对于主动学习,我们假设两个标签之间的混淆与所有标签之间的混淆一样糟糕,因此我们将使用置信度比率来表示不确定性。不确定性分数将用作阈值,以决定是否显示模型提供的自动完成建议。
对于注释,如果没有来自模型的预测,界面将使用从当前报告中所有匹配的文本字符串中获取的自动完成建议。使用匹配的文本字符串将提供与使用预测标签进行自动完成相似的用户体验,即使没有模型预测也是如此。
我们将使用一个从 DistillBERT 预训练模型改编的机器学习模型,该模型定期重新训练。我们可以使用两个模型,就像本章第一个例子中那样,其中一个模型是增量更新的。然而,在这里,增量更新并不那么重要,因为匹配现有字符串的回退行为对于食品安全专业人士来说已经是一个很好的用户体验,因此我们可以尽可能保持架构简单,并在我们有一个工作原型后再考虑这个扩展。该架构如图 12.2 所示。 |
|
图 12.2 从文本中提取食品安全事件信息的示例系统架构 |
注意,图 12.2 在信息流中包含注释,这对于机器学习辅助任务来说更有意义。否则,循环是相同的,数据驱动一个模型,反过来又帮助注释。您可以在github.com/rmunro/food_safety中查看代码。在存储库中的 readme 文件中可以找到有关实现细节和如何进行实验的更多信息。 |
12.3.3 可能的扩展 |
在玩了一段时间的实现之后,考虑一下您可能做出哪些改变以使系统更高效。一些可能的扩展总结在表 12.3 中。 |
与我们之前的例子一样,表 12.3 中的所有更改都可以用不到 50 行代码实现。任何更改都可以根据对系统的经验成为正确的下一步。 |
表 12.3 本例及本书中涵盖的章节/节中可能的扩展 |
| 注释界面 |
|---|
| 预测性注释(第 11.5.4 节) |
| 裁决(第 8.4 节和第 11.5.4 节) |
| 注释质量控制 |
| 注释者间一致性(第 8.2 节) |
| 预测错误(第 9.2.3 节) |
| 机器学习架构 |
| 合成负例(第 9.7 节) |
| 中间任务训练(第 9.4 节) |
| 活跃学习 |
| 基于不确定性的重新排序(第 3.2-3.4 节) |
| 其他不确定性度量(第 3.2 节) |
12.4 示例 3:在图像中识别自行车
不论是交通管理、监控生产线还是计数货架上的商品,在计算机视觉中,计算图像中物体的数量是最常见的用例之一。在这种情况下,我们假设用例是交通研究人员,他们希望估计某些街道上使用自行车的数量。以下是问题陈述和正在解决的三个具体问题:
-
交通研究人员希望估计某些街道上使用自行车的数量。
-
“我想收集有关人们骑自行车下街的频率的信息。”
-
“我想从数千个摄像头中捕捉这些信息,但我没有预算手动完成。”
-
“我希望我的自行车识别模型尽可能准确。”
-
“自行车”并不是 ImageNet(最受欢迎的图像分类数据集)中最常见的 1000 个标签之一,因此这项任务是在常见模型中填补了一个空白(尽管“双人自行车”和“山地自行车”在 ImageNet 中)。自行车是一个有趣的问题,因为它们很容易被人类识别,但不同的角度对于机器学习算法来说会有不同的特征轮廓。我自恋地认为我到处骑自行车,所以我想让这项技术尽可能准确。你也可以将这个任务适应到其他标签上。
12.4.1 假设
我们设计这个产品的假设是:
-
图片可以从任何角度拍摄。
-
现有的数据集(如 ImageNet、Open Images 和 MS COCO)可能很有用,但可能没有涵盖所有可能的拍摄角度和设置。
-
模型的精度是最重要的结果。
重要考虑因素:
-
代理—在注释过程中,交通研究人员不关心代理;他们只想尽快构建最准确、最健壮的模型。
-
透明度—实时监控系统精度是最重要的指标。
-
多样性—交通研究人员希望模型在不同光照条件、不同角度和不同距离处对物体都能同样有效(尽可能做到)。
12.4.2 设计与实现
我们将使用一个依赖于两个基于 ImageNet 和 COCO 数据集构建的预训练模型的机器学习模型,这两个数据集都是与自行车相关的知名数据集,这将为我们创建一个准确模型提供一个先发优势。
对于主动学习,任务是一个二元分类任务,就像第一个例子一样。不确定性采样算法的选择并不重要,所以我们将使用最小置信度。我们将寻找基于模型的异常值在角落案例中,我们可能对预测有信心,但缺乏支持这种信心的强有力证据。对于注释,我们将允许注释者快速对每张图像进行二元选择以优化速度。这种架构在图 12.3 中显示。

图 12.3 示例系统中标记自行车的架构
在本章的三个例子中,图 12.3 与我们全书所见的架构最相似。唯一的区别是我们使用多个预训练模型,因为我们专注于模型精度。你可以在github.com/rmunro/bicycle_detection中看到代码。在存储库的 readme 文件中可以找到有关实现细节和如何进行实验的更多信息。
12.4.3 潜在的扩展
在玩了一段时间的系统后,考虑一下你可能做出的改变。表 12.4 有一些建议。
表 12.4 示例和本书中涵盖的章节/部分的潜在扩展
| 标注界面 |
|---|
| 批量标注(第 11.2.1 节) |
| 边界框标注(第 11.5.2 节) |
| 标注质量控制 |
| 引发主观判断(第 9.1 节) |
| 合成数据(第 9.7 节) |
| 机器学习架构 |
| 目标检测 |
| 连续/连续任务 |
| 活动学习 |
| 基于集成采样的方法(第 3.4 节) |
| 代表性采样(第 4.4 节) |
与我们之前的例子一样,表 12.4 中的所有更改都可以用少于 50 行代码实现。任何更改都可能基于对系统的经验成为正确的下一步。
12.5 构建人机交互式机器学习产品的进一步阅读
尽管不是免费的,但 Emmanuel Ameisen 最近出版的书籍《构建机器学习应用(O’Reilly,2020)Building Machine Learning Powered Applications》是构建机器学习应用时需要考虑的因素的良好概述,例如定义您的产品目标、设置机器学习问题以及快速构建端到端管道。几乎所有这些信息都适用于人机交互系统。
摘要
-
在定义人机交互机器学习应用的产品时,从您试图解决的问题开始并逆向工作是有帮助的。这种方法有助于从技术设计到界面设计以及注释指南的框架。
-
我们创建了一个用于短文本探索性数据分析的系统,使分析师能够根据不同的标签快速过滤新闻标题,以便他们可以看到随时间的变化。
-
我们创建了一个从文本中提取信息的系统,帮助食品安全专家从普通报告中追踪食品中发现的病原体和异物信息。
-
我们创建了一个系统来最大化图像标注任务的准确性,帮助一位数据科学家制作尽可能精确的自行车识别模型。
附录 机器学习复习
本附录涵盖了与人类在循环机器学习最相关的机器学习基础知识,包括解释机器学习模型的输出;理解 softmax 及其局限性;通过召回率、精确率、F 分数、ROC 曲线下面积(AUC)和调整后的准确率来计算准确度;以及从人类的角度衡量机器学习性能。本书假设你具备基本的机器学习知识。即使你有经验,你可能也想回顾这个附录。特别是与 softmax 和准确度相关的部分对于本书尤为重要,有时会被只关注算法的人忽视。
A.1 从模型中解释预测
几乎所有的监督式机器学习模型都会给你两样东西:
-
一个预测标签(或一组预测)
-
与每个预测标签相关联的数字(或一组数字)
假设我们有一个简单的目标检测模型,它试图区分四种类型的对象:“骑自行车的人”、“行人”、“标志”和“动物”。该模型可能会给出以下预测列表。
列表 A.1 模型 JSON 编码预测示例
{
"Object": {
"Label": "Cyclist",
"Scores": {
"Cyclist": 0.9192784428596497, ❶
"Pedestrian": 0.01409964170306921,
"Sign": 0.049725741147994995,
"Animal": 0.016896208748221397
}
}
}
❶ 在这个预测中,对象被预测为“骑自行车的人”,准确度为 91.9%。这些得分加起来为 100%,给出了这个项目的概率分布。
你可以从示例中看到,“骑自行车的人”被预测为得分为 0.919。可能被预测为“行人”、“标志”或“动物”的得分分别是 0.014、0.050 和 0.0168。这四个得分总和为 1.0,这使得得分类似于概率或置信度。例如,你可以将 0.919 解释为有 91.9%的置信度认为该对象是“骑自行车的人”。这些得分合在一起被称为概率分布。
A.1.1 概率分布
在机器学习文献中,术语概率分布仅意味着预测标签之间的数字总和为 100%,这并不一定意味着每个数字都反映了模型对预测正确的实际置信度。对于神经网络、逻辑回归和其他类型的相关判别监督学习算法,算法的任务并不是知道其预测的置信度。算法的任务是尝试根据特征在标签之间进行区分——因此,称为判别监督学习。神经网络最后一层的原始分数是网络尝试在其做出的预测中进行区分的分数。根据模型的参数,这些最终层的原始分数可以是任何实数。尽管本书的范围不涉及为什么神经网络不能产生好的概率分布,但一般来说,大多数模型往往过于自信,预测最可能的标签时给出的分数高于其实际概率,但当有罕见数据时,模型可能会缺乏自信。因此,这些算法输出的分数通常需要转换为更接近真实置信度的东西。
在你喜欢的库中,概率分布可能被称作不同的名称。请参阅以下侧边栏了解更多关于差异的信息。
分数、置信度和概率:不要相信名称!
机器学习库——无论是开源的还是商业的——通常将分数、置信度和概率互换使用。你甚至可能发现在同一个库中也没有一致性。
我遇到过这种情况。当我负责亚马逊 Comprehend 的产品时,这是 AWS 的自然语言处理(NLP)服务,我们必须决定应该称每个预测相关的数字为什么。经过长时间的讨论,我们决定“置信度”这个词具有误导性,因为系统的输出并不是根据概率的严格统计定义的置信度,所以我们选择了“分数”这个词。AWS 现有的计算机视觉服务 Amazon Rekognition 在预测图像标签时(至今仍然如此)已经使用了“置信度”来表示这个相同的分数。
大多数机器学习库在命名约定方面的考虑不如大型云公司给予的那么多,因此你不应该仅根据它们的名称来信任与预测相关的数字。阅读你的机器学习库或服务的文档,以了解与每个预测相关的数字的含义。
对于生成式监督学习算法,如大多数贝叶斯算法,算法确实试图显式地建模每个标签,因此置信度可以直接从你的模型中读取。然而,这些置信度依赖于对数据潜在分布(如正态分布)和每个标签的先验概率的假设。
为了进一步复杂化,你可以通过生成式监督学习方法扩展判别式监督学习算法,以从模型中获得更真实的统计“概率”。今天,从判别模型中获得准确概率的生成方法在大多数广泛使用的机器学习库中是不可用的。你更有可能得到由 softmax 算法生成的概率分布,因此我们将从这里开始。
A.2 softmax 深入探讨
最常见的模型是神经网络,神经网络预测几乎总是通过 softmax 转换到 0-1 的分数范围。softmax 被定义为

神经网络的输出将类似于图 A.1。

图 A.1:softmax 在两种类型架构中如何创建概率分布。在上面的例子中,softmax 是输出(最终)层的激活函数,直接输出一个概率分布。在下面的例子中,输出层使用了线性激活函数,创建了模型分数(logits),这些分数通过 softmax 转换成概率分布。底部的架构稍微复杂一些,但更适合主动学习,因为它提供了更多信息。
如图 A.1 所示,softmax 通常用作模型最终层的激活函数,以产生一个概率分布,作为与预测标签相关联的分数集合。softmax 也可以从线性激活函数(logits)的输出中创建概率分布。
通常在最终层使用 softmax,或者只查看对 logits 应用 softmax 的结果。softmax 是有损的,它丢失了由于强烈竞争信息导致的不确定性和由于信息不足导致的不确定性之间的区别。我们假设我们正在使用图 A.1 中的第二种架构,但效果会适用于 softmax 是激活函数还是应用于模型分数的情况。
如果你正在使用图 A.1 中的第二种架构,在最后一层使用具有负值的激活函数,例如 Leaky ReLU,对于包含人类操作员的架构通常比具有零下限的函数(如 ReLU)更好。对于本书中的一些主动学习策略,这有助于量化一个输出中负信息的数量。如果你知道某些其他激活函数在预测标签方面更准确,你可能会考虑重新训练你的最后一层以进行主动学习。这种策略——为包含人类操作员的任务专门重新训练模型的一部分——在本书中有所涉及。
无论你使用什么架构以及 softmax 的输入范围如何,理解 softmax 方程式都很重要,因为它是有损的(这是众所周知的)并且对任意输入假设,这可能会改变预测置信度的排名顺序(这并不广为人知)。
A.2.1 将模型输出转换为置信度使用 softmax
这里是一个使用 PyTorch 库实现的 softmax 示例:¹
def softmax(self, scores, base=math.e):
"""Returns softmax array for array of scores
Converts a set of raw scores from a model (logits) into a
probability distribution via softmax.
The probability distribution will be a set of real numbers
such that each is in the range 0-1.0 and the sum is 1.0.
Assumes input is a pytorch tensor: tensor([1.0, 4.0, 2.0, 3.0])
Keyword arguments:
prediction -- pytorch tensor of any real numbers.
base -- the base for the exponential (default e)
"""
exps = (base**scores.to(dtype=torch.float)) # exponents of input
sum_exps = torch.su(exps) # sum of all exponentials
prob_dist = exps / sum_exps # normalize exponentials
return prob_dist
严格来说,这个函数应该被称为softargmax,但在机器学习领域几乎总是简称为softmax。你也可能看到它被称为玻尔兹曼分布或吉布斯分布。
为了了解前一个方程中的 softmax 变换在做什么,让我们分解这些部分。假设你预测了图像中的对象,并且模型给你提供了原始分数 1,4,2 和 3。最大的数字 4 将成为最自信的预测(表 A.1)。
表 A.1 使用分数(z,logits)的示例预测;每个分数乘以自然指数(e);以及归一化指数,即 softmax 值。归一化向量被称为概率分布,因为数字在 0-1 范围内,且总和为 1。
| 预测标签 | 骑行者 | 行人 | 标志 | 动物 |
|---|---|---|---|---|
| 分数 (z[1],..z[4]) | 1.0 | 4.0 | 2.0 | 3.0 |
| e^z | 2.72 | 54.60 | 7.39 | 20.09 |
| softmax | 0.0321 | 0.6439 | 0.0871 | 0.2369 |
最后一行,softmax,是 e^z 除以 e^z 行中所有数字的总和。这些原始分数——1,4,2 和 3——将在本节中用于保持示例的一致性,并且因为它们加起来是 10,这使得直觉更容易理解。你得到的数字的确切范围将取决于你的激活函数。如果你使用 softmax 作为最终的激活函数,确切的数字将是激活函数和前一层输出的权重的组合。确切的整数不太可能,但在许多架构中,1-4 的范围将是常见的。
如表 A.1 所示,“行人”是我们示例中最自信的预测,置信度数字是从原始数字拉伸出来的;原始分数中的 4.0/10.0 变成了 softmax 中的 64%。在 e^z 步骤中,“行人”预测变得很大,其中它是 54.60,e^(4.0) = 54.60,因此最可能的标签成为分母方程中的最大数,从而主导了方程。
可解释性的好处应该是显而易见的:通过将数字转换为指数并归一化,我们能够将正负数的无界范围转换为 0-1 范围内的概率估计,并且总和为 1。此外,指数可能比如果我们归一化原始分数时更接近真实概率。如果你的模型是通过使用最大似然估计(MLE)进行训练的,这是训练神经模型最流行的方式,那么它是在优化对数似然。因此,在对数似然上使用指数将我们带到了实际的似然。
A.2.2 softmax 的基数/温度选择
作为将基数从 e 改变的替代方案,你可以将分子和分母除以一个常数。这种技术被称为改变 softmax 的 温度,因此通常用 T 表示,在文献中通常没有报告温度数值时,T 通常为 1:

从数学的角度来看,改变 softmax 的基数和改变温度之间没有区别;你得到相同的概率分布集(尽管不是以相同的速率)。我们在这本书中使用 softmax 基数,因为它使得第三章的一些解释更容易理解。如果你使用的是一个不允许你改变基数的 softmax 函数,你可能发现实验温度更容易一些。
为什么使用基数 = e(或温度 = 1)?老实说,为什么 e 是我们用于归一化数据的数字有点不稳固。在机器学习的许多领域,e 具有特殊的性质,但这个领域不是其中之一。欧拉数 (e) 大约是 2.71828。正如你从高中数学课程中回忆的那样,e^x 是其自身的导数,因此它具有许多有趣的性质。在机器学习中,我们特别喜欢 e^x 是其自身的导数这一事实(图 A.2)。

图 A.2 显示 e 作为其自身的积分。在 f(1) = 1 处的斜率为 1,在 f(2) = 2 处的斜率为 2,依此类推。
在 f(x)处的斜率是 f(x),对于任何给定的 x,e^x 曲线在 f ́(1)处的斜率是 1,曲线在 f ́(2)处的斜率是 2,依此类推。你可能记得在高中数学书中将这个斜率写成 f ́(1) = 1 和 f ́(2) = 2;撇号表示导数,称为导数。或者你可能看到斜率写成 dy/dx 或ẏ。这三个符号—f ́, dy/dx, 和 ẏ—分别来自不同的数学家(Lagrange,Leibniz,和 Newton),但意味着相同的事情。你可能在高中学过 Lagrange 的符号,在机器学习课程中学过 Leibniz 的符号,如果你来自物理学,你可能学过 Newton 的符号。
当我们说e^x 是其自身的导数时,我们指的是 f(x) = f(x)的性质。如果你使用除了e以外的任何基数作为指数曲线,你就不会得到这个性质。在机器学习中,我们需要对函数求导以使其收敛。机器学习中的学习主要是函数的收敛,因此当我们知道函数的导数是其自身时,我们可以节省大量的计算能力。
然而,当你试图找到最佳置信度度量时,这并不意味着e是适合你特定数据集的最佳数字。从相同的输入中,比较图 A.3 中的两个图表,左边的图表使用e(2.71828)作为指数基数,右边的图表使用 10 作为指数基数。

图 A.3 比较 softmax 在相同原始输出数据上使用指数基数 e 和 10 的情况。图表显示,基数越高,最高分的估计概率越高,在更高的基数下,最高分在 softmax 方程中的主导作用越强。
如你所见,指数的选择可能非常重要。如果我们使用 10,我们数据中“行人”的置信度为 90%,而下一个最置信的标签不到 10%。表 A.2 显示了使用 10 作为 softmax 的指数基数在我们示例数据上的分数。
表 A.2 使用 10 而不是 e 作为幂的 softmax 算法从相同的分数(z,logits)重复
| 预测标签 | 骑行者 | 行人 | 标志 | 动物 |
|---|---|---|---|---|
| 分数(z[1],...z[4]) | 1.0 | 4.0 | 2.0 | 3.0 |
| 10^z | 10.00 | 10000.00 | 100.00 | 1000.00 |
| softmax (10) | 0.09% | 90.01% | 0.90% | 9.00% |
这个表格让我们更清楚地了解最大数值的重要性。以 10 为指数基数,我们得到 1 加上 4 个零(10,000),这显然比在最终的 softmax 方程中被推下的其他任何数值都要大得多:
softmax 的指数基数越高,概率的极化程度就越高。
基础的选择不会改变单个项目哪个预测最自信,所以在人们只关心预测准确性而忽略标签的情况下,基础的选择在机器学习任务中常常被忽视。然而,基础的选择可以改变置信度的排名顺序。也就是说,项目 A 在基础e下可能比项目 B 更自信,但在基础 10 下则可能不那么自信。表 A.3 展示了这样一个例子。
表 A.3:softmax 可能的两组输入,根据使用的基数/温度不同,它们的排名会有所不同
| 预测标签 | 骑行者 | 行人 | 标志 | 动物 |
|---|---|---|---|---|
| 输入 A | 3.22 | 2.88 | 3.03 | 3.09 |
| 输入 B | 3.25 | 3.24 | 3.23 | 1.45 |
在这两种情况下,A 和 B 都预测“Cyclist”是最可能的标签。但哪个在正确标签上更自信?如图 A.4 所示,答案取决于基础和温度。
许多人发现图 A.4 中的图形令人惊讶,包括本书的一位审稿人、一位在著名 ICML 会议上的审稿人,以及一位图灵奖获得者,这就是为什么我在本书写作后期添加了这个图。给定一个随机的输入集(在我的实验中),只有大约 1%的输入对会产生图 A.4 中的效果。然而,在为主动学习采样最不自信的预测时,样本可以变化多达 50%。在主动学习中,采样最不自信的项目是最常见的策略,这在第三章中有讨论。因此,这种广泛存在的误解在人类在环机器学习中已被广泛忽视:通过操纵人们以前认为是不变的变量,改变 softmax 的基础或温度有可能创建更准确的系统。

图 A.4:比较表 A.3 中的输入(A = [3.22, 2.88, 3.03, 3.09] 和 B = [3.25, 3.24, 3.23, 1.45])与不同的 softmax 基数和不同的温度,显示根据基数或温度,任一组输入都可能有最自信的结果。严格来说,底部图形的 x 轴是逆温度,这是一个有效的等比例度量标准,尽管不如常见。我们在这里使用逆温度是为了显示两个图形以更多或更少相同的方式向上和向右移动。
假设在本文中,除非明确说明,softmax 使用基础 = e 和温度 = e。现在,重要的是要了解 softmax 如何将输入转换成概率分布。
A.2.3 指数除法的结果
记住,softmax 函数会规范化输入的指数,并回想一下你高中数学中的公式:c^((a-b)) = c^a / c^b。因此,当 softmax 通过除以所有指数来规范化指数时,指数的除法本质上就是减去得分的绝对值。换句话说,只有模型得分之间的相对差异在 softmax 中起作用,而不是它们的实际值。
让我们将(1.0, 4.0, 2.0, 3.0)的分数代入,以创建添加 10、100 和-3 到每个分数的场景,这样我们改变了分数的总和,但保持了分数之间的差异。如图 A.5 所示,概率分布是相同的,尽管在四个预测集中的原始分数差异很大,因为四个原始分数之间的差异是相同的。4 和 3 之间的差异与 104 和 103 之间的差异相同。这种限制是一个重要的理解点。

图 A.5:Softmax 等价性:四个模型分数在 softmax 下给出相同的概率分布。尽管来自不同的模型分数,但四个 softmax 概率分布是相同的,这表明只有分数之间的差异才是重要的。例如,(1, 4, 2, 3)的分数在 softmax 下给出的概率分布与(101, 104, 102, 103)相同。
为了从另一个角度理解这个概念,尝试将(1.0, 4.0, 2.0, 3.0)中的每个数乘以一个常数,而不是像图 A.5 中那样加一个常数。图 A.6 显示了乘法的结果。

图 A.6:两个分数分布除了比例不同外是相同的。右侧的分数是左侧分数的 10 倍。在 softmax 下,这些分数导致不同的概率分布。此图还显示了改变温度而不是基数的效应。如果我们从左侧的值开始,但将温度降低到 0.1(实际上是将 logits 乘以 10),我们将得到更多权重分配给最自信的预测。
在图 A.6 中,你可以看到,尽管来自最后一层的分数仅在 y 轴的比例上有所不同,但在 softmax 下它们产生了不同的概率分布。对于分数较低的分布,softmax 产生了一个比 logits 更紧密的数字集的概率分布,但分数较高时,它产生了一个更宽的分布。
小心 softmax 中的大输入
当使用 softmax 处理大输入值时,你可能会遇到硬件溢出错误,因为指数步骤会产生大数值。如果你在电脑上计算 1,000 的 e 次方,你可能会看到系统错误或无限值(inf),这种结果可能会影响下游过程。你有两种方法可以避免这种溢出,如果你决定开始尝试使用 softmax,我建议你使用其中一种方法。
第一种方法是从你的输入中减去一个常数,使得你的输入中的最大值为 0。这种方法利用了图 A.5 中的现象:减去一个常数给你相同的概率分布,而不会在指数步骤中产生溢出。第二种方法是使用 softmax 的对数(PyTorch 的默认行为),它保持了数字的范围。
在我们之前的例子中,我们将 softmax 视为输出层得分的归一化。你也可以将 softmax 用作输出层的激活函数。关于选择基础/温度以及它如何以不同方式分散数据的所有观察结果仍然适用。
本节及其相关的图表可能是你将在任何地方读到的关于 softmax 的最长描述,但这个信息对于人机交互机器学习非常重要。Softmax 是从机器学习预测中生成概率分布的最常用算法,但许多人认为选择基础为 e 具有生成置信度的特殊属性(它没有),或者选择基础不会改变不确定性的排名顺序。因此,真正理解 softmax 的作用将有助于你选择正确的不确定性采样策略。
A.3 测量人机交互的机器学习系统
你有多种方式来衡量人机交互机器学习系统的成功,你使用的指标将取决于你的任务。本节涵盖了其中一些最重要的指标。
A.3.1 精确度、召回率和 F 分数
对于机器学习算法,通常使用众所周知的指标精确度、召回率和 F 分数。F 分数是精确度和召回率的调和平均数,其中真实正例是该标签的正确预测;假阳性是该标签的错误预测项;假阴性是具有该标签但被预测为其他事物的项。

如果你使用纯准确度并且你的标签是罕见的,那么大部分的准确度将由大量真实负例决定。调整这种不平衡的一种方法被称为机会调整一致性,我们将在下一节中介绍。
A.3.2 微观和宏观精确度、召回率和 F 分数
精确度、召回率和 F 分数的计算通常是针对数据中的一个标签。有两种常见的方法可以将每个标签的准确度组合成一个单一的准确度分数。微观分数在每项级别上汇总准确度,为每个项目进行计算。宏观分数独立地为每个标签计算准确度。
如果你有一个标签比其他标签出现频率高得多,那么这个频率将对微观精确度、微观召回率和微观 F 分数贡献最大。在某些情况下,这个结果可能正是你想要的,因为它给出了一个加权准确度数字,这个数字是根据你的测试数据中的标签来加权的。但是,如果你知道你的测试数据在模型部署时遇到的标签之间不平衡,或者你希望你的模型在预测所有标签时都能保持相同的准确度,无论它们的频率如何,那么宏观准确度分数更为合适。
A.3.3 考虑随机机会:机会调整准确度
假设你有两个标签,并且它们出现的频率相等。如果你的模型随机预测标签,它仍然会是 50%的准确性。显然,这个结果是不公平的积极结果,使得很难与不同模型进行比较,该模型中可能不是所有标签都平衡。调整随机概率的准确性将随机概率数设为 0,并相应地调整分数:

因此,如果你在两个频率相等的标签的任务上准确率为 60%,则调整随机概率的准确性为(60% - 50%)/(1 - 50%)= 20%。尽管调整随机概率的准确性不常用于评估模型预测的准确性,但它确实广泛用于评估人工标注的准确性。当不同标签的频率有较大差异时,调整随机概率的准确性更有用。你有多种计算随机概率的方法;我们在第八章中关注注释时将介绍这些技术。
A.3.4 考虑置信度:ROC 曲线下的面积(AUC)
除了模型对预测标签的准确性之外,我们还关心置信度是否与准确性相关,因此我们可以计算 ROC 曲线下的面积(AUC)。ROC(接收者操作特征)曲线按置信度对数据集进行排序,并计算真阳性与假阳性的比率。
示例如图 A.7 所示。ROC 曲线是通过按模型置信度确定的顺序绘制真阳性率(TPR)与假阳性率(FPR)来创建的。
ROC 曲线可以帮助我们决定在何处可以信任模型的决策,在何处我们希望退回到人工判断。AUC 是曲线下空间相对于整体空间的计算。你可以从图 A.7 中估计 AUC 大约为 0.80。

图 A.7 一个 ROC 曲线示例,按模型置信度确定的顺序绘制 TPR 与 FPR。在这个例子中,我们看到 ROC 曲线的前 20%几乎垂直。这条线告诉我们,对于最自信的 20%预测,我们几乎有 100%的准确性。ROC 曲线在 1.0 处几乎水平,对于最后的 30%。这条线告诉我们,当我们到达标签 30%最不自信的预测时,带有该标签的项目很少。
AUC 是 ROC 曲线下面积占整个可能面积的比例。AUC 也是随机选择两个具有不同标签的项目中,正确标签被更高置信度预测的概率。
因此,我们可以通过比较带有标签e的每个项目的置信度与没有标签的每个项目的置信度来计算 AUC:

此算法将每个集合中的每个项目与其他每个项目进行比较,因此它具有 O(N²)的复杂度。如果你需要加快计算速度,因为评估项目数量很大,你可以首先对项目进行排序,并以 O(N Log(N))的复杂度递归地找到排序位置。
由于我们可以计算微观和宏观的精确度、召回率和 F 分数,我们还可以计算微观和宏观的 AUC:
-
微观 AUC—计算 AUC,但不是针对一个标签中的项目计算,而是针对所有标签中的所有项目计算。
-
宏观 AUC—分别计算每个标签的 AUC,并取所有标签的平均 AUC。
A.3.5 发现的模型错误数量
如果你有一个机器学习模型在可能出错时退回到人工的系统,你可以计算发现的错误数量。你可能决定低于 50%的置信度可能是错误,例如,并将所有这些模型预测放在一个人面前接受或修正:

这个公式告诉你需要人工修正的项目标记百分比。一种变化是计算所有错误的百分比,这给出了人类预测加上模型预测的总准确率。另一种变化是计算每小时或每分钟出现的错误数量,如果你有固定的时间用于人工组件,这可能更有意义。
A.3.6 节省的人工劳动成本
另一种计算人力成本的方法是衡量节省了多少时间和精力。无论你是使用主动学习来更明智地选择哪些项目进行标注(第 3-6 章)还是改进标注的质量控制和界面(第 8-11 章),提高人工组件在人工反馈系统中的效率、准确性和用户体验可能比在模型准确度上做出的小幅改变更为重要。图 A.8 展示了示例。

图 A.8 标签数量的减少是必要的。在这个例子中,使用主动学习(第 3-6 章)的策略达到与随机抽样相同的准确度,但所需的标签数量不到一半。B / (a + b) = 标签需要减少 53%。
如图 A.8 所示,当我们查看 x 轴时,主动学习可以将所需的标签数量减少 53%,但如果查看 y 轴,该点的准确度差异大约为 20%。如果你来自算法背景,你可能更习惯于查看 y 轴,因为你通常在相同的数据上比较两个算法。所以如果你在比较两个不同数据集上的相同算法,x 轴有更重要的数字。
A.3.7 本书计算准确度的其他方法
本附录涵盖了计算准确度的最标准方法,但一些特定于机器学习的准确度指标在此未涵盖:用于语言生成的双语评估助手(BLEU);用于目标检测的交集与并集(IoU);按人口统计的准确度;以及人类标注的调整后一致性。这些指标在书中的适当位置介绍,因此你在此复习中不需要理解它们。
(1.)本章的早期版本使用了 NumPy 库而不是 PyTorch 库。您可以在mng.bz/Xd4p查看那些示例。


浙公网安备 33010602011771号