LSTM 和 RNN 中的隐藏状态到底是什么?

人工智能 循环神经网络 长短期记忆 隐藏层 seq2seq 编码器-解码器
2021-11-17 05:11:53

我正在做一个项目,我们使用编码器-解码器架构。由于 LSTM 的隐藏状态,我们决定对编码器和解码器都使用 LSTM 在我的具体情况下,编码器的隐藏状态被传递给解码器,这将允许模型学习更好的潜在表示。

这有意义吗?

我对此有点困惑,因为我真的不知道隐藏状态是什么。此外,我们为编码器和解码器使用单独的 LSTM,所以我看不出来自编码器 LSTM 的隐藏状态如何对解码器 LSTM 有用,因为只有编码器 LSTM 真正理解它。

4个回答

这是我自己对循环网络中隐藏状态的理解。如果有错,请随时告诉我。

让我们考虑以下两个输入和输出序列

X=[a,b,c,d,,y,z]Y=[b,c,d,e,,z,a]

我们将首先尝试训练一个具有一个输入和一个输出的多层感知器 (MLP)XY. 在这里,隐藏层的细节无关紧要。

我们可以在数学中将这种关系写为

f(x)y

在哪里x是一个元素Xy是一个元素Yf()是我们的 MLP。

训练后,如果给定输入a=x,我们的神经网络会给出一个输出b=y因为f()学习了序列之间的映射XY.

现在,代替上述序列,尝试将以下序列教给相同的 MLP。

X=[a,a,b,b,c,c,,y,z,z]Y=[a,b,c,,z,a,b,c,,y,z]

这个 MLP 很可能无法学习XY. 这是因为简单的 MLP无法学习和理解先前字符和当前字符之间的关系。

现在,我们使用相同的序列来训练 RNN。在 RNN 中,我们采用两个输入,一个用于我们的输入和之前的隐藏值,以及两个输出,一个用于输出和下一个隐藏值。

f(x,ht)(y,ht+1)

重要:这里ht+1表示下一个隐藏值。

我们将执行这个 RNN 模型的一些序列。我们将隐藏值初始化为零。

x = a and h = 0
f(x,h) = (a,next_hidden)
prev_hidden = next_hidden

x = a and h = prev_hidden
f(x,h) = (b,next_hidden)
prev_hidden = next_hidden

x = b and h = prev_hidden
f(x,h) = (c,next_hidden)
prev_hidden = next_hidden

and so on 

如果我们查看上述过程,我们可以看到我们正在使用先前的隐藏状态值来计算下一个隐藏状态。发生的情况是,当我们迭代这个过程prev_hidden = next_hidden时,它还会编码一些关于我们序列的信息,这将有助于预测我们的下一个字符。

正如你所说,一种看待它的方法肯定是 LSTM 编码器的编码只能由它自己理解,这就是解码器存在的原因。优化过程对其进行了编码,为什么优化过程无法对其进行解码?

隐藏状态本质上只是对您提供的信息的编码,以控制时间依赖性。大多数编码器-解码器网络都是端到端训练的,当学习编码时,同时学习相应的解码,以解码所需格式的编码潜在。

我建议您阅读这篇关于如何使用转换器模型将法语转换为英语的博客,因为它可以让您更好地了解编码器-解码器序列模型会发生什么

我喜欢将隐藏状态视为神经系统中输入的中间表示。系统的总体目标是以某种特定的方式重新表示输入,以便系统可以产生一些目标输出。神经网络中的每一层只能根据其节点的具体情况真正“看到”输入,因此每一层都会产生它正在处理的任何东西的独特“快照”。隐藏状态是原始输入数据的一种中间快照,以给定层的节点和神经加权需要的任何方式进行转换。

快照只是向量,因此理论上它们可以由任何其他层处理 - 在您的示例中通过编码层或解码层。

RNN 中的隐藏状态基本上就像常规前馈网络中的隐藏层——它恰好也被用作下一个时间步的 RNN 的附加输入。

一个简单的 RNN 可能有一个输入xt, 一个隐藏层ht, 和一个输出yt在每个时间步t. 隐藏层的值ht通常计算为:

ht=f(Wxhxt+Whhht1)

在哪里f是一些非线性函数,Wxh是大小的权重矩阵h×x, 和Whh是大小的权重矩阵h×h. 为简单起见,我省略了偏差项。

因此,隐藏层的值ht取决于输入xt以及之前的隐藏状态ht1(字面意思是隐藏层的先前值)。