原文:Understanding LSTM Networks — colah’s blog
递归神经网络
人类不会总是都从零开始思考。在读这篇文章的时候,你根据之前看到词的理解来理解新的词,而不会忘记所有的,从头开始。你的思维是连贯的。
传统的神经网络做不到这一点,这也是其主要缺点之一。例如,假设你为电影里发生的事件分类,传统的神经网络没法使用电影中之前的时间来判断后面的事件。
递归神经网络能够解决这个问题:在网络之间构成循环来达到保存信息的目的。
上图是一个递归神经网络A,它从输入xt 计算输出 ht ,并且通过一个循环来把信息传到下一步计算。
这些循环使得递归神经网络看上去很神秘。其实如果你仔细想想,它们和普通的神经网络没有什么不同:递归神经网络可以看成是多个同样的网络串联起来,每个网络将信息传递到下一个。我们把循环展开就是
这种串联性质显示了递归神经网络和序列、列表的密切关系。这种结构的神经网络自然非常适合应用在序列、列表之类的数据上。
当然已经是已经在使用了。在近些年,递归神经网络被成功地应用在语音识别,语言建模,翻译,图像解释 等等问题。Andrej Karpathy 的博客 The Unreasonable Effectiveness of Recurrent Neural Networks 给出了许多精彩的例子。
特别地,这些成功的例子使用LSTM(长短期记忆网络)——一种对于许多问题都优于标准递归神经网络的特殊的实现——几乎所有的令人兴奋的结果都是用它取得的。LSTM,它就是本文研究的对象。
长距离关联问题
递归神经网络吸引人是因为它们可能可以使用之前的信息:如使用之前视频帧来理解当前帧。如果递归神经网络能够做到这点,它们将会非常有用。但是可以吗?要分情况来看。
有时我们只需要看最近的信息来完成当前的任务。比如,试图根据已经出现的单词来预测下一个词的语言模型。如果我们想预测“云在天上”中的最后一个词,我们不需要更多的信息——很明显下一个词是“上”。这种情况下,在相关信息和需要这些信息的距离很小,递归神经网络可以使用之前的信息来学习。
但是有些情况下,我们需要更多信息。假如要预测“我在法国长大……我会说流利的法语”一句中最后的词。从最近的信息可以得出最后一个词是一种语言的名字,但是如果我们想确定是哪种语言,我们需要关于法国的上下文。这样相关信息和需要这些信息的距离就会很大。
不幸的是,这个距离越大,递归神经网络就越难学习。
理论上,递归神经网络完全可以处理这种“长距离关联”问题。精心挑选递归神经网络的参数可以解决一些“玩具问题”。但在实际应用中,递归神经网络没法学习。这个问题Hochreiter (1991) 和 Bengio, et al. (1994) 有深入的研究,揭示了为什么困难的一些本质。
幸运的是LSTM没有这个问题!
长短期记忆网络LSTM
长短期记忆网络——通常简称为LSTM——是一种能够学习长距离关联的递归神经网络。最早由Hochreiter & Schmidhuber (1997)引入,并经许多人的改良和推广。
LSTM是特别地设计来解决长距离关系问题。长时间记住信息是其默认的行为,不需要特别地学习。
所有的递归神经网络具有串联的神经网络的形式。在标准的递归神经网络,串联的模块的结构非常简单,比如单层tanh。
LSTM也有类似的串联结构,但是串联的模块的结构不同。取代单层神经网络,而是四层网络通过非常特殊的方式联系起来。
不用担心这些细节,我们下面一步一步地分析。现在我们先熟悉下将用使用的图标。
上图中,箭头代表整个向量,从一个节点的输出到另一个节点的输入。粉红色的圆圈表示逐点操作,例如向量相加,黄色的矩形代表神经网络的一层。合并的箭头表示合并操作,分支箭头表示复制内容到不同的地方。
LSTM的核型思想
LSTM的关键是元状态,在图中表示为贯穿图的上部的水平线。元状态就像输送带,直接贯穿整个串联的网络,并且只有很小的非线性,这使得信息非常容易传播且保持不变。
LSTM具有向元状态添加和移除信息的能力,这通过成为门的结构来实现。控制信息是否通过的单元叫做门,它们由S函数和逐点乘法操作构成。
S函数输出0到1之间的数值来描述多少信息应该通过。0表示“任何信息都不能通过”,1表示“所有的信息都通过”。
一个LSTM具有三个这样的门,来保护和控制元状态。
LSTM分部详解
LSTM第一步决定我们需要把哪些信息从元状态中去掉。这个决定由称为“遗忘层”的门决定。遗忘层根据 ht-1 和 xt 为元状态Ct-1中的每个数值计算一个0到1的数值。1表示“完全保留”,0表示“完全忘记”。
我们再来看一下预测单词的例子。这个问题中,元状态可能包含当前主语的性别信息,这样就可以使用正确的代词。当我们看到一个新的主语,我们需要忘记之前主语的性别。
第二步是决定哪些信息需要保存在元状态中,这分为两部分。首先,一个成为“输入层”的S函数层决定我们将更新哪些值。接着,一个tanh层计算出新的元状态的备选值 。接下来,我们将这两个结果结合起来更新元状态。
在语言模型的例子中,我们希望把新主语的性别加入到元状态中,取代我们忘记的。
现在我们更新旧的元状态 Ct-1 为 Ct 。之前的计算已经决定应该做什么,我们只需要照做就行了。我们用旧状体乘以ft ——忘记之前我们决定忘掉的,然后加上 —— 新的信息取决于我们决定更新的元状态。
在语言模型的例子中,这是我们实际操作忘记旧主语的性别并加入新信息的步骤。
最后,我们需要决定最终的输出。最终输出取决于元状态,但是是过滤后的版本。首先,我们使用S函数层决定元状态的哪些部分作为最终输出。然手,把元状态经过tanh 层(归到-1到1之间) 并乘以S函数的结果,就只得到我们想要输出的部分。
在预测单词的例子中,因为见到的是主语,所以可能的输出和动词相关,并且可预测应该使用单数还是复数形式。
LSTM的变种
我们之前描述的LSTM是非常普通的LSTM,但是并不是所有的LSTM与之同样。实际上,几乎每篇论文使用略有变化的LSTM版本。这些变化虽然很小,但是非常值得讨论。
一种非常流行的LSTM变种,由Gers & Schmidhuber (2000) 引入,增加了“窥视连接”。这使得门使用元状态作为输入。
上图中所有的门都增加了“窥视连接”,但是很多论文只是给有些门增加。
另一个变种是使用耦合的遗忘和增加门。把分别决定遗忘和增加新信息合为一步。我们只在加入新信息的时候忘记旧信息,只在忘记旧信息的时候加入新信息。
一个较大变化的变种称为“门递归单元” GRU, 由 Cho, et al. (2014) 引入。这个变种合并遗忘和增加门为一个“更新门”,并把元状态和隐含状态合并,以及其它一些变化。这使得模型变得非常简单,并变得非常流行。
以上是几个非常值得关注的LSTM变种。还有很多其他变种,如 Yao, et al. (2015) 的Depth Gated RNNs。 还有一些其他完全不同的方法来处理长距离关联问题,例如 Koutnik, et al. (2014) 的 Clockwork RNNs。
哪个变种最好?这些变化有用吗?Greff, et al. (2015) 将一些流行的变种作了比较,发现它们几乎一样。Jozefowicz, et al. (2015) 测试了超过一万个递归神经网络,发现有些在某些问题上优于LSTM。
小结
人们使用递归神经网络取得了非常出色的结果。特别是使用LSTM,大多数情况下它们工作的更好。
写下一堆公式,LSTM看上去很吓人。希望分布详解更容易理解一些。
LSTM是递归神经网络的一大进步,自然会问:还有另一个大进步吗?研究人员的普遍观点是:“Yes!下一步是关注。” 核心思想是让递归神经网络从更大的信息集合中提取信息。例如,如果你想使用递归神经网络为图像加注释,只把图像中的一部分拿出来作为结果。实际上Xu, et al. (2015) 正是这么做的——这是探索关注一个非常有趣的起点。还有很多非常令人兴奋的结果,而且会有更多。
关注并不是递归神经网络的唯一分支。例如,Kalchbrenner, et al. (2015) 的 Grid LSTM 看上去很棒。把递归神经网络应用在生成模型上——如Gregor, et al. (2015), Chung, et al. (2015), 或者 Bayer & Osendorfer (2015) —— 也非常有趣。近些年是递归神经网络令人兴奋的时光,并且将来看上去会更加令人兴奋。