本文为《Understanding LSTM Networks》翻译
循环神经网络
人类不会一直从头开始思考。当你看这篇文章的时候,你实际上是根据上一个词来理解这一个词的。你不会每时每刻从头开始理解一句话,因为你的思考具有持久性。
传统神经网络做不了这些东西。但是循环神经网络可以做到,它可以使信息持久化。
循环神经网络有个循环
这是RNN的一个块,A。输入xt输出ht。
RNN可以被想象成一个网络的多个复制,每一个网络都可以把信息传递给下个继承者。当我们把上图展开的话,会发生什么?
展开的RNN
通过这个链式的结构可以看到,RNN对于那种一系列的或者是列表的数据联系紧密。
RNN中最成功的当属LSTMs,一种特殊的RNN结构,它在很多方面的作用远远大于RNN,绝大部分的RNN成果都是基于LSTM的。
长期依赖的问题
RNN其中的一个亮点就是它可以将当前的任务和之前的依据信息连接起来,就像看电影时,将现在的场景和之前的情节连接起来了一样。如果RNN可以做这种事情的话,它会非常实用。但是RNN可以吗?这视情况而定。
有时候,我们仅仅需要获取最近的一些信息来完成我们当前的任务。例如,根据上一个词来预测下一个词是什么。比如我说了一句“苟”,我们不需要知道什么更深层次的信息,就可以猜想出来接下来的话。“苟”被称为预测所需要的依赖(Dependencies)。在这种情况下,处理的相关信息间隔就比较短,所需空间也比较少,RNNs可以学会使用之前的信息。
但是有时候我们需要更多的信息。你试着预测一下女朋友说“你决定吧”的下一句会是什么。这就比较难了,你需要根据之前的对话来猜想,女朋友到底是生气了,故意说“你决定吧”还是仅仅因为你们出去吃饭,女朋友让你决定吃什么。在这种情况下,预测出女朋友下一句话所依赖的信息(也就是你和你女朋友之前的对话)可能间隔非常非常大,甚至可能是因为一个月前你们决定吃什么时闹的矛盾。
在这种情况下,随着间隔的增大,RNN需要存储的信息也越来越多,能力也随之捉襟见肘。
理论上,RNNs可以存下来你和你女朋友发生的所有的事情,然后来分析女朋友说的“你决定吧”下一句可能是什么。但我们也知道这不太可能。
但LSTM可以解决这个问题。
LSTM网络
LSTMs全称为长短时记忆网络,是RNN的一种类型,可以解决长期依赖的问题。它解决了很多问题,直到现在也在被广泛使用。
LSTM就是被设计用来解决长期依赖问题的。记住很久前的信息对它来说只是基本操作,根本不需要用力。
所有的循环神经网络都有一个重复的神经网络的链式模型。在标准的RNNs中,这个重复的神经网络模型有着非常简单的结构,例如只有单个tanh层。
LSTM也有相似的链式结构,但是单个神经元模型有着不同的结构。它不是单个tanh层,它有4个交互的层。
别害怕,虽然它现在看起来复杂,但是我们会一步一步给你讲解这张图代表的是什么意思。首先我们先解释一下标记的含义。
黄块就是神经网络层,粉球球就是点态,点态的大概意思就是向量相加之后生成的那个向量,别的符号都很简单就不说了。
LSTMs的核心思想
LSTMs的关键就是cell state(这个不知道怎么翻译,细胞状态?),下面这张图的水平线展示了什么叫做cell state。
cell state像个传送带,它穿过整个链,只有很少的线性交互。
LSTM可以轻松地添加或者移走信息,从cell state上,这个操作是由gates结构仔细地控制着的。
gates是控制信息通过的方式,是由sigmoid神经网络层和一个点态乘法操作组成的。
sigmoid层输出0到1之间的一个数字,这个数字代表着每个部分可以通过多少。0代表着没人能通过,1代表着全都通过。
一个LSTM有3个这样的gates,来保护和控制cell state。
LSTM详细工作原理
LSTM的第一步就是决定什么信息能从cell state里通过。这个是由一个被称作“遗忘门”的sigmoid层决定的。它像底下图里Ct-1的那个ht−1和xt,输出一个0到1之间的数字。1代表着完全保留这个,0代表着完全扔掉这个。
再回到我们预测下一句的语言模型来。针对这种问题,cell state也许包含了上个月你女朋友和你约会的细节,所以正确答案也许能被选出来。然后你和你女朋友分手,交了下一个女朋友,它也许会忘记曾经你们的那次约会。
下一步就是决定我们应该把什么信息存储在cell state里面。这分成了两部分。第一步,有一个被称作“输入门”的sigmoid层决定了哪些值我们应当更新。接下来,一个tanh层创建了一个候选值C~t,这个候选值可能被添加到state里。第二部,我们会合并这两个值来更新state。
在语言模型的那个例子里,就是我们想要添加新女朋友的信息到cell state里,来替换你想要忘记的前女友。
现在是时候更新旧的cell state了,Ct-1,把它换成新的cell state Ct!上面讲的那些已经说了如何去做,现在我们来实际完成它。
我们将旧状态Ct-1乘上ft,忘记那些我们早应该忘记的东西。紧接着,加上it乘以Ct。这是个新的候选值,它的值取决于我们对state值想要更新多少。
在语言模型的那个例子里,这里就是我们要忘记前女友,添加新女友的地方,正如我们前一步决定的那样。
最后,我们需要决定我们要输出什么。这个输出取决于现在的cell state,但是将会是被过滤后的版本。首先,我们运行一个sigmoid层,这个层决定了cell state的哪个部分我们要输出出去。然后,我们让cell state通过tanh(用来将输出值保证在-1到1之间),再之后,将这两个数字相乘。这样的话,我们只输出了我们想要输出的那一部分。
在语言模型的那个例子里,这就像新女友也说了一句“你决定吧”之后,你可以根据前女友的经验和现在的经历共同决定到底要说什么,也就是输出什么。
这就是全部的LSTMs。
LSTM的变种
之前介绍的都是最初的LSTM。但是不是所有的LSTM跟上面介绍的那些一样。事实上,目前几乎所有论文所谈论到的LSTM都跟最初的LSTM有些不一样。我们来讲讲那些不同。
其中一个流行的LSTM变种,加入了“猫眼连接”。这意味着我们让gete层盯着cell state。
上面的这个图就是在所有的gates上面加了个猫眼。但是许多论文都是一些加一些不加。
另一个变种使用了相互连接的遗忘和输入层。之前的LSTM是分开决定什么应该被遗忘,什么应当被输入,而这个变种让他们一起被决定。我们只在替换的情况下,才会遗忘。我们也只是在忘掉什么的时候才向state输入新值。
一个最牛逼的LSTM变种就是门循环单元(Gated Recurrent Unit)被称作GRU。它将遗忘门和输入门结合而成了一个更新门。它还合并了cell state和hidden state,和另外一些小改变。最终的模型比LSTM更简单,也更流行。
这只是其中一些的介绍,还有一些其他的,比如Depth Gated RNNs等。还有一些完全不同的实现,像Clockword RNNs。
哪个变种是最好的?这些改进真的更好吗?有人做了变种的对比,发现都差不多。还有人测试了上万个RNN结构,发现的确有些结构在特定的任务上稍强一点。和