Recurrent Neural Network
Recurrent Neural Network 是反馈神经网络,简称为 RNN 。与最基础的前向传播神经网络不同的是,RNN 是一个有记忆的神经网络,他把上一次的输出存了起来作为下一次的输入参数的一部分影响下一次的输出结果。为什么要这么做呢?让我们来看一个例子。
RNN 的背景
假设有这样一个应用场景,我希望输入一段话给我的语音助手,例如 “I would like to arrive Chengdu on November 2nd” (意思是我将会在 11 月 2 日抵达成都),我希望我的语音助手能够识别出 Chengdu 是我的目的地,November 2nd 是日期,这样可以帮我自动设一个日程表或者是帮我查交通方式等等。
1-of-N Encoding
我们知道神经网络的输入一般都是数值,没法处理这种字符,那么一个常用的方法就是 1-of-N Encoding 。在进行编码前,我们会有一个词汇表(lexicon)。下面举一个例子便于理解,假设我们的词汇表是: l e x i c o n = { a p p l e , b a g , c a t , d o g } \rm lexicon = \{apple,bag,cat,dog\} lexicon={ apple,bag,cat,dog} ,当我们的词是 a p p l e \rm apple apple 时,编码的结果就是 [ 1 , 0 , 0 , 0 ] [1,0,0,0] [1,0,0,0] ,同理若为 c a t \rm cat cat 时,编码的结果就是 [ 0 , 0 , 1 , 0 ] [0,0,1,0] [0,0,1,0] 。下图也是一个例子。

独热编码还有一个改版叫做 Beyond 1-of-N Encoding ,就是在 1-of-N Encoding 的基础上多一个 o t h e r \rm other other 表示一个词未出现在词汇表中,例如词汇表还是上面的(没有 e l e p h a n t \rm elephant elephant),若一个词是 b a n a n a \rm banana banana 则会编码成 [ 0 , 0 , 0 , 0 , 1 ] [0,0,0,0,1] [0,0,0,0,1] 。改版之前是会有词无法进行编码的,因为没有出现在词汇表中,改版后所有词都能编码,但是如果词汇表设置的不好,则会有很多次都被归到 o t h e r \rm other other ,变的没有差别,这样训练出的网络可能会有问题。
Word Hashing
还有一种编码方式就是 Word hashing ,他是把三个字母的组合作为一个维度,所以一共有 26 × 26 × 26 26 \times 26 \times 26 26×26×26 种组合,然后去看单词中的某一种组合是否出现,比如 a p p l e \rm apple apple 这个单词,就可以拆成 a p p 、 p p l 、 p l e \rm app、ppl、ple app、ppl、ple ,那么这三种对应的维度上就是 1 1 1 ,其他都是 0 0 0 。(有个问题是,要是有一个组合在单词中重复出现的话,不知道这个维度上是只记一个 1 1 1 ,还是记他的计数值,课上举的例子没有这个问题)

解决了怎么把单词输入到神经网络中后,回到我们一开始那么问题,首先可以想到的是,我们可以把输出变成单词类型的类别,例如:输入 I \rm I I 输出是 o t h e r \rm other other ,输入是 C h e n g d u \rm Chengdu Chengdu 输出是 d e s t i n a t i o n \rm destination destination ,输入是 N o v e m b e r \rm November November 输出是 t i m e \rm time time ,输入是 2 n d \rm 2nd 2nd 输出是 t i m e \rm time time ,输出的类别一共有三种。似乎用一个普通的神经网络就可以解决这个分类问题了,根本不需要什么有记忆的 RNN 。但是如果问题变成我输入的一句话变成了 “I would like to leave Chengdu on November 2nd” 呢,输入这句话表示我将在十一月二号离开成都,那么我希望我的语音助手进行的操作肯定和原来是不一样的,比如提醒我走之前买纪念品。那么对于原来的无记忆的神经网络来说,是无法鉴别这个 C h e n g d u \rm Chengdu Chengdu 到底是 d e s t i n a t i o n \rm destination destina