RNN,或者说最常用的LSTM,一般用于记住之前的状态,以供后续神经网络的判断,它由input gate、forget gate、output gate和cell memory组成,每个LSTM本质上就是一个neuron,特殊之处在于有4个输入:和三门控制信号、和,每个时间点的输入都是由当前输入值+上一个时间点的输出值+上一个时间点cell值来组成
在智能客服、智能订票系统中,往往会需要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 、,都会被存到memory里,下一次有input的时候,这些neuron就不仅会考虑新输入的、,还会考虑存放在memory中的、
注:在input之前,要先给内存里的赋初始值,比如0
注意到,每次NN的输出都要考虑memory中存储的临时值,而不同的输入产生的临时值也尽不相同,因此改变输入序列的顺序会导致最终输出结果的改变(Changing the sequence order will change the output)
用RNN处理Slot Filling的流程举例如下:
注意:上图为同一个RNN在三个不同时间点被分别使用了三次,并非是三个不同的NN
这个时候,即使输入同样是“Taipei”,我们依旧可以根据前文的“leave”或“arrive”来得到不一样的输出
RNN有不同的变形:
由于hidden layer没有明确的训练目标,而整个NN具有明确的目标,因此Jordan Network的表现会更好一些
RNN 还可以是双向的,你可以同时训练一对正向和反向的RNN,把它们对应的hidden layer 拿出来,都接给一个output layer,得到最后的
使用Bi-RNN的好处是,NN在产生输出的时候,它能够看到的范围是比较广的,RNN在产生的时候,它不只看了从句首开始到的输入,还看了从句尾一直到的输入,这就相当于RNN在看了整个句子之后,才决定每个词汇具体要被分配到哪一个槽中,这会比只看句子的前一半要更好
前文提到的RNN只是最简单的版本,并没有对memory的管理多加约束,可以随时进行读取,而现在常用的memory管理方式叫做长短期记忆(Long Short-term Memory),简称LSTM
冷知识:可以被理解为比较长的短期记忆,因此是short-term,而非是long-short term
LSTM有三个gate:
整个LSTM可以看做是4个input,1个output:
如果从表达式的角度看LSTM,它比较像下图中的样子
把、、、通过activation function,分别得到、、、
其中对、和来说,它们通过的激活函数一般会选sigmoid function,因为它的输出在0~1之间,代表gate被打开的程度
令与相乘得到,然后把原先存放在cell中的与相乘得到,两者相加得到存在memory中的新值
从中也可以看出,forget gate的逻辑与我们的直觉是相反的,控制信号打开表示记得,关闭表示遗忘
此后,通过激活函数得到,与output gate的相乘,得到输出
下图演示了一个LSTM的基本过程,、、是输入序列,是输出序列,基本原则是:
你可能会觉得上面的结构与平常所见的神经网络不太一样,实际上我们只需要把LSTM整体看做是下面的一个neuron即可
假设目前我们的hidden layer只有两个neuron,则结构如下图所示:
从上图中你可能看不出LSTM与RNN有什么关系,接下来我们用另外的图来表示它
假设我们现在有一整排的LSTM作为neuron,每个LSTM的cell里都存了一个scalar值,把所有的scalar连接起来就组成了一个vector
在时间点,输入了一个vector ,它会乘上一个matrix,通过转换得到,而的每个dimension就代表了操控每个LSTM的输入值,同理经过不同的转换得到、和,得到操控每个LSTM的门信号
下图是单个LSTM的运算情景,其中LSTM的4个input分别是、、和的其中1维,每个LSTM的cell所得到的input都是各不相同的,但它们却是可以一起共同运算的,整个运算流程如下图左侧所示:
与上一个时间点的cell值相乘,并加到经过input gate的输入上,得到这个时刻cell中的值,最终再乘上output gate的信号,得到输出
上述的过程反复进行下去,就得到下图中各个时间点上,LSTM值的变化情况,其中与上面的描述略有不同的是,这里还需要把hidden layer的最终输出以及当前cell的值都连接到下一个时间点的输入上
因此在下一个时间点操控这些gate值,不只是看输入的,还要看前一个时间点的输出和cell值,你需要把、和这3个vector并在一起,乘上4个不同的转换矩阵,去得到LSTM的4个输入值、、、,再去对LSTM进行操控
注意:下图是同一个LSTM在两个相邻时间点上的情况
上图是单个LSTM作为neuron的情况,事实上LSTM基本上都会叠多层,如下图所示,左边两个LSTM代表了两层叠加,右边两个则是它们在下一个时间点的状态