首页 > 解决方案 > Keras 和 Pytorch 之间编码器 - 解码器模型的差异

问题描述

keras 和 pytorch 之间的编码器-解码器模型的构建似乎存在显着的根本差异。这是keras 的 enc-dec 博客,这是pytorch 的 enc-dec 博客

我注意到的一些差异如下:

  1. Keras 的模型直接将输入提供给 LSTM 层。而 Pytorch 对编码器和解码器都使用嵌入层。
  2. Pytorch 在编码器中使用没有激活的嵌入层,但在解码器中对嵌入层使用 relu 激活。

鉴于这些观察,我的问题如下:

  1. 我的理解如下,对吗?嵌入层不是严格要求的,但它有助于找到更好和更密集的输入表示。它是可选的,您仍然可以在没有嵌入层的情况下构建一个好的模型(取决于问题)。这就是 Keras 在这个特定示例中选择不使用它的原因。这是一个合理的理由还是有更多的故事?
  2. 为什么对解码器中的嵌入层使用激活而不是编码器?
  3. 为什么使用'relu'作为嵌入层的激活而不是'tanh'等?这里的直觉是什么?我只看到'relu'应用于具有空间关系而不是时间关系的数据。

标签: kerasnlppytorchlstm

解决方案


您对编码器-解码器模型有错误的理解。首先,请注意 Keras 和 Pytorch 是两个深度学习框架,而编码器-解码器是一种神经网络架构。因此,您首先需要了解编码器-解码器的工作原理,然后根据您的需要修改它们的架构。现在,让我回到你的问题。

  1. 嵌入层将 one-hot 编码表示转换为低维向量表示。例如,我们有一个句子I love programming。我们想使用编码器-解码器网络将这句话翻译成德语。因此,第一步是首先将输入句子中的单词转换为一系列向量表示,这可以使用嵌入层来完成。请注意,使用 Keras 或 Pytorch 并不重要。您可以想,如何将自然语言句子作为 LSTM 的输入?显然,您首先需要将它们转换为向量。

  2. 没有这样的规则,你应该在解码器的嵌入层中使用激活层,而不是在编码器中。请记住,激活函数是非线性函数。因此,应用非线性具有不同的结果,但它与编码器-解码器框架无关。

  3. 同样,激活函数的选择取决于其他因素,而不是编码器或解码器或特定类型的神经网络架构。我建议您阅读神经网络中使用的流行激活函数的特征。另外,不要在观察几个用例后得出结论。这样的结论是危险的。


推荐阅读