1.2 有监督学习
深度学习分为三个流派,分别是有监督学习(supervised learning)、无监督学习(unsupervised learning)和强化学习(reinforcement learning)。本节介绍深度学习在有监督学习中的相关概念和主要应用。
现假设一个数据集中有n个数据,m个标签,由其组成的集合称为有标签数据集L={xi,yj}(x表示数据,y表示标签,0<i n,0<j m)。有监督学习通过对有标签数据集的学习学到或建立一个模型,输出这个数据的标签,并把与对应的yj进行差异比对,根据差异对模型进行调整,以提高其精度,最终通过学到或建立的模型进行数据标签预测,即,输入一个数据,通过模型将数据最后可能的标签输出。
下面分别介绍深度学习在有监督学习领域的四个典型应用:图像分类;目标检测;人脸识别;语音识别。
1.2.1 图像分类
图像分类是指根据图像的语义信息将不同类别的图像区分开来。图像分类既是计算机视觉的基础问题,也是图像分割、目标检测、目标跟踪、行为分析等高层视觉任务的基础。
图像分类在很多领域都有应用,包括安防领域的人脸识别和智能视频分析、交通领域的交通场景识别、互联网领域的基于内容的图像检索、医学领域的图像识别等。本节将重点围绕ILSVRC的图像分类项目介绍图像分类的发展过程。可以说,ILSVRC见证了深度学习从崭露头角到大爆发的全过程。
ILSVRC是一项基于ImageNet图像数据库的国际计算机视觉识别竞赛,数据规模很大。ILSVRC自2010年开始举办,谷歌、微软、脸书等业界巨头及世界知名高校、研究单位多次参加该竞赛。竞赛主办方会在每年的国际顶级计算机视觉大会——欧洲计算机视觉国际会议(European Conference on Computer Vision,ECCV)、国际计算机视觉大会(IEEE International Conference on Computer Vision,ICCV)——上举办专题论坛,交流和分享参赛经验。ILSVRC包括图像分类、目标检测、场景分类等多个项目。
在2012年之前,图像分类项目中流行的都是机器学习的方法,即,从图像中提取特征、对特征进行编码、使用机器学习方法进行分类。2012年,Hinton的课题组为了证明深度学习的潜力,首次参加了ILSVRC的图像分类项目。他们通过构建卷积神经网络(convolutional neural networks,CNN)取得了TOP-5错误率[1]16.4%的好成绩,一举夺得冠军,并且比之前最好的方法的错误率降低了9.4%。此后,卷积神经网络和深度学习开始风靡全球计算机科学界。这个卷积神经网络就是AlexNet[1],它以Hinton的学生Alex Krizhevsky的名字命名,可以说是现代卷积神经网络的奠基之作。2013年,Matthew Zeiler和Rob Fergus在AlexNet框架的基础上进行了一些改动,提出了ZFNet,将TOP-5错误率降至11.7%,获得了当年ILSVRC图像分类项目的第一名。ZFNet在网络结构上没有较大的突破,其论文的最大贡献在于解释了卷积神经网络为什么有效,并通过可视化技术展示了神经网络各层所起的作用。
在2014年的ILSVRC中,诞生了两个非常经典的卷积神经网络结构——GoogLeNet[3]和VGGNet[4],它们分别以TOP-5错误率6.7%和7.3%的成绩在图像分类项目中获得了冠军和亚军。
GoogLeNet中的“LeNet”是为了致敬1998年提出的用于识别手写数字的卷积神经网络模型LeNet。GoogLeNet在2014年的ILSVRC中以较大优势取得了图像分类项目的第一名,其TOP-5错误率达到了6.7%——还不到AlexNet的一半。GoogLeNet拥有22层网络,深度超过了之前所有的模型。由于网络中充满了inception结构,“GoogLeNet”也称“Inception Net”。其名称与克里斯托弗·诺兰的电影Inception(中译名为《盗梦空间》)相同,不仅因为其践行了电影中的经典台词“we need to go deeper”,还因为其从“network in network”的工作中获得了启发,打造的模型呼应了“梦中梦”。
VGGNet是牛津大学视觉几何组(visual geometry group,VGG)的Karen Simonyan和Andrew Zisserman在于2014年撰写的论文中提出的卷积神经网络结构。VGGNet建立了一个19层的深度网络,在2014年的ILSVRC中取得了定位第一名、分类第二名(TOP-5错误率7.3%)的成绩。虽然VGGNet模型在分类成功率方面与GoogLeNet相比稍稍逊色,但VGGNet对其他数据集具有很好的泛化能力,因此在多个迁移学习任务中的表现要优于GoogLeNet。一般来说,对于从图像中提取卷积神经网络特征的工作,VGGNet模型是首选算法。VGGNet遵循相同的设计原则,配置了一系列不同深度的网络,例如VGG11、VGG13、VGG16、VGG19。VGGNet的结构相对简单且有顺序,其3×3的卷积成为后来卷积神经网络结构的标配。VGGNet中的VGG16和VGG19更成为后来各种计算机视觉任务的基本模型。
在2015年的ILSVRC上,出现了一个深度空前的卷积神经网络模型——ResNet[5],其深度达到了惊人的152层(在此之前,最深的网络GoogLeNet仅有22层)。更令人惊讶的是,其TOP-5错误率仅为3.57%,而这已经超过了人类大脑TOP-5错误率5.1%的成绩。ResNet由前微软研究院的何凯明等四名华人提出。能实现如此之深的网络,关键在于使用残差模块解决了网络加深所导致的梯度消失问题。
2016年,公安部第三研究所物联网中心选派的“搜神”代表队,在ILSVRC中以2.99%的TOP-5错误率夺得了图像分类项目的冠军。“搜神”代表队使用集成学习的方法,将Inception-v3、Inception-v4、ResNet、Inception-ResNet-v2和WRN(wide ResNet,宽残差网络)模型进行了融合。
2017年的ILSVRC是最后一届,图像分类项目的冠军属于来自自动驾驶创业公司Momenta的Jie Hu和来自牛津大学的Li Shen、Gang Sun提出的SENet[6](squeeze-and-excitation networks)模型——其TOP-5错误率仅为2.25%。SENet的作者团队在空间编码之外研究了通道编码,通过特征重标定对通道关系进行建模,进一步增强了卷积神经网络的表达能力。
八年的ILSVRC已经落下帷幕。在图像分类领域,TOP-5错误率从2010年的28%降至2017年的2.25%,这样的成果令人赞叹。ILSVRC取得的惊人成就还在于引导并见证了深度学习热潮的爆发。
1.2.2 目标检测
如图1.1所示,目标检测可以理解为针对多个目标的目标定位和图像分类。在目标定位中,通常只有一个或数量固定的目标,而目标检测图像中出现的目标,种类和数量都不是固定的。因此,目标检测比目标定位具有更大的挑战性。
图1.1 目标检测结果示例
在2013年以前,目标检测大都基于手工提取特征的方法,人们大多通过在低层特征表达的基础上构建复杂的模型及多模型集成来缓慢地提升检测精度。当CNN在2012年的ILSVRC图像分类项目中大放异彩时,研究人员注意到,CNN能够学习鲁棒性非常强且具有一定表达能力的特征表示。于是,在2014年,Girshick等人提出了区域卷积神经网络目标检测(regions with CNN features,R-CNN)模型[7]。从此,目标检测研究开始以前所未有的速度发展。
R-CNN首先在图像中选取候选区域,接着将每个候选区域送入CNN来提取特征,使用SVM将得到的特征分类,最后进行边界框的回归预测。R-CNN的重要贡献在于,将深度学习引入目标检测,并将Pascal VOC 2007数据集上的mAP[2]由之前最好的35.1%提升至66.0%。
但是,当R-CNN将候选区域送入CNN时,卷积层后全连接层的输入尺寸和输出尺寸是固定的,因此CNN也需要固定的输入尺寸,这就导致输入图像的大小不能任意调节。此外,由于候选区域可能经常重叠,将每个候选区域都送入CNN的方法会造成大量的重复计算。针对这两个问题,何凯明等人在2014年提出了SPP-Net[8](spatial pyramid pooling networks,空间金字塔池化网络)。SPP层的每个池化(pooling)过滤器都会根据输入的内容调整自身的大小,而SPP层的输出尺寸是固定的,这样就解决了图像大小不能调节的问题。同时,SPP-Net只对原图进行一系列卷积操作,从而得到整幅图的特征图,然后找到每个候选框在特征图上的映射区域,将此区域作为每个候选框的卷积特征并输入SPP层和之后的层,节省了大量的计算时间。
2015年,Girshick等人在R-CNN的基础上提出了进阶版的Fast R-CNN[9]。Fast R-CNN使用与SPP层类似的RoI(region of interest,感兴趣区域)池化层,通过将提取特征之后的分类步骤和边界框回归步骤添加到深度网络中来进行同步训练。与R-CNN的多阶段训练相比,Fast R-CNN的训练更加简洁、省时间、省空间。Fast R-CNN的训练速度是R-CNN的9倍,检测速度是R-CNN的200倍。Fast R-CNN在Pascal VOC 2007数据集中,将mAP由R-CNN的66.0%提升至70.0%。
虽然Fast R-CNN在速度与精度上都有显著的提升,但它还需要事先使用外部算法来提取目标候选框。所以,在Fast R-CNN被提出后不久,Shaoqing Ren等人很快提出了Faster R-CNN模型[10],将提取目标候选框的步骤整合到深度网络中。Faster R-CNN是第一个真正意义上的端到端的深度学习目标检测算法,也是第一个准实时的深度学习目标检测算法。在Pascal VOC 2007数据集中,Faster R-CNN将mAP由Fast R-CNN的70.0%提升至78.8%。
Faster R-CNN最大的创新在于设计了区域候选网络(region proposal network,RPN)。2016年,Jifeng Dai等人提出了R-FCN(region based fully convolutional networks,基于区域的全卷积网络)模型[11],旨在引入位置敏感的RoI池化,从而进一步提高检测的精度。
从R-CNN到R-FCN,都是目标检测中基于候选区域的检测方法。实现基于候选区域的目标检测算法通常需要两步,第一步是从图像中提取深度特征并计算候选区域,第二步是对每个候选区域进行定位(包括分类和回归),因此又称两阶段目标检测方法。虽然其检测准确度较高,但在速度上与实时仍有差距。
为了使目标检测满足实时性要求,研究人员提出了单阶段目标检测方法。在单阶段目标检测方法中,不再使用候选区域进行“粗检测+精修”的流程,而采用“锚点+修正”的方法(这类方法只进行一次前馈网络计算,速度非常快,能达到实时的效果)。YOLO是第一个单阶段目标检测方法,也是第一个实现了实时的目标检测方法。
2015年,Joseph和Girshick等人提出了一个仅通过一次前向传导的目标检测模型,名为YOLO[12](you only look once)。YOLO的出现让人们对基于深度学习的目标检测方法的速度有了新的认识——能达到45帧每秒。但其局限性也非常明显,主要表现为网络能够检测的目标数目固定、小目标检测效果较差。
Wei Liu等人在2015年提出了SSD[13]方法。SSD吸收了YOLO的快速检测思想,结合了Faster R-CNN中RPN的优点,并改善了多尺寸目标的处理方式。由于不同卷积层所包含特征的尺寸不同,SSD可以通过综合多个卷积层的检测结果来检测不同尺寸的目标。SSD使用3×3的卷积取代YOLO中的全连接层,对不同尺寸和长宽比的default box进行目标分类与边界框回归。SSD取得了比YOLO快的(58帧每秒)、接近Faster R-CNN的检测性能。
2016年年底,Tsung-Yi Lin等人提出了FPN[14](feature pyramid networks,特征金字塔网络)。此前的方法,大都是取语义信息丰富的高层卷积特征来做预测的,但高层特征会导致损失一些细节信息,且目标位置不够明确。FPN融合多层特征,综合高层、低分辨率、强语义信息及低层、高分辨率、弱语义信息,提高了网络对小目标的处理能力。此外,FPN和SSD一样,可以在不同的层中独立进行预测。但FPN与SSD相比,多了一个上采样过程,这使得高层特征能与低层特征融合。FPN既可以与单阶段目标检测方法结合,也可以与两阶段目标检测方法结合。FPN与Faster R-CNN结合后,在基本不增加原有模型计算量的情况下,大幅提高了对小目标的检测性能。
同样在2016年年底,YOLO推出了升级版——YOLO v2[15]。在YOLO v2中,每个卷积层后添加了批标准化(batch normalization)层以提高收敛速度,同时去掉了网络中的全连接层。
一直以来,虽然单阶段目标检测方法在检测速度上明显高于两阶段目标检测方法,但在检测精度上,单阶段目标检测方法一直略逊于两阶段目标检测方法。Tsung-Yi Lin等人对其中的原因进行了研究,并于2017年提出了RetinaNet[16]检测模型。Tsung-Yi Lin等人认为,单阶段目标检测方法的性能通常不如两阶段目标检测方法的原因是,前者会面临极端不平衡的目标—背景数据分布。两阶段目标检测方法可以通过候选区域过滤大部分背景区域,但单阶段目标检测方法需要直接面对类别的不平衡。RetinaNet通过改进经典的交叉熵损失函数,提出了聚焦损失(focal loss)函数,降低了网络训练过程中简单背景样本的学习权重。RetinaNet可以实现对困难样本的“聚焦”和对网络学习能力的重新分配,从而使单阶段目标检测模型的检测速度和精度全面超越两阶段目标检测模型。
2017年年底,Shifeng Zhang等人提出了RefineDet[17]。RefineDet针对作为单阶段目标检测方法使用的SSD中存在的不平衡的目标—背景数据分布问题,结合两阶段目标检测方法中过滤背景区域的优点,提出了锚框改进模块(anchor refinement module,ARM)和目标检测模块(object detection module,ODM),以及用于串联二者的转换连接模块(transfer connection block,TCB)。
2018年年初,YOLO再次迎来改进版本——YOLO v3[18]。YOLO v3用多个独立的分类器代替softmax函数,用类似特征金字塔网络的方法进行多尺寸预测。在此之前,各种目标检测方法都被一个问题困扰——如何检测两个距离很近的物体。绝大部分算法会将传入的数据调整到一个更低的分辨率,对这种情况给出一个目标框(因为它们的特征提取或者回归过程会把这个目标框当作一个物体)。YOLO v3使用sigmoid函数代替softmax函数作为分类器,主要考虑的因素就是,softmax函数给每个边界框分配一个类别,而使用多个独立的分类器可以针对同一个边界框预测多个类别。
1.2.3 人脸识别
早在20世纪50年代,就出现了利用人脸的几何结构,通过分析人脸器官特征点及其之间的拓扑关系实现的人脸识别方法。虽然这种方法简单、直观,但是,一旦人脸的姿态、表情发生变化,其精度就会严重下降。进入21世纪,随着机器学习理论的发展,许多机器学习方法都被应用到人脸识别上,基于局部描述算子进行特征提取的方法取得了当时最好的识别效果。同时,研究者的关注点开始从受限场景下的人脸识别转移到无约束自然场景下的人脸识别,LFW(labeled faces in the wild home,无约束自然场景人脸识别数据集)人脸识别公开竞赛在此背景下开始流行。
LFW是人脸识别领域最权威的数据集之一。该数据集由13000多张自然场景中不同朝向、不同表情和不同光照条件的人脸图片组成,共有5000多人的人脸图片,其中有1680人有2张或2张以上的人脸图片,每张人脸图片都由唯一的姓名ID和序号加以区分。
2014年前后,随着大数据和深度学习的发展,神经网络重新受到关注,并在图像分类、手写体识别、语音识别等应用中获得了远超经典方法的结果。尤其是卷积神经网络被应用到人脸识别上,在LFW上第一次得到了超过人类水平的识别精度,成为人脸识别发展历史上的里程碑。此后,研究者们不断改进网络结构,同时扩大训练样本规模,将在LFW上的识别率提高到99.5%以上。
FaceNet[19]是谷歌团队发表的人脸识别算法,其在LFW数据集上取得了识别率99.63%的好成绩。FaceNet通过CNN将人脸映射到欧氏空间的特征向量上,计算不同图片中人脸特征之间的距离,通过相同个体人脸特征之间的距离总是小于不同个体人脸特征之间的距离这一先验知识来训练网络。在测试时,只需提取两张人脸照片的特征,然后计算特征之间的距离,即可使用一个阈值来判断两张人脸照片是否属于同一个人。
如图1.2所示,每一列中的两张人脸照片属于同一个人,而每一行中的两张人脸照片属于不同的人,每两张人脸照片之间的数值即为特征之间的距离。对这四张照片来说,同一列中的两张照片之间的距离都小于1.1,而同一行中的两张照片之间的距离都大于1.1,因此,将阈值设为1.1,即可区分两张人脸照片是否属于同一个人。
图1.2 基于FaceNet的人脸识别
FaceNet的总体流程,如图1.3所示。在深度网络部分,FaceNet可以根据不同的需要选择不同的CNN模型。例如,在服务器上可选择VGGNet、Inception、ResNet等精度高、计算量大的模型,在移动设备上可使用MobileNet等体积小、精度略低的模型。使用CNN提取特征之后,紧接着的L2归一化和嵌入层将特征映射到一个128维的欧氏空间中。对于维度选择问题:维度越小,计算速度就越快,但区分不同的图片越困难;维度越大,区分不同的图片就越容易,但训练模型时不易收敛、测试耗时长、占用空间大。笔者通过实验证实,128维的特征能够较好地平衡这个问题。将特征向量以三元组损失(triplet loss)为监督信号,就可以获得网络的损失和梯度。
图1.3 FaceNet的总体流程
三元组损失是FaceNet的核心,它是由三幅图片组成的三元组计算得到的损失。三元组由锚点(anchor)、反例(negative)和正例(positive)组成,任意一幅图片都可以作为一个锚点,与它属于同一个人的图片就是正例,与它属于不同的人的图片就是反例。三元组的学习目标,如图1.4所示,即将原本锚点距离正例远、距离反例近的情况变为距离正例近、距离反例远。
图1.4 三元组的学习目标
FaceNet会直接学习特征之间的可分性,使得同一类特征之间的距离小于不同类特征之间的距离,因此,三元组的选择对模型训练的收敛和模型的效果来说是非常重要的。为了保证训练收敛速度最快、网络训练效果最好,在理论上,需要选择hard positive(与锚点距离最远的正例)和hard negative(与锚点距离最近的反例)组成三元组进行训练。但是,在使用这样的方法进行训练时,选择三元组的过程耗时非常长,甚至会超过训练的时间,同时,容易受不好的数据的影响,造成局部极值,使网络无法收敛至最优值。因此,在实际训练中应使用semi-hard negative(满足距离锚点比正例近即可的反例)。
人脸识别技术已经相对比较成熟,许多基于深度学习的人脸识别方法的精确度已经达到甚至超过了人类的水平。这些方法对复杂环境的适应能力也在不断提高,刷脸门禁、刷脸支付等应用层出不穷。
1.2.4 语音识别
语音识别是深度学习的一个重要的应用方向。语音识别是指能够让计算机识别语音中携带的信息的技术。循环神经网络(recurrent neural network,RNN)给处于瓶颈期的HMM-GMM模型(hidden Markov model-Gaussian mixture model)注入了新鲜血液,将语音识别的准确率提升到了一个新高度。在微软、谷歌、苹果的产品中,都能见到这种技术的使用。
1.语音识别框架
语音识别框架,如图1.5所示。在识别之前:一边是声学模型的训练,即根据数据库中已经存在的数据训练声学模型;另一边是语言模型的建立。语言模型能够结合所使用语言的语法和语义知识,描述各单词之间的内在关系,达到减少总体搜索范围、提高识别准确率的目的。
图1.5 语音识别框架
图1.5的下方展示了语音识别的流程。将一段语音输入计算机后,先要对原始的语音信息进行处理,例如过滤背景噪声、变换等。然后,使用算法提取这段语音信息的特征,即用一段固定长度的帧来分割语音波形,并从每一帧中提取梅尔频率倒谱系数(Mel frequency cepstrum coefficient,MFCC)特征,将其作为一个特征向量。最后,结合声学模型和语言模型,对特征向量进行识别并转换成文本输出。
2.隐马尔可夫模型
当待解决的问题需要根据已经观测到的数据序列来推测无法观测到的数据序列(隐藏序列)时,可以使用隐马尔可夫模型(hidden Markov model,HMM)。例如,将一周的天气状况作为HMM的隐藏序列,现在只有某个人在这一周内的行为这一观察序列,而这个人在不同天气状况下的行为是不同的,我们需要根据这一观察序列来推断一周天气状况这个隐藏序列,就需要使用HMM。
我们再举一个更常见的例子来说明HMM。假设有三个骰子,如图1.6所示。第一个骰子是常见的骰子(称为D6),有6个面,每个面出现的概率是1/6。第二个骰子是个四面体(称为D4),每个面出现的概率是1/4。第三个骰子有8个面(称为D8),每个面出现的概率是1/8。
图1.6 三个骰子
接下来,开始投掷骰子。我们每次随机从三个骰子里挑选一个,因此挑选到每个骰子的概率均是1/3。
多次重复上述过程,我们可能会得到一个随机的数字序列“1、6、3、5、2、7、5、2、4”,如图1.7所示。
图1.7 骰子投掷过程
假如投掷的过程对我们是不可见的,我们只能看到每次投掷后得到的数字,那么这串输出的数字就称为可见状态链(我们可以直接观测)。在投骰子的过程中,虽然每次选择的骰子不可见,但是它们也确实对应于输出结果并形成了一个序列,这个序列就称为隐含状态链。
此时,我们知道每个骰子之间状态改变的概率,也知道每个骰子输出值的概率,以及第一次选择骰子的概率(都是1/3),这样就构成了一个隐马尔可夫模型。建立这个模型后,我们就可以根据输出序列来推测最可能的隐藏状态序列了,这在语音识别中有着重要的作用。
HMM-GMM的整体结构主要由观察序列和隐藏序列构成,如图1.8所示。这里举一个识别少量词汇的例子。假设我们要识别apple、banana、peach、orange四个单词,那么我们可以为每个单词建立四个对应的HMM。HMM包括:转移概率矩阵A;观测概率序列矩阵B;初始状态∏。
图1.8 HMM-GMM的整体结构
我们使用高斯混合模型(Gaussian mixture model,GMM)来描述这一观测概率序列矩阵B。多个高斯分布函数的线性组合构成了GMM。理论上,GMM可以拟合出任意类型的分布。因此,在语音识别领域,我们通过输入的观测序列(经过MFCC提取的特征向量)对HMM-GMM进行训练,不断纠正其输出,从而达到建立正确的语音模型的目的。
回到识别单词的问题上。此时,我们已经有了apple、banana、peach、orange四个训练好的HMM-GMM。我们把一段输入的语音转换成特征向量序列L,然后,用事先训练好的GMM代替HMM中的观测概率序列矩阵B,对这个特征向量序列计算HMM模型的概率,得出L对于这个模型的概率。根据这个思路,我们可以得到L对于这四个单词语音模型的概率,即P{L|apple}、P{L|banana}、P{L|peach}、P{L|orange},把最大概率值所对应的单词作为识别结果输出。
3.循环神经网络
接下来,我们介绍如何使用循环神经网络代替HMM-GMM,得到更高的识别精度。
(1)循环神经网络概述
循环神经网络的结构,如图1.9所示。其中,每个圆圈可以看作一个单元,每个单元做的事情是一样的,因此可以折叠成左半部分的样子。用一句话解释循环神经网络,就是“一个单元结构的重复使用”。
图1.9 循环神经网络的结构
循环神经网络是一个序列到序列的模型。假设xt-2、xt-1、xt、xt+1是一个输入“This is an orange”,那么ot-1、ot、ot+1就分别对应于“is”“an”“orange”。因此,可以有这样的定义:xt表示t时刻的输入,ot表示t时刻的输出,st表示t时刻的记忆。当前时刻的输出是由记忆和当前时刻的输入决定的。就好像你现在读大四,你掌握的知识是大四学到的知识(当前时刻的输入)和大三及大三以前学到的知识(记忆)的组合,循环神经网络在这一点上与此类似。神经网络擅长通过一系列参数把很多内容整合到一起,然后学习这个参数,因此定义了循环神经网络的基础:
s t =f(Uxt+Wst-1+V)
其中,U、W代表权重,V代表偏移量,f代表激活函数。
在这里,我们通常采用连接时序分类(connectionist temporal classification,CTC)算法对语音进行解码并计算损失。该方法会在9.3.2节详细介绍。
(2)长短时记忆网络概述
因为循环神经网络只能通过之前出现的单词加强对当前单词的理解,所以,它只能解决短期记忆问题,对长期记忆问题无能为力。例如,在判别“This is an...”时,orange、peach、apple、banana似乎都说得通,但如果将这句话改成“I take my family to an orange garden...This is an...”,“orange”在句末出现的概率就要比其他三项大得多了。
长短时记忆(long short-term memory,LSTM)网络就是为解决长时间记忆的问题而设计的。LSTM网络主要包括单元和门限两部分。门限让信息有选择地影响循环神经网络中每个时刻的状态。门限结构将sigmoid激活操作的结果与输入数据按位相乘。sigmoid激活操作会输出一个0到1之间的数值,以描述当前输入的信息量中有多少可以通过这个结构。
如图1.10所示,有三种基本的门结构,即输入门、遗忘门和输出门。输入门i·z会根据当前的输入xt和上一时刻的输出ht-1,得到输入状态值z=tanh(Wz[ht-1,xt]+bz),再通过i=sigmoid(Wi[ht-1,xt]+bi)决定将哪些信息加入状态ct-1,生成新的状态ct。
图1.10 长短时记忆网络
遗忘门f·ct-1的作用是让循环神经网络忘记之前那些无用的信息。其中,f=sigmoid(Wf[ht-1,xt]+bf)。新的状态ct可以通过公式ct=f·ct-1+i·z得到。得到新的状态后,输出门负责产生当前时刻的输出ht=o·tanh(ct)。其中,o=sigmoid(Wo[ht-1,xt]+bo),Wz、Wi、Wf、Wo分别代表参数矩阵,bz、bi、bf、bo分别代表偏移量。