Machine Learning —— Recurrent Neural Network

Machine Learning —— Recurrent Neural Network

RNN,或者说最常用的LSTM,一般用于记住之前的状态,以供后续神经网络的判断,它由input gate、forget gate、output gate和cell memory组成,每个LSTM本质上就是一个neuron,特殊之处在于有4个输入: z z z和三门控制信号 z i z_i zi z f z_f zf z o z_o zo,每个时间点的输入都是由当前输入值+上一个时间点的输出值+上一个时间点cell值来组成

Introduction

Slot Filling

slot filling技术,它会分析用户说出的语句,将时间、地址等有效的关键词填到对应的槽上,并过滤掉无效的词语

词汇要转化成vector,可以使用1-of-N编码word hashing或者是word vector等方式,此外我们可以尝试使用Feedforward Neural Network来分析词汇,判断出它是属于时间或是目的地的概率

有记忆力的神经网络,就叫做Recurrent Neural Network(RNN)
在这里插入图片描述
在RNN中,hidden layer每次产生的output a 1 , a 2 a_1,a_2 a1,a2都会被存到memory里,下一次有input的时候,这些neuron就不仅会考虑新输入的 x 1 , x 2 x_1,x_2 x1,x2,还会考虑存放在memory中的 a 1 , a 2 a_1,a_2 a1,a2
在这里插入图片描述

  • 每次NN的输出都要考虑memory中存储的临时值,而不同的输入产生的临时值也尽不相同,因此改变输入序列的顺序会导致最终输出结果的改变

Slot Filling with RNN

用RNN处理Slot Filling的流程举例如下:

  • “arrive”的vector作为 x 1 x^1 x1输入RNN,通过hidden layer生成 a 1 a^1 a1,再根据 a 1 a^1 a1生成 y 1 y^1 y1,,表示“arrive”属于每个slot的概率,其中 a 1 a^1 a1会被存储到memory中
  • “Taipei”的vector作为 x 2 x^2 x2输入RNN,此时hidden layer同时考虑 x 2 x^2 x2和存放在memory中的 a 1 a^1 a1,生成 a 2 a^2 a2,再根据 a 2 a^2 a2生成 y 2 y^2 y2,表示“Taipei”属于某个slot的概率,此时再把 a 2 a^2 a2存储到memory中
  • 依次类推
    在这里插入图片描述
  • 注:上图为同一个RNN在三个不同时间点被分别使用了三次

即使输入同样是“Taipei”,我们依旧可以根据前文的“leave”或“arrive”来得到不一样的输出
在这里插入图片描述

Elman Network & Jordan Network

RNN有不同的变形:

  • Elman Network:将hidden layer的输出保存在memory里
  • Jordan Network:将整个neural network的输出保存在memory里
    在这里插入图片描述

Bidirectional(双向) RNN

RNN 还可以是双向的,你可以同时训练一对正向和反向的RNN,把它们对应的hidden layer x t x^t xt拿出来,都接给一个output layer,得到最后的 y t y^t yt

RNN在产生 y t + 1 y^{t+1} yt+1的时候,它不只看了从句首 x 1 x^1 x1 x t + 1 x^{t+1} xt+1的输入,还看了从句尾 x n x^n xn x t + 1 x^{t+1} xt+1的输入,这就相当于RNN在看了整个句子之后,才决定每个词汇具体要被分配到哪一个槽中,这会比只看句子的前一半要更好
在这里插入图片描述

LSTM

常用的memory管理方式叫做长短期记忆(Long Short-term Memory),简称LSTM

Three-gate

LSTM有三个gate:

  • 当某个neuron的输出想要被写进memory cell,它就必须要先经过一道叫做input gate的闸门,如果input gate关闭,则任何内容都无法被写入,而关闭与否、什么时候关闭,都是由神经网络自己学习到的
  • output gate决定了外界是否可以从memory cell中读取值,当output gate关闭的时候,memory里面的内容同样无法被读取
  • forget gate则决定了什么时候需要把memory cell里存放的内容忘记清空,什么时候依旧保存
    在这里插入图片描述
    整个LSTM可以看做是4个input,1个output:
  • 想要被存到memory cell里的值+操控input gate的信号+操控output gate的信号+操控forget gate的信号
  • 从memory cell中被读取的值
Memory Cell

表达式的角度看LSTM
在这里插入图片描述

  • z z z想要被存到cell里的输入值
  • z i z_i zi操控input gate的信号
  • z o z_o zo操控output gate的信号
  • z f z_f zf操控forget gate的信号
  • a a a是综合上述4个input得到的output值

z z z z i z_i zi z f z_f zf z o z_o zo通过activation function,分别得到 g ( z ) g(z) g(z) f ( z i ) f(z_i) f(zi) f ( z f ) f(z_f) f(zf) f ( z o ) f(z_o) f(zo)

z i z_i zi z f z_f zf z o z_o zo,它们通过的激活函数一般会选sigmoid function,因为它的输出在0~1之间,代表gate被打开的程度

  • g ( z ) g(z) g(z) f ( z i ) f(z_i) f(zi)相乘得到 g ( z ) ⋅ f ( z i ) g(z)\cdot f(z_i) g(z)f(zi)
  • 将原先存放在cell里的 c c c f ( z f ) f(z_f) f(zf)相乘得到 c f ( z f ) cf(z_f) cf(zf)
  • 上两步结果相加得到cell的新值 c ′ = g ( z ) ⋅ f ( z i ) + c f ( z f ) c'=g(z)\cdot f(z_i)+cf(z_f) c=g(z)f(zi)+cf(zf)

forget gate的逻辑与我们的直觉是相反的,控制信号打开表示记得,关闭表示遗忘

LSTM Structure

把LSTM整体看做是下面的一个neuron
在这里插入图片描述
假设目前我们的hidden layer只有两个neuron,则结构如下图所示:

  • 输入 x 1 x_1 x1 x 2 x_2 x2会分别乘上四组不同的weight,作为neuron的输入以及三个状态门的控制信号
  • 在原来的neuron里,1个input对应1个output,而在LSTM里,4个input才产生1个output,并且所有的input都是不相同的
  • 从中也可以看出LSTM所需要的参数量是一般NN的4倍在这里插入图片描述
LSTM for RNN

假设我们现在有一整排的LSTM作为neuron,每个LSTM的cell里都存了一个scalar值,把所有的scalar连接起来就组成了一个vector c t − 1 c^{t-1} ct1

在时间点 t t t,输入了一个vector x t x^t xt它会乘上一个matrix,通过转换得到 z z z z z z的每个dimension就代表了操控每个LSTM的输入值,同理经过不同的转换得到 z i z_i zi z f z_f zf z o z_o zo,得到操控每个LSTM的门信号
在这里插入图片描述
下图是单个LSTM的运算情景,其中LSTM的4个input分别是 z z z z i z_i zi z f z_f zf z o z_o zo的其中1维,每个LSTM的cell所得到的input都是各不相同的,但它们却是可以一起共同运算的,整个运算流程如下图左侧所示:

f ( z f ) f(z^f) f(zf)与上一个时间点的cell值 c t − 1 c^{t-1} ct1相乘,并加到经过input gate的输入 g ( z ) ⋅ f ( z i ) g(z)\cdot f(z^i) g(z)f(zi)上,得到当前时刻cell的值 c t c^t ct,最终乘上output gate的信号 f ( z o ) f(z^o) f(zo),得到输出 y f y^f yf
在这里插入图片描述
上述的过程反复进行下去,就得到下图中各个时间点上,LSTM值的变化情况,其中与上面的描述略有不同的是,这里还需要把hidden layer的最终输出 y t y^t yt以及当前cell值 c t c^t ct都连接到下一个时间点的输入上

因此在下一个时间点操控这些gate值,不只是看输入的 x t + 1 x^{t+1} xt+1,还要看前一个时间点的输出 h t h^t ht和cell值 c t c^t ct,把 x t + 1 x^{t+1} xt+1 h t h^t ht c t c^t ct这三个vector并在一起,乘上4个不同的转换矩阵,得到LSTM的4个输入值 z z z z i z_i zi z f z_f zf z o z_o zo,再对LSTM进行操控

下图是同一个LSTM在两个相邻时间点上的情况
在这里插入图片描述
上图是单个LSTM作为neuron的情况,事实上LSTM基本上都会叠多层,如下图所示,左边两个LSTM代表了两层叠加,右边两个则是它们在下一个时间点的状态
在这里插入图片描述

Learning Target

Loss Function

以Slot Filling的例子,把model的输出 y i y^i yi与映射到slot的reference vector求交叉熵,比如“Taipei”对应到的是“dest”这个slot,则reference vector在“dest”位置上值为1,其余维度值为0
在这里插入图片描述
RNN的output和reference vector的cross entropy之和就是损失函数,也是要minimize的对象

注:word要依次输入model

Training

有了损失函数后,训练其实也是用梯度下降法,为了计算方便,这里采取了反向传播(Backpropagation)的进阶版,Backpropagation through time,简称BPTT算法(BPTT算法与BP算法非常类似,只是多了一些时间维度上的信息)
在这里插入图片描述
我们希望随着epoch的增加,参数的更新,loss应该要像下图的蓝色曲线一样慢慢下降,但在训练RNN的时候,你可能会遇到类似绿色曲线一样的学习曲线,loss剧烈抖动,并且会在某个时刻跳到无穷大,导致程序运行失败
在这里插入图片描述

Error Surface

loss由于参数产生的变化,是非常陡峭崎岖的

下图中, z z z轴代表loss, x x x轴代表参数 w 1 w_1 w1 z z z轴代表参数 w 2 w_2 w2,可以看到loss在某些地方非常平坦,在某些地方又非常的陡峭
在这里插入图片描述
想要解决这个问题,就要采用Clipping方法,当gradient即将大于某个threshold的时候,就让它停止增长,比如当gradient大于15的时候就直接让它等于15

RNN训练困难,是由于它把同样的操作在不断的时间转换中重复使用

从memory接到neuron输入的参数 w w w,在不同的时间点被反复使用, w w w的变化有时候可能对RNN的输出没有影响,而一旦产生影响,经过长时间的不断累积,该影响就会被放得无限大,因此RNN经常会遇到这两个问题:

  • 梯度消失(gradient vanishing),一直在梯度平缓的地方停滞不前
  • 梯度爆炸(gradient explode),梯度的更新步伐迈得太大导致直接飞出有效区间
Help Techniques

LSTM就是最广泛使用的技巧,它会把error surface上那些比较平坦的地方拿掉,从而解决梯度消失(gradient vanishing)的问题,但它无法处理梯度崎岖的部分,因而也就无法解决梯度爆炸的问题(gradient explode)

Q:为什么LSTM能够解决梯度消失的问题?

A:RNN和LSTM对memory的处理其实是不一样的:

  • 在RNN中,每个新的时间点,memory里的旧值都会被新值所覆盖
  • 在LSTM中,每个新的时间点,memory里的值会乘上 f ( g f ) f(g_f) f(gf)与新值相加

对RNN来说, w w w对memory的影响每次都会被清除,而对LSTM来说,除非forget gate被打开,否则 w w w对memory的影响就不会被清除,而是一直累加保留,因此它不会有梯度消失的问题
在这里插入图片描述
另一个版本GRU (Gated Recurrent Unit),只有两个gate,需要的参数量比LSTM少,鲁棒性比LSTM好,不容易过拟合,它的基本精神是旧的不去,新的不来,GRU会把input gate和forget gate连起来,当forget gate把memory里的值清空时,input gate才会打开,再放入新的值

此外,还有很多技术可以用来处理梯度消失的问题,比如Clockwise RNN、SCRN等
在这里插入图片描述

More Applications

Sentiment Analysis

语义情绪分析,我们可以把某影片相关的文章爬下来,并分析其正面情绪or负面情绪

RNN的输入是字符序列,在不同时间点输入不同的字符,并在最后一个时间点输出该文章的语义情绪
在这里插入图片描述

Key term Extraction

RNN可以分析一篇文章并提取出其中的关键词,这里需要把含有关键词标签的文章作为RNN的训练数据
在这里插入图片描述

Output is shorter

如果输入输出都是sequence,且输出的sequence比输入的sequence要短,RNN可以处理这个问题

以语音识别为例,输入是一段声音信号,每隔一小段时间就用1个vector来表示,因此输入为vector sequence,而输出则是character vector

如果依旧使用Slot Filling的方法,只能做到每个vector对应1个输出的character,识别结果就像是下图中的“好好好棒棒棒棒棒”,但这不是我们想要的,可以使用Trimming的技术把重复内容消去,剩下“好棒”
在这里插入图片描述
但“好棒”和“好棒棒”实际上是不一样的,如何区分呢?

需要用到CTC算法,它的基本思想是,输出不只是字符,还要填充NULL,输出的时候去掉NULL就可以得到连词的效果
在这里插入图片描述
下图是CTC的示例,RNN的输出就是英文字母+NULL,google的语音识别系统就是用CTC实现的
在这里插入图片描述

Sequence to Sequence Learning

在Seq2Seq中,RNN的输入输出都是sequence,但是长度不同

在CTC中,input比较长,output比较短;而在Seq2Seq中,并不确定谁长谁短

比如现在要做机器翻译,将英文的word sequence翻译成中文的character sequence

假设在两个时间点分别输入“machine”和“learning”,则在最后1个时间点memory就存了整个句子的信息,接下来让RNN输出,就会得到“机”,把“机”当做input,并读取memory里的值,就会输出“器”,依次类推,这个RNN甚至会一直输出,不知道什么时候会停止
在这里插入图片描述
可以多加一个叫做“断”的symbol “===”,当输出到这个symbol时,机器就停止输出
在这里插入图片描述

Seq2Seq for Syntatic Parsing

Seq2Seq还可以用在句法解析上,让机器看一个句子,它可以自动生成树状的语法结构图
在这里插入图片描述

Seq2Seq for Auto-encoder Text

如果用bag-of-word来表示一篇文章,就很容易丢失词语之间的联系,丢失语序上的信息

比如“白血球消灭了感染病”和“感染病消灭了白血球”,两者bag-of-word是相同的,但语义却是完全相反的
在这里插入图片描述
这里就可以使用Seq2Seq Autoencoder,在考虑了语序的情况下,把文章编码成vector,只需要把RNN当做编码器和解码器即可

我们输入word sequence,通过RNN变成embedded vector,再通过另一个RNN解压回去,如果能够得到一模一样的句子,则压缩后的vector就代表了这篇文章中最重要的信息
在这里插入图片描述
这个结构甚至可以被层次化,我们可以对句子的几个部分分别做vector的转换,最后合并起来得到整个句子的vector
在这里插入图片描述

Seq2Seq for Auto-encoder Speech

Seq2Seq autoencoder还可以用在语音处理上,它可以把一段语音信号编码成vector

这种方法可以把声音信号都转化为低维的vecotr,并通过计算相似度来做语音搜索
在这里插入图片描述
先把声音信号转化成声学特征向量(acoustic features),再通过RNN编码,最后一个时间点存在memory里的值就代表了整个声音信号的信息

为了能够对该神经网络训练,还需要一个RNN作为解码器,得到还原后的 y i y_i yi,使之与 x i x_i xi的差距最小
在这里插入图片描述

Attention-based Model

除了RNN之外,Attention-based Model也用到了memory的思想

机器会有自己的记忆池,神经网络通过操控读写头去读或者写指定位置的信息,这个过程跟图灵机很像,因此也被称为neural turing machine
在这里插入图片描述
这种方法通常用在阅读理解上,让机器读一篇文章,再把每句话的语义都存到不同的vector中,接下来让用户向机器提问,神经网络就会去调用读写头的中央处理器,取出memory中与查询语句相关的信息,综合处理之后,可以给出正确的回答

Reference

https://sakura-gh.github.io/ML-notes/ML-notes-html/27_Recurrent-Neural-Network-part2.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值