初学RNN
FNN
定义
FNN(Feedforward Neural Network),即前馈神经网络,它是网络信息单向传递的一种神经网络,数据由输入层开始输入,依次流入隐藏层各层神经元,最终由输出层输出。其当前的输出只由当前的输入决定,任何层的输出都不会影响同级层。
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170218916-299803599.png)
以上图所示的神经网络为例,它在训练过程中通过前向计算和反向传播,不断通过调整权重系数Wi和Wo来实现学习目的。通常情况下,前馈神经网络会在空间上进行延伸,通过增加隐藏层层数与隐藏层神经元个数追求更好的学习效果。
缺点
前馈神经网络假定元素之间是相互独立的,对于序列数据,只能单独地处理序列中的每个元素,前一个输入与后一个输入在处理过程中也是完全独立的,无法捕获序列之间的依赖关系。
RNN
定义
RNN(Recurrent Neural Network),即循环神经网络,它是一种主要用来处理序列数据的神经网络,它关注了隐藏层每个神经元在时间维度上的变化,其中循环说成递推可能会更直观一些,本质就是同一个网络接收当前时刻的输入和上一时刻隐藏层神经元的输出,沿着时序反复迭代以实现对序列数据的学习。
结构
直观结构
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170222828-397827550.png)
在上图中, RNN 的每个时刻,输入层的x1和x2都在Wi的作用下传入隐藏层,上一时刻的隐藏层输出也通过Wh传入当前的隐藏层,因此它相当于可以间接访问之前的所有输入,这就是为什么说RNN可以保存记忆。
内部结构
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170223564-845696890.png)
上图展示了RNN在三个相邻时刻的计算逻辑。 在任意时刻t,隐藏层状态的计算可以被视为:
- 拼接t时刻的输入Xt和t−1时刻的隐藏层状态Ht−1,得到新的张量[Xt,Ht-1];
- 将新的张量送入带有激活函数φ的全连接层,激活函数常用tanh或者relu, 全连接层的输出是t时刻的隐藏层状态Ht。
在t时刻,隐藏层状态Ht的计算公式为:
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170224280-960016917.png)
在t时刻,输出层的输出计算公式为:
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170224730-1600504898.png)
参数说明:
- Xt是t时刻的输入,它是一个向量;
- Wi是输入层到隐藏层的权重矩阵;
- Ht-1是t-1时刻的隐藏层状态,在初始时刻,会给隐藏层设置初始状态H0;
- Wh是隐藏层上一时刻的值作用于当前时刻的权重矩阵;
- Wo是隐藏层到输出层的权重矩阵;
- bh是和bo是偏置系数。
注意:
- 在不同时刻,RNN总是使用这些模型参数,其参数开销不会随着时间的增加而增加。
- 隐藏层状态中XtWi+Ht-1Wh的计算,相当于Xt和Ht-1的拼接与Wi和Wh的拼接进行矩阵乘法。
- RNN和前馈神经网络一样,也是通过反向传播来更新权重,以达到学习的效果。
应用
1-N类型,输入一张图片,输出一段话或者一段音乐,利用它可以实现看图说话。
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170227893-195539667.png)
N-1类型,输入一段话,输出对其情感类别的判断,利用它可以实现文本分类。
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170233307-1897009628.png)
N-N类型,输入和输出是等长的序列,可以用来生成等长的诗歌。
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170233774-1397944672.png)
N-M类型,输入和输出是不等长的序列,也被叫做Encoder-Decoder模型或Seq2Seq模型,可以应用在机器翻译、文本摘要、阅读理解等多个领域上。
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170234246-1805556115.png)
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170234759-574610285.png)
变体
BRNN(Bidirectional RNN)
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170235424-972424856.png)
RNN的一个主要问题是只能从以往的输入进行学习,也就是只能理解上下文中的上文,为了拥有更好的学习效果,因此提出了双向RNN,也就是BRNN。 BRNN会在原有RNN的基础上再加一个隐藏层,该隐藏层的状态是从后向前传播的,从序列的终点开始读取,称为后向层;而原有的从序列起点开始读取的隐藏层称为前向层。 BRNN的隐藏层状态的计算可以被视为:
- 根据输入序列计算前向层隐藏层状态H1;
- 将输入序列反转,计算后向层隐藏层状态H2;
- 将H1和H2拼接起来,得到最终隐藏层状态H,H=[H1,H2]。
注意,只有能拿到整个输入序列时才能使用BRNN 。
DRNN(Deep RNN)
![](https://img2022.cnblogs.com/blog/3038153/202211/3038153-20221116170236074-1803784714.png)
与前馈神经网络不同,RNN因为考虑了时间维度,隐藏层达到三层就算多的了。
优缺点
优点
- RNN可以处理序列信息,且内部结构简单,对计算资源的要求低。
缺点
-
RNN是一个时序模型,每个时刻的计算都依赖于前一时刻的结果,计算速度慢;
-
RNN由于梯度消失,难以支持长序列,不能捕获序列中长期的依赖关系;
-
RNN网络在时间维度上是串联的,离当前时间越远的隐藏层输出,对当前隐藏层的输出影响越小,它无法根据不同词本身的重要性对当前的输出产生影响;
-
RNN对所有输入是同等对待的,提取了所有的信息,没有区分有用信息、无用信息和辅助信息。但是如果某个网络可以根据不同输入的重要性,选择性地丢弃和记忆,就可以使得有效信息即使距离当前时间较远,也能有较大影响,实现长期记忆,这就引出了LSTM。
主要参考
- 《动手学深度学习》第8章第4节;
- 网络上相关资料。