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。
如下图所示,只有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”。
使用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)。
因为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$……
RNN的变体
Elman Network & Jordan Network
RNN也有不同的变形。Elman Network是把隐藏层的输出存到memory中,而Jordan Network是把输出层的输出保存到memory中。由于隐藏层没有明确的训练目标,而整个NN具有明确的目标,因此Jordan Network的表现会更好一些。
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的概率。
Github(github.com):@chouxianyu
Github Pages(github.io):@臭咸鱼
知乎(zhihu.com):@臭咸鱼
博客园(cnblogs.com):@臭咸鱼
B站(bilibili.com):@绝版臭咸鱼
微信公众号:@臭咸鱼
转载请注明出处,欢迎讨论和交流!