RNN教程, Part 1—Introduction to RNNs
这是一个节选翻译
原文地址:http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/
什么是RNN
RNN是为了利用序列化的信息。在一个传统的神经网络中,我们认为所有的输入(和输出)都是不相关联的。但是在很多问题中,这是一个愚蠢的假设。如果你想预测一个句子中下一个出现的单词会是什么,那么这个句子之前出现的单词和要预测的输出有很大关系。RNN之所以是”recurrent”(递归)的,因为它对句子中的每一个元素使用了相同的机制,同时它的输出都和之前的计算有关。从另一个角度理解,RNN具有“记忆功能”,它记住了之前被计算的信息。理论上讲,RNN可以作用在任意长度的句子上,但在实际应用中,我们只会回头看几步。下面的图像是一个典型的RNN的样子。
左边是未展开的RNN网络,右边是展开的RNN网络
通过展开RNN,我们看到这个网络是作用于一个完整的句子的。比如说,我们关注的是一个5个词语的句子,RNN就会被展开成一个5层神经网络,每一层对应一个单词。一个RNN网络中包含的计算如下:
-
xt 是在t 时刻的输入。例如,x1 可以是一个一个句子中第二个单词(第一个单词对应的是x0 )的one-hot vector(一种编码输入的编码方式,给一个长度为N的词典向量,表示这个单词的位置设置为1,其他位置设置为0) -
st 是在时刻t 的隐藏状态。表示网络的“记忆”。st 的计算基于前一个隐藏状态和当前的输入:st=f(Uxt+Wst−1) 。其中函数f 通常是非线性的例如tanh或者ReLU函数。我们需要s−1 来计算第一个隐藏状态s0 ,通常把s−1 设置为全零 -
ot 是时刻t 的输出。例如,如果我们想要预测这个句子下一个单词是什么这个输出将是一个向量,表示的是词典上每一个单词预测的出现概率。ot=softmax(Vst)
softmax函数输出的向量,其所有元素之和为1,关于softmax,可以看这个post: http://neuralnetworksanddeeplearning.com/chap3.html#softmax
以下是一些需要注意的点:
- 你可以把隐藏状态
st 理解为网络的记忆。st 记录了之前时刻的所有的信息。输出ot 只基于t 时刻的记忆。然而在实践中,st 不能记忆太久之前的信息。 -
RNN中隐藏节点共享参数。传统的神经网络每一个节点对应了不同的参数。与传统的深度神经网络不同,RNN网络中的所有节点使用的参数
U,V,W 是一样的。 - 不是每步都有输入,不是每步都有输出。在上图中,每一步都对应了一个输出。但在实际中,这并不是必须的。例如,当预测一个句子的感情时我们只在乎在最后一个单词上的输出,而并不关注整个句子上在前面每一个上输出的感情。相似的,我们也不需要每一步都有一个输入。RNN的关键特征在于隐藏状态,因为隐藏状态保存了句子上的信息。
RNN可以做什么
RNN在自然语言处理上有很大作用。最常用的RNN网络是LSTM。LSTM在保存长距离的相关性上有很好的效果,本质上和RNN是一回事,他们之间的不同只在于计算隐藏状态的方法。在之后我们会更详细地介绍LSTM。在这里先介绍RNN在自然语言处理上的典型应用。
语言模型(language model)和文本生成
在一个句子中,我们想基于前面出现过的词来预测每一个词出现的概率。language models可以让我们知道怎样的词语序列是一个句子,这对机器翻译非常重要(因为在高概率下生成的句子一般都是正确的)。我们在评估一个序列是不是一个句子时,顺便得到了一个生成模型,可以用来预测一个句子中的下一个单词是什么。在language modeling中我们的输入是一串单词(用one-hot方法编码),我们的输出是一串预测的单词。当训练时,我们让
机器翻译
机器翻译和language modeling很像,他们的输入是一串源语言的单词。我们想输出一串目标语言的单词。其中最关键的区别是机器翻译的输出是在所有的输入结束之后,因为翻译后输出的第一个单词和所有输入的信息都有关系。其网络示意图如下:
语音识别
语音识别的输入时一串声音信号,输出是一串语音段和其概率
生成图片标注
结合CNN,RNN可以来给图片标注一段文字描述。RNN在图片标注上有惊人的好结果。在混合模型中,我们甚至可以让图片上的特征和生成的语言互相对应。