Keras 和 Pytorch 之间编码器-解码器模型的差异
Differences in encoder - decoder models between Keras and Pytorch
keras 和 pytorch 在编码器-解码器模型的构建方面似乎存在重大的根本差异。这里是 keras' enc-dec blog and here is pytorch's enc-dec blog.
我注意到的一些差异如下:
- Keras 的模型直接将输入馈送到 LSTM 层。而 Pytorch 对编码器和解码器都使用嵌入层。
- Pytorch 在编码器中使用没有激活的嵌入层,但在解码器中对嵌入层使用 relu 激活。
鉴于这些观察结果,我的问题如下:
- 我的理解是这样的,对吗?嵌入层不是严格要求的,但它有助于找到更好、更密集的输入表示。它是可选的,你仍然可以在没有嵌入层的情况下构建一个好的模型(取决于问题)。这就是 Keras 选择不在此特定示例中使用它的原因。这是一个合理的理由还是有更多的故事?
- 为什么在解码器而不是编码器中为嵌入层使用激活?
- 为什么使用 'relu' 作为激活而不是 'tanh' 等作为嵌入层?这里的直觉是什么?我只看到 'relu' 应用于具有空间关系的数据,而不是时间关系。
你对encoder-decoder模型的理解有误。首先请注意Keras和Pytorch是两个深度学习框架,而encoder-decoder是一种神经网络架构。因此,您需要首先了解编码器-解码器的工作原理,然后根据您的需要修改它们的架构。现在,让我回到你的问题。
嵌入层将单热编码表示转换为低维向量表示。例如,我们有一个句子I love programming
。我们想使用编码器-解码器网络将这句话翻译成德语。因此,第一步是首先将输入句子中的单词转换为向量表示序列,这可以使用嵌入层来完成。请注意,使用 Keras 或 Pytorch 并不重要。你可以想一想,如何将自然语言句子作为 LSTM 的输入?显然,你首先需要将它们转换成向量。
没有这样的规则,你应该在解码器的嵌入层中使用激活层,而不是在编码器中。请记住,激活函数是非线性函数。因此,应用非线性会产生不同的结果,但它与编码器-解码器框架无关。
同样,激活函数的选择取决于其他因素,而不是编码器或解码器或特定类型的神经网络架构。我建议您阅读神经网络中使用的流行激活函数的特性。另外,不要在观察了一些用例之后得出结论。这样的结论是危险的。
keras 和 pytorch 在编码器-解码器模型的构建方面似乎存在重大的根本差异。这里是 keras' enc-dec blog and here is pytorch's enc-dec blog.
我注意到的一些差异如下:
- Keras 的模型直接将输入馈送到 LSTM 层。而 Pytorch 对编码器和解码器都使用嵌入层。
- Pytorch 在编码器中使用没有激活的嵌入层,但在解码器中对嵌入层使用 relu 激活。
鉴于这些观察结果,我的问题如下:
- 我的理解是这样的,对吗?嵌入层不是严格要求的,但它有助于找到更好、更密集的输入表示。它是可选的,你仍然可以在没有嵌入层的情况下构建一个好的模型(取决于问题)。这就是 Keras 选择不在此特定示例中使用它的原因。这是一个合理的理由还是有更多的故事?
- 为什么在解码器而不是编码器中为嵌入层使用激活?
- 为什么使用 'relu' 作为激活而不是 'tanh' 等作为嵌入层?这里的直觉是什么?我只看到 'relu' 应用于具有空间关系的数据,而不是时间关系。
你对encoder-decoder模型的理解有误。首先请注意Keras和Pytorch是两个深度学习框架,而encoder-decoder是一种神经网络架构。因此,您需要首先了解编码器-解码器的工作原理,然后根据您的需要修改它们的架构。现在,让我回到你的问题。
嵌入层将单热编码表示转换为低维向量表示。例如,我们有一个句子
I love programming
。我们想使用编码器-解码器网络将这句话翻译成德语。因此,第一步是首先将输入句子中的单词转换为向量表示序列,这可以使用嵌入层来完成。请注意,使用 Keras 或 Pytorch 并不重要。你可以想一想,如何将自然语言句子作为 LSTM 的输入?显然,你首先需要将它们转换成向量。没有这样的规则,你应该在解码器的嵌入层中使用激活层,而不是在编码器中。请记住,激活函数是非线性函数。因此,应用非线性会产生不同的结果,但它与编码器-解码器框架无关。
同样,激活函数的选择取决于其他因素,而不是编码器或解码器或特定类型的神经网络架构。我建议您阅读神经网络中使用的流行激活函数的特性。另外,不要在观察了一些用例之后得出结论。这样的结论是危险的。