1. RNN和LSTM结构对比

RNN:

循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好地解决这类问题。

TMS320C6000 神经网络 神经网络slam_lstm

LSTM:

长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。

TMS320C6000 神经网络 神经网络slam_TMS320C6000 神经网络_02

其中的符号:

TMS320C6000 神经网络 神经网络slam_深度学习_03

注意:上面的四个黄框,每一个都是普通的神经网络,激活函数就是上面标注的。

TMS320C6000 神经网络 神经网络slam_TMS320C6000 神经网络_04

从上图也可以看出,原来的一个RNN cell只需要存储一个隐藏层状态h,而一个LSTM cell需要存储两个状态c和h。

TMS320C6000 神经网络 神经网络slam_lstm_05

LSTM比RNN多了一个细胞状态,就是最上面一条线(也就是c),像一个传送带,信息可以不加改变的流动。即Ct-2可能和Ct+1存储的信息可能非常相似,所以LSTM可以解决RNN不能长依赖的问题。其中C是长时记忆,h是短时记忆或者工作记忆。

从上面也可以看出,LSTM一个cell有三个输入,分别为上一层的的两个输出h和C,本层的输入x;有两个输出,C和h,都作为下一层的输入。

2. LSTM出现的原因

传统RNN的激活函数用的是sigmoid,它会将+∞~-∞之间的输入压缩到0~1之间。当input的值更新时,output会有很小的更新。

又因为上一层的输出将作为后一层的输入,而输出经过sigmoid之后更新速率会逐步衰减,直到输出层才会有微乎其微的更新。

从数学的角度出发,sigmoid函数在0的位置取得最大值1/4,当我们使用均值为0,方差为1的高斯分布初始化参数w,有|w|<1。

随着网络层数的加深,w的变化幅度会呈1/4的指数衰减,使得最后学不到东西,造成梯度弥散。

同样,当|w|>1,w变化幅度会指数递增,最后造成梯度爆炸。

解决办法:

(1)使用relu函数:比sigmoid要好一些,但是有时还是会产生梯度消失;

(2)加入BN(Batch Normalization)层

   ——加速收敛;

   ——控制过拟合,可以少用或者不用Dropout和正则;

   ——降低网络对初始化权重不敏感;

   ——允许使用较大的学习率;

3. LSTM信息的流动

TMS320C6000 神经网络 神经网络slam_深度学习_06

一个LSTM cell有3个门,分别叫做遗忘门(f门),输入门(i门)和输出门(o门)。要注意的是输出门的输出ot并不是LSTM cell最终的输出,LSTM cell最终的输出是ht和ct。

这三个门就是上图中三个标着σ的黄色的框。sigmoid层输出0-1的值,表示让多少信息通过,1表示让所有的信息都通过。

LSTM的输入:

TMS320C6000 神经网络 神经网络slam_数据_07


LSTM的输出: 

TMS320C6000 神经网络 神经网络slam_lstm_08

上图公式中的*是元素乘,不是矩阵乘法。

4. 结构解释

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

TMS320C6000 神经网络 神经网络slam_神经网络_09

第一步是决定从细胞状态里扔掉什么信息,也就是保留多少信息。将上一步细胞状态中的信息选择性的遗忘。遗忘的数据作为本细胞状态的一部分,待会共同与新数据拼凑成本细胞状态

TMS320C6000 神经网络 神经网络slam_数据_10


实现方式为:通过sigmoid实现的忘记门。以上一步的输出ht-1和这一步的xt作为输入,输出为ft。即为Ct-1里的每一个数字输出一个0~1之间的值,记为ft,表示保留多少信息(1表示完全保留,0表示完全舍弃)。

例子:以预测语言模型为例。在这个例子中,细胞状态可能包含当前主语的类别,因此正确的代词可能被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

例如,他今天有事,所以我… ,当处理到‘’我‘’的时候选择性的忘记前面的’他’,或者说减小这个词对后面词的作用。

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

TMS320C6000 神经网络 神经网络slam_数据_11

接受本层输入ht-1和xt,产生两个值,第一个通过sigmoid层产生的概率it,第二个通过tanh产生的候选值向量

TMS320C6000 神经网络 神经网络slam_数据_12

,作为本cell细胞状态的组成部分。

此步决定在细胞状态存什么,即有第一部分旧信息后,将新的信息选择性的存到细胞状态中,实现方式:

     ——sigmoid层(输入门层)决定我们要更新什么值,这个概率表示为it

     ——tanh层创建一个候选值向量

TMS320C6000 神经网络 神经网络slam_数据_12

,将会被增加到细胞状态中。 我们将会在下一步把这两个结合起来更新细胞状态。

例子:在我们语言模型的例子中,我们希望增加新的主语的类别到细胞状态中,来替代旧的需要忘记的主语。 例如:他今天有事,所以我…

当处理到‘’我‘’这个词的时候,就会把主语我更新到细胞中去。

(3)更新细胞状态

TMS320C6000 神经网络 神经网络slam_TMS320C6000 神经网络_14

首先注意上面公式中的 ∗ 是对应元素乘,而不是矩阵的乘法。

更新旧的细胞状态 实现方式:ft 表示忘记上一次的信息Ct−1的程度,it表示要将候选值

TMS320C6000 神经网络 神经网络slam_数据_12

加入的程度, 这一步我们真正实现了移除哪些旧的信息(比如一句话中上一句的主语),增加哪些新信息,最后得到了本细胞的状态Ct。

(4)输出层门

TMS320C6000 神经网络 神经网络slam_深度学习_16

最后,我们要决定作出什么样的预测。 实现方式:

      ——我们通过sigmoid层(输出层门)产生的概率ot来决定输出的本细胞状态 Ct 的哪些部分;

      ——然后我们将细胞状态通过tanh层(使值在-1~1之间),然后与sigmoid层的输出ot相乘得到最终的输出ht。

所以我们只输出我们想输出的部分。 例子:在语言模型的例子中,因为它就看到了一个代词,可能需要输出与一个动词相关的信息。例如,可能输出是否代词是单数还是复数,这样如果是动词的话,我们也知道动词需要进行的词形变化。

例如:上面的例子,当处理到‘’我‘’这个词的时候,可以预测下一个词,是动词的可能性较大,而且是第一人称。 会把前面的信息保存到隐层中去。

粘贴一张图,比较详细:

TMS320C6000 神经网络 神经网络slam_lstm_17

总结:

——所以可以看出,本层的Ct是由上层的旧信息(一部分)和本层的新信息拼合而成。旧信息为上一个cell的一部分细胞状态Ct-1(因为乘了个概率ft),新信息为本cell的输入层门的tanh层创建的候选值向量

TMS320C6000 神经网络 神经网络slam_数据_12

和概率

TMS320C6000 神经网络 神经网络slam_深度学习_19

(由sigmoid决定的一个0~1的概率)决定。——可以看出,LSTM的公式中有三个概率值,即通过三个sigmoid得到的ft, it和ot。第一个概率ft与上个cell的细胞状态Ct-1相乘,取一部分上个cell的细胞状态信息作为本cell的细胞状态信息组成的第一部分;第二个概率it与tanh层产生的候选值向量

TMS320C6000 神经网络 神经网络slam_数据_12

相乘,得到本cell的细胞状态的第二部分,与第一部分相拼合得到了本cell的细胞状态Ct,作为第一个输出参数即将传下去到下一个cell;第三个概率ot与通过tanh函数的本层细胞状态Ct相乘,作为本层的输出ht,作为第二个输出参数传到下一个cell。——可以看出,一个cell中有三个sigmoid,产生三个概率值;两个tanh,第一个产生本层的候选值向量

TMS320C6000 神经网络 神经网络slam_数据_12

,第二个将本cell的状态信息Ct进行处理,作为输出ht。三个概率值和候选值向量

TMS320C6000 神经网络 神经网络slam_数据_12

的产生都是和本cell的输入ht-1与xt有关的。

5. LSTM中的变量

TMS320C6000 神经网络 神经网络slam_神经网络_23

是element-wise乘,即按元素乘

介绍下各个变量的维度,LSTM cell的输出

TMS320C6000 神经网络 神经网络slam_数据_24

的维度是黄框里隐藏层神经元的个数,记为d,即矩阵

TMS320C6000 神经网络 神经网络slam_神经网络_25

的行数。t 时刻LSTM cell的输入xt的维度记为 n,最终的输入是

TMS320C6000 神经网络 神经网络slam_数据_26

和xt的联合,即[

TMS320C6000 神经网络 神经网络slam_数据_26

,xt] ,其维度是d+n,所有矩阵(包括

TMS320C6000 神经网络 神经网络slam_神经网络_25

)的维度都是[d,d+n],所有的向量包括(

TMS320C6000 神经网络 神经网络slam_数据_29

)维度都是d。(为了表示、更新方便,我们将bias放到矩阵里)以

TMS320C6000 神经网络 神经网络slam_深度学习_30

举例:

TMS320C6000 神经网络 神经网络slam_神经网络_31

同理:

TMS320C6000 神经网络 神经网络slam_神经网络_32

合并为一个矩阵就是:

TMS320C6000 神经网络 神经网络slam_数据_33