目前我正在学习RNN,尤其是LSTM网络。我看了很多专题,包括 这个 而我仍然有一些误解.下面的图片来自于 本文 并且它代表单个RNN细胞展开的时间。1. 我理解得对吗,RNN细胞不是Feedforward神经网络中的单个神经元,而是单层神经元,是它的内部?
文章中的另一张图片代表了单层LSTM细胞在时间上的展开。2. 根据第一个问题的逻辑,从Feedforward神经网络的角度来看,LSTM细胞不是一个单一的神经元,而是一组4层的神经元,是在它的内部吗?
3. 粗略的说,我们是否可以说,RNN(或LSTM)层(比如用Keras层来说)就是我们所说的 "细胞"?
先谢谢您的解答!
考虑到你发布的图,正如你所看到的,每个单元都使用其前体单元的输出。例如,当你想输入 x2
到您的LSTM网络中,您必须使用 h1
的向量,以及前一个单元的输出(即前一个时间步长的输出)。x2
. 喂养这两个人会给你 h2
,然后再向前传播到下一个单元。这是在时间步长中发生的一个例子。t=2
.
循环神经网络可以被认为是同一个网络的多个副本,每个副本都会向后继者传递一个信息。不过在教程中,你看到这些网络是为了便于理解而展开的。这并不是实际情况,因为图中的细胞并不是独立的,因为它们都有相同的参数,而这些参数会随着每次反向传播的迭代而更新。
为了让它更容易理解,请考虑下面的代码片段。
# X is the input sequence (e.g., word embeddings vectors)
# steps is the input sequence length
# h0, and c0 are zero state vector (commonly done) that you want to
# feed into the first RNN cell
# h_out is the hidden states that the RNN network outputs
X = torch.randn(seq_len, hidden_dim)
steps = range(seq_len)
h0 = torch.zeros(seq_len, hidden_dim)
c0 = torch.zeros(seq_len, hidden_dim)
hidden = (h0, c0)
h_out = list()
for i in steps:
# advance rnn
hidden = RNN(X[i], hidden)
hy, cy = hidden
h_out.append(hy)
假设 RNN(.,.)
是一个RNN(LSTMGRU)单元,它有一堆可训练的参数,如权重矩阵和偏置。这些参数都是相同的,并且被每个 X[i]
和 hidden
实例,在每次迭代时都会被输入到RNN单元中。
所以回到你的问题,一个RNN网络实际上是一个RNN单元的多个副本,随着你的继续训练而得到训练。