说起循环神经网络RNN,不得不说一下这个梗。一天,iPhone99发售了,女朋友给你发微信说,她的手机坏了,想让你给她换一个256g的苹果。你对她说,没有问题,下班就给你买。
等你憨憨地提着256g苹果来到女朋友面前,你猜女朋友会不会生气?
虽说这是个小玩笑,但却体现了上下文对于理解的重要性。
今天,就让我们一起来研究循环神经网络。
简单的神经网络一般如下图所示,输入层x进入到隐藏层神经元s再经过输出,产生最后的结果y,通过调整权重Win和Wout就可以实现学习的效果。
![](https://i-blog.csdnimg.cn/blog_migrate/af0a0d22657facc3602fb825507454ad.png)
通常情况下,深度神经网络都是水平方向延伸的,比如卷积神经网络CNN,隐层数量多了,但是没有考虑单个隐层在时间上、时序上的变化。
![](https://i-blog.csdnimg.cn/blog_migrate/f3e1d26a029613385b23d032539e2965.png)
RNN则不同,你可以理解为它更加细腻温情,它关注隐层的每个神经元在时间维度上的不断成长与进步,体现在图上,如下图所示。
沿着时间轴,建立时序上的关联,这里的层级扩展并非神经元数量的真实增加,而是表示隐层在不同时刻的状态。
根据问题的需要,隐层的时间关联既可以是全连接式的,如下图所示。
也可以是自己对自己的,如下图所示。
假如我们使用Ws来表示层级间的权重矩阵,RNN通常会假定不同的层,其实也就是不同的时刻,共享一个Ws。这样可以有效地减少训练参数。
在神经元模型中,对隐层而言,如果输出用Si表示,如下图所示。
将Si写成矩阵的形式,如下图所示。
对于RNN而言,这个式子就活了起来,多了一项Ws×St-1,这样就建立了隐层在不同时刻,即 t-1 时刻与 t 时刻之间的一种迭代关系,换言之,就是让神经网络有了某种记忆的能力。
RNN本质上就是用这样一种看似是级联,但实际上却是沿着时序反复迭代的网络结构,从而实现了对序列数据的学习。
给出RNN网络结构的3D动画演示,如下为两个视频链接。
https://live.csdn.net/v/320071https://live.csdn.net/v/320071
https://live.csdn.net/v/320071https://live.csdn.net/v/320071
RNN对时序数据的建模,使它天生就是一个记账小能手,就像你的女朋友或老婆,每次吵架都能把各种陈芝麻烂谷子的事情滔滔不绝地讲出来一样,这种天赋让RNN在自然语言处理NLP领域实现了巨大的飞跃。
RNN网络的输入输出关系
由于时序上的层级结构,使得RNN在输入输出关系上具备了更大的灵活性,能够解决不同的问题。RNN的输入输出关系则有四种:1 to N、N to 1、N to N、N to M(N≠M),如下图所示。
第一种 1 to N:比如单入多出的形式,输入可以是一副图片,而输出则是一段话或者music,利用它可以实现看图说话或者是放音乐的功能。
第二种 N to 1:下面这种是N to 1的情况,输入是序列式的,可以是一段话,而输出是单个的,可以是一种情感类别的判定,或者是一张图片。如下图所示。
第三种N to N:输入和输出两个序列是等长的,这种RNN网络可以用来生成文章、诗歌、代码。
第四种N to M(N≠M):输入和输出的序列不等长,如下图所示。
该模型先将输入数据编码成一个上下文的向量, 然后通过该向量输出预测的序列,这种RNN在机器翻译、文本摘要、阅读理解、对话生成等很多领域都有着极为广泛的应用。