在对TensorFlow、PyTorch和Keras做功能对比之前,先来了解一些它们各自的非竞争性柔性特点吧。
非竞争性特点
下文介绍了TensorFlow、PyTorch和Keras的几个不同之处,便于读者对这三个框架有初步了解。列出这些区别的重点不在于对三者做比较,而在于做一个初步介绍。
TensorFlow
· 开发者:Google
· 2017年1月发布1.0版本
PyTorch
· 开发者:Facebook
· 2018年10月发布1.0版本
· 基于Torch开发(Torch是基于Lua开发的另一个深度学习框架)
Keras
· 是一个高级API,降低了深度学习框架的复杂程度
· 可以在其他深度学习API,如TensorFlow、Theano和CNTK上运行
· 本身并不是一个库
竞争性区别
下面将介绍这三个框架更加具有竞争性的区别。本文着重分析比较了这三个框架用于自然语言处理(Natural Language Processing,NLP)时的不同之处。
1. 可用的RNN类型
当试图用深度学习方法来解决NLP问题时,循环神经网络(Recurrent Neural Networks,RNNs)是开发者最常用的专业架构。因此,本文也选择从这一角度切入来比较TensorFlow、PyTorch和Keras框架。
本文比较的三种框架都具有可用于构建简单RNN以及更复杂的RNN——门控循环单元(Gated Recurrent Units,GRU)和长短时记忆网络(Long Short Term Memory networks,LSTM)的模块。
PyTorch:
PyTorch提供2种不同层次的类别(class)用于构建循环网络:
· 多层次类别(Multi-layer classes),包括nn.RNN、nn.GRU和nn.LSTM。这些类别的基类(Object)可用于表示深度双向循环神经网络。
· 单元层类别(Cell-level classes),包括nn.RNNCell、nn.GRUCell和nn.LSTMCell。这些类别的基类仅可用于表示单个单元(如简单RNN、LSTM及GRU的单元),即处理输入数据一个时间步长的单元。
因此,当神经网络中不需要太多定制时,多层次类别对单元层类别来说,就像是不错的包装类(wrapper)。
此外,构建一个双向RNN非常简单,只需在多层次类别中将双向实参设置为True就可以了。
TensorFlow:
TensorFlow提供tf.nn.rnn_cell模块用于构建标准RNN。
tf.nn.rnn_cell模块中最重要的类别包括:
· 单元层类别(Cell level classes):用于定义RNN的单个单元,即BasicRNNCell、GRUCell和LSTMCell。
· 多RNN单元类别(MultiRNNCell class):用于堆栈多个单元,以创建深度RNN。
· 随机失活包装类别(DropoutWrapper class):用于执行dropout正则化。
Keras:
Keras库提供的循环层包括:
· 简单RNN——全连接RNN,其输出被反馈到输入中
· GRU——门控循环单元层
· LSTM——长短时记忆层
TensorFlow、PyTorch和Keras都具有构建常见RNN架构的内置功能。它们的区别在于接口不同。
Keras的接口非常简单,包含一小串定义明确的参数,能够使上述类别的执行更加简单。作为一个能够在TensorFlow上运行的高级API,Keras使得TensorFlow更加简单。TensorFlow和PyTorch两者的灵活性差不多,但是后者的接口更加简洁明了。
2. TensorFlow、PyTorch、Keras易用性对比
TensorFlow常因其范围狭小的API而被诟病。相比之下,PyTorch对用户则更为友好,使用也更加简单。总之,PyTorch与Python语言的融合更为紧密,也更加自然。而在TensorFlow框架中编写程序时,程序员常感到自己与模型之间仿佛隔着一堵砖墙,只留下了几个洞孔用于交流。
下文将讨论并比较更多影响这三个框架易用性的因素:
· 静态计算图vs动态计算图:
计算图是NLP中非常重要的一个因素。TensorFlow使用静态计算图,PyTorch则使用动态计算图。
这也就意味着在TensorFlow中,需要先静态定义计算图,再运行模型。所有与外界的沟通都通过tf.Session对象和tf.Placeholder进行,而这两个张量在运行时库中都会被外部数据替代。
PyTorch中的计算图则更为重要和灵活。用户可以根据需要定义、改变和执行节点,无需依赖特殊的会话接口或占位符。
RNN静态图的输入序列长度通常是固定的。也就是说,开发一个英文句子情感分析模型必须将句子长度固定到某个最大值,并用0填充所有过短的序列。这真的很不方便。
· 调试:
由于PyTorch在运行时库中定义计算图,所以用户可以使用自己喜爱的调试工具,如pdb、ipdb、PyCharm debugger、old trusty print statements等。
但上述情况并不适用于TensorFlow。在TensorFlow中,用户可以选择使用一个名为tfdbg的特殊工具,用于评估运行时库的TensorFlow表达式和浏览会话作用域中的所有张量和操作。但是,这一工具显然不能调试python代码。所以用户还必须再使用pdb进行调试。
· 社区规模:
和PyTorch相比,TensorFlow更加成熟,其社区规模比PyTorch和Keras的社区规模加起来还要大得多,用户基数的增长也比PyTorch和Keras要快。
这也就意味着:
· 有更大规模的社区,如StackOverFlow上的社区,帮助你解决问题
· 有更多的线上学习资料,如博客、视频、课程等
· 能更快掌握最新的深度学习技术
NLP的未来
循环神经网络作为用作NLP任务的专业架构已经有相当长的一段时间了,但这一情况并不会长期不变。一个最新开发的基于注意力机制的变换模型(transformer model)已经在研究者之间流行开来。
这一模型已经代替RNN成为了新的NLP标准。一些评论家认为,Transformer将会成为2019年主流NLP深度学习架构。
在这场比赛中,TensorFlow似乎领先于另外两个框架:
· 首先,注意力架构是Google自己研发的。
· 其次,只有TensorFlow有Transformer稳定版架构。
但这并不是说PyTorch已经远远地落在了后面。Huggingface的GitHub已经发布了很多预训练的PyTorch transformer模型:。
另外,Google最近发布的TensorFlow 2.0很可能将带来翻天覆地的变化!
具体来说:
· Keras将会成为TensorFlow的高级API,其功能将会被扩展,使得用户能够在tf.keras上直接使用TensorFlow的最新功能。任一范围的TensorFlow及其硬件设备都将具备Keras的简便性。
· TensorFlow 2.0默认为动态图机制(eager execution)。用户甚至在eager context中也可以使用计算图,这将使调试和原型设计更为简单。TensorFlow运行时库则会在后台调控性能和规模。
· TensorBoard会和Keras整合——这在目前无法实现。
所以,本文猜想,TensorFlow 2.0将会消除几乎所有TensorFlow的不足。TensorFlow作为所有深度学习任务专业框架的地位将会得到巩固,甚至变得更好!
留言 点赞 关注
我们一起分享AI学习与发展的干货
编译组:王努铱、杨月
相关链接:
如需转载,请后台留言,遵守转载规范