框架罗列和归类
底层深度学习框架:theano tensorflow pytorch mxnet paddlepaddle
高级封装:
通用:keras(后端: tensorflow, theano) pytorch-lightning(pytorch) tensor2tensor( tensorlfow)
NLP相关: opennmt (opennmt-py pytorch opennmt-tf tensorflow) ParlAI(对话 pytorch) AllenNLP(pytorch)
使用高级封装的框架可以快速(几行代码)复现经典的模型,但由于封装了太多的细节, 不易修改原始模型,不利于自定义新的模型。
如何利用框架实现自定义模型
Tensor2Tensor使用总结(便于快速复现)
T2T 是Google 非官方提供的仓库,是社区广大爱好者共同努力建设的简单入门型框架,底层封装TF,能满足大部分CV 和 NLP的任务,很多主流成熟的模型也已经都有实现。直接继承或实现一些框架内预设的接口,就可以完成很多任务。入门起来非常友好,并且文档更新也较为及时。认真阅读文档(或阅读报错信息)就可以了解并使用该框架,方便许多非大幅创新模型的复现。
AllenNLP使用总结(复现+定制)
关于AllenNLP的学习代码,可以参考[5]。由于AllenNLP是基于PyTorch的,代码风格和PyTorch的风格基本一致,因此如果你会用PyTorch,那上手AllenNLP基本没有什么障碍。代码注释方面也比较全,模块封装方面比较灵活。AllenNLP的代码非常容易改动,就像用纯的PyTorch一样灵活。当然灵活也就意味着很多复杂的实现,AllenNLP目前还没有,大部分可能都需要自己写。AllenNLP依赖了很多Python库,近期也在更新。
OpenNMT使用总结(复现,序列到序列的复现)
OpenNMT提供了基于PyTorch和TensorFlow这两大主流框架的不同实现,能够满足绝大多数用户的需求。对于基础框架的封装使得其丧失了一定的灵活性,但是对于编码器-解码器结构下文本生成的任务来说,可以省去数据格式、接口定义等细节处理,将精力更多集中在其自定义模块上,快速搭建出需要的模型。OpenNMT的训练由Trainer.py中Trainer类控制,该类的可定制化程度并不高,只实现了最基本的序列到序列的训练过程。对于多任务、对抗训练等复杂的训练过程,需要对该类进行较大的改动。
ParlAI使用总结(可用于快速复现对话baseline)
ParlAI有自己的一套模式,例如world、agent和teacher等等。代码封装性特别好,代码量巨大,如果想查找一个中间结果,需要一层一层查看调用的函数,不容易进行修改。ParlAI中间封装了很多现有的baseline模型,对于对话研究者,可以快速实现baseline模型。目前ParlAI还在更新,不同版本之间的代码可能结构略有不同,但是ParlAI的核心使用方法大致相同。
总结
四种常见框架构建自定义模型。
Tensor2Tensor涵盖比较全面,但是只支持TensorFlow。
AllenNLP最大的优点在于简化了数据预处理、训练和预测的过程。代码改起来也很灵活,但是一些工具目前官方还没有实现,需要自己写。
如果是比较传统的编码器-解码器结构下文本生成任务,使用OpenNMT能节省很多时间。但是如果是结构比较新颖的模型,使用OpenNMT搭建模型依旧是一个不小的挑战。
ParlAI内部封装了很多对话任务,方便使用者快速复现相关的baseline模型。但由于代码封装性太强和其特殊的模式,使用ParlAI从头搭建自己的模型具有一定的挑战性。
每个框架都有各自的优点和弊端,需结合自身情况和使用方式进行选择。不可能每个框架都试一遍,毕竟掌握每个框架还是需要一定时间成本的。
参考: https://mp.weixin.qq.com/s/YRDZ8inqaxmdD5g_SR1MLg
网友评论