
RNN神经网络
pridelizihaoRNN
1.1 单层网络到RNN结构
在学习LSTM之前,得先学习RNN,而在学习RNN之前,首先要了解一下最基本的单层网络,它的结构如下图所示:
输入是x,经过变换Wx+b和激活函数f,得到输出y。相信大家对这个已经非常熟悉了。
在实际应用中,我们还会遇到很多序列形的数据:
如:
- 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推
- 语音处理。此时,x1、x2、x3……是每帧的声音信号。
- 时间序列问题。例如每天的股票价格等等
而其中,序列形的数据就不太好用原始的神经网络处理了。
RNN引入了隐状态h(hidden state)的概念,隐状态h可以对序列形的数据提取特征,接着再转换为输出。
先从h1的计算开始看
图示中记号的含义是:
- a)圆圈或方块表示的是向量。
- b)一个箭头就表示对该向量做一次变换。如上图中h0和x1分别有一个箭头连接,就表示对和各做了一次变换
h2的计算和h1的计算类似,但是有两点需要注意:
- 在计算时,每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,一定要牢记;
- 而下文马上要看到的LSTM中的权值则不共享,因为它是在两个不同的向量中。而RNN的权值为何共享呢?很简单,因为RNN的权值是在同一个向量中,只是不同时刻而已
同样可以计算剩下来的
而RNN的输出方式就是,直接通过h进行计算
OK!大功告成!这就是最经典的RNN结构,是x1, x2, …..xn,输出为y1, y2, …yn,也就是说,输入和输出序列必须要是等长的
1.2 RNN的应用
类似于人脑的思考,我们的思考不会是完全的零基础,一定是建立在一定的基础上,每一次新的学习思考都是更进一步的
传统的神经网络并不能做到这点,看起来也像是一种巨大的弊端。例如,假设你希望对电影中的每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题:使用电影中先前的事件推断后续的事件。循环神经网络RNN解决了这个问题。
RNN就是这样包含循环的神经网络
本质上RNN就是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个
1.3 RNN的局限性:长期依赖问题
RNN的关键点之一就是他们可以用来连接先前的信息到当前的任务上,但是真的可以么?答案是,还有很多依赖因素。
在较短的循环进程中,RNN是很有效的
但是相关信息和当前预测位置之间的间隔肯定也有大的时候。
不幸的是,在这个间隔不断增大时,RNN会丧失学习到连接如此远的信息的能力。
RNN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。
因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。在反向传播期间(反向传播是一个很重要的核心议题,本质是通过不断缩小误差去更新权值,从而不断去修正拟合的函数),RNN 会面临梯度消失的问题。
因为梯度是用于更新神经网络的权重值(新的权值 = 旧权值 - 学习率*梯度),梯度会随着时间的推移不断下降减少,而当梯度值变得非常小时,就不会继续学习。
换言之,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN会忘记它在较长序列中以前看到的内容,因此RNN只具有短时记忆。
而梯度爆炸则是因为计算的难度越来越复杂导致。
然而,幸运的是,有个RNN的变体——LSTM,可以在一定程度上解决梯度消失和梯度爆炸这两个问题,这个我们之后再讨论。