单单元 LSTM 和 3 单元 LSTM 神经网络之间的区别

机器算法验证 机器学习 神经网络 lstm 喀拉斯
2022-02-25 21:10:31

以下 Keras 代码中的 LSTM

input_t = Input((4, 1))
output_t = LSTM(1)(input_t)
model = Model(inputs=input_t, outputs=output_t)
print(model.summary())

可以表示为

我知道,当我们调用model.predict(np.array([[[1],[2],[3],[4]]]))(唯一的)LSTM 单元时,首先处理向量 [1],然后是 [2] 加上来自先前输入的反馈,依此类推,直到向量 [4]。换句话说x1=[1],x2=[2],x3=[3],x4=[4].

我不明白以下神经网络如何处理相同的输入序列[1],[2],[3],[4]

 input_t = Input((4, 1))
 output_t = LSTM(3)(input_t)
 model = Model(inputs=input_t, outputs=output_t)
 print(model.summary())

在这个 NN 中,我们有三个 LSTM 单元。他们如何处理序列[1],[2],[3],[4]它们是否相互关联?他们是并行处理输入序列还是一个单元处理输入序列,然后将其输入馈送到第二个 LSTM 单元等等?有人可以示意性地使用这张图片解释整个过程吗?

3个回答

在 KerasLSTM(n)中的意思是“创建一个由 LSTM 单元组成的 LSTM 层。下图演示了层和单元(或神经元)是什么,最右边的图像显示了单个 LSTM 单元的内部结构。

在此处输入图像描述

下图展示了整个 LSTM 层是如何运作的。

在此处输入图像描述

正如我们所知,LSTM 层处理一个序列,即x1,,xN. 在每一步t层(每个神经元)接受输入xt, 上一步的输出ht1, 和偏差b,并输出一个向量ht. 坐标ht是神经元/单元的输出,因此是向量的大小ht等于单位/神经元的数量。这个过程一直持续到xN.

现在让我们计算参数的数量,LSTM(1)并将LSTM(3)其与 Keras 在调用时显示的内容进行比较model.summary()

inp是向量的大小xtout是向量的大小ht(这也是神经元/单位的数量)。每个神经元/单元接受输入向量、上一步的输出和一个偏置,使得inp+out+1参数(权重)。但是我们有out神经元的数量,所以我们有out×(inp+out+1)参数。最后每个单元有 4 个权重(见最右边的图像,黄色框),我们有以下公式计算参数的数量:

4out(inp+out+1)

让我们比较一下 Keras 的输出。

示例 1。

 t1 = Input(shape=(1, 1))
 t2 = LSTM(1)(t1)
 model = Model(inputs=t1, outputs=t2)
 print(model.summary())

  Layer (type)                 Output Shape              Param #   
  =================================================================
  input_2 (InputLayer)         (None, 1, 1)              0         
  _________________________________________________________________
  lstm_2 (LSTM)                (None, 1)                 12        
  =================================================================
  Total params: 12
  Trainable params: 12
  Non-trainable params: 0
  _________________________________________________________________

单元数为 1,输入向量的大小为 1,所以4×1×(1+1+1)=12.

示例 2。

  input_t = Input((4, 2))
  output_t = LSTM(3)(input_t)
  model = Model(inputs=input_t, outputs=output_t)
  print(model.summary())

    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_6 (InputLayer)         (None, 4, 2)              0         
    _________________________________________________________________
    lstm_6 (LSTM)                (None, 3)                 72        
    =================================================================
    Total params: 72
    Trainable params: 72
    Non-trainable params: 0

单元数为3,输入向量的大小为2,所以4×3×(2+3+1)=72

我通常使用 Tensorflow,但我可以在文档中看到它类似于 Keras。

基本上,当你打电话时,LSTM(3)不会像这张图片1那样创建一个彼此顶部的 LSTM 这是一个完全不同的问题。

但是,当您创建时,LSTM(3)您正在制作具有3 个隐藏单元或隐藏单元的 LSTM 。在您的代码中,3 将是 LSTM 中内部单元格的维度。这是什么意思?这意味着隐藏状态的维度和输出状态的维度将与隐藏单元的参数相同。

与其将 LSTM 想象为获取一系列标量并给出和输出标量的东西,不如想象一下:您有一个长度为 T 的序列,每个 T 有 512 个值,所以 [Batchsize, T, 512]。在第一个时间 T=1 时,您将一次向 LSTM 提供这 512 个值,这要归功于隐藏单元。

如果我的解释不是很清楚,我会附上一些参考资料和链接。 Q参考S参考

2 堆栈 LSTM

我制作了一张图片(参见原始图片的来源),显示了教程中经典表示的单元格(Source1:Colah's Blog)和具有 2 个单元的等效单元格(Source2:Raimi Karim 的帖子)。希望它能澄清单元/单元之间的混淆以及网络架构的真正含义。

在此处输入图像描述