在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。
相关信息和当前预测位置之间的间隔就肯定变得相当的大,RNN训练会变得很困难。
LSTM网络
LSTM网络可以学习长期依赖信息。为了解决长期依赖问题而生。
举个例子:
“菜的口味嘛,其实我是经过朋友介绍决定来尝一下这里的,还不错。“
标准的RNN结构:
LSTM结构:
核心思想
LSTM的核心思想
LSTMs 的核心所在是 cell 的状态(cell state),也就是下图这条向右的线。
Cell 的状态就像是传送带,它的状态会沿着整条链条传送,而只有少数地方有一些线性交互。信息如果以这样的方式传递,实际上会保持不变。
LSTM 通过一种名为「门」(gate)的结构控制 cell 的状态,并向其中删减或增加信息。
门
门由一个 sigmoid 网络层与一个按位乘操作构成。
Sigmoid 层的输出值在 0 到 1 间,表示每个部分所通过的信息。
0 表示「对所有信息关上大门」;1 表示「我家大门常打开」。
一个 LSTM 有三个这样的门,控制 cell 的状态。
LSTM主要过程
首先,LSTM 的第一步需要决定我们需要从 cell 中抛弃哪些信息。
「遗忘层」
输入: ht-1 和 xt
输出:一个 0 到 1 之间的数。
Ct−1 就是每个在 cell 中所有在 0 和 1 之间的数值,就像我们刚刚所说的,0 代表全抛弃,1 代表全保留。
(我个人理解,Ct-1用来表示细胞的状态,即将被遗忘还是保留)
再拿刚才预测单词的语言模型来举例,cell 的状态可能会需要考虑主语的性别,这样才能找到正确的代词。因此如果我们设定,如果看到了一个新的主语,就「忘记」旧的主语所代表的性别。
下一步,我们需要决定什么样的信息应该被存储起来。
怎么决定?
1.sigmod层(输入门)决定要更新哪些值
2.tanh层生成了一个新的候选向量C’,它能够加入cell的状态中
将1、2中的值结合,更新cell的状态
更新状态
接下来,我们就可以更新 cell 的状态了。将旧状态与 ft 相乘,忘记此前我们想要忘记的内容,然后加上 C`。得到的结果便是新的候选值,依照我们决定的值进行缩放。
确定要输出的内容
这个内容取决于我们的cell状态,但这时经过过滤的版本
首先,我们会运行一个 sigmoid 层决定 cell 状态输出哪一部分。
随后,我们把 cell 状态通过 tanh 函数,将输出值保持在-1 到 1 间。
之后,我们再乘以 sigmoid 门的输出值,就可以得到结果了。
对于语言模型的例子,当它只看到一个主语时,就可能会输出与动词相关的信息。比如它会输出主语是单数还是复数。这样的话,如果后面真的出现了动词,我们就可以确定它的形式了。
LSTM的变体
(遇到过的)有一种变体就是采用一对门,分别叫遗忘门(forget)及输入门(input)。
与分开决定遗忘及输入的内容不同,现在的变体会将这两个流程一同实现。
我们只有在将要输入新信息时才会遗忘,而也只会在忘记信息的同时才会有新的信息输入。
一个比较惹眼的变体为 GRU(Gated Recurrent),由 Cho, et al. (2014) 提出。他将遗忘门与输入门结合在一起,名为「更新门」(update gate),并将 cell 状态与隐藏层状态合并在一起,此外还有一些小的改动。 这个模型比起标准 LSTM 模型简单一些,因此也变得更加流行了。