“`” Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。如@寒小阳所说:LSTM和基线RNN并没有特别大的结构不同,但是它们用了不同的函数来计算隐状态。LSTM的“记忆”我们叫做细胞/cells,你可以直接把它们想做黑盒,这个黑盒的输入为前状态ht−1和当前输入xt。这些“细胞”会决定哪些之前的信息和状态需要保留/记住,而哪些要被抹去。实际的应用中发现,这种方式可以有效地保存很长时间之前的关联信息。 LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。 LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力! 所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://julyedu-img-public.oss-cn-beijing.aliyuncs.com/Public/Image/Question/1515857524_689.png"">

标准 RNN 中的重复模块包含单一的层 LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://julyedu-img-public.oss-cn-beijing.aliyuncs.com/Public/Image/Question/1515857583_596.png"">

LSTM 中的重复模块包含四个交互的层 不必担心这里的细节。我们会一步一步地剖析 LSTM 解析图。现在,我们先来熟悉一下图中使用的各种元素的图标。

<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://julyedu-img-public.oss-cn-beijing.aliyuncs.com/Public/Image/Question/1515857610_673.png"">

LSTM 中的图标 在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。 四、LSTM 的核心思想 LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。 细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://julyedu-img-public.oss-cn-beijing.aliyuncs.com/Public/Image/Question/1515857686_304.png"">

LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。

<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://julyedu-img-public.oss-cn-beijing.aliyuncs.com/Public/Image/Question/1515857715_135.png"">

Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”! LSTM 拥有三个门,来保护和控制细胞状态。 在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取 h<em>{t-1} 和 x_t,输出一个在 0 到 1 之间的数值给每个在细胞状态 C</em>{t-1} 中的数字。1 表示“完全保留”,0 表示“完全舍弃”。 让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://julyedu-img-public.oss-cn-beijing.aliyuncs.com/Public/Image/Question/1515857798_931.png"">

决定丢弃信息 下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量,\tilde{C}<em>t,会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。 在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。 确定更新的信息 现在是更新旧细胞状态的时间了,C</em>{t-1} 更新为 C_t。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。 我们把旧状态与 f_t 相乘,丢弃掉我们确定需要丢弃的信息。接着加上 i_t * \tilde{C}_t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。 在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。

<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://julyedu-img-public.oss-cn-beijing.aliyuncs.com/Public/Image/Question/1515858026_294.png"">

 

更新细胞状态 最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。 在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。 <img alt=""img"" referrerpolicy=""no-referrer"" src=""https://julyedu-img-public.oss-cn-beijing.aliyuncs.com/Public/Image/Question/1515858060_635.png"">

输出信息

 

<pre><code> "“`

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.