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, ,
- 第一次的输入为 [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 版本,接下来的才是主菜,才是我们目前真正实用的 RNN。
3 Long Short-term Memory (LSTM)
3.1 基本结构
-
LSTM 的构成如下图:
- Input Gate: 只有打开时,输入才能进入到内存单元(Memory Cell).
- Output Gate: 只有打开时,才能输出。
- Forget Gate: 打开时,内存将被清空。(这里一般控制信号为0才叫做打开)。
-
由上图可以知道,LSTM 有 4 个输入:
- 输入到 input gate 中的值;
- 控制 input gate 的值;
- 控制 output gate 的值;
- 控制 forget gate 的值。
一个输出:
- 从 outpu gate 中输出的值。
-
为什么叫 Long Short-term Memory?因为之前介绍的 RNN 中,每次有新的值进来,内存中的值就会被替换掉,所以记忆是“short-term“。但是 LSTM 加了好几个控制阀门,内存并不会每次都被替换,所以有更 ”long“ 的记忆。、
3.2 进一步分析
-
先上一张图:
上图中的 active funtion 都是 sigmoid,经过 sigmoid 后的值都会在 0 ~ 1之间,表示当前这个 gate 被打开的程度。
相信根据这张图可以很容易的与上一张图的各个部件对应起来,然后我们省去分析的过程(因为很简单),可以很容易的得到,
也就是说,
-
当 时,input gate 就被关闭了,也就相当于没有了输入。
-
当 时,forget gate 就被打开了,将会清空原本的指。
-
当 时,output gate 就被关闭了,将不会有输出值。
-
反之,你自己推一下。
-
3.3 应用到例子
-
LSTM 的 4 个输入,其实输入都是一样的,但是我们可以通过调整每个输入的权值来使他们表现得不一样。比如说我们输入 [x1, x2, x3] ,要做到
-
下图是一个例子,可以用来实现上图中的功能。当然在实际应用中,这些 weight 都是机器自己学习出来的。
3.4 组合起来
-
我们之前讲的虽然看起来很复杂,但是对应到我们之前的的神经网络的架构,我们会发现,上面这个看起来很复杂的东西其实只是一个神经元(Neural),所以要把 LSTM 真正应用起来,就是拿上面讲的这个去替换 Neural Network 中的 Neural ,如果有两个 neural 那么就是这样子:
-
其实上面也是一个简化版,真正的 LSTM 长得像下面这样子:
这玩意儿正常人应该看不懂………但是多看看说不定可以,图上具体的各个含义我也不解释了,可以去听听李宏毅老师的课。
总结
- 也没有什么好总结的,我写这些博客的目的主要是为了自己能够理解得更深,能够梳理清楚整个知识框架,所以可能对旁人看起来不太友好,但是如果有人看了我的博客能够从中受益,那我就非常开心了:smile:。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:李宏毅机器学习笔记-12.1 循环神经网络(Recurrent Neural Network-RNN)- part 1 - Python技术站