本文为 AI 研习社编译的技术博客,原标题 :
NLP tools of DL
作者 | Thomas Delteil
翻译 | 孙稚昊2
校对 | 酱番梨 整理 | 菠萝妹
原文链接:
https://medium.com/apache-mxnet/gluonnlp-deep-learning-toolkit-for-natural-language-processing-98e684131c8a
深度学习的NLP工具
为什么最新的模型结果这么难以复现?为什么去年可以工作的代码和最新发布的深度学习框架不适配?为什么一个很直白的基线这么难以建立?在今天的世界中,这些都是自然语言处理(NLP)的研究员遇到的问题。
我们来看一个假想的博士学生。我们叫它亚历山大,他刚开始机械翻译(NMT)的研究。有一天早上他看到了Google 最著名的 论文“注意力是你全部需要的”,其中介绍了Transformer 模型,完全基于注意力机制。被结果惊艳到了,Alex搜索了一下google,结果告诉他T恩送染发咯哇的 Tensor2Tensor包已经包含了这个模型的实现。他的实验室里充满了快乐的尖叫;他应该可以在下午就复现出来结果,并且享受一个放松的晚上来和朋友在酒吧看世界杯!他还想。。。
然后,我们的朋友发现官方实现用的超参数和论文中提到的很不一样。他的导师建议:稍微调整一下参数,跑一下看看,结果应该还好--真的吗?
三天之后 。。。。实验室里所有的GPU都冒烟了,在不停地100%负荷运转。他的同事强制把他登出了,并且告诉他回家休息。我们不行的英雄照做了,并且去了Tensor2Tensor的Github 页面去报告这个问题,看看有没有别人遇到了同样的问题。很快,很多人回复他们遇到了同样的问题,但他们还没找到解决方案。
半个月过去了。。。终于项目的维护者出现了并回复说他会看看。
三个月过去了。。。。Alex 还在无助地询问:有没有进展?
在亚马逊云服务(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求职百题斩已经悄咪咪上线啦,点击下方小程序卡片,开始愉快答题吧!