李宏毅机器学习笔记-12.1 循环神经网络(Recurrent Neural Network-RNN)- part 1

Recurrent Neural Network(RNN) - 循环神经网络(part 1)


1 从一个例子说起

  • 假设要做一个智能客服系统或者智能订票系统之类的,需要用到一个叫做 Slot Filling 的技术,举个例子,如果做一个人对智能订票系统说 ”I would like to arrive Taipei on November 2nd“。那么你的系统会有一些 Slot,在这里应该是 Destinationtime of arrival ,然后根据对方的话讲一些词填入到这些 Slot 中。具体如下图:

  • 那应该要怎么实现以上的 Slot Filling 呢?可以考虑用之前学过的 前馈神经网络(Feedforward Neural NetWork),将输入的单词转换成向量的形式输入神经网络进行学习。将单词转换成向量的方法有很多,这里就不详细说明。

  • 那以上的方法真的可行吗? 想一下输入的两个句子是

    1. arrive Taipei on November 2nd.
    2. leave Taipei on November 2nd.

    第一句中的 Taipei 表示的是目的地,而第二句中的表示的是出发地,但是我们的前馈神经网络是无法分辨这种情况的,因为前馈神经网络并不知道在 Taipei 之前是什么单词。也就是说,因为前馈神经网络没有记忆性。

2 Recurrent Neural Network(RNN)

  • RNN 具有记忆性,而这是通过设置一些内存单元实现的,如在下图中,a1a2 就表示内存,其中存的值就是 hidden layer 的输出。并且,a1a2 同样会被当成输入。

  • 假设所有的 weight 都是 1bias 都是 0a1a2 的初始值是 0, σ(z)=z σ ( z ) = z ,

    1. 第一次的输入为 [1, 1] ,那 hidden layer 的输出就是 [2, 2],同时 a1a2 也会被更新为 [2, 2],output = [4, 4].
    2. 第二次的输入为 [1, 1] ,那 hidden layer 的输出就是 [6, 6],同时 a1a2 也会被更新为 [6, 6],output = [12, 12].
    3. 第三次的输入为 [2, 2] ,那 hidden layer 的输出就是 [16, 16],同时 a1a2 也会被更新为 [16, 16],output = [32, 32].
  • 如上,前两次输入是一样的,但是因为有“记忆性”,所以两次的输出不一样。并且我们注意到,现在这个 RNN 对顺序是敏感的,也就是说,如果我们把第三次输入换到第一次,那么整个输出的结果都会改变。

  • 以上介绍的叫做 Elman NetworkRNN 还有很多其他的变体,比如 Jordan Network,还有 双向的RNN,即 Bidirectional RNN

  • 以上的这些都是一些 RNN 的 simple 版本,接下来的才是主菜,才是我们目前真正实用的 RNN。

3 Long Short-term Memory (LSTM)

3.1 基本结构

  • LSTM 的构成如下图:

    1. Input Gate: 只有打开时,输入才能进入到内存单元(Memory Cell).
    2. Output Gate: 只有打开时,才能输出。
    3. 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 被打开的程度。

    相信根据这张图可以很容易的与上一张图的各个部件对应起来,然后我们省去分析的过程(因为很简单),可以很容易的得到,

    c=g(z)f(zi)+cf(zf) c ′ = g ( z ) f ( z i ) + c f ( z f )

    a=h(c)f(z0) a = h ( c ′ ) f ( z 0 )

    也就是说,

    • f(zi)=0 f ( z i ) = 0 时,input gate 就被关闭了,也就相当于没有了输入。

    • f(zf)=0 f ( z f ) = 0 时,forget gate 就被打开了,将会清空原本的指。

    • f(zo)=0 f ( z o ) = 0 时,output gate 就被关闭了,将不会有输出值。

    • 反之,你自己推一下。

3.3 应用到例子

  • LSTM 的 4 个输入,其实输入都是一样的,但是我们可以通过调整每个输入的权值来使他们表现得不一样。比如说我们输入 [x1, x2, x3] ,要做到

  • 下图是一个例子,可以用来实现上图中的功能。当然在实际应用中,这些 weight 都是机器自己学习出来的。

3.4 组合起来

  • 我们之前讲的虽然看起来很复杂,但是对应到我们之前的的神经网络的架构,我们会发现,上面这个看起来很复杂的东西其实只是一个神经元(Neural),所以要把 LSTM 真正应用起来,就是拿上面讲的这个去替换 Neural Network 中的 Neural ,如果有两个 neural 那么就是这样子:

  • 其实上面也是一个简化版,真正的 LSTM 长得像下面这样子:

    这玩意儿正常人应该看不懂………但是多看看说不定可以,图上具体的各个含义我也不解释了,可以去听听李宏毅老师的课。

总结

  • 也没有什么好总结的,我写这些博客的目的主要是为了自己能够理解得更深,能够梳理清楚整个知识框架,所以可能对旁人看起来不太友好,但是如果有人看了我的博客能够从中受益,那我就非常开心了:smile:。

你可能感兴趣的:(机器学习)