原文来自知乎专栏NLP进阶之路,作者韦伟。
以下文章是摘录了原文部分内容的学习笔记,侵删。
循环神经网络(Rerrent Neural Network)
RNN是神经网络的一种,RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息。其中,序列特性包括时间顺序,逻辑顺序等其他顺序。
例如:I like eating apple ! / The Apple is a great company !
如果要给apple打Label,那么第一个apple是一种水果,第二个apple是苹果公司,如果单独看apple这个单词,是很难准确地确定它的Label的,这时候我们就需要结合上下文来确定apple的Label,于是就有了循环神经网络。
循环神经网络的结构及原理
如果不看W,只看X,U,S,V,O,这幅图展开以后就变成了
, 这就是全连接神经网络,其中X是一个向量,作为输入层,U是输入层到隐藏层的参数矩阵,S是隐藏层的向量,V是隐藏层到输出层的参数矩阵,O是输出层的向量。
那么右边的W又是什么呢,把第一幅图打开之后,是这样的:
举个例子,有一句话是,I love you,那么在利用RNN做一些事情时,比如命名实体识别,上图中的 |Xt-1| 代表的就是I这个单词的向量, |Xt|代表的是love这个单词的向量, |Xt+1| 代表的是you这个单词的向量,以此类推,我们注意到,上图展开后,W一直没有变,W其实是每个时间点之间的权重矩阵,我们注意到,RNN之所以可以解决序列问题,是因为它可以记住每一时刻的信息,每一时刻的隐藏层不仅由该时刻的输入层决定,还由上一时刻的隐藏层决定,公式如下,其中Ot代表t时刻的输出, |St| 代表t时刻的隐藏层的值:
值得注意的是,在整个训练过程中,每一时刻所用的都是同样的W。
LSTM
以上是最基础版本的RNN,我们可以看到,每一个时刻的隐藏状态都不仅由该时刻的输入决定,还取决于上一时刻的隐藏层的值,如果一个句子很长,到句子末尾时,他将记不住这个句子的开头的详细内容,而LSTM通过他的“门控装置”有效地缓解了这个问题,这也就是为什么我们现在都在使用LSTM而非普通的RNN。打个比喻吧,普通RNN就像一个乞丐,路边捡的,别人丢的,什么东西他都想要,什么东西他都不嫌弃,LSTM就像一个贵族,没有身份的东西他不要,他会精心挑选符合自己身份的物品。
由于LSTM是RNN的一种变体,是更高级的RNN,所以二者的本质是一样的:每个时刻都会把隐藏层的值存下来,到下一时刻的时候再拿出来用,这样就保证了,每一时刻含有上一时刻的信息,如图,我们把存每一时刻信息的地方叫做Memory Cell,即记忆细胞。都是,和RNN只有中间的Memory Cell不同,LSTM的Memory Cell附近多了三个门,控制信息的进出。
依次来解释一下这三个门:
- Input Gate:中文是输入门,在每一时刻从输入层输入的信息会首先经过输入门,输入门的开关会决定这一时刻是否会有信息输入到Memory Cell。
- Output Gate:中文是输出门,每一时刻是否有信息从Memory Cell输出取决于这一道门。
- Forget Gate:中文是遗忘门,每一时刻Memory Cell里的值都会经历一个是否被遗忘的过程,就是由该门控制的,如果打卡,那么将会把Memory Cell里的值清除,也就是遗忘掉。
按照上图的顺序,信息在传递的顺序,是这样的:
先经过输入门,看是否有信息输入,再判断遗忘门是否选择遗忘Memory Cell里的信息,最后再经过输出门,判断是否将这一时刻的信息进行输出。
LSTM内部结构
对于LSTM我们着重讨论其中一个时间点的内部结构
其中的代表一个**函数,LSTM里常用的**函数有两个,一个是tanh,一个是sigmoid。另外,a是输出,cell是记忆细胞,Z 是最为普通的输入,Z 是通过该时刻的输入 Xt和上一时刻存在memory cell里的隐藏层信息 向量拼接,再与权重参数向量 W点积,得到的值经过**函数tanh最终会得到一个数值,也就是 Z ,注意只有 Z 的**函数是tanh,因为 Z是真正作为输入的,其他三个都是门控装置。
再来看 Zi ,input gate的缩写i,所以也就是输入门的门控装置, Zi 同样也是通过该时刻的输入 Xt 和上一时刻隐藏状态,也就是上一时刻存下来的信息 向量拼接,在与权重参数向量 Wi 点积(注意每个门的权重向量都不一样,这里的下标i代表input的意思,也就是输入门)。得到的值经过**函数sigmoid的最终会得到一个0-1之间的一个数值,用来作为输入门的控制信号,另外两个门控装置都是这个原理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深度学习笔记——循环神经网络RNN/LSTM - Python技术站