序列数据是指数据列中的数据有固定的顺序特征,比如文章中的单词是按顺序写的,如果顺序被随机地重排,就很难理解文章原始的意思。同样,视频中的图像帧、对话中的音频信号以及网站上
的浏览行为都是有顺序的。
简言之,如果说卷积神经网络可以有效地处理空间信息,那么本章的循环神经网络(recurrent neural network,RNN)则可以更好地处理序列信息。循环神经网络通过引入状态变量存储过去的信息和当前的输入,从而可以确定当前的输出。
自回归模型
想要预测时刻的变量值,可以参考变量之前的数据取值,且此预测值有一定概率。当时间越来越长,过去的数据越来越多,预测将变麻烦。设计一个新的变量,用来存储冗长的历史数据集,使得当前预测变量仅和当前时刻的新变量有关,且此新变量又由上一时刻变量值和上一时刻新变量值有关,这就引出了隐变量自回归模型。就是前文所说的新变量。
此模型的数学公式是
文本预处理
1. 将文本作为字符串加载到内存中
2. 将字符串拆分为词元(如单词和字符)
给定文本片段,如:
S = "... or not to be to be ..."
按单词处理的结果是
L = [...,to, be, or, not, to, be, ...]
按字符处理的结果
L = [..., 't', 'o', ' ',‘b,‘e’, ...]
3. 建立一个词表,将拆分的词元映射到数字索引
词元的类型是字符串,而模型需要的输入是数字,因此这种类型不方便模型使用。构建词表将字符串类型的词元映射到从0开始的数字索引中,可以解决这种现象,具体如下:
1)对文档的唯一词元进行统计,统计结果也称之为语料。唯一词元即将文段拆分成词元后,对重复词元进行剔除得到的结果。
2)根据每个唯一词元的出现频率,为其分配一个数字索引。一般采取,频率越高,序号越小的原则。很少出现的词元通常被移除,这可以降低复杂性。语料库中不存在或已删除的任何词元都将映射到一个特定的未知词元“<unk>”。
4. 将文本转换为数字索引序列,方便模型操作。
有隐状态的循环神经网络(RNN)
我们的目标是根据过去的和当前的词元预测下一个词元,基于自回归模型构造循环神经网络,结构如下
正向传播
在任意时间步的时候,隐藏层加权的数据是输入和隐状态上一时刻的值,经过一层网络得到隐状态这一时刻的值,公式如下:
注意,这里激活函数使用的是
同时,可得到当前时间步上的输出
反向梯度传播
此RNN网络的目标函数取为网络输出值和对应标签值之间的误差,和神经网络的不同之处在于:这里误差累加公式的变量是一段时间的每个时间步,公式如下
按照链式求导法则,梯度公式如下
可看到,隐状态关于网络隐藏层权重的导数,会受到隐状态过去时间步取值的影响
随着考察时间段变长,将导致梯度公式乘积项过多,导致“梯度消失”的问题
最简单的解决方法就是,我们“截断”时间步,即可以在𝜏步后截断上页式中的求和计算
长短期记忆网络(LSTM)
可以说,这款网络是基于RNN修改了网络结构,以应对隐变量模型存在着长期信息保存和短期输入缺失的问题。
先给出LSTM种基础模块的数据流图示
遗忘门、输入门和输出门
输入数据:当前时间步的输入,前一个时间步的隐状态
三个具有sigmoid激活函数的全连接层处理, 以计算输入门、遗忘门和输出门的值
候选记忆门
它和上面三个门类似,区别在使用tanh激活函数
记忆元
输入门控制采用多少来自的新数据, 而遗忘门控制保留多少过去的 记忆元的内容。 使用按元素乘法,得出当前时刻的记忆:
隐状态
可发现,隐状态仅仅是记忆元的tanh的门控版本。只要输出门接近1,我们就能够有效地将所有记忆信息传递给预测部分, 而对于输出门接近0,我们只保留记忆元内的所有信息,而不需要更新隐状态。