在生活中,有许多领域都用到了序列模型,如语音识别,音乐创作,情感分类,DNA序列分析,机器翻译,视频动作检测,名称实体识别等。
1、符号定义
对于训练数据中的输入序列X和输出序列Y,令 x(i)<t>表示第 i个训练数据输入序列中,第 t个位置的序列元素;令y(i)<t>表示第 i个训练数据输出序列中,第 t个位置的序列元素;令 Tx(i)表示第 i i i个训练数据输入序列的长度;令 Ty(i)表示第 i i i个训练数据输出序列的长度。one-hot向量表示法表示 x(i)<t>:对于构建的词库vocabulary,词库中 x(i)<t>位置的取值为1,其余位置取值均为0;伪词<UNK>-Unknown Word,用来代替没有在vocabulary中出现的词。
2、构建循环神经网络-Recurrent Neural Network
使用标准神经网络(ANN)处理序列问题问题的缺陷:首先,序列问题下不同的训练数据的输入和输出很大可能下会不同;其次,也是比较重要的缺陷在于,ANN不会共享从不同文本文职学习到的特征。
循环神经网络(RNN)的结构如下图所示:
其中, a<i>表示通过神经网络层和激活函数计算之后的值,其中 a<0>一般初始化为全0向量; w a x , w a a , w y a w_{ax},w_{aa},w_{ya} wax,waa,wya表示权重系数。如:
其中,g表示激活函数,计算 a时候的激活函数和计算 y时候的激活函数不一定为一种激活函数。计算 a 时候的激活函数通常使用 tanh或者 Relu;计算 y的时候,激活函数通常使用sigmoid(用于二元分类问题)或者softmax(用于多元分类问题)。上述拓展公式扩展到第 t步时的计算方法如下所示:
使用 [waa;wax]=wa,可以将上式 at的表达形式进行简化为:
使用 w y 代 替 w y a w_y代替w_{ya} wy代替wya可以将上式 y
<t>的表达形式变为:
2.1 RNN中的反向传播
RNN正向传播的简化示意图如下图所示:
下面定义出序列模型的单个时间步下的交叉熵误差计算式:
所以总的误差为将所有时间步下的误差进行累和得到:
误差反向传播的示意图如下图所示:
2.2 不同架构的RNN
多对多RNN,many-to-many,输入序列有多个元素,输出序列也有多个元素,输入输出序列长度相同的示意如下所示:
多对多RNN,many-to-many,输入序列有多个元素,输出序列也有多个元素,输入输出序列长度不同的示意如下所示:
多对一RNN,输入序列中有多个元素,输出序列中只有一个元素:
一对多RNN,输入序列只有一个元素,输出序列中包含多个元素:
3、语言模型的RNN架构
3.1 架构
基于RNN的语言模型的架构如下所示:
损失函数使用交叉熵误差,形式如下所示:
3.2 序列采样
下图展示了怎样从一个训练好的RNN模型中提取出结果序列。
4、RNN的梯度消失问题-vanishing gradients
若输入序列的长度过长,后续RNN在预测时,对于很早之前的输入信息会变得不太“敏感”,若很早之前输入的信息对于RNN后续预测影响很大,则会使得RNN的效果变得很差,使得RNN不擅长捕捉远程依赖关系。
4.1 门控制单元-Gate Recurrent Unit
GRU通过修改RNN的隐藏层,使得RNN可以更好地捕捉长距离的关系,有助于减少梯度消失的问题。
简化版的GRU单元如下所示:
其中 C表示记忆单元(memory cell),
C <t>=tanh(wc[C<t−1>,x<t>]+bc)
表示 t时间步下的记忆单元,在GRU中, a<t>=C<t>;
Γu=sigmoid(wu[C<t−1>,x<t>]+bu)
表示更新门控;
C<t>=Γu∗C <t>+(1−Γu)C<t−1>
用来计算 t时间步下的输出值;
完整版的GRU需要引入一个新的门控单元-相关性门控 Γr表示 t−1时间步的记忆单元和 t时间步的记忆单元之间的相关性,所以需要对 C<t>的计算进行调整:
4.2 长短期记忆单元-Long Short Term Memory
下图罗列出了在GRU中使用的机制:
LSTM相对于GRU是一种更加有效,更加泛化的克服梯度消失问题的工具。在LSTM中,a<t>和 C<t>不再是一个相同的值;LSTM通常不需要相关性控制门 Γr,但是增加了两个额外的控制门 Γf表示遗忘控制门和 Γo表示输出控制门。所以LSTM的核心等式如下所示:
LSTM的示意图如下图所示:
5、双向RNN-Bidirectional RNN
BRNN是为了同时考虑过去的信息和未来的信息,在某个时间步 t t下进行决策,BRNN的示意图如下图所示:
其中,在某个时间步 t下的预测值区别于RNN,需要同时考虑前向输入和后向输入