RNN及双向RNN原理


原文地址:http://www.keraschina.com/keras_rnn/

一、RNN网络结构及原理讲解

RNN的网络结构如下图:

 

 Xi代表输入第i时刻输入,hi代表第i时刻记忆,yi代表第i时刻输出,U,V,W为相应权重矩阵。

图中左侧是未展开RNN模型,在模型中间有个大圆圈表示循环,正是这个循环允许信息的持久化。但这个看起来可能不太好理解,因此将其展开为右侧的模型,并做进一步详细介绍如何实现信息的持久化。

右图中圆圈可以看作一个单元。定义Xi为第i时刻的输入,hi为第i时刻的记忆,yi为第i时刻的输出。

举个例子说明RNN实现过程:假设有一个句子的输入是”今天天空很”,要预测下个词是什么。通过分词后可能得到三个词作为输入:“今天”,“天空”,“很”,对应的就是上图的Xi-1,Xi,Xi+1,那么输出yi-1应该是“天空”,yi应该是“很”,预测下个词yi+1是什么,根据这句话,“蓝”的概率比较大。因此预测下个词应该是“蓝”。

通过上述浅显易懂的例子读者应该对RNN实现过程有个大概的了解,接下来将具体讲解RNN实现的详细过程。

输入层到隐藏层

从上图的箭头指示,读者或许发现第i时刻的输出是由上一时刻的记忆和当前时刻共同决定的。这个思想很符合对时序数据处理的思路。正如我们在看连续剧的时候如果直接看中间某一集,可能会对部分剧情不能理解,但是,当我们看过前几集后会对剧情有所记忆,再加上该集剧情内容,我们就能更好的理解接下来剧情内容。因此用公式表示RNN当前时刻的记忆为:

其中f()函数为激活函数。在此处要加上激活函数也很好理解,因为得到的信息并不是所有的都是重要的信息,而我们只需要记住重要的信息即可。这个时候就可以使用激活函数,如tanh,去对一些不重要的信息进行过滤,保留重要的信息即可。

隐藏层到输出层

同样使用电视剧的例子进行通俗解释,当我们对上几集和该集的剧情进行整理,留下一些重要信息之后,我们会试图去猜测下一集的内容大概会是怎么样的。同样的,RNN的思路也如此。当我们hi中保留了i时刻的重要信息后,就试图使用这些重要信息进行预测下一个词应该是什么。用公式表示RNN当前时刻的输出为:

使用softmax函数是RNN希望预测每个词出现的概率,然后概率最高的词就是预测的下一个词。

注:U、W、V分别是对应的权重矩阵,通过反向传播算法调整相应的值使得预测的结果更加准确。与CNN一样,网络中的每个单元都共享同一组(U、V、W),可以极大的降低了计算量。

具体的前向传播计算过程如下:

在t1时刻的输入为2,结合上一时刻的记忆(0.537,0.462),得到(0.54,0.46,2.0),然后与隐藏层的权重矩阵相乘得到该时刻的记忆(0.860,0.884)。通过该时刻的记忆与输出层的权重矩阵相乘得到该时刻的预测值2.73。这就是一个时刻RNN前向传播的具体过程。

 

因此,通过上述思想,RNN就能有效的处理时序数据,对每个输入保留一些重要的信息,理论上最后就能得到整个输入的所有重要信息,进而综合考虑所有输入去预测输出。

 

二、双向RNN(BRNN)网络结构及原理讲解

在RNN中只考虑了预测词前面的词,即只考虑了上下文中“上文”,并没有考虑该词后面的内容。这可能会错过了一些重要的信息,使得预测的内容不够准确。正如电视剧的例子,当在该集新出现了一个人物,若要预测该人物的名字,单从前几集的内容,并不能有效的进行预测。但如果我们看了后几集的内容,可能就能更加有效的进行预测。双向RNN也是基于这种思想,不仅从前往后(如下图黄色实箭头)保留该词前面的词的重要信息,而且从后往前(如下图黄色虚箭头)去保留该词后面的词的重要信息,然后基于这些重要信息进行预测该词。双向RNN模型如下:

用公式表示双向RNN过程如下:

另外,双向RNN需要保存两个方向的权重矩阵,所以需要的内存约为RNN的两倍。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM