45、人机协同机器学习产品实践

人机协同机器学习产品实践

1. 人机协同机器学习应用的产品定义

在设计人机协同机器学习应用时,良好的产品管理始于明确要解决的问题,即所支持的实际日常任务。理解要解决的人类任务有助于产品设计的各个方面,包括界面、注释和机器学习架构。

1.1 从要解决的问题入手

好的产品设计应从定义要解决的问题开始。常见的错误是从所创建的技术角度而非要解决的问题来谈论产品。以电子邮件客户端的自动完成功能为例,将问题定义为“人们希望在电子邮件中自动完成句子”过于简单,更好的定义是“人们希望尽可能高效地进行交流”。明确问题有助于从为注释者创建指南到决定下一步构建或扩展哪些产品功能等各个方面。

在问题定义中具体化也很有帮助。如果电子邮件自动完成产品针对营销人员,问题可以定义为“营销人员希望尽可能高效地与潜在客户进行交流”;如果是面向消费者的产品,则可以定义为“人们希望尽可能高效地与朋友和家人进行交流”。这种方法有助于在设计产品时形成假设。

定义好要解决的问题后,可以将其分解为人们试图执行的具体任务。对于电子邮件自动完成产品,具体任务可能包括“我希望每天发送给潜在客户的电子邮件数量翻倍”或“我希望在不缩短邮件回复长度的情况下每天清理完收件箱”。这些具体任务可以成为产品成功的一些衡量指标。

以下是三个作为人机协同机器学习系统示例要解决的问题:
- 新闻标题数据分析
- 数据分析师希望了解新闻标题数据中的信息分布。
- “我想知道有多少新闻标题与特定主题相关。”
- “我想跟踪新闻标题主题随时间的变化。”
- “我想导出与特定主题相关的所有新闻文章进行进一步分析。”
- 食品安全数据收集
- 食品安全专业人员希望收集食品中检测到病原体或异物的事件数据。
- “我想维护欧盟所有记录在案的食品安全事件的完整记录。”
- “我想跟踪不同食品安全事件是否可能来自同一来源。”
- “当可能存在尚未检测到或报告的食品安全事件时,我想向特定国家发出警告。”
- 自行车使用情况估计
- 交通研究人员希望估计特定街道上使用自行车的人数。
- “我想收集人们在街道上骑自行车的频率信息。”
- “我想从数千个摄像头中获取这些信息,但没有预算进行手动操作。”
- “我希望我的自行车识别模型尽可能准确。”

1.2 设计解决问题的系统

对于上述三个用例,可以从问题定义出发设计解决这些问题的系统。每个示例都将构建一个完整的人机协同机器学习系统,可将这些示例视为概念验证(PoC),后续可使其更具可扩展性和鲁棒性。

虽然难以在本文中提供一个关于注释者间一致性的实用示例,但后续会有一篇免费文章使用相关示例来介绍注释者间一致性。该示例包括根据短文本是否与灾难相关进行注释,并使用开源代码收集人们的注释和(如果选择加入)他们的身份信息,以便比较不同人的注释。

需要注意的是,其中两个系统在机器学习问题上有相似之处,一个是对新闻标题进行标注,另一个是对图像进行标注,但由于支持的用例不同(探索性数据分析和对象计数),最终的系统会有所不同。食品安全示例是对现有人类流程的自动化,因此保持执行此工作的人员的自主性很重要,尤其不能让他们觉得工作因要为机器学习算法提供数据而变慢。在这种情况下,模型准确性的重要性最低,因为如果辅助文本不起作用,人员可以直接输入字段值。

以下是三个示例系统设计中最重要因素的总结:
| 示例 | 自主性 | 模型准确性 | 注释准确性 |
| ---- | ---- | ---- | ---- |
| 新闻标题 | 中等 | 中等 | 低 |
| 食品安全 | 高 | 低 | 高 |
| 自行车检测 | 低 | 高 | 中等 |

在所有三个案例中,一些组件可以替换为更复杂的组件,如更主动的学习采样方法、更复杂的机器学习模型、更高效的界面等。在与这三个示例交互时,可根据系统目标、数据和任务本身,思考每个用例下一步最有用的扩展或添加组件。

1.3 连接Python和HTML

为示例构建Web界面时,需要将Python与HTML/JavaScript连接起来。这里使用Python库 eel ,它允许为Python应用程序构建本地HTML界面。有许多库可用于连接Python和HTML,如果熟悉其他库,如 flask kivy pyqt tkinter 或其他可轻松与HTML应用程序连接的HTML应用程序或Python API库,也可选择它们来创建原型。

使用 eel 是因为它轻量级且对JavaScript知识要求较低。即使不熟悉JavaScript但了解Python和HTML,也能理解本文中的示例。使用 eel 时,大部分工作将在Python中完成。

在每个示例中,将有三个代码文件:一个Python文件( .py )、一个JavaScript文件( .js )和一个HTML文件( .html )。这种格式便于教学。可通过 pip 安装 eel

pip install eel

以下是如何导入 eel 并将Python函数暴露给HTML文件中的JavaScript的示例:

import eel
@eel.expose
def hello(message):
    return "Hello " + message

在JavaScript中调用该Python函数的代码如下:

<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文件中添加以下两行代码,确保Python脚本可以与包含JavaScript的HTML文件进行通信:

eel.init('./')  # Tell eel where to look for your HTML files 
eel.start('helloworld.html')   

上述代码假设HTML文件名为 helloworld.html ,且与Python文件在同一目录中。 start() 调用将打开一个浏览器窗口来启动应用程序,通常应将此调用放在Python脚本的末尾。

需要注意的是,虽然在Python和JavaScript中都将函数命名为 hello() ,但这不是必需的命名约定,JavaScript可以按名称调用Python中任何暴露的函数。为了使代码更易读,本文在整个示例中遵循使用相同函数名的约定。同样,为了简单起见,在每个示例中Python、JavaScript和HTML文件使用相同的名称,仅更改扩展名。

2. 示例1:新闻标题的探索性数据分析

探索性数据分析(EDA)是快速开发的机器学习系统最常见的用例之一。在机器学习文献中,关于EDA的研究相对较少,因为它不侧重于机器学习的准确性。在行业中,数据科学家通常希望在决定构建哪些模型和产品之前更详细地了解他们的数据。EDA可以让数据科学家快速浏览和过滤数据。

2.1 假设

设计此产品的假设如下:
- 新闻标题仅为英文。
- 预训练语言模型将有所帮助。
- 分析师将有一些用于引导的好关键词的想法。

数据本身会影响架构决策的各个方面。这里使用DistilBERT预训练模型,它是在仅包含英文的维基百科数据和公共领域书籍集合上训练的。维基百科包含类似于新闻标题的标题以及一些实际新闻文章的标题,因此该预训练模型适合此任务。

重要考虑因素包括:
- 自主性 :使用该系统的分析师应能够通过关键字和年份浏览数据。
- 透明度 :系统的准确性应在整个数据集以及按年份的层面上清晰可见。
- 密集/丰富布局 :分析师应能够在屏幕上获取尽可能多的信息,因此布局应信息密集。
- 即时性 :界面应能立即帮助分析师理解数据,因此评估数据的创建应与训练数据的创建并行进行。
- 分层 :分析师对每年的准确性感兴趣,因此除了总体准确性外,还需要跟踪每年的准确性。
- 灵活性 :分析师可能希望在不同时间查看不同的标签。
- 可扩展性 :分析师可能希望稍后将此任务扩展为更大规模的任务,因此希望跟踪有趣的标题示例以添加到未来的指南中。

2.2 设计与实现

这是一个二元标注任务,因此不确定性采样算法的选择并不重要。这里将使用最小置信度采样,并使用分层采样以实现现实世界的多样性,目标是针对特定年份的标题。允许分析师使用关键字过滤要标注的数据。

在标注方面,允许标注者对每个标题进行快速的二元选择以优化速度。通过关键字采样的项目不会包含在评估数据中,因为它们不会形成平衡的样本。

将使用两个机器学习模型。一个模型随着每个新标注进行增量更新,通过允许分析师立即在模型和预测结果中看到他们标注的结果,增加了分析师的自主性。

然而,增量模型存在近期偏差,并且会收敛到局部最优。在主动学习场景中,近期偏差可能会被放大,因为最近的项目不是随机采样的,特别是如果它们是通过关键字采样的。因此,第二个模型将定期在所有训练数据上从头开始重新训练。当新模型在保留数据上更准确时,将替换第一个模型。

对于两个机器学习模型,都将基于DistillBERT预训练模型进行调整。DistillBERT比BERT小得多,但具有相当的准确性。假设即使在准确性上有小的损失,更快的处理速度和更小的内存占用也是净收益。其架构如下:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(未标注标题池):::process --> B(主动学习采样):::process
    B --> C(标注):::process
    C --> D(训练数据):::process
    D --> E1(增量训练模型):::process
    D --> E2(批量训练模型):::process
    E1 --> F(预测标签):::process
    E2 --> F
    F --> G(带预测标签的数据):::process
    E2 --> H{新模型更准确?}:::process
    H -- 是 --> E1(替换增量训练模型):::process
    H -- 否 --> E1

    subgraph 主动学习采样
        style 主动学习采样 fill:#ffffff,stroke:#000000,stroke-width:1px
        B1(最小置信度采样):::process
        B2(分层采样):::process
        B3(关键字采样):::process
    end

该架构与常见架构相似,但有两个模型,可分别针对实时训练和最大化准确性进行优化。代码可在https://github.com/rmunro/headlines 查看,仓库中的README文件提供了实现细节和实验方法的更多信息。

2.3 潜在扩展

在使用该系统一段时间后,可以考虑进行一些更改。以下是一些潜在改进的示例:
| 改进方向 | 描述 |
| ---- | ---- |
| 优化采样方法 | 尝试其他主动学习采样方法 |
| 更换模型 | 尝试更复杂的机器学习模型 |
| 改进界面 | 设计更高效的界面 |

每个改进示例都可以在少于50行代码内实现,因此实现一两个改进的障碍较小。但实现所有更改并评估哪些最有效将是一项艰巨的工作。与系统交互可以帮助确定首先进行哪些最有价值的改进。此示例体现了机器学习辅助人类的元素,下一个示例将进一步深化这一点。

3. 示例2:从文本中提取食品安全信息

食品安全专业人员需要收集食品中检测到病原体或异物的事件数据,这涉及到从文本中提取相关信息。

3.1 问题定义与目标

问题定义如下:
- 维护欧盟所有记录在案的食品安全事件的完整记录。
- 跟踪不同食品安全事件是否可能来自同一来源。
- 当可能存在尚未检测到或报告的食品安全事件时,向特定国家发出警告。

目标是设计一个系统,能够自动化现有的人类流程,同时保持操作人员的自主性,并且在模型准确性不是首要考虑因素的情况下,确保注释准确性。

3.2 系统设计

由于该任务是对现有人类流程的自动化,因此系统设计需要考虑操作人员的工作习惯和需求。允许操作人员在系统辅助无效时,仍然能够直接输入字段值。

在数据处理方面,使用文本提取技术从相关文本中提取食品安全事件的关键信息,如事件发生时间、地点、病原体或异物类型等。对于提取的信息,进行标注和整理,形成训练数据。

模型选择上,可以使用相对简单的机器学习模型,因为在这个场景中,模型准确性的重要性相对较低。重点在于确保注释的准确性,以便为后续的分析和决策提供可靠的数据支持。

以下是系统设计的主要步骤:
1. 数据收集 :收集与食品安全事件相关的文本数据,如新闻报道、检测报告等。
2. 信息提取 :使用自然语言处理技术从文本中提取关键信息。
3. 标注 :对提取的信息进行标注,形成训练数据。
4. 模型训练 :使用训练数据训练机器学习模型。
5. 部署与应用 :将训练好的模型部署到实际系统中,为操作人员提供辅助。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(文本数据):::process --> B(信息提取):::process
    B --> C(标注):::process
    C --> D(训练数据):::process
    D --> E(模型训练):::process
    E --> F(部署模型):::process
    F --> G(辅助操作人员):::process
3.3 系统评估与优化

系统评估主要关注注释准确性和操作人员的自主性。可以通过人工检查标注结果和收集操作人员的反馈来评估系统性能。

如果发现系统存在问题,可以进行以下优化:
- 调整信息提取规则 :根据实际数据情况,调整自然语言处理规则,提高信息提取的准确性。
- 改进标注流程 :优化标注界面和流程,提高标注效率和准确性。
- 更新模型 :根据新的训练数据,更新机器学习模型,提高系统性能。

4. 示例3:自行车图像标注系统

交通研究人员希望估计特定街道上使用自行车的人数,需要对大量的自行车图像进行标注。

4.1 问题定义与目标

问题定义如下:
- 收集人们在街道上骑自行车的频率信息。
- 从数千个摄像头中获取这些信息,但没有预算进行手动操作。
- 希望自行车识别模型尽可能准确。

目标是设计一个高效、准确的自行车图像标注系统,利用机器学习技术减少人工标注的工作量,同时提高标注的准确性。

4.2 系统设计

该系统主要包括图像采集、标注和模型训练三个部分。

在图像采集方面,使用摄像头收集街道上的自行车图像。为了提高模型的准确性,需要确保采集的图像具有多样性,包括不同时间、天气和光照条件下的图像。

标注过程中,使用主动学习技术,选择最有价值的图像进行标注。可以使用不确定性采样方法,如最小置信度采样,选择模型预测最不确定的图像进行标注。

模型训练使用深度学习模型,如卷积神经网络(CNN)。通过不断迭代训练,提高模型的准确性。

以下是系统设计的主要步骤:
1. 图像采集 :使用摄像头收集自行车图像。
2. 主动学习采样 :选择最有价值的图像进行标注。
3. 标注 :人工对选择的图像进行标注。
4. 模型训练 :使用标注数据训练深度学习模型。
5. 模型评估与更新 :评估模型性能,根据评估结果更新模型。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(图像采集):::process --> B(主动学习采样):::process
    B --> C(标注):::process
    C --> D(训练数据):::process
    D --> E(模型训练):::process
    E --> F(模型评估):::process
    F --> |性能不足| E(更新模型):::process
    F --> |性能达标| G(应用模型):::process
4.3 系统优化与扩展

为了进一步提高系统性能,可以进行以下优化和扩展:
- 增加数据多样性 :采集更多不同场景下的自行车图像,提高模型的泛化能力。
- 改进采样方法 :尝试更复杂的主动学习采样方法,如基于密度的采样,提高采样效率。
- 多模型融合 :使用多个不同的深度学习模型进行融合,提高模型的准确性。

以下是三个示例系统的比较总结:
| 示例 | 主要任务 | 关键考虑因素 | 主要技术 |
| ---- | ---- | ---- | ---- |
| 新闻标题探索性数据分析 | 对新闻标题进行分类和分析 | 自主性、透明度、信息密度 | DistilBERT预训练模型、增量更新模型 |
| 食品安全信息提取 | 从文本中提取食品安全信息 | 操作人员自主性、注释准确性 | 自然语言处理、简单机器学习模型 |
| 自行车图像标注系统 | 对自行车图像进行标注和识别 | 模型准确性、主动学习效率 | 卷积神经网络、主动学习采样 |

通过以上三个示例,可以看到人机协同机器学习在不同领域的应用和设计思路。在实际应用中,可以根据具体问题和需求,选择合适的技术和方法,设计出高效、准确的人机协同机器学习系统。同时,不断优化和扩展系统,以适应不断变化的业务需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值