本篇笔记接上篇笔记【直观理解】一文搞懂RNN(循环神经网络)基础篇(请戳我)记录一下RNN为什么可以记录以前历史信息,如何从公式中体现出?
那么首先介绍一下为什么普通的神经网络不能记忆以前的历史信息,然后引出RNN的相应能力,因为如果普通的神经网络能够记录以前的历史信息的话,那么也就不会有RNN思想的诞生了。
1
普通神经网络(MLP)
首先我们有一个任务,就是进行词性标注,下面有两个训练数据。
他向我表白
我觉得他的表白不够真诚
正确的词性是:
那么将这些训练数据送给神经网络进行训练,比如第一个数据 “他/r”,神经网络学习 “他->r”的一个映射,第二个数据 “向/p”,神经网络学习一个 “向->p”的映射,这样一直将训练数据学习完,更新到最后的参数,从而学习到model,但是问题来了。
学习示例图如下:
在上面的训练数据中,有些词语的词性并不是唯一的,比如“表白”一词,在“他向我表白”这句话中作为动词v,在“我觉得他的表白不够真诚”这句话中作为名词n,所以对于神经网络来说,它是会学乱的。
一下子神经网络要学习“表白”是动词,一下子又要学习“表白”是名词,神经网络也很无辜呀,它没有能力来处理什么情况下应该将“表白”判别为名词,什么情况下降“表白”判断为动词,因为神经网络学习不到周围的语境。喂给神经网络的数据和之前的数据并没有联系。
所以我们这个时候就需要一个能够记忆以前历史信息的网络出现,比如在第一句话中,碰到表达一词的时候,我知道他前面的词是“我”/代词,那么代词后面的表白作为动词的概率就远大于名词的表白,当然RNN还能够看到他前面好几个词语,理论上rnn可以记忆当前词语前面的任何词。
同理在第二句话的时候,碰到“表白”一词的时候,我们的网络能够知道他前面的词是“的”/助词,那么助词后面的“表白”作为名词的概率就远大于动词的”表白“。
所以我们希望能够有一个网络在预测当前任务的时候,能够记忆以前的知识帮助当前的任务完成,这样RNN就闪亮登场了,可能有些小伙伴会说,它存在很多问题,比如不能长期记忆,但是这篇文章不介绍,但是无论如何,RNN提供了这种问题解决的可能。
2
循环神经网络记录历史信息RNN
首先来介绍一下RNN
首先看一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成:
不知道初学的同学能够理解这个图吗,反正我刚开始学习的时候是懵逼的,每个结点到底代表的是一个值的输入,还是说一层的向量结点集合,如何隐藏层又可以连接到自己,等等这些疑惑~这个图是一个比较抽象的图。
我们现在这样来理解,如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同);
U是输入层到隐藏层的权重矩阵,o也是一个向量,它表示输出层的值;V是隐藏层到输出层的权重矩阵。
那么,现在我们来看看W是什么。循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
我们给出这个抽象图对应的具体图:
我们从上图就能够很清楚的看到,上一时刻的隐藏层是如何影响当前时刻的隐藏层的。
如果我们把上面的图展开,循环神经网络也可以画成下面这个样子:
现在看上去就比较清楚了,这个网络在t时刻接收到输入 之后,隐藏层的值是 ,输出值是 。关键一点是, 的值不仅仅取决于 ,还取决于 。我们可以用下面的公式来表示循环神经网络的计算方法:
用公式表示如下:
那么我们将第二个公式一直代入到第一个公式后,就会有下面推导:
从上图可以看出,当前时刻确实包含了历史信息,这也就说明了循环神经网络(RNN)为什么能够记忆历史信息,在很多任务上也确实需要用到这样的特性。
致谢: 感谢夏冲制作的图片~
推荐阅读:
精选干货|近半年干货目录汇总
【最优化】线性规划基础
【直观详解】什么是PCA、SVD
欢迎关注公众号学习交流~
欢迎加入交流群交流学习~