1. 结构

1.1 比较

RNN:

LSTM:

其中的notation:

1.2 核心思想:

LSTM在原来的隐藏层上增加了一个

The key to LSTMs is the cell state, the horizontal line running through the top of the diagram.

  1. LSTM比RNN多了一个细胞状态,就是最上面一条线,像一个传送带,它让信息在这条线上传播而不改变信息。

The cell state is kind of like a conveyor belt. It runs straight down the entire chain, with only some minor linear interactions. It’s very easy for information to just flow along it unchanged.

  1. LSTM可以自己增加或移除信息,通过“门”的结构控制。
    “门”选择性地让信息是否通过,“门”包括一个sigmoid层和按元素乘。如下图:

sigmoid层输出0-1的值,表示让多少信息通过,1表示让所有的信息都通过。

一个LSTM单元有3个门。

2. 流程

上面一条线lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习是细胞状态,下面的lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_02是隐藏状态 。

其实看多少个圆圈、黄框就知道有哪些操作了。

三个sigmoid层是三个门:忘记门、输入门、输出门。

lstm的bias在反向传播时被原地修改 lstm反向传播推导_LSTM_03

2.1 忘记门:扔掉信息(细胞状态)

第一步是决定从细胞状态里扔掉什么信息(也就是保留多少信息)。将上一步细胞状态中的信息选择性的遗忘 。

实现方式:通过sigmoid层实现的“忘记门”。以上一步的lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_04和这一步的lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_05作为输入,然后为lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_06里的每个数字输出一个0-1间的值,表示保留多少信息(1代表完全保留,0表示完全舍弃),然后与lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_06乘。

例子:让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的类别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。
例如,他今天有事,所以我… 当处理到‘’我‘’的时候选择性的忘记前面的’他’,或者说减小这个词对后面词的作用。

2.2 输入层门:存储信息(细胞状态)

第二步是决定在细胞状态里存什么。将新的信息选择性的记录到细胞状态中。

实现方式:包含两部分,1. sigmoid层(输入门层)决定我们要更新什么值;2. tanh层创建一个候选值向量lstm的bias在反向传播时被原地修改 lstm反向传播推导_LSTM_08,将会被增加到细胞状态中。 我们将会在下一步把这两个结合起来更新细胞状态。

例子:在我们语言模型的例子中,我们希望增加新的主语的类别到细胞状态中,来替代旧的需要忘记的主语。 例如:他今天有事,所以我… 当处理到‘’我‘’这个词的时候,就会把主语我更新到细胞中去。

2.3 更新细胞状态(细胞状态)

更新旧的细胞状态

实现方式:lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_09lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_10表示保留上一次的多少信息,lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_11表示更新哪些值,lstm的bias在反向传播时被原地修改 lstm反向传播推导_LSTM_08表示新的候选值。候选值被要更新多少(即lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_11)放缩。

这一步我们真正实现了移除哪些旧的信息(比如一句话中上一句的主语),增加哪些新信息。

2.4 输出层门:输出(隐藏状态)

最后,我们要决定作出什么样的预测。

实现方式:1. 我们通过sigmoid层(输出层门)来决定输出新的细胞状态的哪些部分;2. 然后我们将细胞状态通过tanh层(使值在-1~1之间),然后与sigmoid层的输出相乘。

所以我们只输出我们想输出的部分。

例子:在语言模型的例子中,因为它就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是复数,这样如果是动词的话,我们也知道动词需要进行的词形变化。
例如:上面的例子,当处理到‘’我‘’这个词的时候,可以预测下一个词,是动词的可能性较大,而且是第一人称。 会把前面的信息保存到隐层中去。

3. 反向传播

如图上的5个不同的阶段反向传播误差。

1. 维度

先介绍下各个变量的维度,lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_02 的维度是黄框里隐藏层神经元的个数,记为d,即矩阵lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_15 的行数(因为lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_16是输入层的第lstm的bias在反向传播时被原地修改 lstm反向传播推导_LSTM_17个神经元指向隐藏层第lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_18个神经元的参数),lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_19的维度记为n,则lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_20的维度是lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_21,矩阵的维度都是lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_22,其他的向量维度都是lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_23。(为了表示、更新方便,我们将bias放到矩阵里)

lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_24举例:

同理:


合并为一个矩阵就是:

2.一些符号

lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_25

为了表示向量和矩阵的元素,我们把时间写在上标。

lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_26表示lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_27lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_28的偏导。

lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_29

3.两点疑惑

  1. 3.2中 lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_30
  2. 3.5中下划线的是lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_31的函数 ,但lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_32 也是lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_31的函数,不知道为什么不算 。

3.1 lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_34

我们首先假设lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_35 ,这里的lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_27指的是t时刻的误差,对每个时刻的误差都要计算一次。

3.2 lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_37

Forward: lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_38

已知:lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_34

求:lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_37

解:由于


所以

但是 这里提到 lstm的bias在反向传播时被原地修改 lstm反向传播推导_LSTM_41

3.3 lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_42

Forward:lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_43

已知:lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_37

求:lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_42

解:因为


所以:

3.4 lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_46

Forward:lstm的bias在反向传播时被原地修改 lstm反向传播推导_LSTM_47

已知:lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_42

求:lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_46

解:由于

所以:

合并在一起就是:

3.5 lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_50

Forward:


下划线的是lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_51的函数 ,但lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_52 也是lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_51的函数,不知道为什么不算 。

已知:lstm的bias在反向传播时被原地修改 lstm反向传播推导_反向传播_42

求:lstm的bias在反向传播时被原地修改 lstm反向传播推导_神经网络_50

解:


式1是Forward里第一个式子对lstm的bias在反向传播时被原地修改 lstm反向传播推导_深度学习_56求导;式2是Forward里第二个式子对lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_57求导。然后看Forward里的后几个式子,对lstm的bias在反向传播时被原地修改 lstm反向传播推导_LSTM_58求导:


所以(*)式用矩阵计算则为:

3.6 总梯度

lstm的bias在反向传播时被原地修改 lstm反向传播推导_机器学习_59

4.变种

GRU

It combines the forget and input gates into a single “update gate.” It also merges the cell state and hidden state, and makes some other changes. The resulting model is simpler than standard LSTM models, and has been growing increasingly popular.

add peephole

use coupled forget

Another variation is to use coupled forget and input gates. Instead of separately deciding what to forget and what we should add new information to, we make those decisions together. We only forget when we’re going to input something in its place. We only input new values to the state when we forget something older.

其他

These are only a few of the most notable LSTM variants. There are lots of others, like Depth Gated RNNs by Yao, et al. (2015). There’s also some completely different approach to tackling long-term dependencies, like Clockwork RNNs by Koutnik, et al. (2014).

Which of these variants is best? Do the differences matter? Greff, et al. (2015) do a nice comparison of popular variants, finding that they’re all about the same. Jozefowicz, et al. (2015)tested more than ten thousand RNN architectures, finding some that worked better than LSTMs on certain tasks.