李宏毅机器学习课程笔记-9.1循环神经网络RNN入门

Slot Filling

比如在订票系统中,输入“Arrive Taipei on November 2nd”这样一个序列,我们设置几个slot(槽位),希望算法能够将关键词“Taipei”放入Destination这个slot,将”November”和”2nd”放入到达时间Time of Arrival这个slot,而“Arrive”和“on”不属于任何slot。那这个算法如何实现呢?

Slot Filling with FNN

可以用Feedforward Neural Network实现Slot Filling吗?可以,下面介绍这种FNN的输入和输出,但其存在问题。

输入是一个word(比如“Taipei”)并用vector来表示它;输出是1个probablity distribution,表示输入的word属于各个slot的概率。

如何用vector表示1个word呢?方法有很多。比如1-of-N Encoding(又名one-hot Encoding),如下图所示。设定1个lexicon(词汇表),那vector的size就和lexicon的size相同,vector中的每个维度对应lexicon中的word,vector中word对应的维度的值为1、其它维度的值为0。

img

如下图所示,只有1-of-N Encoding还不够,一些word不在lexicon中,对此我们需要在lexicon中添加1个”other“。除了1-of-N Encoding,还可以通过word hashing。可以用1个26×26×26的vector表示1个word,该vector中每个元素代表1个3字母序列。比如”apple”包括”app”、”ppl”、”ple”。

img

使用FNN实现Slot Filling时会存在一个问题:假如有2个句子“Arrive Taipei on November 2nd”和“Leave Taipei on November 2nd”,在处理这2个句子时FNN会先处理“arrive”和“leave”这2个词汇然后再处理“Taipei”。这时FNN没有办法区分出“Taipei”是出发地还是目的地,而我们希望算法在处理序列时是有“记忆力”的(即在处理“Taipei”时,它还记得“Leave”或“Arrive”),于是RNN诞生了。

Recurrent Neural Network

如下图所示,将每1个隐藏层的输出保存在memory中,网络不仅考虑了input,还要考虑memory中的数据(merory中的数据是需要有初值的,比如0)。

img

因为RNN会考虑memory中存储的临时值,而不同输入产生的临时值不一定相同,所以改变输入序列中元素的顺序会导致最终输出结果的改变(Changing the sequence order will change the output)。

Slot Filling with RNN

如下图所示,以“Arrive Taipei on November 2nd” 这个word sequence为例,将“Arrive”的vector$x^1$输入到RNN,隐藏层生成$a^1$,根据$a^1$生成$y^1$,表示“arrive”属于每个slot的概率,其中$a^1$会被存储到memory中;将“Taipei”的vector$x^2$输入到RNN,此时隐藏层同时考虑$x^2$和memory中的$a^1$生成$a^2$,根据$a^2$生成$y^2$,表示“Taipei”属于某个slot的概率,此时再把$a^2$存到memory中;以此类推根据$x_3$和$a_2$生成$a_3$进而得到$y^3$……

img

RNN的变体

Elman Network & Jordan Network

RNN也有不同的变形。Elman Network是把隐藏层的输出存到memory中,而Jordan Network是把输出层的输出保存到memory中。由于隐藏层没有明确的训练目标,而整个NN具有明确的目标,因此Jordan Network的表现会更好一些。

img

Bidirectional RNN

如下图所示,RNN可以是双向的。训练2个方向的RNN,1个从前往后读取序列,1个从后往前读取序列,然后使用2个RNN的隐藏层得到最后的输出层。这样的好处是,输出层的感受野更大,因为RNN在得到$y^{t+1}$的时候,它不只看了从句首$x^1$开始到$x^{t+1}$的数据,还看了从句尾$x^{n}$一直到$x^{t+1}$的输入,这就相当于RNN是在看过整个句子之后才计算每个word属于哪个slot的概率

img


Github(github.com):@chouxianyu

Github Pages(github.io):@臭咸鱼

知乎(zhihu.com):@臭咸鱼

博客园(cnblogs.com):@臭咸鱼

B站(bilibili.com):@绝版臭咸鱼

微信公众号:@臭咸鱼

转载请注明出处,欢迎讨论和交流!