转自:
1. 简介
本文旨在帮助神经网络学习者了解递归网络的运作方式,以及一种主要的递归网络,即LSTM的功能和结构。
递归网络是一类人工神经网络,用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,或用于识别传感器、股票市场、机构产生的数值型时间序列数据。
递归网络可以说是最强大的神经网络,甚至可以将图像分解为一系列图像块,作为序列加以处理。
由于递归网络拥有一种特定的记忆模式,而记忆也是人类的基本能力之一,所以下文会时常将递归网络与人脑的记忆活动进行类比。
2. 前馈网络回顾
要理解递归网络,首先需要了解前馈网络的基础知识。这两种网络的名字都来自于它们通过一系列网络节点数算来传递信息的方式。前馈网络将信息径直向前递送(从不返回已经过的节点),而递归网络则将信息循环传递。
在前馈网络中,样例输入网络后被转换为一项输出;在进行有监督学习时,输出为一个标签。也就是说,前馈网络将原始数据映射到类别(原始数据-->类别),识别出信号的模式,例如一张输入图像应当给予“猫”还是“大象”的标签。
我们用带有标签的图像定型一个前馈网络,直到网络在猜测图像类别时的错误达到最少。将参数,即权重定型后,网络就可以对从未见过的数据进行分类。已定型的前馈网络可以接受任何随机的图片组合,而输入的第一张照片并不会影响网络对第二张照片的分类。看到一张猫的照片不会导致网络预期下一张照片是大象。
这是因为网络并没有时间顺序的概念,它所考虑的唯一输入是当前所接受的样例。前馈网络仿佛患有短期失忆症;它们只有早先被定型时的记忆。
3. 递归网络
递归网络与前馈网络不同,其输入不仅包括当前所见的输入样例,还包括网络在上一个时刻所感知到信息。以下是[由Elman提出的早期递归网络]的示意图(),图中最下行的BTSXPE代表当前的输入样例,而CONTEXT UNIT则表示前一时刻的输出。
递归网络在第t-1个时间步的判定会影响其在随后第t个时间步的判定。所以递归网络有来自当下和不久之前的两种输入,此二者的结合决定了网络对于新数据如何反应,与人类日常生活中的情形颇为相似。
递归网络与前馈网络的区别便在于这种不断将自身上一刻输出当作输入的反馈循环。人们常说递归网络是有记忆的。为神经网络添加记忆的目的在于:序列本身即带有信息,而递归网络能利用这种信息完成前馈网络无法完成的任务。
这些顺序信息保存在递归网络隐藏状态中,不断向前层层传递,跨越许多个时间步,影响每一个新样例的处理。
人类记忆会在体内不断进行不可见的循环,对我们的行为产生影响而不显现出完整样貌,而信息也同样会在递归网络的隐藏状态中循环。英语中有许多描述记忆反馈循环的说法。例如,我们会说“一个人被往日所为之事纠缠”,这其实就是在讲过去的输出对当前造成了影响。法国人称之为“Le passé qui ne passe pas”,即“过去之事不曾过去”。
让我们用数学语言来描述将记忆向前传递的过程:
第t个时间步的隐藏状态是h_t。它是同一时间步的输入x_t的函数,由一个权重矩阵W(和我们在前馈网络中使用的一样)修正,加上前一时间步的隐藏状态h_t-1乘以它自己的隐藏状态-隐藏状态矩阵的U(或称过渡矩阵,与马尔可夫链近似)。权重矩阵是决定赋予当前输入及过去隐藏状态多少重要性的筛选器。它们所产生的误差将会通过反向传播返回,用于调整权重,直到误差不能再降低为止。
权重输入与隐藏状态之和用函数进行挤压-可能是逻辑S形函数(sigmoid函数)或双曲正切函数,视具体情况而定-这是将很大或很小的值压缩至一个逻辑空间内的标准工具,同时也用于产生反向传播所能接受的梯度。
由于这一反馈循环会在系列的每一个时间步发生,每一个隐藏状态不仅仅跟踪前一个隐藏状态,还包括了记忆能力范围内所有在h_t-1之前的状态。
若输入一系列字母,则递归网络必定会根据第一个字符来决定对第二个字符的感知, 例如,第一个字母如果是q,网络就可能推断下一个字母是u,而第一个字母如果是t,则网络可能推断下一个字母是h。
由于递归网络具有时间维度,所以可能用动画示意最为清楚(最先出现的节点垂直线可被视为一个前馈网络,随时间展开后变为递归网络)。
在中,每一个x都是一个输入样例,w是用于筛选输入的权重,a是隐藏层的激活状态(附加权重后的输入与上一个隐藏状态之和),而b则是隐藏层在转换,或称“挤压”后的输出,使用线性修正或sigmoid单位。
4. 沿时间反向传播(BPTT)
前文提到,递归网络的目的是准确地对序列输入进行分类。我们依靠误差反向传播和梯度下降来达成这一目标。
前馈网络的反向传播从最后的误差开始,经每个隐藏层的输出、权重和输入反向移动,将一定比例的误差分配给每个权重,方法是计算权重与误差的偏导数-a??E/a??w,即两者变化速度的比例。随后,梯度下降的学习算法会用这些偏导数对权重进行上下调整以减少误差。
递归网络则使用反向传播的一种扩展方法,名为,或称BPTT。在这里,时间其实就表示为一系列定义完备的有序计算,将时间步依次连接,而这些计算就是反向传播的全部内容。
无论递归与否,神经网络其实都只是形如f(g(h(x)))的嵌套复合函数。增加时间要素仅仅是扩展了函数系列,我们用链式法则计算这些函数的导数。
5.截断式BPTT
是完整BPTT的近似方法,也是处理较长序列时的优先选择,因为时间步数量较多时,完整BPTT每次参数更新的正向/反向运算量会变的非常高。该方法的缺点是,由于截断操作,梯度反向移动的距离有限,因此网络能够学习的依赖长度要短于完整的BPTT。
6. 梯度消失(与膨胀)
像大多数神经网络一样,递归网络并非新事物。在上世纪九十年代早期,梯度消失问题成为影响递归网络表现的重大障碍。
正如直线表示x如何随着y的变化而改变,梯度表示所有权重随误差变化而发生的改变。如果梯度未知,则无法朝减少误差的方向调整权重,网络就会停止学习。
递归网络在寻找最终输出与许多时间步以前的事件之间的联系时遇到了重大障碍,因为很难判断应当为远距离的输入赋予多少重要性。(这些输入就像曾曾…曾祖父母一样,不断向前追溯时会迅速增多,而留下的印象通常很模糊。)
原因之一是, 神经网络中流动的信息会经过许多级的乘法运算。
凡是学过复合利率的人都知道,任何数值,只要频繁乘以略大于一的数,就会增大到无法衡量的地步(经济学中的网络效应和难以避免的社会不平等背后正是这一简单的数学真理)。反之亦然:将一个数反复乘以小于一的数,也就会有相反的效果。赌徒要是每下一美元注都输掉97美分,那片刻就会倾家荡产。
由于深度神经网络的层和时间步通过乘法彼此联系,导数有可能消失或膨胀。
梯度膨胀时,每个权重就仿佛是一只谚语中提到的蝴蝶,所有的蝴蝶一齐扇动翅膀,就会在遥远的地方引发一场飓风。这些权重的梯度增大至饱和,亦即它们的重要性被设得过高。但梯度膨胀的问题相对比较容易解决,因为可以将其截断或挤压。而消失的梯度则有可能变得过小,以至于计算机无法处理,网络无法学习-这个问题更难解决。
反复应用sigmoid函数的结果如下图所示。数据曲线越来越平缓,直至在较长的距离上无法检测到斜度。梯度在经过许多个层后消失的情况与此相似。