博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度学习的NLP工具
阅读量:5757 次
发布时间:2019-06-18

本文共 4543 字,大约阅读时间需要 15 分钟。

TB1P7BMukvoK1RjSZFNXXcxMVXa.jpg

本文为 AI 研习社编译的技术博客,原标题 :

NLP tools of DL

作者 |  Thomas Delteil

翻译 | 孙稚昊2

校对 | 酱番梨        整理 | 菠萝妹

原文链接:

https://medium.com/apache-mxnet/gluonnlp-deep-learning-toolkit-for-natural-language-processing-98e684131c8a

深度学习的NLP工具

TB1lRNIuAPoK1RjSZKbXXX1IXXa.jpg

为什么最新的模型结果这么难以复现?为什么去年可以工作的代码和最新发布的深度学习框架不适配?为什么一个很直白的基线这么难以建立?在今天的世界中,这些都是自然语言处理(NLP)的研究员遇到的问题。

我们来看一个假想的博士学生。我们叫它亚历山大,他刚开始机械翻译(NMT)的研究。有一天早上他看到了Google 最著名的 论文“注意力是你全部需要的”,其中介绍了Transformer 模型,完全基于注意力机制。被结果惊艳到了,Alex搜索了一下google,结果告诉他T恩送染发咯哇的 Tensor2Tensor包已经包含了这个模型的实现。他的实验室里充满了快乐的尖叫;他应该可以在下午就复现出来结果,并且享受一个放松的晚上来和朋友在酒吧看世界杯!他还想。。。

然后,我们的朋友发现官方实现用的超参数和论文中提到的很不一样。他的导师建议:稍微调整一下参数,跑一下看看,结果应该还好--真的吗?

TB1mOVVuxjaK1RjSZFAXXbdLFXa.jpg

三天之后 。。。。实验室里所有的GPU都冒烟了,在不停地100%负荷运转。他的同事强制把他登出了,并且告诉他回家休息。我们不行的英雄照做了,并且去了Tensor2Tensor的Github 页面去报告这个问题,看看有没有别人遇到了同样的问题。很快,很多人回复他们遇到了同样的问题,但他们还没找到解决方案。

TB1KctKurvpK1RjSZPiXXbmwXXa.jpg

半个月过去了。。。终于项目的维护者出现了并回复说他会看看。

TB1gQlIuAvoK1RjSZPfXXXPKFXa.png

三个月过去了。。。。Alex 还在无助地询问:有没有进展?

TB1a9VEuyrpK1RjSZFhXXXSdXXa.png

在亚马逊云服务(AWS)上研究深度学习和自然语言处理之后,我发现这不是个例。重现NLP模型比计算机视觉模型难得多。数据预处理管道包括需要重要步骤,并且模型本身有很多可调节组件。例如,人们需要注意下面的东西,比如:

字符串编码/解码和Unicode格式

文本解析和分割

来自多种语言的文本遵循不同的语法和句法规则

左到右和右到左的阅读顺序

词语表征

输入填充

梯度切割

处理变长输入数据和状态

从载入训练数据集到在测试集上计算输出的BLEU分数,有一千种可能做错。如果没有合适的工具,每次你开始新的项目,你都有遭遇全新问题的风险。

许多MXNet的贡献者和我曾经分享我们在做NLP时遇到的问题,并且每个人都有相似的故事,我们之间有很强的共鸣。我们都同意虽然NLP很困难,我们还是想做些事情!我们决定开发一个工具来帮助你复现最新的研究结果,并且简单的在Gluon中开发新模型。这个团队包括 Xingjian Shi (@sxjscience), Chenguang Wang (@cgraywang), Leonard Lausen (@leezu), Aston Zhang (@astonzhang), Shuai Zheng (@szhengac), 和我自己 (@szha).  GluonNLP 诞生了!

症状:自然语言处理论文难以复现。Github上的开源实现质量参差不齐,并且维护者可以停止维护项目。

√GluonNLP处方:复现最新的研究结果。频繁更新复现代码,包括训练脚本,超参数,运行日志等。

你曾经也被无法复现结果困扰过,而且这并不少见。理论上,你的代码不会随时间变质,但事实上会这样。一个主要原因是深度学习库的API会随时间变化。

为了了解这种现象,我们在Google搜索中跑了这个请求 --- “X API 挂了”

┌────────────┬────────────────┐

│     X      │ Search Results │

├────────────┼────────────────┤

│ MXNet      │ ~17k           │

│ Tensorflow │ ~81k           │

│ Keras      │ ~844k          │

│ Pytorch    │ ~23k           │

│ Caffe      │ ~110k          │

└────────────┴────────────────┘

虽然MXNet 社区花了很多努力来保持API最小的变化,搜索结果还是返回了1万7千个结果。为了防止我们的包遭遇这样的问题,我们在开发中特别注意了。每个训练脚本都进入连续集成(CI)来捕捉任何回退并避免给用户不好的影响。

症状:复现代码对API变化很敏感,所有只有很短的寿命。

√GluonNLP处方:自动化对训练和评估脚本的测试,尽早适应最新API的变化。

去年做了一些NLP的服务,我最后有五个 Beam 搜索算法的实现,每个都和别的不太一样。原因是每个模块的接口都因为要赶截止日去而被潦草设计。为了不同的使用情景,最简单的方法就是复制并稍稍修改他们中的一个。结果是,我最后有了五个版本的Beam 搜索算法,只在打分和步函数上略有不同。

做一个可服用,易扩展的接口需要很多努力,研究使用场景,并且和许多开发做讨论。在GlunonNLP中,我们不仅专注于复现现存的例子,还要把它设计得易用,接口可扩展,使以后的研究更简单。

症状:复制粘贴以前的项目并做少许修改,作为短期解决方法,因为赶工期而没有精细的设计接口,导致了难以维护的代码。

√GluonNLP 处方:易用并可扩展的接口,基于GluonNLP团队对各种使用场景的研究。

最近,我在做一个新项目,并且发现一个常见问题,就是很多有用的资源没有被聚拢起来。每个人都知道预训练的词语表征和语言模型对很多应用都很有用。然而对特定问题该用哪一个模型需要很多实验才能知道。开发人员经常需要在探索阶段安装很多工具。比如,Google的 Word2vec 对gensim有依赖,然而Salesforce的AWD语言模型是用PyTorch实现的,并且不提供预训练模型。Facebook的Fasttext是自己开发的独立包。为了正确地使用这些资源,用户经常需要话费大量努力来搭建环境,并把数据转化为各种格式。

我们都知道资源共享是社区的特点。在 GluonNLP中,我们不仅提供工具和社区给NLP 爱好者们,还要让他们易于使用这些资源,通过整合这些来自不同平台的资源,使GluonNLP成为一站式解决方案。

症状:NLP资源太分散了。为了完成一个项目需要依赖很多包。

√GluonNLP 处方:整合并重新分发这些有用的公开资源。一键为不同应用下载预训练词表征,预训练语言模型,常用的数据集和预训练模型。

  说的够多了,给我看代码!

import mxnet as mx

import gluonnlp as nlp

# Load GloVe word embeddings

glove = nlp.embedding.create('glove', source='glove.6B.50d')

# Compute 'baby' and 'infant' word embeddings

baby_glove, infant_glove = glove['baby'], glove['infant']

# Load pre-trained AWD LSTM language model and get the embedding

lm_model, lm_vocab = nlp.model.get_model(name='awd_lstm_lm_1150',

                                        dataset_name='wikitext-2',

                                        pretrained=True)

baby_idx, infant_idx = lm_vocab['baby', 'infant']

lm_embedding = lm_model.embedding[0]

# Get the word embeddings of 'baby' and 'infant'

baby_lm, infant_lm = lm_embedding(mx.nd.array([baby_idx, infant_idx]))

# cosine similarity

def cos_similarity(vec1, vec2):

   return mx.nd.dot(vec1, vec2) / (vec1.norm() * vec2.norm())

print(cos_similarity(baby_glove, infant_glove)) # 0.74056691

print(cos_similarity(baby_lm, infant_lm)) # 0.3729561

gluonnlp.py hosted with by GitHub

在这个例子中,我们用 GluonNLP来加载Glove 词语表征,和预训练好的AWD语言模型,然后比较了他们在测量相似度问题伤的准确性。我们通过在 'baby'和 'infant'这两个例子上比较词语表征之间的余弦相似度。从结果可以看到,Glove  表征能更好地捕捉语义相似度。

  项目在哪里?

最新的GluonNLP 和最新版的MXNet可以在 gluon-nlp.mxnet.io 上获得,并且可以通过指令 pip install gluonnlp 来安装。

v.0.3.2版本的GluonNLP 包含这个功能:

预训练模型:超过300个词语表征模型(GloVe, FastText, Word2vec),5种语言模型 (AWD, Cache, LSTM)。

神经机器翻译(Google NMT, Transformer)模型训练

用来训练Word2vec 和 FastText的词语表征,包括未知词表征和用部分词来产生的表征。

灵活的数据管道工具和许多公开数据集。

NLP的例子,比如情感分析。

我们会在接下来的版本中继续增加功能和模型。如果你对某个模型有兴趣或者有反馈给我们,可以在Github上找到我们。雷锋网(公众号:雷锋网)

想要继续查看该篇文章相关链接和参考文献?

长按链接点击打开【深度学习的NLP工具】:雷锋网

https://ai.yanxishe.com/page/TextTranslation/731

AI研习社每日更新精彩内容,观看更多精彩内容:雷锋网

用Python实现遗传算法

如何将深度学习应用于无人机图像的目标检测

机器学习和深度学习大PK!昆虫分类谁更强?

Python高级技巧:用一行代码减少一半内存占用

等你来译:

五个很厉害的 CNN 架构 

如何在神经NLP处理中引用语义结构 

特朗普都被玩坏了,用一张照片就能做出惟妙惟肖的 Memoji

让神经网络说“我不知道”——用Pyro/PyTorch实现贝叶斯神经网络

◆◆    敲黑板,划重点啦!    ◆◆

AI求职百题斩已经悄咪咪上线啦,点击下方小程序卡片,开始愉快答题吧!

TB1dzRHurvpK1RjSZFqXXcXUVXa.jpg

转载地址:http://xztkx.baihongyu.com/

你可能感兴趣的文章
MachineLearning-Sklearn——环境搭建
查看>>
你不知道的CSS
查看>>
node学习之路(二)—— Node.js 连接 MongoDB
查看>>
Goroutine是如何工作的?
查看>>
《深入理解java虚拟机》学习笔记系列——垃圾收集器&内存分配策略
查看>>
用grunt搭建自动化的web前端开发环境-完整教程
查看>>
研究人员发现:基于文本的AI模型容易受到改述攻击
查看>>
TriggerMesh开源用于多云环境的Knative Event Sources
查看>>
GitLab联合DigitalOcean为开源社区提供GitLab CI免费托管
查看>>
通过XAML Islands使Windows桌面应用程序现代化
查看>>
区块链现状:从谨慎和批判性思维看待它(第二部分)
查看>>
苹果公司透露Siri新发音引擎的内部原理
查看>>
GCM 3.0采用类似方式向Android、iOS和Chrome发送消息
查看>>
如何成为一家敏捷银行
查看>>
MongoDB主动撤回SSPL的开源许可申请
查看>>
Oracle在JavaOne上宣布Java EE 8将会延期至2017年底
查看>>
使用Prometheus监控Cloudflare的全球网络
查看>>
Javascript 深入浅出原型
查看>>
VS 2019要来了,是时候了解一下C# 8.0新功能
查看>>
简单之极,搭建属于自己的Data Mining环境(Spark版本)
查看>>