机器学习系统由代码和数据共同构建。代码易于复用,但数据难以重用,因此构建人工智能主要意味着进行数据标注。这本身是好事,因为示例数据正是你编程模型行为的方式——学习器本身实际上只是一个编译器。但当前用于创建示例数据的技术并不理想。因此,我们很高兴推出 Prodigy,一款可下载的、用于实现极致高效机器教学的工具。
当有大量原始输入数据可供模型流式处理时,主动学习的效果最佳,这样可以选择更具信息量的示例进行标注。模型必须在标注过程中持续更新,并且更新需要针对每个用户进行个性化。这些问题固然可以开发出解决方案——但……何必呢?尽管SaaS对投资者很有吸引力,但只有当托管组件能增加价值而非削弱价值时,它才有意义。
Prodigy 通过让数据科学家自行进行标注来解决此问题,从而实现快速原型设计。想法测试的速度甚至可以快过第一次规划会议的安排。我们也期望 Prodigy 能够降低大型项目的成本,但我们最为兴奋的是其带来的敏捷性提升。
大多数标注工具避免向用户提供任何建议,以免对标注产生偏差。Prodigy 则采取相反策略:尽可能少地向用户提问,并尝试猜测其余部分。Prodigy 将模型置于循环之中,使其能够主动参与训练过程,并随着你的操作不断学习。模型利用已有知识来判断接下来该问你什么。在你回答问题的过程中,模型会不断更新,从而影响后续向你提问的示例选择。为了充分利用这一策略,Prodigy 以 Python 库和命令行工具的形式提供,并附带一个灵活的 Web 应用程序。此外,有一个可选且轻量的托管组件,用于方便地共享标注队列,但工具本身完全由你掌控。
Prodigy 内置了用于训练和评估文本分类、命名实体识别、图像分类和词向量模型的配方。此外,还有一个简洁的内置组件用于执行 A/B 评估,这在开发生成模型和翻译系统时特别有用。为尽可能降低系统要求,数据默认存储在 SQLite 数据库中。也很容易切换到其他 SQL 后端,或指定自定义存储方案。
通过在任何 Python 函数上添加 @recipe 装饰器,可以将各个组件组合成一个配方。该装饰器允许你从命令行调用函数,作为 prodigy 的子命令。配方可以通过返回一个组件字典来启动 Web 服务。配方系统在声明式与过程式方法之间取得了良好平衡。如果仅需组合内置组件,返回一个 Python 字典与等价的 JSON 表示相比,输入量并无增加。但 Python 函数也允许你实现更复杂的行为,并在多个配方之间复用逻辑。
# recipe.py
import prodigy
import your_arbitrary_ETL_logic
@prodigy.recipe('custom_stream',
dataset=("Dataset"),
db=("Database"),
label=("Label", "option"))
def custom_stream(dataset, db=None, label=''):
DB = your_arbitrary_ETL_logic.load(db)
return {
'dataset': dataset,
'stream': ({'text': row.text, 'label': label} for row in DB),
'view_id': 'classification'
}当人与机器交互时,交互体验决定了交互的成败。大多数标注工具避免向用户提供建议,以免引入标注偏差。Prodigy 则采取相反策略:尽可能少地向用户提问。模型需要生成的结构越复杂,从 Prodigy 的二元交互界面中获得的收益就越大。Web 应用允许你直接在浏览器中标注文本、实体、分类、图像和自定义 HTML 任务——甚至在移动设备上也可使用。
人的时间和注意力是宝贵的。与其向标注者呈现一段包含实体的文本,要求他们高亮实体、从下拉列表中选择多个标签之一并确认,不如将整个交互过程拆解为简单的二元决策。为了获取同样的信息,你需要问更多问题,但每个问题都简单而聚焦。你会收集到更多的用户操作,从而获得许多可学习的小块信息,以及人与模型之间更紧密的反馈循环。
如今大多数人工智能系统依赖于监督学习:你提供带标签的输入-输出对,得到一个能够对新数据执行类似计算任务的程序。监督学习算法进步迅速,使许多人期待全新一代的完全无监督算法:这些算法如此“先进”,以至于无需你指定任何目标就能计算出你想要的结果。这无异于希望有一种极其先进的编程语言,让你甚至无需编写程序。
无监督算法基于数据的内在结构返回语义表示。根据定义,你无法直接控制该过程返回的结果。有时语义表示会直接回答某个有用的问题。如果你正在平台上寻找可疑活动,可能会发现异常检测过程就足够了。然而,无监督算法通常不会返回与你关心的标签精确对应的聚类。通过适当的特征权重,或许能构建一个更有用地对数据进行排序的模型,但手工完成这项工作效率低下——而这正是监督学习旨在解决的问题。
文本分类模型可训练用于执行多种实用任务,包括情感分析、聊天机器人意图检测、以及标记滥用或欺诈内容。文本分类的一个难题是:通常很难预估系统的准确表现。有些问题出人意料地简单,而另一些问题则非常困难,以至于需要重新设计预期功能。Prodigy 让你能够进行非常快速的原型设计,从而迅速判断哪些想法值得进一步探索。
prodigy textcat.print-stream "docs" --api github --label DOCS | less -r子命令系统完全可扩展。你只需在函数上添加 @recipe 装饰器,即可从命令行调用它。要启动标注服务器,配方只需返回一个组件字典,如示例流、标注界面,以及用于更新和保存模型的可选回调函数。
现在开始标注。首先初始化一个新的数据集,并添加简短描述以备将来参考。下一个命令启动标注服务器。textcat.teach 子命令告诉 Prodigy 运行内置的配方函数 teach(),使用命令行中提供的其余参数。
Prodigy 在标注过程中会根据你提供的答案训练模型。这使得 Prodigy 能够对流中的示例进行排序,从而减少冗余问题。从流式数据中学习是一个棘手的问题,因此通常在收集完所有标注后,从头开始训练一个新模型能获得更好的结果。这也可以让你更详细地研究模型,并尝试不同的超参数。
决策 | 数量 |
|---|---|
accept | 261 |
reject | 525 |
ignore | 44 |
total | 830 |
默认情况下,Prodigy 使用某开源库 v2.0 的新文本分类系统(当前为 alpha 版本)。该模型是一个卷积神经网络叠加一元词袋模型。词袋模型学习速度快,而卷积网络在获得几百个示例后可以从更长的短语中捕捉线索。
使用 Prodigy 采用不同的文本分类策略非常容易。如果你想继续使用该开源库,只需将新的模型实例传递给 TextClassifier 组件即可。对于完全自定义的 NLP 解决方案,你只需要提供两个函数:一个用于为文本分配分数,另一个用于在新一批示例上更新模型。如果你的文本分类解决方案仅支持批量训练,可以在标注期间使用内置模型,然后导出标注数据,单独训练你的解决方案。
通过使用更少的示例重新训练系统,可以了解随着更多数据被标注,系统将如何改进。
% | 准确率 | 增量 |
|---|---|---|
25% | 0.73 | +0.73 |
50% | 0.82 | +0.09 |
75% | 0.84 | +0.02 |
100% | 0.87 | +0.03 |
表中的每一行展示了一个实验:模型在 20% 的数据上进行评估,并在剩余示例的子集上训练。这让你能够看到数据集大小与准确率之间的关系,从而预测收集更多标注后准确率可能提升多少。
训练曲线显示了使用 10%、25%、50% 和 75% 的训练数据所达到的准确率。最后 25% 的训练数据带来了 3% 的准确率提升,表明进一步的训练将改进系统。类似的逻辑用于估计训练过程中的进度指示。
训练完模型后,Prodigy 输出一个可直接使用的模型,便于投入生产环境。该库附带一个便捷的 package 命令,可将模型目录转换为 Python 包,从而允许在 requirements.txt 中指定数据依赖项。这提供了从原型到生产的平滑路径,使得在更大系统的上下文中真正测试模型变得容易。
spacy package /tmp/gh_docs /tmp
cd /tmp/gh_docs
python setup.py sdist
pip install dist/gh_docs-1.0.0.tar.gzimport gh_docs
nlp = gh_docs.load()
texts = ['missing documentation',
'docker container not loading',
'installation not working on windows']
for doc in nlp.pipe(texts):
print(doc.cats)
# {'DOCS': 0.9812000393867493}
# {'DOCS': 0.005252907983958721}
# {'DOCS': 0.0033084796741604805}如果标注项目启动成本高昂,你只能猜测哪些想法看起来有前景。这些猜测常常是错误的,因为在收集数据之前很难预测统计模型的性能。Prodigy 通过大幅降低验证新想法的成本,帮助你突破这一瓶颈。使用 Prodigy,整个标注过程成本更低,但最重要的是获得首个证据的时间缩短了。不乏那些一旦能够实现就会极具价值的想法。真正稀缺的是用于验证这些机会的时间——而这正是 Prodigy 能为你提供的更多资源。FINISHED
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。