Recurrent Neural Network(RNN) - 循环神经网络(part 1)
1 从一个例子说起
假设要做一个智能客服系统或者智能订票系统之类的,需要用到一个叫做 Slot Filling 的技术,举个例子,如果做一个人对智能订票系统说 ”I would like to arrive Taipei on November 2nd“。那么你的系统会有一些 Slot,在这里应该是 Destination 和 time of arrival ,然后根据对方的话讲一些词填入到这些 Slot 中。具体如下图:
那应该要怎么实现以上的 Slot Filling 呢?可以考虑用之前学过的 前馈神经网络(Feedforward Neural NetWork),将输入的单词转换成向量的形式输入神经网络进行学习。将单词转换成向量的方法有很多,这里就不详细说明。
那以上的方法真的可行吗? 想一下输入的两个句子是
- arrive Taipei on November 2nd.
- leave Taipei on November 2nd.
第一句中的 Taipei 表示的是目的地,而第二句中的表示的是出发地,但是我们的前馈神经网络是无法分辨这种情况的,因为前馈神经网络并不知道在 Taipei 之前是什么单词。也就是说,因为前馈神经网络没有记忆性。
2 Recurrent Neural Network(RNN)
RNN 具有记忆性,而这是通过设置一些内存单元实现的,如在下图中,a1 和 a2 就表示内存,其中存的值就是 hidden layer 的输出。并且,a1 和 a2 同样会被当成输入。
假设所有的 weight 都是 1,bias 都是 0,a1 和 a2 的初始值是 0, σ(z)=z σ ( z ) = z ,
- 第一次的输入为 [1, 1] ,那 hidden layer 的输出就是 [2, 2],同时 a1 和 a2 也会被更新为 [2, 2],output = [4, 4].
- 第二次的输入为 [1, 1] ,那 hidden layer 的输出就是 [6, 6],同时 a1 和 a2 也会被更新为 [6, 6],output = [12, 12].
- 第三次的输入为 [2, 2] ,那 hidden layer 的输出就是 [16, 16],同时 a1 和 a2 也会被更新为 [16, 16],output = [32, 32].
如上,前两次输入是一样的,但是因为有“记忆性”,所以两次的输出不一样。并且我们注意到,现在这个 RNN 对顺序是敏感的,也就是说,如果我们把第三次输入换到第一次,那么整个输出的结果都会改变。
以上介绍的叫做 Elman Network,RNN 还有很多其他的变体,比如 Jordan Network,还有 双向的RNN,即 Bidirectional RNN 。
以上的这些都是一些 RNN 的 simple 版本,接下来的