LSTM初探

要说LSTM,那就得先从RNN说起,RNN是一种对序列型数据进行建模的工具,在语音识别,机器翻译等领域有很好的应用。LSTM可以说是RNN的改进版,简单来说,RNN对长距离序列处理时会出现梯度消失或者爆炸这种现象,使得训练不起来(注:梯度消失或者爆炸问题不光在RNN中出现,在其他神经网络中也有,比如在使用sigmoid的激活函数时就可能出现,只不过那边处理的方法可以是替换激活函数,比如为Relu)。

RNN(Recurrent Neural Network)

人类每个时刻都不会从头去想一个问题或者理解一篇文章。正如你在读一篇文章时候,你理解的每一个单词都是基于先前读过的单词。你不会将之前读过的东西都忘了,也不会从头开始,这说明你的部分想法被保存了下来。RNN的思想就是记住先前看过的,形成记忆,并将记忆运用于当前样本的处理,这就表明了当前隐藏层神经元处理接受的数据不光来自输入 X 还有之前的记忆经验。

传统的神经网络并不能处理类似序列的数据问题,这也是它的一个很大的短板。例如,想象你要去判断电影中每一个点发生什么样的事件。传统神经网络是不能将先前的时间运用到当前事件的预测的。

但是RNN解决了这个问题,RNN中有个RNN Cell用来持久化信息。

这里写图片描述

X是输入,A是RNN Cell,h是RNN Cell的输出,A身上有一个循环标志,A使得信息循环的从上一步传递到下一步。

单独看上面的循环A是不太能理解的,但是将它展开来就很清楚了。
这里写图片描述
X0,X1,X2…是一系列时序型输入数据,RNN Cell每一次将之前保存的状态信息传递到下一次,简而言之就是将先前的记忆传递到下一步。

近些年RNN被成功应用到语音识别,语言建模,翻译,图像标注(image captioning)等,具体可以参考下我推荐的第二个博客。

具体的成功应用还得是LSTM,它是RNN的升级版,它更加出色的处理长序列依赖问题,他解决了梯度消失的问题。

LSTM(Long Short Term Memories)

长序列依赖问题

RNN出色的处理序列问题在于它连接了先前的信息用于处理现在任务,例如使用先前的电影画面信息来提示理解现在的电影画面,RNN能做到这些,而且很好。

有时候,我们只需要一些离当前信息比较近的信息来处理当前任务。例如,我们想要预测一句话的下一个单词,如 ‘the clouds are in the XXX’,我们需要去预测sky这个单词,我们不需要离XXX很远的单词,离XXX很近的单词记忆就够了。在这样的例子中,我们需要信息记忆和当前任务是很近的,RNN可以很好的去使用先前的信息。

这里写图片描述

但是有一些情况,我们需要更远处的信息来帮助处理当前的问题。例如,我么要去预测一个单词‘I grew in France,……..I speak fluent XXX(French)’这儿要预测的就是French,RNN要预测处French就要通过很远处的上下文信息来帮助它,这使得当前要处理信息与与之有关的相关信息隔得太远了。

不幸的是对于长距离的上下文信息,RNN不能学会去将两者之间信息连接起来。

在理论上将,RNN有绝对的能力处理长距离依赖。不幸的是,实际上RNN并不能。But,LSTM解决了这个问题。

LSTM Networks

LSTM就是专门设计去解决长距离依赖问题的。记住长距离的信息是他们默认的能力。

所有的RNN 网络中都有一个重复模块,一个简单的模块如下图所示:
这里写图片描述

LSTM也有类似的模块,但重复模块有点不同。不同于单一的神经元,LSTM有四个,以一种特别的方式交互。

这里写图片描述

这里写图片描述

LSTM的核心

LSTM的核心是cell state,如下图所示,它是一条横向贯穿图的直线。
这里写图片描述

LSTM有能力在cell state中移除或者添加信息,由一种叫做门的结构控制着。

门是一种可以有选择的控制信息流通的结构。他们由一个sigmoid神经层和点乘的操作组成。

这里写图片描述

sigmoid层输出0-1之间的数字,用以描述信息的流通量。值为0的话就是代表不让任何信息通过,1代表着让所有信息都流通过。

一个LSTM有三个门来控制着cell state。

一步步理解LSTM

LSTM的第一步是决定抛弃cell state中的哪些信息。这是由一个sigmoid层被称为遗忘门的部件决定的。遗忘门查看了 ht1 xt 并且为cell state Ct1 每个数输出一个0-1之间的数。1代表了全部保留,而0代表全部丢弃。

当我们返回我们的语言模型例子,让我们尝试去基于之前的单词去预测下一个单词。在这样的问题中,cell state可能包含了某个主题的属性(如单复数),所以我们可以使用正确的动词格式。当我们看到新的主题时候,我们想要去忘记旧主题的属性。

这里写图片描述

下一步是要决定在cell state中存储什么新信息。这分为两个步骤。第一步,一个由sigmoid层组成的部件叫输入门来决定什么信息将被更新。接下来,一个 tanh 层创建想要加入信息这里写图片描述,它将被将入到cell state中。在接下来,我们将要将这两部结合起来创建并更新celll state。

在语言建模的例子中,我们想要去添加新主题的属性,用以替换我们忘记的旧主题的属性。
这里写图片描述

现在开始更新旧的cell state 这里写图片描述了,得到新的cell state 这里写图片描述
我们用 ft 乘以旧的状态,忘记我们决定忘记的信息。然后我们添加这里写图片描述。这是新的想要加入的信息。
这里写图片描述

最终,我们需要决定什么样的输出。输出是基于cell state的,但是它将是一个被过滤后的版本。首先,我们运行一个sigmoid层决定哪部分的cell state我们想要输出。然后,我们将cell state经过 tanh (使得值为-1到1之间)并且乘以sigmoid门的输出,最终得到了我们想要输出的部分。
这里写图片描述

LSTM的变种

这里写图片描述

这里写图片描述

这里写图片描述

这儿放上几个我读过的比较好的博客吧:https://r2rt.com/written-memories-understanding-deriving-and-extending-the-lstm.htmlhttp://karpathy.github.io/2015/05/21/rnn-effectiveness/http://colah.github.io/posts/2015-08-Understanding-LSTMs/

猜你喜欢

转载自blog.csdn.net/silence2015/article/details/76774651