数学系的一线研发,关注 数据结构 | 深度学习 | 职场文章分享
前言
目录:
RNN提出的背景
- 一个问题
- 为什么不用标准神经网络
- RNN模型怎么解决这个问题
- RNN模型适用的数据特征
- RNN几种类型
RNN模型结构
- RNN block
- 简化符号表示
- stacked RNN
- 双向RNN
- 梯度消失爆炸问题
GRU模型结构
LSTM模型结构
- LSTM背后的关键思想
- Step by Step理解LSTM
本文可以解答:
RNN用来解决什么问题,什么样的数据特征适合用它来解决
RNN的缺陷是什么,LSTM,GRU是如何解决这些缺陷的
理解从简单RNN到LSTM的每个模型的结构
RNN提出背景/适用场景
一个问题
我们考虑一下这么一个问题,任意给定一句话,判断句子里的单词是不是人名的一部分。比如输入
x : Harry Potter and Hermione Granger invented a new spell.
单词有
['Harry', 'Potter', 'and', 'Hermione', 'Granger', 'invented', 'a', 'new', 'spell']如果1表示单词是人名一部分,0表示不是人名的部分,那么输出的y就应该是
[1, 1, 0, 1, 1, 0, 0, 0, 0]y的组成是和x等长,相同的index对应x中元素是不是人名。我们把x中的每个单词用one-hot向量来表征,如下所示。
为什么不用标准的神经网络?
如果我们用标准的神经网络来解决这个问题,标准神经网络的结构是这样的
标准神经网络的流程,将样本数据x一次性输入,从左边传到右边(输出层)。这样做不好的地方在于:
输入和输出的长度不固定,比如有的句子输入长度是10,有的句子长度就不是10。
如果使用标准网络,它不能共享文本不同位置学习到的东西,比如知道Harry是人名一部分,如果第i个位置又出现了Harray,它是不能自动识别的。
RNN模型怎么解决这个问题
RNN对数据的处理流程如上图所示,它不会同时输入数据。我们将首先输入X1(第一个单词Harray)得到预估值y1(Harray是不是人名一部分),然后将X1计算的结果传递到下一层与输入X2(第二个单词Potter)结合输出对X2的预测y2(Potter是不是人名一部分),这样y2的预测其实受X1的影响,以此类推。这样就解决了标准神经网络带来的问题。
RNN模型适用的数据特征
上面的句子有个特征:
States Dependency:当前的状态和上一步的状态是相关的;
数据是序列的(sequential): 当我们说一个数据是序列的,是指数据之间有时间顺序,它是在不同时间输入的,如果我们更改顺序,把句子中的单词打乱,它就变的不同失去含义了。能用标准神经网络训练的数据就是可以打乱顺序,所以我们可以在一开始就输入它们。
所以用RNN最大的动力就是它可以连接之前的数据,意味着这个模型关心之前的东西是什么,接下来将要出现什么。
RNN的几种类型
除了上面的例子,RNN根据不同的输入和输出数量,有以下几种类型:
one on one: 输入一张图片,输出图片中的活动。