【问题标题】:Understanding multi-layer LSTM了解多层 LSTM
【发布时间】:2017-11-24 05:11:44
【问题描述】:

我正在尝试理解和实现多层 LSTM。问题是我不知道它们是如何连接的。我有两个想法:

  1. 在每个时间步,第一个 LSTM 的隐藏状态 H 将成为第二个 LSTM 的输入。

  2. 在每个时间步,第一个 LSTM 的隐藏状态 H 将成为第二个 LSTM 的隐藏状态的初始值,第一个 LSTM 的输入将成为第二个 LSTM 的输入。

请帮忙!

【问题讨论】:

  • 你的第一个想法是正确的

标签: neural-network deep-learning lstm


【解决方案1】:

TLDR:在时间 t 和级别 l 的每个 LSTM 单元都有输入 x(t) 和隐藏状态 h(l,t) 在第一层,输入是实际的序列输入 x(t),和之前的隐藏状态 h(l, t-1),在下一层,输入是上一层对应单元格的隐藏状态 h (l-1,t)。

来自https://arxiv.org/pdf/1710.02254.pdf

增加 GRU 网络的容量(Hermans 和 Schrauwen 2013),循环层可以堆叠在 彼此。 由于GRU没有两个输出状态,相同的输出隐藏状态h'2 被传递到下一个垂直层。换句话说,下一层的 h1 将等于 h'2。 这迫使 GRU 学习在深度和时间上有用的转换。

【讨论】:

    【解决方案2】:

    我正在接受colah's blog post 的帮助,只是为了让您了解具体部分,我会缩短它。

    如上图所示,LSTM 具有这种链状结构,每个都有四个神经网络层。

    我们传递给下一个时间戳(单元状态)和下一层(隐藏状态)的值基本相同,它们都是期望的输出。此输出将基于我们的单元状态,但将是过滤后的版本。首先,我们运行一个 sigmoid 层,它决定我们要输出的单元状态的哪些部分。然后,我们将单元状态通过 tanh(将值推到 -1 和 1 之间)并将其乘以 sigmoid 门的输出,这样我们就只输出我们决定通过的部分。

    我们还将先前的单元状态信息(顶部箭头到下一个单元)传递给下一个时间戳(单元状态),然后决定使用 sigmoid 层(忘记门层),我们将继续使用多少信息来帮助新输入和来自先前状态的输入。

    希望这会有所帮助。

    【讨论】:

    • 我想你是误会了,我认为图像中的三个框是一个 LSTM 单元的三个时间步长,而不是一个 LSTM 单元。
    • 是的,但我想堆叠多个 LSTM 单元 :(
    • @KhoaNgo 堆叠可以是水平的,就像想象所有的盒子在彼此的顶部一样,其中一个盒子的输入是下一个盒子的输入,具有自己的隐藏状态。
    【解决方案3】:

    在 PyTorch 中,多层 LSTM 的实现表明上一层的隐藏状态成为下一层的输入。所以你的第一个假设是正确的。

    【讨论】:

      【解决方案4】:

      没有明确的答案。这取决于您的问题,您应该尝试不同的方法。

      您可以做的最简单的事情是将第一个 LSTM(不是隐藏状态)的输出作为输入到 LSTM 的第二层(而不是对其施加一些损失)。这应该在大多数情况下都有效。

      你也可以尝试管道隐藏状态,但我不经常看到它。

      您也可以尝试其他组合。说对于第二层,您输入第一层的输出和原始输入。或者你从当前单元和上一个单元链接到第一层的输出。

      这完全取决于您的问题,您需要进行试验,看看哪种方法适合您。

      【讨论】:

      • LSTM 的实际输出是什么?我读了一些关于 LSTM 的帖子,发现它们产生了记忆 Ct 和隐藏状态 Ht?
      • @KhoaNgo 取决于型号。 Ct 通常是您需要输出步长预测的节点(下一个字符或下一个标记,如果您以这种方式训练它),而隐藏状态通常会对该状态进行编码(即整个单词/句子)。最后你仍然有一些神经元得到训练,很难准确地说出它们的意思(除非你训练它们有一定的意义)。
      猜你喜欢
      • 2019-07-21
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2020-08-31
      • 2018-04-07
      • 2018-07-08
      • 1970-01-01
      相关资源
      最近更新 更多