LSTM网络介绍

来源:互联网 发布:诺基亚n8下载软件 编辑:程序博客网 时间:2024/06/05 22:44

文章参考1

文章参考2

循环神经网络(Recurrent Neral Networks)介绍

 

人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。传统的神经网络并不能做到这点,看起来也像是一种巨大的弊端。例如,假设你希望对电影中的每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题——使用电影中先前的事件推断后续的事件。RNN 解决了这个问题。RNN 是包含循环的网络,允许信息的持久化。

如右图:
A正在读取某个输入 xt,并输出一个值 ht。
循环可以使得信息可以从当前步传递到下一步。这些循环使得 RNN 看起来非常神秘。

下图便是一个典型的RNNs: 

 

 

 

       

  • RNN 可以被看做是同一神经网络的多次赋值,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开
  • RNN的目的就是使用来处理序列数据的。

变得非常困难的相当根本的原因。然而,幸运的是,LSTM并没有这个问题!

长期依赖(Long-Term Dependencies)问题

假设我们试着去预测“I grew up in France...I speak fluentFrench”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。

                 


  • 在理论上,RNN 绝对可以处理这样的 长期依赖 问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。 Bengio, et al. (1994) 等人对该问题进行了深入的研究,他们发现一些使训练 RNN

LSTM网络

Long Short Term 网络——一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息

  • 所有的RNN都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

标准RNN 中的重复模块包含单一的层


 

    

 

  • LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

 

 

 

LSTM中的重复模块包含四个交互的层。

 

LSTM的核心思想

  • LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

 

 

  • LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。

                                                                                   

Sigmoid层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”

LSTM拥有三个门,来保护和控制细胞状态。

 

逐步理解 LSTM

  • 丢弃信息

决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为 忘记门层 完成。该门会读取 h_{t-1}和 x_t,输出f_t在 0 到 1之间的数值给每个在细胞状态C_{t-1}中的数字。1 表示“完全保留”,0 表示“完全舍弃”。

在这个问题中,细胞状态可能包含当前 主语 的类别,因此正确的 代词 可以被选择出来。当我们看到新的 代词 ,我们希望忘记旧的代词

 

    

 

 

  • 确定什么样子的新信息并更新

下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。

第一,sigmoid层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh层创建一个新的候选值向量,\tilde{C}_t,会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。

在我们语言模型的例子中,我们希望增加新的代词的类别到细胞状态中,来替代旧的需要忘记的代词。

确定更新的信息

现在是更新旧细胞状态的时间了,C_{t-1}更新为C_t。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。

我们把旧状态与f_t相乘,丢弃掉我们确定需要丢弃的信息接着加上i_t * \tilde{C}_t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的类别信息并添加新的信息的地方。

 

  • 更新细胞状态,输出下一个词信息

最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分

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

输出预测

 

原创粉丝点击