LSTM 层之间的激活函数

数据挖掘 机器学习 深度学习 喀拉斯 lstm 堆叠的lstm
2021-10-11 05:20:57

我知道 LSTM 单元在内部同时使用 sigmoid 和 tanh 激活函数,但是在创建堆叠 LSTM 架构时,通过激活函数(例如 ReLU)传递它们的输出是否有意义?

所以我们更喜欢这个:

model = LSTM(100, activation="relu", return_sequences=True, input_shape(timesteps, n_features))
model = LSTM(50, activation="relu", return_sequences=True)(model)
...

在这个?

model = LSTM(100, return_sequences=True, input_shape(timesteps, n_features))
model = LSTM(50, return_sequences=True)(model)
...

根据我在创建 LSTM 自动编码器时的经验结果,我发现它们非常相似。

2个回答

用图片简单解释

我们知道在矩阵乘法之间需要激活,以使神经网络能够模拟非线性过程。

一个经典的 LSTM 单元已经包含相当多的非线性:三个sigmoid函数和一个双曲正切 ( tanh) 函数,这里显示在重复(展开)循环 LSTM 单元的顺序链中:

顺序(展开)LSTM 单元 符号图例 图片来自“colah的博客”

到目前为止,这只是一个 LSTM 层,在这里我们看到单元输出已经是两个激活(一个 sigmoid 和一个双曲正切)的乘积在这种情况下,您可以同意无需在 LSTM 单元之后添加另一个激活层。

你说的是堆叠层,如果我们在一层的隐藏输出和堆叠层的输入之间放置一个激活。查看上图中的中央单元格,这意味着紫色 (ht) 和堆叠层的蓝色 Xt. 然后你会注意到,这种情况下的输出,就像顺序输出一样,已经被激活,因为它与黑色的从左到右箭头完全相同的输出(知道ft)。更重要的是,输入在堆叠层中要做的第一件事是通过遗忘/输入/输出门的 sigmoid 和双曲正切。

所以有很多非线性被使用,这意味着没有必要在堆叠的 LSTM 层之间添加另一个。您可能想将其视为ReLU在全连接层之后简单地应用两层。与仅使用一个相比,结果可能略有不同,但差别不大;就像你对堆叠 LSTM 的实验一样。

文档

如果您查看 LSTM 模块(或任何循环单元)的 Tensorflow/Keras文档,您会注意到它们提到了两种激活:(输出)激活和循环激活。在这里,您可以决定使用哪个激活,然后整个单元格的输出已经被激活,可以这么说。PyTorch似乎(默认情况下)不允许您更改默认激活。

真实世界的堆叠模型

在 NLP 中可以找到循环网络的常见应用,例如 ELMo 模型。如果您查看网络设计代码,您会看到只使用了基本的 LSTM 单元,之后没有额外的激活。他们只提到在最终输出中为全连接层(即 ReLU)添加激活。

堆叠 LSTM(据我所知)的第一次使用被应用于语音识别(Graves 等人),作者也没有提到 LSTM 单元之间需要激活层;仅在最终输出与全连接层结合使用。

model = LSTM(100, return_sequences=True, input_shape(timesteps, n_features))
model = LSTM(50, return_sequences=True)(model)
...

文档说:这个 LSTM 实现默认有

activation="tanh",
recurrent_activation="sigmoid",

所以如果你想要一个不同的激活函数,你应该选择另一个激活函数。