李宏毅机器学习笔记10:RNN(1)

Recurrent Neural Network(Ⅰ)

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

Introduction

Slot Filling

  • 在智能客服、智能订票系统中,往往会需要slot filling技术,它会分析用户说出的语句,将时间、地址等有效的关键词填到对应的槽上,并过滤掉无效的词语

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

  • 但这样做会有一个问题,该神经网络会先处理“arrive”和“leave”这两个词汇,然后再处理“Taipei”,这时对NN来说,输入是相同的,它没有办法区分出“Taipei”是出发地还是目的地

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

这种有记忆力的神经网络,就叫做Recurrent Neural Network(RNN)
  • 在RNN中,hidden layer每次产生的output a1a_1a1a2a_2a2,都会被存到memory里,下一次有input的时候,这些neuron就不仅会考虑新输入的x1x_1x1x2x_2x2,还会考虑存放在memory中的a1a_1a1a2a_2a2

    注:在input之前,要先给内存里的aia_iai赋初始值,比如0

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

Slot Filling with RNN

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

  • “arrive”的vector作为x1x^1x1输入RNN,通过hidden layer生成a1a^1a1,再根据a1a^1a1生成y1y^1y1,表示“arrive”属于每个slot的概率,其中a1a^1a1会被存储到memory中
  • “Taipei”的vector作为x2x^2x2输入RNN,此时hidden layer同时考虑x2x^2x2和存放在memory中的a1a^1a1,生成a2a^2a2,再根据a2a^2a2生成y2y^2y2,表示“Taipei”属于某个slot的概率,此时再把a2a^2a2存到memory中
  • 依次类推
注意:上图为同一个RNN在三个不同时间点被分别使用了三次,并非是三个不同的NN
这个时候,即使输入同样是“Taipei”,我们依旧可以根据前文的“leave”或“arrive”来得到不一样的输出

Elman Network & Jordan Network

RNN有不同的变形:

  • Elman Network:将hidden layer的输出保存在memory里
  • Jordan Network:将整个neural network的输出保存在memory里

由于hidden layer没有明确的训练目标,而整个RNN具有明确的目标,因此Jordan Network的表现会更好一些

Bidirectional RNN(双向RNN)

  • RNN 还可以是双向的,你可以同时训练一对正向和反向的RNN,把它们对应的hidden layer xtx^txt拿出来,都接给一个output layer,得到最后的yty^tyt

使用Bi-RNN的好处:

  • RNN在产生输出的时候,它能够看到的范围是比较广的,RNN在产生yt+1y^{t+1}yt+1的时候,它不只看了从句首x1x^1x1开始到xt+1x^{t+1}xt+1的输入,还看了从句尾xnx^nxn一直到xt+1x^{t+1}xt+1的输入,这就相当于RNN在看了整个句子之后,才决定每个词汇具体要被分配到哪一个槽中,这会比只看句子的前一半要更好

LSTM

现在常用的memory管理方式叫做长短期记忆(Long Short-term Memory),简称LSTM
冷知识:可以被理解为比较长的短期记忆,因此是short-term,而非是long-short term

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:

  • 4个input:
    • 想要被存到memory cell里的值
    • 操控input gate的信号
    • 操控output gate的信号
    • 操控forget gate的信号
  • 1个output:
    • 想要从memory cell中被读取的值

Memory Cell

如果从表达式的角度看LSTM,它比较像下图中的样子

  • zzz是想要被存到cell里的输入值
  • ziz_izi是操控input gate的信号
  • zoz_ozo是操控output gate的信号
  • zfz_fzf是操控forget gate的信号
  • aaa是综合上述4个input得到的output值
  • zzzziz_izizoz_ozozfz_fzf通过activation function,分别得到g(z)g(z)g(z)f(zi)f(z_i)f(zi)f(zo)f(z_o)f(zo)f(zf)f(z_f)f(zf)

    • 其中对ziz_izizoz_ozozfz_fzf来说,它们通过的激活函数f()f()f()一般会选sigmoid function,因为它的输出在0~1之间,代表gate被打开的程度
  • g(z)g(z)g(z)f(zi)f(z_i)f(zi)相乘得到g(z)⋅f(zi)g(z)\cdot f(z_i)g(z)f(zi),然后把原先存放在cell中的cccf(zf)f(z_f)f(zf)相乘得到cf(zf)cf(z_f)cf(zf),两者相加得到存在memory中的新值c′=g(z)⋅f(zi)+cf(zf)c'=g(z)\cdot f(z_i)+cf(z_f)c=g(z)f(zi)+cf(zf)

    • f(zi)=0f(z_i)=0f(zi)=0,则相当于没有输入,若f(zi)=1f(z_i)=1f(zi)=1,则相当于直接输入g(z)g(z)g(z)
    • f(zf)=1f(z_f)=1f(zf)=1,则保存原来的值ccc并加到新的值上,若f(zf)=0f(z_f)=0f(zf)=0,则旧的值将被遗忘清除
  • 从中也可以看出,forget gate的逻辑与我们的直觉是相反的,控制信号打开表示记得,关闭表示遗忘

  • 此后,c′c'c通过激活函数得到h(c′)h(c')h(c),与output gate的f(zo)f(z_o)f(zo)相乘,得到输出a=h(c′)f(zo)a=h(c')f(z_o)a=h(c)f(zo)

LSTM Example

下图演示了一个LSTM的基本过程,x1x_1x1x2x_2x2x3x_3x3是输入序列,yyy是输出序列,基本原则是:

  • x2=1x_2=1x2=1时,将x1x_1x1的值写入memory
  • x2=−1x_2=-1x2=1时,将memory里的值清零
  • x3=1x_3=1x3=1时,将memory里的值输出
  • 当neuron的输入为正时,对应gate打开,反之则关闭

LSTM Structure

你可能会觉得上面的结构与平常所见的神经网络不太一样,实际上我们只需要把LSTM整体看做是下面的一个neuron即可

假设目前我们的hidden layer只有两个neuron,则结构如下图所示:

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

LSTM for RNN

从上图中你可能看不出LSTM与RNN有什么关系,接下来我们用另外的图来表示它
  • 假设我们现在有一整排的LSTM作为neuron,每个LSTM的cell里都存了一个scalar值,把所有的scalar连接起来就组成了一个vector ct−1c^{t-1}ct1

  • 在时间点ttt,输入了一个vector xtx^txt,它会乘上一个matrix,通过转换得到zzz,而zzz的每个dimension就代表了操控每个LSTM的输入值,同理经过不同的转换得到ziz^izizfz^fzfzoz^ozo,得到操控每个LSTM的门信号

下图是单个LSTM的运算情景,其中LSTM的4个input分别是zzzziz^izizfz^fzfzoz^ozo的其中1维,每个LSTM的cell所得到的input都是各不相同的,但它们却是可以一起共同运算的,整个运算流程如下图左侧所示:

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

  • 因此在下一个时间点操控这些gate值,不只是看输入的xt+1x^{t+1}xt+1,还要看前一个时间点的输出hth^tht和cell值ctc^tct,你需要把xt+1x^{t+1}xt+1hth^thtctc^tct这3个vector并在一起,乘上4个不同的转换矩阵,去得到LSTM的4个输入值zzzziz^izizfz^fzfzoz^ozo,再去对LSTM进行操控

注意:下图是同一个LSTM在两个相邻时间点上的情况

  • 上图是单个LSTM作为neuron的情况,事实上LSTM基本上都会叠多层,如下图所示,左边两个LSTM代表了两层叠加,右边两个则是它们在下一个时间点的状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值