如果你对机器学习感兴趣的话,那么有很多很棒的学习资源。像 fast.ai 就可以帮助任何具有技术背景的人学习机器学习的基础,并训练他们自己的模型。
但是,如果你对用机器学习构建生产软件感兴趣,那么可以使用的资源就少多了。把机器学习应用到生产中的基础设施挑战根本就没有那么丰富的写作内容。
本文旨在充当基于 NLP 构建的软件项目的指导,任何人甚至没有 ML 经验的人都可以构建文中的这些项目。
当然,这些项目也不是玩玩而已,它们都是受当今真实公司销售的真实软件的启发而产生的。
写在开始之前
以下每个项目将使用类似的架构:
-
你将实现一个相关的预训练模型
-
你将把模型部署为一个 API
-
你将把 API 连接到主应用程序
这种设计模式称为实时推理,它有很多好处。
首先,它消除了主应用程序的计算负担,将其卸载到专门为 ML 模型构建的服务器上。其次,它允许你通过 API 合并 ML 进行预测,这是大多数软件开发人员都熟悉的模式。最后,还有像 Cortex 这样的开源工具,它自动地将这些模型部署为 API 所需的所有基础设施工作,这意味着你不必花费大量时间来研究如何配置 AWS 来为机器学习模型服务。
要使用 Cortex 部署任何模型,你都需要做三件事:
-
编写一个 Python 脚本来提供来自模型的预测
-
编写一个配置文件来定义你的部署
-
从命令行运行 cortex deploy
把所有这些都排除在外,让我们开始吧。
项目 1:自动完成功能
传统上,自动完成是通过键值查找来实现的,在键值查找中,将用户输入的不完整单词与字典进行比较,并给出潜在单词。
然而,使用机器学习,自动完成可以更进一步。与引用静态的单词或短语词典不同,模型可以根据真实世界的用户输入进行训练,以预测最有可能出现的下一个短语。
一个常见的例子是 Gmail 的智能回复,它对你收到的电子邮件的回复提出建议:
图片来源于 Google
让我们看看如何构建自己的 ML 自动完成功能。
我应该用什么模型?
在这种情况下,我们要用 RoBERTa。
RoBERTa 是 Facebook 开发的一个 NLP 模型。它建立在谷歌著名的 BERT 的基础上,因此在 RoBERTa 中使用了奇怪的大写字母,并通过实现稍微不同的训练方法改进了 BERT 的性能。
预先训练好的 RoBERTa 通过 PyTorch Hub 加载,它带有一个内置的 fill_mask()方法,允许你传入一个字符串,指向 RoBERTa 应该预测的下一个单词/短语的位置,并接收你的预测。
现在,你只需要将 RoBERTa 部署为一个 API,并在前端编写一个函数,用用户的输入查询你的模型。
如果遇到任何问题,可以使用这个 Cortex 示例部署 RoBERTa:https://github.com/cortexlabs/cortex/tree/master/examples/pytorch/search-completer 。
项目 2:客户支持机器人
支持机器人绝不是一个新的概念,但随着机器学习的发展,整个领域都向前迈进了一步。
在过去,一个支持机器人可能已经预先准备好了一些问题的答案。如果这个问题的措辞没有被机器人识别,或者它涉及了一个主题之外的内容,机器人就不会工作。
然而,现在,ML 驱动的机器人可以解析和理解用户输入,而不仅仅是将其与问题列表进行比较,还可以自行生成答案。
像 Reply.ai 这样构建自定义支持机器人的公司就是一个典型的例子。根据 Reply.ai 的数据,平均一家公司可以通过一个 ML 驱动的机器人来处理 40% 的入站支持请求,下面就是哪一个例子:
图片来源:Reply.ai
现在,让我们构建自己的客户支持机器人。
我应该用什么型模型?
DialoGPT 非常适合这个任务。
DialoGPT 是微软公司构建的一个模型, 是用 Hugging Face 的 pytorch transformer 和 OpenAI 的 GPT-2 开发的。该模型接受了 Reddit 对话的训练,并将返回查询到的任何文本的答案。
然而,因为微软地保留了这个模型的解码器(有人担心 Reddit 训练模型的潜在输出),所以你必须实现你自己的 GPT-2 解码器来将模型的响应翻译成人类语言。幸运的是,这对你来说并不太困难,你可以通过克隆此 repo 来运行 DialoGPT 的整个部署。
一旦部署了 DialoGPT API,就可以将其连接到前端并开始处理客户请求。
额外提示:如果你对使用 DialoGPT 有问题,这里有一个教程:https://towardsdatascience.com/how-to-actually-use-ml-in-production-reading-comprehension-1597095a54b2 。
项目 3:文本预测生成器
如果你隐约知道机器学习社区,你应该听说过 AI Dungeon 2。这是一款经典的文本冒险游戏,其中的故事完全由 GPT-2 生成。这款广受欢迎的游戏最初被关闭的原因是,它的云托管成本超过 10000 美元/天。
你可以用这款游戏做任何事情,比方说,吃掉月亮:
AI Dungeon 2 是使用 OpenAI 的 GPT-2 构建的,虽然交互式 RPG 可能不是你想要的商业案例,但 AI Dungeon 2 展示了自动生成文本的说服力。
Deep TabNine 是自动生成文本的一个很好的例子。Deep TabNine 是一款使用机器学习在 IDE 中实现自动完成功能的产品,适用于多种编程语言:
图片来源:TabNine Blog
如果你是一名软件工程师,那么使用 ML 立即生成准确、完整的代码行的想法一定令人激动。
让我们看看如何构建自己的版本。
我应该用什么模型?
对于这个项目,你应该使用这个庞然大物本身,也就是 OpenAI 的 GPT-2。
当 GPT-2 第一次发布的时候,它引起了一系列的轰动。首先,它非常强大。其次,OpenAI 的团队没有发布完整的预训练模型,因为他们担心它可能被滥用。不出所料,这引发了媒体对一个可能「对公众太危险」的人工智能的猛烈抨击。
而如今,完整的模型已经发布,并且在 Skynet 上没有相关报道。
和这个模型交互非常简单,给它发一段文本,然后等着它生成就行。
要使用 Cortex 部署 GPT-2,可以使用这个存储库:https://github.com/cortexlabs/cortex/tree/master/examples/tensorflow/text-generator。
项目 4:语言标识符
你有没有浏览过 Google Chrome 中的一个网站并看到这个弹出窗口?
你有没有想过 Chrome 如何识别页面的语言?答案很简单:它使用语言标识符。
语言识别是出了名的棘手。不同的语言有许多共同的词汇,不同的方言和俚语使语言更难被识别,而且没有法律禁止在一个网页上使用多种语言。
这个模糊的任务是确定一个给定的文本用哪种语言对于机器学习来说是完美的。让我们看看如何在下面构建自己的语言标识符。
我应该用什么模型?
Facebook 的 fastText。
fastText 是一个使用单词嵌入来理解语言的模型。在我关于将 fastText 部署为 API 的教程中,我简要解释了使 fastText 如此特殊的原因:
单词嵌入将单词表示为浮点数的 n 维向量,其中每个数字表示单词含义的一个维度。使用单词向量,你可以根据单词的语义来「映射」单词——例如,如果你从「king」的向量中减去「man」的向量,再加上「woman」,你将得到「queen」的向量。换句话说,king-man+woman=queen
word2vec 是最早流行的生成 word 嵌入的工具之一,fastText 是 word2vec 的扩展。word2vec 处理单个单词,而 fastText 将单词分解为 n 个单词。这使得 fastText 能够更好地理解晦涩难懂的单词。当给出一个罕见的单词如「deminiquavers」时,fastText 会分析其中较小的 n 个字母(「demi」、「semi」等),以帮助找到它的语义,这类似于你分析熟悉的词根来理解一个陌生的单词。
部署 fastText 相当简单。你可以使用这个存储库:https://github.com/cortexlabs/cortex/tree/master/examples/pytorch/language-identifier,如果需要额外的帮助,可以按照本教程进行操作。
项目 6:媒体监视器
现代商业的现实状况是,如果用户对你的产品有意见,他们会在大量的平台上表达自己的不满。为了有效地保持品牌的领先地位,监控社交媒体以了解公司的情况是必要的。
这类产品的一个例子是 Keyhole,它是一个社交分析平台,使用机器学习来监控与贵公司相关的社交媒体:
然而,在构建这种工具时,最大的挑战之一是弄清楚你的品牌是怎么被提及的。
假设你想为你的品牌建立一个监控黑客新闻的服务,每天删除 HN 评论是相当简单的,搜索这些评论中与你的品牌相关的词也很容易。但是,这就是症结所在,你怎么能肯定地知道,这些关键词正被用于你的品牌?
例如,如果我在监控 cortex,我怎么知道「cortex」这个词在给出的评论中是指开源平台,而不是一个人大脑的前额叶皮层?
这就是机器学习发挥作用的地方。
我应该用什么模型?
Flair 的 SequenceTagger。
Flair 是一个基于 PyTorch 的开源 NLP 库,它在很多方面都很出色,尤其是在命名实体识别(NER)方面,这正是我们试图解决的问题。
例如,以下内容直接取自 Flair 存储库:
示例用法
让我们对一个示例语句运行命名实体识别。你只需要造一个句子,加载一个预先训练好的模型,然后用它来预测句子的标签:
from flair.data import Sentence
from flair.models import SequenceTagger# make a sentence
sentence = Sentence('I love Berlin .')# load the NER tagger
tagger = SequenceTagger.load('ner')# run NER over sentence
tagger.predict(sentence)
完成!这个句子现在有实体注释。把句子打印出来看看标语者发现了什么。
print(sentence)
print('The following NER tags are found:')# iterate over entities and print
for entity in sentence.get_spans('ner'):
print(entity)
其输出应该是:
Sentence: "I love Berlin ." – 4 Tokens
The following NER tags are found:
LOC-span [3]: "Berlin"
你可以使用 Cortex 的 Predictor API 来实现 Cortex 的 Flair,这是我们到目前为止用于部署所有 PyTorch 模型的方法。
使用机器学习不需要博士学位
机器学习通常给人一种感觉,那就是它只适合那些有着强大数学或理论背景的计算机科学的人来学习使用。
如果你想开发新的模型架构或者突破机器学习的界限,那可能是真的,你需要从理论上理解机器学习。然而,如果你只是想用机器学习来构建软件,那么这个障碍只是想象出来的。
我上面列出的每一个项目都可以构建,即使你对软件开发只有一个初步的了解。而且所有这些项目都模仿真实的、成功的产品的功能——它们不是玩具项目。
雷锋网(公众号:雷锋网)雷锋网雷锋网
雷锋网版权文章,未经授权禁止转载。详情见。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/137611.html