深度模型框架(持续更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014665013/article/details/84623780


在各个领域,在一项技术渐于成熟的时候,就会摒弃掉一些底层枯燥的东西,一步步抽象出更加高层的framework,正因如此,才让人摒弃掉更多底层枯燥的工作,专注于更加有利于科技、人类社会发展的事务。而在程序猿的世界里,更是如此,前后端出现了laravel、thinkPhp,爬虫出现了scrapy、scrapyd,前端出现vue、bootstrap等优秀的框架~
扯远了,今天我想整理介绍下深度模型界的framework,深度学习涉及很多不同的主题和很多我们需要学习的东西,所以一个好的策略就是开始研究人们已经为我们构建好了的东西。这就是为什么框架非常棒的原因。框架使我们不必太过于关心如何构建模型的细节,使得我们可以更多地关注我们想要完成的任务(而不是专注于如何实现)。因为深度学习发展迅速,越来越专注于model本身,至于数据处理啊,调参啊,都交给framework去做吧~
下面就整理下相关深度模型框架,相关介绍也是抛砖引玉,更多详细内容可参考相关链接。

1.翻译

1.1.快照

framework Programming language
tensor2tensor tensorflow
allennlp pytorch
OpenNMT-py pytorch
NMT tenforflow
seq2seq tensorflow

更多参考:NMT framework

1.2.详解

  • tensor2tensor(tensorflow)
    Google Brain在发布了“attention is all you need”之后,也发布了Tensor2Tensor (T2T),这是一个用于在TensorFlow中训练深度学习模型的开源系统。
    T2T有助于开发顶尖水平的模型,并适用各类机器学习应用,例如翻译、分析和图像标注等。这意味着,对各种不同想法的探索要比以往快得多。
    此次发布的这个版本还提供了由数据集和模型构成的库文件,包括近期几篇论文中最优秀的模型(文末列举了这几篇论文),从而推动你自己的深度学习研究。
    T2T库利用TensorFlow工具来开发,定义了一个深度学习系统中需要的多个部分:数据集、模型架构、优化工具、学习速率衰减计划,以及超参数等等。实现了架构的模块化,因此输入数据和预期输出结果之间所有部分都是张量到张量的函数
    源码地址:tensor2tensor
    tensor2tensor参考链接:


  • allennlp(Pytorch)
    建立在PyTorch上,AllenNLP可以轻松设计和评估几乎任何NLP问题的新的深入学习模型,以及轻松将其运行在云端或笔记本电脑上的基础架构。AllenNLP设计有以下原则:

    • 超模块化和轻量化。使用您喜欢的部件与PyTorch无缝连接。
    • 经过广泛测试,易于扩展。测试覆盖率高于90%,示例模型提供了贡献的模板。
    • 认真填充和掩蔽,轻松实现正确的模型,无需痛苦。
    • 实验友好。 通过综合测井从json规范运行可重复的实验。

    AllenNLP包括语义角色标签,问答和双向优化(EntDAment)(可分解关注)等高质量模型的参考实现。

    AllenNLP由Allen人造智能研究所建立和维护,与华盛顿大学和其他地方的研究人员密切合作。拥有一流的现场研究人员和软件工程师团队,AllenNLP项目具有独特的优势,能够为高品质工程提供最先进的模型。

    package instructions
    allennlp 一个基于PyTorch的开源NLP研究库
    allennlp.commands CLI和Web服务的功能
    allennlp.data 数据处理模块,用于将数据集和编码字符串加载为矩阵中的整数
    allennlp.models 收集最先进的模型
    allennlp.modules 一组用于文本的PyTorch模块
    allennlp.nn 张量效用函数,如初始化器和激活函数
    allennlp.service 一个Web服务器来为我们的演示和API提供服务
    allennlp.training 训练模型的功能

    源码地址AllenNLP
    allennlp参考链接:


  • openNMT-py
    OpenNMT是一个开放源代码(MIT)神经机器翻译系统,OpenNMT的Pytorch 端口。本系统的设计基于简洁的使用性以及便捷的扩展性,同时保持高效性和最先进的翻译准确度。功能包括:高性能GPU训练的速度和内存优化。界面简单而且通用,方便部署。 扩展性强以允许其他序列生成任务,如生成汇总和图像字幕。
    实现以下OpenNMT功能:

    • 多层双向RNN具有注意力和缺点
    • 数据预处理
    • 从检查站保存和加载
    • 推荐(翻译)与批量和波束搜索
    • 多GPU

    测试版功能:

    • 上下文门
    • 多源和目标RNN(lstm / gru)类型和注意(dotprod / mlp)类型
    • 图像到文本处理
    • 源词功能
    • “注意就是你需要的”
    • TensorBoard /蜡笔记录
    • 复制,覆盖和结构化注意

    源码地址:openNMT-py
    openNMT参考链接


2.reading comprehension

快照

framework Programming language
gluon-nlp mxnet

详解

  • GluonNLP
    GluonNLP提供NLP中最先进(SOTA)深度学习模型的实现,并为文本数据管道和模型构建模块。它专为工程师,研究人员和学生设计,可以基于这些模型快速研究原型和产品的原型。
    该工具包提供四个主要功能:
    • 培训脚本以重现研究论文中报告的SOTA结果。
    • 针对常见NLP任务的预训练模型。
    • 精心设计的API大大降低了实现的复杂性。
    • 社区支持。

源码链接 :GluonNLP
GluonNLP参考链接:

展望

博主在做了相关的调研之后发现,现在的framework多数有以下优缺点:
优点:

  • 很多fm封装的特别棒,代码条例,便于扩展
  • 特别适合商业化
  • 如果想入门,速度回很快
  • 源码开源,社区多个contributor
  • 相关教程比较丰富

缺点:

  • 为了便于扩展,导致的一些函数的实现往往有好多层,为了实现函数A,需要调用函数B,函数B又要调用函数C,而真正的实现可能也就几行,如此一来看明白某个函数的思路往往需要花费不少精力(里面还有好多的空函数,ORZ…)
  • 由于函数的高度抽象,运行代码很简单,但是很多特别多相关细节都会屏蔽掉,不适合模型细节trick学习
  • 系统支持多任务,任务混杂,导致代码结构比较复杂。在实现的时候,要考虑到整体的结构,所以会存在各种封装、继承、多态的实现。可能你只想用其中的一个功能,理解该功能对应的代码,但是却需要排除掉大量的不相关的代码。
  • 系统基于Tensorflow封装较高的API。使用了Tensorflow中比较高的API来管理模型的训练和预测,Experiment,Monitor,Estimator,Dataset对象的使用隐藏了比较多的控制流程,对于侧重应用的用户来说,可能是是好事情,设一设参数就能跑。但是对于想了解更多的开发人员来说,TF该部分的文档实在很少,说的也不清楚,很多时候需要去阅读源代码才能知道实验到底是不是按照自己预期的进行的。这种方式也不太方便找bug和调试。
  • 某些方法调用比较深。原因应该还是出于整体结构和扩展性的考虑。这导致了实现一点很小功能的方法A,需要再调一个其他方法B,B再去调用方法C,实际上每个方法中就几行代码,甚至有的方法就是空操作。
  • 多层继承和多态也降低了代码的可读性。追溯一个类的某个方法的时候,需要看到其父类的父类的父类。。。这些父类和子类之间的方法又存在着调来调去的关系,同名方法又存在着覆盖的关系,所以要花一些时间来确定当前的方法名到底是调用的的哪个类中的方法。
  • 要求开发者有模型层面的理解和与代码实现的挂钩。肯定是要提高对模型逻辑的理解,但在读代码的过程中,会遇到两种问题:第一个,代码实现的是论文中的功能,但不是论文中的原始公式,可能要做变形以规避溢出的问题,或是实现更高的效率;第二个,某些代码实现与其论文中的表述存在不一致的情况。

基于此,本博打算在最近一段时间里做出一个rc的框架,结合之前的相关代码和比赛经验,打造一个适合比赛、学生、初学者使用的简单framework,敬请期待~

猜你喜欢

转载自blog.csdn.net/u014665013/article/details/84623780