为什么需要RNN?
这也是我接触完卷积网络之后的疑问,有了卷积神经网络以及感知机(人工神经网络)这两种提取特征的利器,为什么深度学习还需要循环神经网络(RNN Recurrent Neural Network)?
原因是他们都只能单独的去处理一个个输入,前一个输入和后一个输入是没有关系的,生成的结果之间也是没有关系的。但是在生活中,我们需要一些模型来处理序列信息,即前面的输入和后面的输入是有一定关系的。比如说理解一句话的时候,单单理解这句话的每个词是远远不够的,我们需要处理这些词连接起来的整个序列;又或者说我们在处理视频的时候,我们不能简单地分析每一帧,而是要分析这些帧连接起来的整个序列。
以词性标注任务举例
“我爱看电影”这句话。将这句话进行词性标注,结果为:我/nn 爱看/v 电影/nn。
有人就会说,这个任务可以交给普通的卷积神经网络来做,就是一个简单的分类任务。不否认这种方法是可以的,但是在一个句子中,单词的前后关联性对词性预测是由很大影响的。比如说预测电影的时候,由于前面一个词是动词,那么电影这个词作为名词的概率会大于作为动词的概率,因为动词后面接名词的情况很常见,动词后面接动词的情况很少见。
为了解决类似的问题,并且让神经网络能更好处理序列信息,让神经网络也具有一定的记忆能力,RNN就这样诞生了。
RNN结构
首先来看一个比较简单的循环神经网络:
图源:【知乎】一文搞懂RNN(循环神经网络)基础篇
上图的元素有输入层X,权重矩阵U,隐藏层S,权重矩阵w,权重矩阵V,输出层O。他们之间的关系如下:
上面公式中的函数g和函数f都是这一层的激活函数。对照上面的结构图以及关系式,接下来我们来理解一下这两行公式的含义:
第一行公式很好理解,就是张量相乘,然后经过激活函数,t时刻的S和V相乘得到t时刻的O输出。
第二行理解起来可能就有些困难,但是其实分成两部分来看也并不困难。
第一部分:
是t时刻的输入
和权重矩阵U的相乘,相当于t时刻S的一部分取决于t时刻的输入
。
第二部分:也就是RNN的核心部分,
表示权重矩阵W与t-1时刻的隐藏层S相乘。也就是说权重矩阵W是隐藏层S上一次的值作为这一次的输入的权重。通过这一步就可以将隐藏层S在t-1时刻的记录下的状态作为输入,从而影响t时刻的隐藏层S。
的值不仅仅取决于
,还取决于
。
比如t时刻输入 的shape为 ,权重矩阵 的shape为 ,通过矩阵乘法可以知道 的shape为 ,那么权重矩阵 的shape应该为 ,这样t-1时刻的 与 进行矩阵相乘的shape也是 ,这样就可以和 相加了。
我们给出上面抽象图具体的展开图:
从上图就可以很清楚的了解到,t-1时刻的隐藏层S到底是如何影响t时刻的隐藏层S的。
我们将RNN图按照时间线展开,循环神经网络可以展开成下面这个样子:
这样就很清楚了,一个网络在t时刻接收到输入
之后,隐藏层的值为
,输出层是
。其中,RNN的关键是,
的值不仅仅取决于
,还取决于
,也就是可以用上面提到的计算公式来表示循环神经网络的计算方法: