图解RNN

循环神经网络(recurrent neural network)或RNN是一类用于处理序列数据的神经网络。就像卷积网络是专门用于处理网格化数据(如一个图像)的神经网络,循环神经网络是专门用于处理序列x1,... xt 的神经网络。本文将通过语言模型中RNN的应用来浅谈自己对RNN的理解。


图1 RNN展开图

上图表示一个RNN的展开图,其中,X为输入,隐层是S,输出是O。RNN输入到隐藏的连接由权重矩阵U 参数化,隐藏到隐藏的循环连接由权重矩阵W 参数化以及隐藏到输出的连接由权重矩阵V 参数化。

如果输入序列是一个句子,那么xi对应的就是输入的每个词,如对于“我们是中国人”这句话,输入将会是:x1="我们",x2=“是”,x3=“中国人”;不过一般都将这些词处理,变为一个固定维度的词向量输入。我们在看看只有一个输出的RNN


图2 单一输出的RNN

如果xt+1是句子的最后一个词,那么ot+1就是整个句子的输出,那么在语言模型中ot+1是怎么通过这些转换表示这个句子的呢?

我们看看下面的公式:



对于初学RNN的同学来说,理解起来可能就很费劲了,就这一个简单的公式就能表示千变万化的语言模型?从垂直的方向看,他就是一个浅层神经网络,只不过加了一个隐层连接而已。看看下面一个简单的RNN模型,词向量是4维的,隐藏单元3个,有3个词向量组成的句子,输出是四维的。我们以网络连接的形式把它展示出来:


图3 RNN网络连接图

看到这个像木马的图形,结合MLP的知识,是不是看着有点眉目了,不过这个图是横着的,我们再把它拉直,按照MLP的结构看看


图4 RNN垂直网络连接图

看完这个图是不是有种,还是那个原来的配方,还是那个熟悉的味道的感觉,是的RNN他就是横着放的神经网络,很像MLP,它和一般的MLP不同的地方在于,MLP隐层一般都不会有额外的输入,但是RNN会,这是由于处理序列数据特殊的需求导致的。我们知道MLP最厉害的地方在于抽象能力,举个人脸识别的例子(这个图不准确)


图5 人脸识别过程

我们看到浅层的神经网络学习到的是一些边缘特征,中间的网络学习到的是边缘的组合特征,也就是局部人脸,后面的网络学习到的是整个人脸。这种由底层到高层不断抽象的能力,展示出神经网络建模的能力,用数学公式表示就是,如果某个集合存在一个映射,y=f(x),x可能是人脸,可能是其他的事物,y是想要的输出,神经网络有能够拟合出这个f的能力,即使这个f很复杂。

回到图4,我们再看看网络,发现这和MLP还有有着本质的区别的,因为MLP的每个隐层是不同的,所以它才能不断的抽象,但是RNN隐层是共享参数的,也就是黑色部分的参数是一样的,所以它可以看成一个特殊的单隐层神经网络。

那么RNN网络到底学习了什么呢?

个人浅显理解:我们看看第一个隐层的输出是第一个词内部关系,第二个隐层输出是第二个词和第一个词之间的关系,第三个隐层输出的是第三个词和(第二个词和第一个词之间的关系)的关系,有点绕,举个例子,如:abc为一句话,第二个隐层能够表示b和a的关系,第三个隐层的输出能够表示c和b,a之间的关系。那么我理解的黑色连接部分是表示关系转换信息,也就是ab和abc之间应该存在着某些特定的模式,而转换矩阵w就是要学习到这些关系;蓝色的连接我认为是当前词对当前句子的影响程度;绿色连接和黑色连接的意义差不多。这么割裂开来看纯属个人理解,如有错误还请指导。

通过图4我们也可以看出RNN的巧妙之处,对于任意长度的输入,输出是一致的;能够表达序列之间的关系;参数共享易于训练。但是也发现了一个问题,就是RNN对于长句子表达的不好,我们看到第一个词和最后一个词的关系是通过好多次转换矩阵才产生的,这样句子很长这种关系就很难表示出来,这也一度成为RNN的瓶颈,当然这些问题最后被LSTM(1997),GRU等RNN变种网络给解决了。一个有趣的问题是,类似于LSTM这种直接连接近似解决梯度弥散的方法在CNN使用中直到ResNet(2015)提出才被广泛使用,不过两者相差了好多年,也充分说明了一个现象,只有想不到没有做不到,哈哈。

接下来我们再看看模型的容量,如词向量的维度是1024维,隐层有1000个单元,输出也是1024维,那么整个网络的参数个数为:U参数+V参数+W参数=1024*1000+1000*1024+1000*1000≈3*10^6,也就是300万个参数,这个模型的容量对于千变万化的语言来说估计有点小,不过没有关系,还有其他的RNN变种,待续...

欢迎大家拍砖,讨论,指正!多谢!







猜你喜欢

转载自blog.csdn.net/wdmlovekerry/article/details/76795050
RNN