当我在Keras中创建一个有N个“units”的stateful LSTM层时,我究竟在配置什么?

87
在普通的Dense层中,第一个参数也是units,表示该层中神经元/节点的数量。然而,标准的LSTM单元如下所示:

enter image description here

这是 "理解LSTM网络" 的改版。
在Keras中,当我像这样创建一个LSTM对象 LSTM(units=N, ...),我是否实际上创建了N个这样的LSTM单元?还是它是LSTM单元内部的“神经网络”层的大小,即公式中的W?或者是其他什么?
为了背景,我是基于这个示例代码工作的。
以下是文档:https://keras.io/layers/recurrent/ 它说:

units:正整数,输出空间的维度。

这让我想到它是来自Keras LSTM“层”对象的输出数量。这意味着下一层将有N个输入。这是否意味着在LSTM层中实际存在N个这些LSTM单元,或者可能只运行一个LSTM单元进行N次迭代,从h[t-N]到h[t]输出N个这样的h[t]值?
如果它仅定义了输出数量,那么输入是否仍然可以只有一个,还是我们必须手动创建滞后的输入变量x[t-N]到x[t],为每个由units=N参数定义的LSTM单元创建一个?
当我写这篇文章时,我想到了return_sequences参数的作用。如果设置为True,则所有N个输出都将传递到下一层,而如果设置为False,则仅将最后一个h[t]输出传递到下一层。我是对的吗?

1
可能是 https://stats.stackexchange.com/questions/241985/understanding-lstm-units-vs-cells 的重复问题。 - Peteris
@Peteris我认为在不同的堆栈交换站点上标记问题为“重复”不是一件好事。这个问题也涉及到Keras,它是Tensorflow的一个抽象层。无论如何,链接很有帮助,是一个好的参考,谢谢。 - André C. Andersen
1
看这个 - https://zhuanlan.zhihu.com/p/58854907。一个相当不错的解释。 - Shirish Kumar
4个回答

47

如果需要更详细的信息,您可以查看这个问题,尽管它是基于Keras-1.x API的。

基本上,“unit”指的是LSTM内部单元的维度。因为在LSTM中,内部单元(图中的C_t和C_{t-1})、输出掩码(图中的o_t)以及隐藏/输出状态(图中的h_t)的维度应该具有相同的长度,因此您的输出维度也应该是unit

Keras中的LSTM仅定义了一个LSTM块,其单元的长度是unit。如果设置return_sequence=True,则会返回形状为(batch_size, timespan, unit)的结果。如果设置为false,则只返回最后一个输出,形状为(batch_size, unit)

至于输入,您应为每个时间戳提供输入。基本上,形状类似于(batch_size, timespan, input_dim),其中input_dim可以与unit不同。如果您只想在第一步提供输入,可以在其他时间步骤简单地使用零填充您的数据。


4
那么,这意味着“unit”表示每个时间步长LSTM单元输出的向量大小。但是,Keras如何知道需要使用多少个这些LSTM单元来训练数据?我的意思是,很容易确定输入所需的LSTM单元数量(在“timespan”中指定),但是如何确定输出所需的LSTM单元数量呢? - ajaysinghnegi

25
这是否意味着LSTM层中实际上存在N个LSTM单元,或者可能只有一个LSTM单元运行N次,输出N个h[t]值,例如从h[t-N]到h[t]?
第一种情况是正确的。在Keras LSTM层中有N个LSTM单元或细胞。
keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False) 

如果您计划创建只有一个单元的简单LSTM层,则会得到以下结果: enter image description here 这将是您的模型。
N=1
model = Sequential()
model.add(LSTM(N))

对于其他型号,您需要N>1。 enter image description here


为什么在“一对一”模型中要使用LSTM? - user2543622
如果神经网络是矩阵变换后跟非线性变换,那么在LSMT中有几个神经网络。我不清楚为什么在实践中只使用单个LSMT单元。 - prosti
1
所以N是蓝色单元格的数量? - David
2
@dvdblk,是的,N应该是蓝色单元格,或者LSTM输出空间 - prosti
3
蓝色的细胞不是根据输入时间步骤计算得出的。例如,如果我们有一个LSTM(32)层,如果我们输入尺寸为(2,1,24)对应于(批量大小,时间步骤,特征),那么这将只有1个蓝色细胞。 - Bipin Maharjan

14

"LSTM链"的实例数量有多少个?

Keras递归神经网络中'units'参数的恰当直观解释是,使用units=1可以得到教科书中描述的RNN,而使用units=n可以得到一个层,该层由n个独立的RNN副本组成 - 它们具有相同的结构,但由于它们使用不同的权重进行初始化,因此会计算出不同的结果。

或者,您可以考虑,在具有units=1的LSTM中,关键值(f、i、C、h)为标量;而在具有units=n的LSTM中,它们将是长度为n的向量。


1
所以,如果我有一个包含N个时间点的输入序列,那么在展开LSTM时,单元的数量就是N。如果我将units=1设置为1,那就是这样了。如果我将其设置为10,它将产生10个独立的LSTM链的副本,每个链都有N个单元。对吗? - seralouk

5

“直观地”就像一个有100维的密集层(Dense(100)),会有100个神经元。同样,LSTM(100)将是由100个“智能神经元”组成的层,其中每个神经元都是您提到的图形,并且输出将是一个具有100维的向量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接