LSTM 的核心关键是细胞状态(cell state),表示细胞状态的这条线水平的穿过图的顶部。细胞的状态类似于输送带,细胞的状态在整个链上运行,只有一些小的线性操作作用其上,信息很容易保持不变的流过整个链。
门控是一种选择性地让信息通过的方式。具体的门控概念和相应的任务实例已经在上面讲过了。LSTM 中它们由一个 Sigmoid 神经网络层和一个点乘运算组成。Sigmoid 层输出 0 到 1 之间的数字,描述每个组件有多少应该被允许通过。一个 LSTM 有三个这样的门,以保护和控制单元的状态。
具体分析LSTM的结构第一步:LSTM 中的第一步就是要决定我们从之前的信息中丢弃哪些信息。这个是 forget gate 的工作。如下图所示:
丢弃信息通过一个 Sigmoid 层实现,又叫 forget gate layer。接收了上一层的输出 \(h_{t-1}\) 以及当前 time step 的输入 \(x_t\) 。通过 Sigmoid 层之后输出一个介于 0 和 1 之间的数字 \(f_t\)。如果 \(f_t = 1\) 表示完全的保留这些信息;如果 \(f_t = 0\) 表示完全的遗忘这些信息;如果 \(0<f_t<1\) 表示只忘记一部分信息。
第二步:LSTM中的第二步就是决定我们要保留哪些新信息,即存储哪些信息到 cell state 中。这个是 input gate 的工作。如下图所示:
从图中可以看出,这一步由两个神经网络层来实现。第一个是一个 Sigmoid 层,又称为 input gate layer,决定的是我们将会更新哪信息。第二个是一个 tanh 层,会创建一个新的候选数据 \({\widetilde{C}_{t}}\) ,它将会被添加到当前信息中。在下一步的时候,我们会将二者结合来创新对新信息的更新。
第三步:我们要将传入的旧cell state \({\widetilde{C}_{t-1}}\) ,更新为新的cell state \({\widetilde{C}_{t}}\) 。如下图所示:
我们先用第一步产生的 \(f_t\) 乘以 \({\widetilde{C}_{t-1}}\) ,也就是忘记我们打算忘记的信息(这就是一个门控过程)。然后和 \(i_t *{\widetilde{C}_{t}}\) 相加。这就是我们根据想要更新多少信息而选出的新的信息。
第四步:决定我们要输出什么信息,这个是 output gate 的工作。如下图所示:
首先我们利用一个 Sigmoid 层决定我们要输出哪些信息。然后我们把第三步的新的信息放入一个 tanh 层中(把值置为 -1 到 1 之间),然后二者相乘。最终就能得到我们想输出的值。
由此整个 LSTM 的数据流向和基本操作已经学习完毕。但是我们还有个地方需要注意!
如果你有仔细看基本结构划分的黑白图,会发现里面多了几个框,也就是 U 和 W 的框。这个其实就是我们的神经网络的权重。需要注意的一点是,这里的三组 U 和 W 是各不相同!也就是第一组实际上应该是 \(U_f\) 和 \(W_f\) ;第二组实际上应该是 \(U_i\) 和 \(W_i\) ;第三组实际上应该是 \(U_o\) 和 \(W_o\)。之前讨论过的公式,最终应该为下图右边表示的公式:
GRU 简介门控循环单元(Gated Recurrent Unit, GRU), 是 LSTM 的一个比较经典的变种。在上面的传统LSTM中有三个门控单元,但是在GRU中只有两个门控单元,分别为更新门和重置门,结构变的更加的简单了。所以和LSTM相比,它更容易计算。如下图所示: