循环神经网络
人类的思考并非每一秒都从零开始。例如当你读这篇文章的时候,你会根据对之前单词的理解来理解后面的每一个单词。你不会抛掉之前所知的一切而重新开始思考。你的思维是有持久性的。
传统的神经网络无法做到这点,这似乎是一个很大的缺憾。然而循环网络解决了这个问题。其是具有循环的网络架构,可以使信息得以留存。
在上图中,一块神经网络
以
为输入,以
为输出。而循环的架构允许信息从网络的一个步骤传递到下一个步骤。
这类循环架构为循环神经网络蒙上了一层神秘的面纱。然而,其实只要稍作思索,即能发现它们和标准的神经网络并没有什么不同。一个循环神经网络可以被认为是同一个网络的多个副本,每个副本都向后传递一条消息。思考一下如果我们展开循环会怎样?
这种链状的特质展现了循环神经网络与序列和列表之间的密切相关性。链状架构是神经网络用于序列和链表数据的最佳架构模式。
并且这种架构名副其实,在过去的几年里,将 RNN 应用到各类问题上取得了令人难以置信的成功:语音识别、语言建模、翻译、图像字幕......它们的表现的确令人叹为观止。
而这些成功的关键因素就是“长短期记忆神经网络(Long Short Time Memory,LSTM)”,这是一种非常特殊的循环神经网络,在许多任务上,它的表现要明显优于标准神经网络。几乎所有基于循环神经网络的振奋人心的成果都是通过 LSTM 实现的。而这篇文章将探讨的正是 LSTM。
长期依赖的困扰
RNN 的一个诱人之处在于,它们能够将之前的信息与当前的任务联系起来,例如我们可以通过之前的视频帧了解当前帧的内容。如果 RNN 能做到这一点,它们将大有用处。但它们能吗?这就得视情况而定了。
有时,我们只需要查看最近的信息就可以执行当前的任务。例如,考虑一个语言模型,它试图根据前面的单词预测下一个单词。如果我们试图预测“the clouds are in the sky”中的最后一个单词,我们不需要任何更远的上下文。很明显,最后一个单词将是“sky”。在这种情况下,相关信息与所需要预测的单词位置之间的跨度很小,RNN 便可以学习使用之前的信息。
但有些情况下,我们需要更多的上下文。考虑预测文本“I grew up in France… I speak fluent French.”的最后一个单词。从最靠近的信息中,能推断出最后一个单词可能是一种语言的名字,但如果我们想要缩小语言的范围,我们就需要更早的关于“France”的上下文。相关信息与我们寻求的预测点之间的跨度完全有可能十分巨大。
不幸的是,随着跨度的增加,RNN 变得难以对信息之间的关联进行有效学习。
理论上来说,RNN 是绝对能够处理这种“长期依赖关系”的。你可以谨小慎微地来为其选择参数来解决上述例子那种形式的问题。然而遗憾的是,在实践中,RNN 似乎无能为力。Hochreiter(1991[德国])对这一问题进行了深入探讨。
令人欣慰的是,LSTM 不存在这种困扰。
LSTM 网络
长短期记忆网络,即 LSTM,是一种特殊类型的 RNN,具有对长期依赖进行学习的能力。
LSTM 被明确地设计为避免长期依赖问题。与 RNN 相比,对信息的长期记忆实际上是 LSTM 与生俱来的能力。
所有循环神经网络的构造都是将神经网络的模块以链式进行重复。这个重复的模块将会有一个非常简单的结构,例如单个
层。
LSTM 也有这种链状结构,但是重复模块的结构却不同。即并非单一的神经网络层,而是四个,并以一种非常特殊的方式相互作用。LSTM中的重复模块包含四个交互层
不要担心细节。稍后,我们将逐步研究 LSTM 图。现在,让我们试着熟悉一下我们将要用到的符号。
在上面的图中,每个黑色的单行箭头代表一个完整的向量,从一个节点的输出到其他节点的输入。粉色的圆圈表示点对点的操作,比如向量加法,黄色的方框表示神经网络层。箭头合并表示连接,而箭头分叉表示内容被复制,且副本被复制到不同的位置。
LSTM的核心思想
LSTM 的核心要素是细胞状态,即贯穿下图顶部的水平线。细胞状态有点像传送带。它沿着整个链直线贯通,只有一些微小的线性相互作用。信息很容易在没有大幅变化的情况下流动。在传递过程中,通过当前时刻输入
、上一时刻隐藏层状态
、上一时刻细胞状态
以及门结构来增加或删除细胞状态中的信息。
细胞状态随时间的信息传递
门是指一种有选择性地让信息通过的方式,即控制增加或删除信息的程度。其由一个 sigmoid 神经网络层和一个点乘运算组成。
sigmoid 层输出
到
之间的数字,描述每个组件应该允许的通过量。
的值表示“不让任何量通过”,而
的值表示“让所有量通过”。
LSTM 有三个这样的门,用来保护以及控制细胞的状态。
逐步解析LSTM
遗忘门:
LSTM 的第一步是决定从上一个细胞状态中丢弃什么信息。这个决定是由一个叫做“遗忘门”的 sigmoid 层做出的。如下图所示,遗忘门的输入为
和
,输出为
。即为细胞状态
中的每个值输出一个相对应的介于
和
之间的值。
表示完全保留,而
表示完全删除。
让我们回到语言模型的例子,即试图根据前面的单词预测下一个单词。在这种情况下,细胞状态可能包含了当前主题的性别特征,以便正确使用代词。然而当我们看到一个新的主题时,我们通常需要忘掉旧主题的性别特征。遗忘门
输入门:
下一步是决定在细胞状态中存储哪些新信息。这分为两个部分。首先,
层创建一个新的打算添加到细胞状态中的候选值向量。其次,一个名为“输入门层”的 sigmoid 层决定候选值中的哪些值应该被添加到细胞状态中。接下来,我们将二者结合来创建细胞状态的更新值。
在我们语言模型的例子中,我们想要在细胞状态中添加新主题的性别特征,以取代我们打算遗忘的旧主题的性别特征。输入门
更新细胞状态:
现在是时候将旧的单元格状态
更新为新的细胞状态
了。前面的步骤已经定好了要做什么,接下来我们只需要实际去做就好了。
我们将旧状态
按元素乘上
,将打算遗忘的内容遗忘掉。同理,我们添