君は春の中にいる、かけがえのない春の中にいる.

你驻足于春色中,于那独一无二的春色之中.

基于递归神经网络的监督序列标记(3)

负责的项目代码初版7月18日全部完成了,有时间继续补坑。然而之后又是出差,所以这篇一直拖到了8月14日才完成~

0x01 长短时记忆网络结构

前面说过了循环神经网络的优点在于它们处理序列时的使用上下文的能力。但是,对于标准的循环神经网络来说,实际中能够利用的上下文范围是十分有限的。由于多重循环的关系,给定的输入在隐藏层中的影响要么减弱,要么指数式增加。这种影响叫做梯度消失。二十世纪九十年代曾经有很多尝试来解决这一问题。它们使用了非梯度的训练算法,比如模拟退火、离散误差传播、时间常数和层次序列压缩。而这里重点要说长短时记忆算法。

长短时记忆结构由一组可重复连接的子网组成,称为记忆块。这些块可以看成是计算机中内存芯片的一个细微版本。每个块包含一个或者多个自连接的内存单元和三个乘法单元,分别在输入、输出和遗忘门的地方,它们为每个神经元提供了连续读、写和重置操作。长短时记忆与标准循环神经网络类似,只是隐藏层中的求和单元被记忆块替代。记忆块也可以和求和单元混用,尽管通常不这样做。而它们两者的输出层都是相同的。乘法门允许长短时记忆单元长时间的存储和访问信息,从而减轻梯度消失问题。比如,只要输入门保持关闭,神经元的激活就不会被新输入覆盖,因此,当打开输出门时,之前的状态就可以被用于之后的网络中。通过这一机制对梯度信息进行保护。

在过去的十年中,长短时记忆在一系列需要长范围记忆的任务中被证明是成功的,包括上下文无关的语言学习、扩展噪声序列中的召回高精度实数以及要求精确计时和计数的任务。特别是在解决其他循环神经网络所无法解决的问题上。

长短时记忆已经被应用在许多真实问题中,包括蛋白质二级预测、音乐生成、强化学习、语音识别和手写体识别。正如预期的那样,它的优势就在于解决对长程上下文依赖的问题。

0x02 预处理带来的影响

以上的讨论抛出了一个对预处理影响而言重要的观点,如果我们能够将包含长程上下文依赖的任务转换为只包含短期依赖的任务,我们就不需要LSTM了。例如,一个原始的语音信号通常有40千赫左右的采样率。很明显,当对这个语音进行标记或者建模时,我们需要用很长的时间步长来进行序列学习。然而,当信号先转换成100赫兹的频率倒谱系统时,利用上下文范围相对较短的算法对数据进行处理就是可行的,比如隐马尔科夫模型。

尽管预处理会带来这样的好处,但是如果这种转换是困难的或者是未知的,又或者我们只是单纯的希望不去设计预处理而得到较好的结果时,我们就需要能够处理长程依赖的算法。

0x03 梯度计算

就像上一章所讨论过的网络一样,LSTM是一个可微的函数近似器,通常用梯度下降来训练。当然,近几年还有人进行非梯度的LSTM训练方法研究。

最初的LSTM训练算法采用一种近似误差梯度,同时结合了实时循环学习和反向传播。反向转播部分在一个时间步长后被截断,这里的长程依赖将由内存块处理,而不是通过原来连接的激活节点。截断梯度的好处是使算法完全在线,在每一个时间步长后都可以进行权重更新。这对于连续控制或者时间序列预测来说是一个重要的属性。

当然,也可以用未截断的反向传播来精确计算LSTM的梯度。除了准确的特点外,这种梯度计算还有易于调优的优点,因为它可以用之前提到的技术进行数值检查。

0x04 构架变体

原始的LSTM只包含输入门和输出门。而在拓展LSTM中,加入了连接到记忆单元的遗忘门和附加的窥孔权重。遗忘门的目的是为记忆单元提供一种重置的方法,对于那些需要遗忘输入的任务很重要。与此同时,窥孔连接提高了LSTM的学习能力,这些任务需要精确的时间和内部状态计数。

由于LSTM完全由简单的乘法和加法单元组成以及它们之间的连接构成,因此可以直接通过创建块结构来进一步改变LSTM。事实上,它已经证明了在玩具问题上具有同样良好的效果,比如上下文自由的学习和上下文敏感的语言可以自动演变。

0x05 双向长短期记忆

利用LSTM作为双向循环神经网络结构,双向LSTM在两个输入方向上提供了对远程上下文的访问,后面会继续讨论。

0x06 网络方程

这一节提供了在一个循环神经网络中一个LSTM隐藏层激活和反向梯度计算的方程。

和之前一样,我们有权重连接表示、网络输入单元、时间单位以及时间单位输入带来的表示、时间单位上的激活单元。LSTM方程仅仅提供一个单一记忆单元。对于多个块,简单的进行依次重复计算。只是在权重值上,我们多了遗忘门权重以及窥孔权重。其他参数还有激活函数、神经元状态的激活线性单元。

注意,我们附加的这些单元只在神经元的内部可见,与标准循环神经网网络不同的是,一个LSTM层包含更多的输入,但只有神经元产生可见的输出给网络的其余部分。

和标准循环神经网络相似,它的前向计算是循环的更新长度序列,反向传播通过时间倒序递减计算单位导数。