Recurrent Neural Network and LSTM(循环神经网络与长短期记忆详解)

为什么要用RNN

slot filling指的是槽填充,比如说现在有一个智能票务系统,用户告诉机器我几月二号去台北,那么机器只需要读出Taipei和November 2nd即可,这就是槽,然后其余的程序已经写好,机器只需识别出这两个关键信息填入已写好的模板程序中,相当于完形填空。
在这里插入图片描述那么解决slot filling问题能用DNN吗?如下图,我们将Taipei向量化输入,但是该DNN可能只能告诉我们是不是Taipei,其他信息并不能告诉我们。
在这里插入图片描述
如下图,我们可以看到输出结果是slot的概率。

在这里插入图片描述但是,如果光看地名和时间,我哪知道客户是要离开还是到达?所以神经网络需要记忆,所以才有了RNN,如下图:
在这里插入图片描述

如何用向量去代表单词

每一维代表了一种单词。
在这里插入图片描述
在这里插入图片描述

Recurrent Neural Network (RNN)

RNN基本原理

我们需要一种带有记忆的神经网络!!如下图,hidden layer的输出被存放在memory里
在这里插入图片描述
举个例子,这两个memory的初始值都是0,然后所有的w都是1,没有b,然后激活函数都是线性函数(为了简单说明)。这时,输入一句话,我们把这句话的单词分别转化成向量。第一个向量1x1+1x1=2,这时两个绿色神经元的输出就是两个2,然后分别放入memory里;然后将这两个memory的值取出作为红色神经元的输入,就是2x1+2x1=4,这时两个红色神经元的值就是4了;
在这里插入图片描述
然后来看第二个向量,这时输入有四个,还要算上memory的,所以就是1x1+1x1+2x1+2x1=6,这时绿色神经元的输出就是6,然后分别存入memory,然后再6x1+6x1=12;

在这里插入图片描述
再看第三个向量,这时memory里的值是6,所以就有2x1+2x1+6x1+6x1=16;这时绿色神经元就是16了,然后存入memory里,并且红色神经元为16x1+16x1=32;注意,我们改变单词在句子中出现的位置也会得到不同的输出。
在这里插入图片描述同一个神经网络循环使用,如下图,比如arrive是向量x1,然后输出是y1,输出就代表某一个词出现的概率,然后在每一次训练都更新memory里的向量,并且将该memory向量与下一个单词的向量共同作为输入传给神经元,下面这张图很容易看懂。
在这里插入图片描述如下图,我们来看看两种Taipei有什么不一样?他们依赖于前一个单词,因为前一个单词不同导致memory里的值不同,所以导致最终的预测结果不同。
在这里插入图片描述当然,RNN的结构也可以叠加很多层!!

在这里插入图片描述

其他RNN

上述我们讨论的其实就是Elman Network。然后下图还有一个Jordan Network,这个是将每一个单词的最终的memory作为下一个单词的初始值,而Elman Network是横向的,看看上图就知道了。
在这里插入图片描述双向RNN可以使该network知道整个句子的情况,如下图所示,正向反向的单词情况都知道。
在这里插入图片描述

训练RNN遇到的难题

我们可以给每个单词设置一个target,arrive与on这类词设置的target为other,Taipei为dest,November 2nd为time,然后将每个单词训练的结果用向量表示。
在这里插入图片描述那么如何找到一个靠谱的w?当然也是用梯度下降,这里也是用的反向传播,只不过使用的升级版,也就是通过时间的反向传播算法。

在这里插入图片描述不幸的是,RNN的loss不稳定,可能会爆裂,下图蓝色曲线是我们所期望的,但是绿色曲线是真实的。
在这里插入图片描述我们来建一个三维坐标看看w1,w2与loss之间是个什么情况?如下图,我们发现loss在某些位置直线上升!!看橙色的点,开始梯度下降很小,学习率很小,但是可能到悬崖上瞬间梯度变大,学习率变大,然后就飞出去了。然后在某些平滑的地方又有可能出现梯度消失。
在这里插入图片描述为什么会有这样的事发生?举个例子,如下图所示,假设第一个memory里的值为1x1=1,然后作为输入,那么第二个memory里的值就是1xw+0x1=w,然后同理,第三个memory里的值为wxw+0x1=w^2,以此类推,第1000个memory的值为w的99次方。那么当w为1时,y1000的值为1,当w为1.01时,y1000就变成了20000,但是当w为0.99时,y1000就变成了0,我们可以看到,做了一点点变化就会可能会导致后面的结果变化巨大。
在这里插入图片描述

解决问题

用LSTM可以解决梯度消失,因为RNN的memory是每一次都被洗掉重新赋值,而LSTM是将输入与memory里的值相加,也就是每次将新的变化加进来,然后相加后的这个值的影响会永远存在,除非forget gate被使用。然后GRU比LSTM更简便,只有两个gate,所需要的参数也越少,不容易过拟合。
在这里插入图片描述
在这里插入图片描述

LSTM

基本结构

下面我们来介绍一种可以处理RNN梯度消失的模型,此模型是LSTM,中文名长短期记忆模型,顾名思义,让RNN具有较长时间的短期记忆。(该模型不能处理梯度爆炸)。下图是这个模型的基本结构,有三个开关,分别是输入开关,输出开关,忘记开关(控制该模型是否遗忘memory的值)

在这里插入图片描述激活函数我们通常用sigmoid,因为它的值在0和1之间,可以模仿开和关。

在这里插入图片描述

LSTM手动操作案例

下面有一句话,我们把它搞成9个三维向量,其中当x2=1时,将x1的数字存入到memory里,当x2=-1时,将memory清空,当x3=1时,将memory的值输出。
在这里插入图片描述根据上一张图,我们来手动模拟一下每一个向量的步骤:如下图,为了说明方便,我们有两个激活函数换成Relu。然后memory里的初始值是0,,输入向量(1,0,0),偏置为1,然后经过Relu之后,为1,然后来看input gate,将(1,0,0)于偏置代入,结果为-10,再经过sigmoid函数,就约等于0了,然后该输入开关关闭,刚刚得到的1就不管了。
在这里插入图片描述然后来看第二个向量,(3,1,0)与偏置1,这时经过第一个Relu的值为3,然后来看输入开关,得出的值约为1,然后3x1=3,然后来看忘记开关,忘记开关约为1,说明可以忘记了,于是就把原始的0忘掉,并且改为新的值3,但是输出开关的值约为0,不允许3输出,然后就只能输出0了.
在这里插入图片描述再看第三个向量,输入(4,1,0)与偏置1,得到4,然后看输入开关,为1,相乘得4,然后看忘记开关,约为1,然后将memory更新3+4=7,然后输出开关又为0,所以输出为0
在这里插入图片描述同理。。。。。
在这里插入图片描述同理。。。。。
在这里插入图片描述同理。。。。。
在这里插入图片描述

LSTM与神经网络的联系

LSTM取代了神经元
在这里插入图片描述我们用不同的颜色表示不同的w
在这里插入图片描述然后我们输入xt这个向量,然后用这个向量分别与四个不同的矩阵相乘,得到四个不同的向量,这四个向量的作用是控制三个那开关和输入向量,请仔细看LSTM的结构图,有四个入口,正好对应四个向量。
在这里插入图片描述
在这里插入图片描述

LSTM遇到的难题

太复杂!!!会有优化措施!!
在这里插入图片描述在这里插入图片描述

More Applications(本节大致看一下就行了,之后会针对每一个应用详细说明)

之前我们用RNN来搞slot filling时,一句话的每一个词都有相应的输入和输出,那么RNN还能不能做其他事呢?
在这里插入图片描述

Many to one

如下图,我们在对一些电影评论做分析时,我们的输入是一句话(很多单词组成),但是我们的输出只需要只需要好评还是差评。
在这里插入图片描述
我们来看看大致流程,输入一个向量序列,但是输出只有一个向量。

在这里插入图片描述

Many to Many

输入和输出都是向量序列,但是输出要更短一些。比如说语音识别,输入是一串向量,将结果经过trimming(去重)处理后,得出"好棒"这个序列。那么我要得到好棒棒呢?
在这里插入图片描述
我们需要CTC这个技术,增加一个额外的标识代表null,如下图所示:
在这里插入图片描述CTC在训练的时候穷举所有情况进行输入。
在这里插入图片描述下面举了一个输出的例子:
在这里插入图片描述再举一个例子,输入和输出都是不同长度的序列,然后我们来做一下机器翻译,我们使用RNN去做,先是将machine转化为向量作为input,然后结果记录在memory里,然后将memory与learning作为下一个神经元的输入,如下图,这时第二个神经元就包含了所有输入序列的信息了。
在这里插入图片描述然后我们将第二个神经元吐出一个机字,然后将当前memory和这个机字转换的向量作为下一个神经元的输入,然后下一个神经元吐出一个器字,以此类推,但是你会发现这样做下去没完没了。
在这里插入图片描述这时我们就需要一个标识来作为整个过程的结束,就像游戏接龙推文一样。
在这里插入图片描述如下图,我们增加一个symbol标识结束。
在这里插入图片描述在翻译的时候,我们可以将一种语言翻译成另一种语言,但是如果我们直接将一种语言的声音讯号翻译成另一种语言的文字,中间跳过语音辨识,这也是可以的,如下图所示:
在这里插入图片描述

Other Application

我们还可以将RNN用于语法解析,我们可以将一棵语法树变成序列,如下图所示:
在这里插入图片描述 如下图,单词的顺序会使整个序列表达的意思不同,如下图所示:

在这里插入图片描述那么,我们利用RNN可以采取下图所示方法来表示该序列的信息是否是重要的,我们将序列里的每个单词和memory作为输入,所得到最后一个memory的值我们称为encode,然后我们将这个encode作为输入,这个encode就包含了序列所有信息,然后我们对它进行解码decode,解出来的东西越接近原始的序列说明该序列所表达的意思越重要。
在这里插入图片描述下图是用了LSTM的升级版!!
在这里插入图片描述 如下图,语音辨识我也可以用上述类似的思路:
在这里插入图片描述我们将数据库里的语音信号向量化,然后将采集的声音也向量化,然后与数据库里的比对!
在这里插入图片描述我们将一段声音讯号分段,然后转化为若干声音向量,然后传入RNN,整个RNN就可以看成是encoder,然后最后一个时间点的神经元里存储了所有的声音信息。

在这里插入图片描述我们将最后一个时间点的memory作为输入,输入到RNN decoder里,如下图所示,每一个神经元输出的值,例如y1,如果与x1接近,说明结果很好,当所有的都接近,说明success了。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值