长短期记忆网络(LSTM)简述

来源:互联网 发布:mysql数据库连接url 编辑:程序博客网 时间:2024/05/29 09:05

本文是学习LSTMs入门知识的总结。

LSTM(Long-Short Term Memory)是递归神经网络(RNN:Recurrent Neutral Network)的一种。
RNNs也叫递归神经网络序列,它是一种根据时间序列或字符序列(具体看应用场景)自我调用的特殊神经网络。将它按序列展开后,就成为常见的三层神经网络。常应用于语音识别。

虽然前馈神经网络取得很大成功,但它无法明确模拟时间关系,并且所有数据点都是固定长度的向量。所以就诞生了递归神经网络,递归即自我调用,递归神经网络与其他网络的不同之处在于它的隐含层是能够跨越时间点的自连接隐含层,隐含层的输出不仅进入输出端,还进入了下一个时间步骤的隐含层,所以它能够持续保留信息,能够根据之前状态推出后面的状态。
按时间序列展开RNN
RNN每个时间状态的网络拓扑结构相同,在任意t时间下,包含输入层、隐含层、输出层。RNN的隐含层的输出一分为二,一份传给输出层,一份与下一时刻输入层的输出一起作为隐含层的输入。RNN的激活函数仍为sigmoid函数或tanh函数。
RNN与BPNN对比图

RNN展开图

RNN局部放大

举一个应用RNN预测单词的案例:

假设我们只有四种字母的词汇“helo”,然后我们想要用训练序列“hello”训练一个RNN。这个训练序列实际上是来自于4个独立的训练案例:
1. 字母e应该在字母h出现的情况下才可能出现,
2. 字母l应该出现在he出现的情况下,
3. 字母l同样可以出现在hel出现的情况下,
4. 字母o应该出现在hell出现的情况下。

用“hello”训练RNN
采用1-of-k编码(按字符索引顺序,1表示输入字符在该索引位置,0表示不在)将每个字符编码成一个向量,然后用每次向RNN中输入一个字符。然后我们会看到一个4维序列的输出向量(每个字符代表一个维度),我们将此作为RNN分配给序列下一个字符的置信度。选用三层RNN网络,输入输出层为4维(即4个单元),隐含层为3维。可以看出,在第一次执行时,RNN读取到字符“h”然后将它之后可能出现字符“h”的置信度设置为1.0,可能出现字符“e”的置信度设置为2.2,可能出现字符“l”的置信度设置为-3.0,可能出现字符“o”的置信度设置为4.1。因为在我们的训练数据中,下一个出现的字符是“e”,我们将要提高这个字符的置信度(绿色数字)并且降低其他字符的置信度(红色数字)。通常的做法是使用一个交叉熵损失函数,这相当于在每个输出向量上使用Softmax分类器,将下一个出现的字符的索引作为一个正确的分类。本案例中采用小批量随机梯度下降训练。

RNN也有缺点,跨时间步的反向传播扩展会有梯度消失问题,即后面时间步的错误信号不能回到足够早的时间步,这样RNN就不能学习长时间度的问题。于是1997年,Sepp Hochreiter和Jurgen Schmidhuber提出了长短期记忆(LSTM)模型,这个模型中,常规的神经元被存储单元替代,每个存储单元由输入门、输出门、自有状态组成。
LSTM神经元
标准RNN的重复模块只包含一个tanh函数:
RNN
LSTM中的重复模块包含四个相互作用的激活函数(三个sigmoid,一个tanh):
(图中每条线表示一个完整向量,从一个节点的输出到其他节点的输入。粉红色圆圈代表逐点操作,比如向量加法,而黄色框表示门限激活函数。线条合并表示串联,线条分差表示复制内容并输出到不同地方。)
LSTM
下面分析LSTM工作原理:
存储单元中管理向单元移除或添加的结构叫门限,有三种:遗忘门、输入门、输出门。门限由sigmoid激活函数和逐点乘法运算组成。前一个时间步骤的隐藏状态,一个送到遗忘门(输入节点),一个送到输入门,一个送到输出门。就前传递而言,输入门学习决定何时让激活传入存储单元,而输出门学习合适让激活传出存储单元。相应的,对于后传递,输出门学习何时让错误流入存储单元,输入门学习何时让它流出存储单元。
LSTM存储单元
LSTM核心是单元状态,即传过图中的水平线,下图所示为t-1状态到t状态。

单元状态
正向传递第一步:遗忘门限层,决定哪些信息从单元状态中抛弃。公式中,括号左边的σ是sigmoid函,W是连接权重矩阵,其下标对应那条连接,W_f是遗忘门(forget)连接的权重矩阵,h_t-1是隐含层上一个时间节点的输出,x_t是t时刻输入层的输出,b_f是遗忘门的偏移值。下面的公司依此类推。

第二步:决定单元状态中保存哪些新信息。分为两步:生成临时新状态、更新旧状态。
i为输入门的输出,决定哪些值需要更新; C’t 是临时状态,包含新候选值。


旧状态Ct-1 乘以ft,忘记决定要忘记的,再加上新的候选值it*C’t ,就得到新的状态。

第三步决定要输出什么:
首先通过sigmoid函数决定哪些需要输出,再将单元状态输入到tanh函数(将值转化为-1到1之间),再乘以sigmoid门限值,得到输出。

上面讨论的是最标准的LSTM,但实际应用中会稍加改动,常见的LSTM变体如下:
1. 2000年Gers和Schmidhuber提出加入窥视孔连接,即将单元状态也作为门限层的输入。

2. 藕合遗忘和输入门限,不单独决定遗忘哪些、添加哪些,而是一起做决定,在输入时才遗忘:

3. 2014年,Cho等提出门限递归单元GRU。将以往和输入门限结合输入到单个“更新门限”中,还将单元状态和隐藏状态合并。

4. 其他的还有深度门限RNN、关注点RNN(即让RNN中每一步都从更大的信息集中挑选信息作为输入)等。


参考文献:
1. 深入浅出LSTM神经网络:http://www.csdn.net/article/2015-06-05/2824880
2. 递归神经网络不可思议的有效性:http://yuedu.163.com/news_reader/#/~/source?id=426f1ed9-b19b-44f5-bcad-9f58930fc65e_1&cid=e26730167cd644e1a11f156aec324823_1
3. 理解长短期记忆网络:http://www.csdn.net/article/2015-11-25/2826323

0 0
原创粉丝点击