本博客是针对李宏毅教授在Youtube上上传的课程视频的学习笔记。
Introduction
假设我们想做一个智慧订票系统,它能根据用户的文本输入获得订票必须的信息。那么对于系统来说,它所需的订票信息可以被视作若干槽(slot),这些槽需要被填充。比如在订票这里,槽包括目的地(destination),和到达时间(time of arrival)。那么订票系统就需要从用户的输入中提取出两个槽对应的信息填入。
那么,这个问题当然是可以用前馈神经网络来解的,只要把每个句子中的词都用一个词向量(word vector)来表示(最简单的方法是如下的1-of-N encoding,也包括Beyond 1-of-N encoding的一些方法),然后扔到NN(神经网络)里,让NN来判断该词是否代表目的地或者到达时间(属于某个槽的概率)。
- 1-of-N encoding
- Beyond 1-of-N encoding
为了保证能够顾及到所有的词,我们可以加入一个”other”分量,表示未出现在该向量其它分量中的词;也可以做词散列化(word hashing)。
如下图,但是使用前馈神经网络的问题也很明显:我们会需要系统有记忆能力,即它能判断句子中的地点到底是目的地,还是出发地。 (eg:arrive Taipei on Nov.2nd 和 leave Taipei on Nov.2nd中的Taipei都是地点,但前者是目的地,后者是出发地,要买的票完全不一样)。所以,我们可能会希望我们的系统会记得它在看过“Taipei”之前,有看过”arrive”或”leave”。也即面对相同的输入,能输出相应的不同的结果的能力,于是,循环神经网络(Recurrent Neural Network)登场了。
Framework
RNN会将隐层的输出暂存到一个额外的单元中( a1,a2 ),而这些额外单元会再将储存的值也作为下一次隐层的输入的一部分。
RNN Example
我们用一个简单的RNN例子来说明一下它的效果。
首先给定额外单元初始值0,然后我们的输入序列如下图所示。那么,当我们输入第一个向量[1,1],那么其最终对应的output会是[4,4],而隐层会将它的output[2,2]写入到额外单元。