1. 可用的 RNN 类型
在寻找 NLP 问题的深度学习解决方案时,循环神经网络 (RNN) 是开发人员最流行的首选架构。因此,从这个角度来比较框架是有意义的。
所有正在考虑的框架都具有允许我们创建简单 RNN及其更进化的变体的模块——门控循环单元 ( GRU ) 和长短期记忆 ( LSTM ) 网络。
PyTorch
PyTorch 提供了 2 个级别的类来构建此类循环网络:
-
多层类 — nn.RNN、nn.GRU和nn.LSTM。 这些类的对象能够表示深度双向循环神经网络。
-
单元级类 — nn.RNNCell、nn.GRUCell和nn.LSTMCell。 这些类的对象只能表示一个可以处理输入数据的一个时间步的单元(同样是一个简单的 RNN 或 LSTM 或 GRU 单元)。
因此,当我们不想在神经网络中进行太多定制时,多层类就像单元级类的一个很好的包装器。
此外,使 RNN 成为双向就像在多层类中将双向参数设置为True一样简单!
TensorFlow
TensorFlow 为我们提供了tf.nn.rnn_cell 模块来帮助我们满足标准 RNN 需求。
该模块中一些最重要的类tf.nn.rnn_cell
如下:
-
单元级别类 用于定义 RNN 的单个单元,即 —
BasicRNNCell
和GRUCell
LSTMCell
-
MultiRNNCell 类 用于堆叠各种单元以创建深度 RNN
-
DropoutWrapper类 用于实现dropout正则化
喀拉斯
以下是Keras 库中提供的循环层。其中一些层是:
-
SimpleRNN - 全连接 RNN,其中输出将反馈到输入
-
GRU——门控循环单元层
-
LSTM——长短期记忆层
TensorFlow、PyTorch 和 Keras 具有内置功能,使我们能够创建流行的 RNN 架构。区别在于它们的界面。
Keras 有一个简单的接口,其中包含一小部分定义良好的参数,这使得上述类易于实现。作为 TensorFlow 之上的高级 API,我们可以说 Keras 让 TensorFlow 变得简单。虽然 PyTorch 提供了与 TensorFlow 类似的灵活性,但它的界面更加简洁。
当我们讨论这个主题时,让我们根据每个框架的易用性进行更深入的比较研究。
2. 易用性:TensorFlow、PyTorch、Keras
TensorFlow 经常因其不全面的 API 而受到谴责。PyTorch 更加友好且易于使用。总体而言,PyTorch 框架与 Python 语言的集成更加紧密,大多数时候感觉更加原生。当您在 TensorFlow 中编写时,有时您会感觉您的模型位于一堵砖墙后面,上面有几个小孔可供通信。
让我们根据三者的易用性来讨论比较这三个因素的更多因素:
静态计算图与动态计算图
这个因素在 NLP 中尤其重要。TensorFlow 使用静态图进行计算,而 PyTorch 使用动态计算图。
这意味着在 Tensorflow 中,您可以在模型运行之前静态定义计算图。与外部世界的所有通信都是通过 tf.Session 对象和 tf.Placeholder 执行的,它们是在运行时将被外部数据替换的张量。
在 PyTorch 中,事情变得更加命令式和动态:您可以随时定义、更改和执行节点;没有特殊的会话界面或占位符。
在 RNN 中,对于静态图,输入序列长度将保持不变。这意味着,如果您开发英语句子的情感分析模型,则必须将句子长度固定为某个最大值,并用零填充所有较小的序列。不太方便吧?
调试
由于 PyTorch 中的计算图是在运行时定义的,因此您可以使用我们最喜欢的 Python 调试工具,例如 pdb、ipdb、PyCharm 调试器或旧的可信打印语句。
TensorFlow 的情况并非如此。您可以选择使用名为tfdbg的特殊工具,它允许您在运行时评估 TensorFlow 表达式并浏览会话范围内的所有张量和操作。当然,您将无法使用它调试任何Python代码,因此有必要单独使用pdb。
Tensorflow 比 PyTorch 更成熟。与 PyTorch 和 Keras 的总和相比,它拥有更大的社区。其用户群的增长速度超过 PyTorch 和 Keras。
所以这意味着:
- 更大的 StackOverFlow 社区可以帮助您解决问题
- 更大的在线学习材料集——博客、视频、课程等。
- 更快地采用最新的深度学习技术