前言
RNN擅长解决的问题是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音等。这些序列比较长,且长度不一,比较难直接拆分成一个个独立的样本通过DNN/CNN进行训练。
而RNN由于其独有的结构和优势,能够处理DNN/CNN所不能及的问题。
RNN的5种不同架构
one2one:
一个输入对应一个输出。
one2many:
一个输入对应多个输出,这个架构多用于图片的对象识别,即输入一个图片,输出一个文本序列。
many2one:
多个输入对应一个输出,多用于文本分类或视频分类,即输入一段文本或视频片段,输出类别。
many2many I:
这种结构广泛用于机器翻译,输入一个文本,输出另一种语言的文本。
many2many II:
这种结构广泛应用于序列标注。
RNN模型与前向传播
RNN是基于序列的,它对应的输入为对应的样本序列中的时间步t对应的
。而
代表t位置的隐藏状态,由
和t-1位置的隐藏状态
决定。
主流模型如下图
这些循环使RNN可以被看做同一个网络在不同时间步的多次循环,每个神经元会把更新的结果传递到下一个时间步。这就是RNN的正向传播,依次按照时间的顺序计算一次即可。
和
分别代表序列时间步t-1和t+1时训练样本的输入。
对任意一个序列时间步t,隐藏状态由
和
得到:
为**函数,这里一般为tanh或者Relu,b为偏置。这个公式就可以理解为
,现有的输入+过去的记忆,也正是由于这个,使RNN具有了记忆能力。
U:输入层到隐藏层直接的权重
W:隐藏层到隐藏层的权重
V:隐藏层到输出层的权重
U,W,V这三个矩阵是模型的线性关系参数,在整个RNN网络中是共享的,也正是共享,才体现了RNN模型的“循环反馈”的思想。
输出的表达式比较简单:
最终在时间步t时我们预测输出为:
通常RNN是分类模型,所以这里的**函数一般是softmax/sigmoid。
误差函数可以量化模型当前损失,比如交叉熵损失函数或平方误差,即
和
的差距。
RNN与反向传播
我们希望通过反向传播来更新和优化RNN的权重,而RNN的权重分布在U、W、V三个矩阵中。
所以问题在于如何求解各个权重的梯度,即