台大李宏毅机器学习(一)——RNN&LSTM

课件下载地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/RNN (v2).pdf
视频:https://www.bilibili.com/video/av9770190/?p=25
讲解LSTM最好的文章:http://colah.github.io/posts/2015-08-Understanding-LSTMs/
RNN是一种比较复杂的网络结构,每一个layer还会利用上一个layer的一些信息。

比如说,我们要做slot filling的task。我们有两个句子,一个是“arrive Taipei on November 2nd”,另一个是“leave Taipei on November 2nd”。我们可以发现在第一个句子中,Taipei是destination,而第二个句子中Taipei是departure。如果我们不去考虑Taipei前一个词的话,Taipei的vector只有一个,那么同样的vector进来吐出的predict就是一致的。所以我们在做的时候就需要把前一个的结果存起来,在下一个词进来的时候用了参考。

所以这样我们就在neuron中设计一个hidden layer来存储这个值,如下图中a1,a2所示,相当于让神经网络拥有记忆能力。

在这里插入图片描述

我们用这个网络来举例。假设我们每个weight都是1,bias=0,每个activation都是linear的。那么我们现在有一个序列(1,1),(1,1),(2,2),那么一开始memory里面的值是(a1=0,a2=0),现在将序列第一个值传入network,我们得到(x1=1,x2=1),因为active function都是linear的,所以经过第一个hidden layer,我们输出的就是1×a1+1×a2+1×x1+1×x2,其中a1=a2=0,两个节点一致。所以第一个hidden layer得到(2,2)(绿色方块所示),同时我们将(2,2)保存起来,更新一下得到(a1=2,a2=2),output layer是(4,4),所以得到第一个(y1=4,y2=4)。第二个input (1,1),同样计算一下,hidden layer得到的是(6,6)和(a1=6,a2=6),output layer是(12,12)。同理第三个input最后得到的output是(32,32),所最后得到的三个output序列是(4,4),(12,12),(32,32)。以此类推。
在这里插入图片描述
那么我们可以想一下,如果现在的序列顺序变化一下,结果是否会不一致?如果现在的序列是(1,1),(2,2),(1,1),我们得到的是(4,4),(16,16),(36,36)。结果发生了变化。所以RNN对序列是敏感的,这样的特性就表示,在slot filling的task里面,我们前面的arrive和leave将会影响后面接着的Taipei的结果。

当然RNN也可以是深度的,即有多层hidden layer(绿色方框),设计上就是
在这里插入图片描述

这种深度的设计有两种方法
在这里插入图片描述
Elaman Network中,store的值是hidden layer里的值;Jordan Networkde 的store里存的是output的值

传说Jordan Network一般效果会比较好。另外RNN也可以双向训练:将双向RNN的输出结果都存在y(t)单元中。
在这里插入图片描述
这里也需要注意一下,RNN不是训练好多个NN,而是一个NN用好多遍。所以可以看到RNN里面的这些network的参数都是一致的。

那这个是一个非常原始简单的RNN,每一个输入都会被memory记住。现在RNN的标准做法基本上已经是LSTM。LSTM是一个更加复杂的设计,最简单的设计,每一个neuron都有四个输入,而一般的NN只有一个输入。

LSTM的一个简单结构长这样:(某些公司在招聘AI算法工程师时,会考察应聘者画出LSTM的结构,如vivo)
这里给读者遗留一个小case:LSTM是谁的缩写,Long Short-Term Memory 还是Long-Short Term Memory?二者字面表达的意思是不一样的~
在这里插入图片描述
具体表示如下:
在这里插入图片描述
C表示Memory中存储的原始值,C’表示新的存储值。
可以看到,一个output受到三个gate的影响,首先是input gate决定一个input是否可以进入memory cell,forget gate决定是否要忘记之前的memory,而output gate决定最后是否可以输出。这样一个非常复杂的neuron。

那么实作上这个neuron是如何工作的呢?假设我们现在有一个最简单的LSTM,每个gate的input都是一样的vector,那么我们这边在做的时候就是每一个input乘以每个gate的matrix,然后通过active function进行计算。这里做一个最简单的人肉LSTM。假设我们有一个序列是:
在这里插入图片描述
我们希望,当x2=1的时候,我们将x1加入memory中,当x2=−1的时候,memory重置为0,当x3=1的时候,我们输出结果。

那么我们再假设一个很简单的LSTM,长这样:
在这里插入图片描述
这个cell的input activate function是linear的,memory cell的activate function也是linear的。

那么我们可以将上面的序列简化一下
在这里插入图片描述
现在,将第一个元素放进来,我们得到是3,input gate部分的结果是90,经过activate function得到的是1,所以允许通过进入memory cell。forget gate这里计算的结果是110,经过activate function(Sigmoid)是1,所以我们记住这个值(这里要注意,虽然这个gate叫forget gate,但是当取值是1的时候其实是记住,0的时候是遗忘)。然后到output gate这里,output gate计算是-10,activate function输出是0,所以我们不output结果。

输入下一个元素(4,1,0)。直接输入计算是4,经过input gate,得到的是4。因为原来memory cell里面已经存了3,所以这一轮的计算是原来的memory加上新进入的4,得到7。然后output gate依然关闭,所以memory cell还是存7。

第三个元素类似的计算,发现input gate关闭,所以没法进入memory cell,因此memory cell没有更新。同时output gate关闭,没有输出。

第四个元素进入,input gate关闭,memory cell不更新,但是这时候output gate的activate function得到1,所以开放输出结果。因为之前memory cell里面存放的是7,所以输出7。但是要注意一点,虽然memory cell的值输出了,里面的值并没有被清空,仍然保留着,所以这个时候的memory cell还是7。

最后一个元素进入,input gate关闭,memory cell不更新,这时候,forget gate的activate function得到的是0,所以我们清空记忆,memory cell里面现在是0。output gate仍然关闭,所以没有output。

上面五个过程用图表示如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

那时做的时候,一个简化的LSTM是:
在这里插入图片描述

如图中,我们输入一个原始的xt,会通过四个linear transform变成四个vector,然后每个vector输入到LSTM对应的gate。这里要注意的是,转换后的z有多少个维度,那么我们就需要建立多少个LSTM的cell,同时,每次进入cell训练的只是z的一个维度。

这是实作上的运算过程:
在这里插入图片描述

上面是最simple的LSTM,实际的LSTM如下图:输入不仅是xt,还有ct和ht-1。
在这里插入图片描述

嗯,复杂。不过这是现在LSTM的标准做法。不用担心,虽然上述结构你可能不太清楚,但是Keras可以直接调用LSTM。

RNN很难训练,因为有个问题就是可能梯度爆炸,有可能梯度消失。我们用一个最简单的模型来体验一下这个问题。假设我们现在的模型是非常simple的RNN,activate function是linear的,如下图:
在这里插入图片描述

我们可以发现,如果我们有1000个cell,那么我们的weight从1 update到1.01的时候,到了第一千个输出就从原来的1变成了2w,梯度爆炸了。但是当我们weight从1 update到0.99,那么到了第一千个输出就变成了0。更极端一点,如果我们因为之前选择了一个很大的lr,那么我们一步就把weight调到了0.01,我们发现,第一千个输出还是0。所以一般的RNN难以训练是有两个问题的,一个是梯度爆炸,一个是梯度消失。

那么LSTM在实现的时候,因为有了forget gate的存在,只要forget gate长期保持开启,那么很久以前的数据会持续影响后面的数据,所以可以抹消掉梯度消失的问题。另外memory cell里面的值是加起来而不是simple RNN里面直接抹消的,所以这也是能解决梯度消失的问题。

原文参考:https://samaelchen.github.io/machine_learning_step16/

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值