从零开始学Python自然语言处理(十九)—— 不可不知的循环神经网络(RNN)

浏览: 2064

前文传送门:

从零开始学自然语言处理(十八)—— 如何评价统计语言模型的好坏

循环神经网络(RNN)对自然语言处理来说,是非常重要的,包括之后的LSTM等网络结构,都是基于基础RNN变化而来。既然循环神经网络是一种神经网络,那它长什么样呢?

如下图所示:

可能你看的有点迷糊,我们可以看看另一张图:

其实,左边的这个结构展开之后就得到右边的结构了,两者所表达的含义相同,都是RNN网络结构。

你可能会问,这网络结构怎么理解呢?

首先,我们回顾常见的神经网络结构是这样的:

上图是一种典型的神经网络结构,也是比较基础的结构,叫做前馈神经网络,大家应该比较熟悉了,前馈神经网络分为输入层、隐藏层和输出层。

我们再看看看刚说到的RNN结构:

先看看折叠展开之前的结构,x代表输入层的输入,s代表隐藏层的值,而o代表输出层的输出,U为输入层到隐藏层的权重矩阵,V为隐藏层到输出层的权重矩阵。这样和前馈神经网络对比一下,是不是更容易理解了呢?接下来我们看看右边展开之后的RNN,t代表某一时刻,从图中,我们可以看到有t-1、t、t+1三个时刻,意味着随着时间推移,例如在t时刻,输入xt后,此时隐藏层的值为st,输出ot,但是和前馈神经网络有区别的是,ot的输出不仅和xt有关系,还和s(t-1)有关系,这一点可以在图中看到s(t-1)的节点指向了st。所以,从图中可以看出任意时刻的隐藏层的值st都被上一时刻的隐藏层的值s(t-1)所影响,以此类推,s(t-1)被s(t-2)影响,则st被之前所有时刻的隐藏层值或多或少影响着。

如果将RNN用数学公式表示出来,如下所示:

此时,我们也就能理解RNN未展开的左图的含义了,即隐藏层的值除了被当前时刻的输入影响,还被上一时刻隐藏层的值所影响。

我们再看看RNN展开后的图:

和前馈神经网络还有较大区别的一点是,这个典型RNN结构中,是一个多次输入和多次输出的过程。当我们按顺序输入x(t-1)、x(t)、x(t+1)时,相应输出的是o(t-1)、o(t)、o(t+1),这个过程是带有时间序列性质的,也就是说它有时间先后顺序。而传统的前馈神经网络总是一次输入完,然后在输出端一次输出。RNN的这种时间序列的输入输出性质能为自然语言处理带来很大作用,因为自然语言处理中的序列相关处理任务十分重要。举个例子,当我们在处理自然语言中的词性标注任务时,我们的词性标注任务是个序列标注任务,例如一句分词好的句子“小明 喜欢 滑雪”,词性标注结果为:

小明 nr
喜欢 v
滑雪 nr

在这个词性标注任务中,当前词的词性和之前的词是有很大关系的,例如在标“滑雪”的词性时,我们发现前一个词“喜欢”是动词,所以“滑雪”一词是名词的概率远大于是动词的概率。所以RNN的出现,让自然语言处理中的序列相关处理任务得到发展。

扫码下图关注我们不会让你失望!

推荐 0
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册