循环神经网络(Recurrent Neural Network)

1138-魏同学

发表文章数:75

热门标签

首页 » 算法 » 正文

RNN是最常用的LSTM(LSTM由RNN转化而来)一般般用于记住之前的状态,以供后续神经网络的判断,它由input gate 、forget gate 、output gate 、和cell memory组成,每个LSTM本质上就是一个神经元,特殊之处在于有4个输入:

z

z

z和三个门控制信号

z

i

,

z

f

,

z

o

z^{i},z^{f},z^{o}

zi,zf,zo 组成 ,每个时间点的输入都是由当前输入值+上一个时间点的输出值+上一个时间点cell值来组成
槽填充
在智能客服、智能订票系统中,往往需要槽填充技术,他会分析用户说出的语句,将时间、地址等有效的关键词填到对应的槽上,并过滤掉无效的词语。
词汇转化为向量,可以使用1-of-N(one-hot)编码,word hashing或者是word vector等方式,此外我们可以尝试使用Feedforward Neural Network来分析词汇,判断出它是属于时间或是目的地的概率.
循环神经网络(Recurrent Neural Network)

如上图所示:该神经网络会先处理“arrive”和“leave”这两个词汇,然后再处理“Taipei”,这时对NN来说,输入是相同的,它没有办法区分出“Taipei”是出发地还是目的地

这个时候我们就希望神经网络是有记忆的,如果NN在看到“Taipei”的时候,还能记住之前已经看过的“arrive”或是“leave”,就可以根据上下文得到正确的答案
这种有记忆力的神经网络,就叫做Recurrent Neural Network(RNN)

在RNN中,隐藏层每次产生的输出

a

1

,

a

2

a_{1},a_{2}

a1,a2,都会被存到记忆中,下次有输入的时候,这些神经元就不仅会考虑新的输入

x

1

,

x

2

x_{1},x_{2}

x1,x2,还会考虑存放在记忆中的

a

1

,

a

2

a_{1},a_{2}

a1,a2
循环神经网络(Recurrent Neural Network)
注意到,每次NN的输出都要考虑memory中存储的临时值,而不同的输入产生的临时值也尽不相同,因此改变输入序列的顺序会导致最终输出结果的改变(Changing the sequence order will change the output)

RNN处理糟填充
“arrive”的向量作为

x

1

x^{1}

x1输入RNN中,通过隐藏层生成

a

1

a^{1}

a1,再根据

a

1

a^{1}

a1生成

y

1

y^{1}

y1,表示“arrive”属于每个槽的概率,其中

a

1

a^{1}

a1会被存储到内存中。

“Taipei”的向量作为

x

2

x^{2}

x2输入RNN中,此时隐藏层同时考虑

x

2

x^{2}

x2和存放在存储器中的

a

1

a^{1}

a1,生成

a

2

a^{2}

a2,再根据

a

2

a^{2}

a2生成

y

2

y^{2}

y2,表示“Taipei”属于每个槽的概率,此时再把

a

2

a^{2}

a2会被存储到内存中。
以此类推
循环神经网络(Recurrent Neural Network)
上图为同一个RNN在三个不同时间点被分别使用了三次,并非是三个不同的NN

这个时候,即使输入同样是“Taipei”,我们依旧可以根据前文的“leave”或“arrive”来得到不一样的输出
循环神经网络(Recurrent Neural Network)
Elman Network & Jordan Network
RNN有不同的变形:
Elman Network:将hidden layer的输出保存在memory里
Jordan Network:将整个neural network的输出保存在memory里
由于hidden layer没有明确的训练目标,而整个NN具有明确的目标,因此Jordan Network的表现会更好一些

双向回归神经网络(Bidirectional RNN)
RNN可以是双向的,可以同时训练一对正向和反向的RNN,把它们对应的隐藏层

x

t

x^{t}

xt拿出来,都结给一个输出层,得到最后的

y

t

y^{t}

yt
使用双向回归神经网络的好处是,NN在产生输出的时候,能够看到的范围比较广,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在看了整个句子之后,才决定每个词汇具体被分到哪个槽中。
循环神经网络(Recurrent Neural Network)
LSTM(Long Short-term Memory)长短期记忆
上文的RNN是最简单的版本,没有对memory约束,可随时进行读取,现在常用的memory管理方式叫做长短期记忆,简称LSTM。
LSTM有三个gate:
当某个神经元的输出想要被写进记忆单元,它必须要先经过一道叫做input gate 的闸门,如果input gate 关闭,则任何内容都无法被写入,而关闭与否、什么时候关闭,都由神经网络自己学习到的。
output gate 决定了外界是否可以从memory cell中读取值,当output gate关闭的时候,memory里面的内容同样无法被读取。
forget gate则决定了什么时候需要把memory cell中存放的内容忘记清空,什么时候依旧保存。
循环神经网络(Recurrent Neural Network)
整个LSTM可以看作4个input,1个output:
4个input=想要被存到memory cell里的值+操控input gate的信号+操控output gate的信号+操控forget gate的信号
1个output=想要从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值
循环神经网络(Recurrent Neural Network)

z

z

z

z

i

z_{i}

zi

z

o

z_{o}

zo

z

f

z_{f}

zf通过激励函数,分别得到,

g

(

z

)

g(z)

g(z)

f

(

z

i

)

f(z_{i})

f(zi)

f

(

z

o

)

f(z_{o})

f(zo)

f

(

z

f

)

f(z_{f})

f(zf)
其中对于

z

i

z_{i}

zi

z

o

z_{o}

zo

z

f

z_{f}

zf,它们通过激活函数

f

(

)

f()

f()一般会选择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)*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),两者相加得到存在memory中的新值

c

=

g

(

z

)

f

(

z

i

)

+

c

f

(

z

f

)

c'=g(z)*f(z_{i})+cf(z_{f})

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

f

(

z

i

)

=

0

f(z_{i})=0

f(zi)=0,则相当于没有输入,若

f

(

z

i

)

=

1

f(z_{i})=1

f(zi)=1,则相当于直接输入

g

(

z

)

g(z)

g(z)

f

(

z

f

)

=

1

f(z_{f})=1

f(zf)=1,则保存原来的值

c

c

c并加到新的值上,若

f

(

z

f

)

=

0

f(z_{f})=0

f(zf)=0,则旧的值将被遗忘清除。
从中可看出,forget gate 的逻辑是,控制信号打开表示记得,关闭表示遗忘,此后,

c

c'

c通过激活函数得到

h

(

c

)

h(c')

h(c),与output gate 的

f

(

z

o

)

f(z_{o})

f(zo)相乘,得到输出

a

=

h

(

c

)

f

(

z

o

)

a = h(c')f(z_{o})

a=h(c)f(zo)

LSTM Example
如下图LSTM的基本过程,

x

1

x_{1}

x1

x

2

x_{2}

x2

x

3

x_{3}

x3是输入序列,

y

y

y是输出序列,基本原则是:

x

2

=

1

x_{2}=1

x2=1时,将

x

1

x_{1}

x1的值写入memory

x

2

=

1

x_{2}=-1

x2=1时,将memory里的值清零

x

3

=

1

x_{3}=1

x3=1时,将memory里的值输出
当neuron的输入为正时,对应gate打开,反之则关闭
循环神经网络(Recurrent Neural Network)

LSTM Structure

可以把LSTM整体看作是下面的一个神经元:
循环神经网络(Recurrent Neural Network)
假设目前我们的hidden layer只有两个neuron,则结构如下图所示:
输入

x

1

x_{1}

x1

x

2

x_{2}

x2,会分别乘上四组不同的权重,作为神经元的输入以及三个状态门的控制信号
在原来的神经元里,一个输入对应一个输出,而在LSTM里,4个输入才产生一个输出,并且所有的输入都是不相同的
从中也可以看出LSTM所需要的参数量是一般NN的4倍

循环神经网络(Recurrent Neural Network)
LSTM 和 RNN
假设有一整排的LSTM作为神经元,每个LSTM的cell中都存了一个scalar值,把所有的scalar连接起来就组成了一个vector

c

t

1

c^{t-1}

ct1
在时间点

t

t

t,输入了一个向量

x

t

x^{t}

xt,他会乘上一个矩阵,通过转化得到

z

z

z,而

z

z

z的每个维度代表了操控每个LSTM的输入值,同理:经过不同的转换得到

z

i

z_{i}

zi

z

o

z_{o}

zo

z

f

z_{f}

zf,得到操控每个LSTM的门信号。
循环神经网络(Recurrent Neural Network)
下图是单个LSTM的运算场景,其中LSTM的4个输入分别是

z

z

z

z

i

z_{i}

zi

z

o

z_{o}

zo

z

f

z_{f}

zf的其中一维,每个LSTM的cell所得到的输入都是各不相同的,但他们可以一起共同运算,整个运算流程如下图左侧所示:

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)*f(z_{i})

g(z)f(zi)上,得到这个时刻cell中的值

c

t

c^{t}

ct,最终再乘上output gate的信号

f

(

z

o

)

f(z_{o})

f(zo),得到输出

y

t

y^{t}

yt
循环神经网络(Recurrent Neural Network)
上述的过程反复进行下去,就得到下图中各个时间点上,LSTM值的变化情况,其中与上面的描述略有不同的是,这里还需要把hidden layer的最终输出

y

t

y^{t}

yt以及当前cell的

c

t

c^{t}

ct值都连接到下一个时间点的输入上.

因此在下一个时间点操控这些gate值,不只看输入的

c

t

c^{t}

ct,还要看前一个时间点的输出

c

t

c^{t}

ct和cell值

c

t

c^{t}

ct,需要把这3个向量并在一起,乘上四个不同的转换矩阵,去得到LSTM的4个输入值

z

z

z

z

i

z_{i}

zi

z

o

z_{o}

zo

z

f

z_{f}

zf,再去对LSTM进行操控。
下图是同一个LSTM在两个相邻时间点上的情况

循环神经网络(Recurrent Neural Network)
上图是单个LSTM作为神经元的情况,事实上,LSTM基本上都会叠多层,如下图所示,左边两个LSTM代表了两层叠加,右边两个则是他们在下一个时间点的状态。
循环神经网络(Recurrent Neural Network)

Learning Target
Loss Function

RNN的输出和reference vector的cross entropy之和就是损失函数,也是要minimize的对象

需要注意的是,word要依次输入model,比如“arrive”必须要在“Taipei”前输入,不能打乱语序
循环神经网络(Recurrent Neural Network)
训练(training)
有了损失函数,训练可以采用梯度下降法,这里采用反向传播(Backpropagation)的进阶版,Backpropagation through time,简称BPTT算法

BPTT算法与BP算法非常类似,只是多了一些时间维度上的信息
循环神经网络(Recurrent Neural Network)
RNN训练的时候,希望随着epoch的增加,参数的更新,loss应该像下图蓝色曲线一样慢慢下降,但是在训练RNN 的时候,如果遇到绿色曲线一样的学习曲线,loss剧烈抖动,并且会在某个时刻跳到无穷大,导致程序运行失败。
循环神经网络(Recurrent Neural Network)
误差曲面(Error Surface)
分析可知,RNN的误差曲面,即loss由于参数产生的变化,是非常陡峭的。
下图中,轴代表loss,轴和轴代表由两个参数和,可以看到loss在某些地方非常平坦,在某些地方又非常陡峭

如果训练过程类似下图中从下往上的橙色的点,它先经过一块平坦的区域,又由于参数的细微变化跳上了悬崖,就会使得loss抖动非常剧烈。
循环神经网络(Recurrent Neural Network)
如上图所示,橙色点,在悬崖上,由于之前一直处于平坦区域,梯度很小,此时会把参数更新的步长(learning rate)调的比较大,而在悬崖上导致梯度突然增大,会导致参数一下被更新尺度较大,导致学习曲线突然跳到无穷大的原因。
解决此类问题可以采用clipping方法,当梯度即将大于某个阈值的时候,就让它停止增长。

假设RNN只有一个神经元,他是线性的,输入和输出的权重都是1,没有bias,从当前时刻的memory值接到下一时刻的输入的权重是

w

w

w,按照时间点顺序输入[1, 0, 0, 0, …, 0]

当第一个时间点输入1的时候,在第1000个时间点,RNN输出的

y

1000

=

w

999

y^{1000}=w^{999}

y1000=w999,想要知道参数

w

w

w的梯度,只需要改变

w

w

w的值,观察对RNN的输出有多大的影响即可:
如下图所示:

w

w

w从1-1.01,得到的

y

1000

y^{1000}

y1000从1变成了很大的值,这表示

w

w

w的梯度很大,需要降低学习率

w

w

w从0.99-1,得到的

y

1000

y^{1000}

y1000几乎没有变化,这表示

w

w

w的梯度很小,需要调高学习率
从中可以看出gradient时大时小,error surface很崎岖,尤其是在w = 1的周围,gradient几乎是突变的,这让我们很难去调整learning rate
循环神经网络(Recurrent Neural Network)
由上可知RNN经常遇到的问题:
梯度消失(gradient vanishing),一直在梯度平缓的地方停滞不前
梯度爆炸(gradient explode),梯度的更新步伐迈得太大导致直接飞出有效区间

LSTM会把error surface上那些比较平坦的地方拿掉,从而解决梯度消失(gradient vanishing)的问题,但它无法处理梯度崎岖的部分,因而也就无法解决梯度爆炸的问题(gradient explode)
但由于做LSTM的时候,大部分地方的梯度变化都很剧烈,因此训练时可以放心地把learning rate设的小一些

RNN的其他功能
在Slot Filling中,我们输入一个word vector输出它的label,除此之外RNN还可以做更复杂的事情
多对一
多对多

1 语义情绪分析(Sentiment Analysis)
语义情绪分析:可以把某影片的相关文章爬下,并分析其正面情绪或负面情绪.
RNN的输入是字符序列,在不同时间点输入不同的字符,并在最后一个时间点输出该文章的语义情绪
循环神经网络(Recurrent Neural Network)
2 关键词分析(Key term Extraction)
关键词分析,RNN可以分析一篇文章并提取出其中的关键词,这里需要把含有关键词标签的文章作为RNN的训练数据
循环神经网络(Recurrent Neural Network)

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

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

如果依旧使用Slot Filling的方法,只能做到每个vector对应1个输出的character,识别结果就像是下图中的“好好好棒棒棒棒棒”,但这不是我们想要的,可以使用Trimming的技术把重复内容消去,剩下“好棒:"
循环神经网络(Recurrent Neural Network)
但“好棒”和“好棒棒”实际上是不一样的,如何区分呢?

需要用到CTC算法,它的基本思想是,输出不只是字符,还要填充NULL,输出的时候去掉NULL就可以得到连词的效果

循环神经网络(Recurrent Neural Network)
下图是CTC的示例,RNN的输出就是英文字母+NULL,google的语音识别系统就是用CTC实现的
循环神经网络(Recurrent Neural Network)
4 Sequence to Sequence Learning
在Seq2Seq中,RNN的输入输出都是sequence,但是长度不同

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

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

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

循环神经网络(Recurrent Neural Network)
5 Seq2Seq for Syntatic Parsing(同步分析)
Seq2Seq还可以用在句法解析上,让机器看一个句子,它可以自动生成树状的语法结构图
循环神经网络(Recurrent Neural Network)
6 Seq2Seq for Auto-encoder Text(自动编码器)
如果用bag-of-word来表示一篇文章,就很容易丢失词语之间的联系,丢失语序上的信息

比如“白血球消灭了感染病”和“感染病消灭了白血球”,两者bag-of-word是相同的,但语义却是完全相反的
循环神经网络(Recurrent Neural Network)
这里就可以使用Seq2Seq Auto-encoder,在考虑了语序的情况下,把文章编码成vector,只需要把RNN当做编码器和解码器即可

我们输入word sequence,通过RNN变成embedded vector,再通过另一个RNN解压回去,如果能够得到一模一样的句子,则压缩后的vector就代表了这篇文章中最重要的信息
循环神经网络(Recurrent Neural Network)
这个结构甚至可以被层次化,我们可以对句子的几个部分分别做vector的转换,最后合并起来得到整个句子的vector
循环神经网络(Recurrent Neural Network)
7 Seq2Seq for Auto-encoder Speech(Seq2Seq用于自动编码器语音)
Seq2Seq autoencoder还可以用在语音处理上,它可以把一段语音信号编码成vector

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

为了能够对该神经网络训练,还需要一个RNN作为解码器,得到还原后的

y

i

y_{i}

yi,使之与

x

i

x_{i}

xi的差距最小
循环神经网络(Recurrent Neural Network)
8 Attention-based Model(基于注意力的模型)
除了RNN之外,Attention-based Model也用到了memory的思想

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

标签:

未经允许不得转载:作者:1138-魏同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《循环神经网络(Recurrent Neural Network)》 发布于2020-11-17

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录