1、 5-1 5-1 一维卷积神经网络一维卷积神经网络 5-2 5-2 循环神经网络循环神经网络RNNRNN 5-3 5-3 递归神经网络递归神经网络 5-4 5-4 长短期记忆长短期记忆LSTMLSTM网络网络第五章 序列类数据处理本章简介本章简介第第4 4章介绍了识别图像类数据的深度学习技术。但是在我们的生章介绍了识别图像类数据的深度学习技术。但是在我们的生活以及工程应用中,数据的表现形式不一定只有图像,还存在活以及工程应用中,数据的表现形式不一定只有图像,还存在着诸如特征序列,语音信号,文本等序列类数据,这些数据同着诸如特征序列,语音信号,文本等序列类数据,这些数据同样记录着十分重要的信息,
2、我们也希望计算机能够准确地识别样记录着十分重要的信息,我们也希望计算机能够准确地识别它们。它们。本章将介绍一系列序列类数据处理的方法并利用本章将介绍一系列序列类数据处理的方法并利用KerasKeras实现它们。实现它们。同时,也会介绍一些适用于处理序列类数据深度学习模型的优同时,也会介绍一些适用于处理序列类数据深度学习模型的优化方法。化方法。5-1 5-1 一维卷积神经网络一维卷积神经网络5.1.1 5.1.1 一维卷积神经网络原理一维卷积神经网络原理与与二二维维卷卷积积神神经经网网络络相相似似,一一维维卷卷积积神神经经网网络络也也是是利利用用滤滤波波器器来来识识别别特特征征。为为了了减减少少
3、计计算算的的复复杂杂程程度度,在在识识别别一一种种特特征征的的时时候候依依旧旧使使用用权权重共享技术。一维卷积的基本原理如图重共享技术。一维卷积的基本原理如图5 5-1 1所示。所示。图图5 5-1 1 一维卷积原理图一维卷积原理图不难发现,图不难发现,图5-1中的输入序列数据维度为中的输入序列数据维度为8,滤波器,滤波器的维度为的维度为2。与二维卷积类似,卷积后输出的数据维。与二维卷积类似,卷积后输出的数据维度特征图个数为度特征图个数为82+1=7。由此可以得到一位卷积的。由此可以得到一位卷积的输出维度公式。输出维度公式。图图5-2 5-2 一维卷积补零策略一维卷积补零策略其中,为输出维度,
4、为输入维度,为滤波器维度。其中,为输出维度,为输入维度,为滤波器维度。这样看来,一维卷积与二维卷积一样,同样存在这样看来,一维卷积与二维卷积一样,同样存在着维度减少的问题。为了保持信号的维度不发生着维度减少的问题。为了保持信号的维度不发生变化,一维卷积也可以采用补零策略,如图变化,一维卷积也可以采用补零策略,如图5 5-2 2所所示。示。(5-5-1 1)在得到特征图之后,为了进一步凝炼特征还要使用池化技术。和二在得到特征图之后,为了进一步凝炼特征还要使用池化技术。和二维卷积技术相同,在一维卷积中我们依旧可以使用最大池化、平均维卷积技术相同,在一维卷积中我们依旧可以使用最大池化、平均池化以及池
5、化以及L2L2池化等。但是,在使用池化技术之前还需要利用激活函池化等。但是,在使用池化技术之前还需要利用激活函数来增加非线性因素。数来增加非线性因素。在获得凝炼的特征之后还可以利用压平(在获得凝炼的特征之后还可以利用压平(FlattenFlatten)方法或者是全)方法或者是全局平均池化(局平均池化(Global Average PoolingGlobal Average Pooling)使众多特征图变成一个特)使众多特征图变成一个特征向量以便使用分类函数对样本进行分类。征向量以便使用分类函数对样本进行分类。压压平平方方法法就就是是将将所所有有特特征征图图的的每每一一个个元元素素各各自自连连接
6、接到到一一个个单单独独的的神神经经元,原理如图元,原理如图5 5-3 3所示。所示。如图如图5-3所示,假如我们拥有所示,假如我们拥有4个特征图,每一个特征图的大小为个特征图,每一个特征图的大小为18,那么全,那么全连接层的神经元个数为连接层的神经元个数为48=32个,这是一个个,这是一个“被压平被压平”的的32维特征向量。因维特征向量。因此,压平方法就是将特征图中的所有元素进行全连接,使众多特征值变为一此,压平方法就是将特征图中的所有元素进行全连接,使众多特征值变为一个一维向量。最后将这个特征向量送入分类函数,最终可以获得分类结果。个一维向量。最后将这个特征向量送入分类函数,最终可以获得分类
7、结果。图图5 5-3-3 压平方法原理压平方法原理虽然压平方法看起来十分简单,但是它存在着很大的问题,即特征虽然压平方法看起来十分简单,但是它存在着很大的问题,即特征图的数量以及规模十分庞大时,加入全连接层会使模型的参数数量图的数量以及规模十分庞大时,加入全连接层会使模型的参数数量剧增。为了解决这一问题,可以使用全局平均池化方法。剧增。为了解决这一问题,可以使用全局平均池化方法。全局平均池化方法就是计算每一个特征图中元素的平均值,然后将全局平均池化方法就是计算每一个特征图中元素的平均值,然后将每一个特征图的平均值构成特征向量,得到的特征向量再被送入分每一个特征图的平均值构成特征向量,得到的特征
8、向量再被送入分类函数,最终得到样本的分类结果。由于全局平均池化只是求取了类函数,最终得到样本的分类结果。由于全局平均池化只是求取了每一个特征图的平均值而非使用全连接层,这样就节省了大量的计每一个特征图的平均值而非使用全连接层,这样就节省了大量的计算资源。算资源。结合在第结合在第4 4章中所讲到的二维卷积神经网络,我们就得到了一维章中所讲到的二维卷积神经网络,我们就得到了一维卷积神经网络的原理图,如图卷积神经网络的原理图,如图5 5-4-4所示。所示。图图5 5-4 4 一维卷积神经网络原理一维卷积神经网络原理5.1.2 5.1.2 一维卷积神经网络实例一维卷积神经网络实例现现在在利利用用Ker
9、as来来实实现现一一个个实实际际的的工工程程问问题题,就就是是在在第第3章章讲讲述述“实实现现简简单单神经网络神经网络”时所提到的对不同种类鸢尾花的识别,数据集如图时所提到的对不同种类鸢尾花的识别,数据集如图5-5所示。所示。图图5 5-5-5 鸢尾花数据集鸢尾花数据集不难理解,鸢尾花数据集就是序列数据,每一条数据由鸢尾花的特不难理解,鸢尾花数据集就是序列数据,每一条数据由鸢尾花的特征值构成。因此,我们可以使用一维卷积神经网络对鸢尾花数据进征值构成。因此,我们可以使用一维卷积神经网络对鸢尾花数据进行识别。现在初步构造一个一维卷积神经网络来进行实验,看看它行识别。现在初步构造一个一维卷积神经网络
10、来进行实验,看看它的效果如何。的效果如何。#导入所需要的包导入所需要的包import numpy as npimport numpy as npimport pandas as pdimport pandas as pdfrom keras import optimizersfrom keras import optimizersfrom keras import regularizersfrom keras import regularizersfrom keras.models import Sequentialfrom keras.models import Sequentialfrom
11、 keras.layers import Dense,Dropoutfrom keras.layers import Dense,Dropoutfrom keras.wrappers.scikit_learn import KerasClassifierfrom keras.wrappers.scikit_learn import KerasClassifierfrom keras.utils import np_utilsfrom keras.utils import np_utilsfrom sklearn.model_selection import train_test_split,f
12、rom sklearn.model_selection import train_test_split,KFold,cross_val_scoreKFold,cross_val_scorefrom sklearn.preprocessing import LabelEncoderfrom sklearn.preprocessing import LabelEncoderfrom keras.layers.core import Dense,Dropout,Activationfrom keras.layers.core import Dense,Dropout,Activationfrom k
13、eras.layers import Conv1D,from keras.layers import Conv1D,MaxPooling1D,GlobalAveragePooling1D,FlattenMaxPooling1D,GlobalAveragePooling1D,Flattenfrom keras.callbacks import TensorBoardfrom keras.callbacks import TensorBoardfrom keras.callbacks import EarlyStoppingfrom keras.callbacks import EarlyStop
14、ping%matplotlib inline%matplotlib inline import matplotlibimport matplotlibimport matplotlib.pyplot as pltimport matplotlib.pyplot as plt#读取读取CSVCSV文件文件dataframe=pd.read_csv(D:DLsampleiris2.csv,header=None)dataframe=pd.read_csv(D:DLsampleiris2.csv,header=None)dataset=dataframe.valuesdataset=datafram
15、e.values#读取范围的设定,共读取第读取范围的设定,共读取第0 0至第至第4 4列并转为列并转为floatfloat形式形式X=dataset:,0:4.astype(float)X=dataset:,0:4.astype(float)#标签的设定,第标签的设定,第4 4列为标签列列为标签列Y=dataset:,4Y=dataset:,4#由于由于Conv1Conv1官方要求输入为一个官方要求输入为一个3D3D张量,形如(张量,形如(samplessamples,stepssteps,input_diminput_dim)的)的3D3D张量,因此要对输入的数据增扩张量,因此要对输入的数据
16、增扩X=np.expand_dims(X,3)X=np.expand_dims(X,3)#将每一类值对应为一个整数将每一类值对应为一个整数encoder=LabelEncoder()encoder=LabelEncoder()encoded_Y=encoder.fit_transform(Y)encoded_Y=encoder.fit_transform(Y)#one-hot#one-hot形式编码形式编码dummy_y=np_utils.to_categorical(encoded_Y,3)dummy_y=np_utils.to_categorical(encoded_Y,3)#显示输入数据
17、以及编码后的标签显示输入数据以及编码后的标签print(X)print(X)print(dummy_y)print(dummy_y)#搭建模型搭建模型model=Sequential()model=Sequential()model.add(Conv1D(64,3,activation=relu,input_shape=(4,model.add(Conv1D(64,3,activation=relu,input_shape=(4,1),padding=same)1),padding=same)model.add(MaxPooling1D(2)#model.add(MaxPooling1D(2)
18、#使用最大池化使用最大池化model.add(Conv1D(128,3,activation=relu,input_shape=(4,model.add(Conv1D(128,3,activation=relu,input_shape=(4,1),padding=same)1),padding=same)model.add(MaxPooling1D(2)model.add(MaxPooling1D(2)model.add(GlobalAveragePooling1D()#model.add(GlobalAveragePooling1D()#使用全局平均池化使用全局平均池化model.add(D
19、ense(10,activation=relu)model.add(Dense(10,activation=relu)model.add(Dense(5,activation=relu)model.add(Dense(5,activation=relu)model.add(Dense(output_dim=3,activation=softmax)model.add(Dense(output_dim=3,activation=softmax)model.summary()#model.summary()#打印模型打印模型History=model.fit(X,dummy_y,epochs=50
20、0,batch_size=20,validHistory=model.fit(X,dummy_y,epochs=500,batch_size=20,validation_split=0.2)#ation_split=0.2)#训练网络训练网络#画图画图plt.plot(history.historyacc)plt.plot(history.historyacc)plt.plot(history.historyval_acc)plt.plot(history.historyval_acc)#设定图片属性设定图片属性plt.title(model accuracy)plt.title(model
21、accuracy)plt.ylabel(accuracy)plt.ylabel(accuracy)plt.xlabel(epoch)plt.xlabel(epoch)plt.legend(train,test,loc=upper left)plt.legend(train,test,loc=upper left)plt.show()plt.show()最后,我们可以观察到内嵌的训练最后,我们可以观察到内嵌的训练情况情况。图图5 5-6-6 一维卷积神经网络一维卷积神经网络训练情况训练情况5-2 5-2 循环神经网络循环神经网络RNN循循环环神神经经网网络络(Recurrent Recurren
22、t Neural Neural Network,RNNNetwork,RNN)具具有有固固定定的的权权值值和和内内部部的的状状态态,是是一一类类专专门门用用于于处处理理任任意意长长度度序序列列信信息息的的神神经经网网络络。通通常用来描述动态时间行为序列,常用来描述动态时间行为序列,循循环环网网络络通通常常是是在在序序列列的的小小批批量量元元素素上上进进行行操操作作的的,并并且且不不同同的的小小批批量量数数据据可可以以具具有有不不同同的的序序列列长长度度。此此外外,循循环环神神经经网网络络在在几几个个时时间间步步内内共共享享相相同同的的权权重重,不不需需要要分分别别学学习习句句子子每每个个位位置
23、置的的所所有有语语言言规规则则。同样可以应用于两个维度的空间数据(如图像和视频信号)。同样可以应用于两个维度的空间数据(如图像和视频信号)。5.2.1 5.2.1 循环神经网络基本原理循环神经网络基本原理信号流图可以很好地显示深度学习模型的信号流向以及具体构造。信号流图可以很好地显示深度学习模型的信号流向以及具体构造。为了让循环神经网络变得更易被理解,我们结合信号流图来解释循为了让循环神经网络变得更易被理解,我们结合信号流图来解释循环神经网络的原理。环神经网络的原理。(5-5-2 2)首先考虑动态系统的基本形式首先考虑动态系统的基本形式:其中,是系统在时刻的状态,为系统参数。通过表达式不难看出
24、其中,是系统在时刻的状态,为系统参数。通过表达式不难看出每一时刻的系统状态不仅仅由系统参数决定,还由系统上一时刻每一时刻的系统状态不仅仅由系统参数决定,还由系统上一时刻的状态决定。由于系统在时刻还需要考虑时刻的状态,因此这样的状态决定。由于系统在时刻还需要考虑时刻的状态,因此这样的系统是循环的。的系统是循环的。图图5 5-7-7 迭代式的信号流图迭代式的信号流图对于有限时间步对于有限时间步t,例如,例如t=3,展开式(,展开式(5.2)得到:)得到:(5.35.3)不停地迭代下去就能得到最终的表达。图不停地迭代下去就能得到最终的表达。图5 5-7-7是利用传统的数据流图是利用传统的数据流图来表
25、达这一过程。来表达这一过程。在在自自然然语语言言建建模模的的过过程程中中使使用用RNN,通通常常给给定定前前一一个个词词去去预预测测下下一一个个词词或或者者一一系系列列词词来来预预测测样样本本类类别别,此此时时没没有有必必要要存存储储时时刻刻之之前前输输入入序序列列中中的的所所有有信信息息,而而仅仅仅仅存存储储足足够够的的信信息息就就可可以以了了。当当然然,我我们们要要求求在在稀稀疏疏的的同同时时又又足足够够丰丰富富,尽尽可可能能无无差差别别地地恢恢复复输输入序列。入序列。设一个函数设一个函数g g(t t)经)经t t步展开后的循环为步展开后的循环为(5.45.4)(5.55.5)函函数数g
26、(t)将将全全部部的的过过去去序序列列作作为为输输入入来来更更新新系系统统当当前前的的状状态态,通通过过前前面面的的分分析析允允许许将将分分解解g(t)为为多多次次映映射射函函数数f的的重重复复应应用用。这这种种迭迭代代方法具有以下两个优点:方法具有以下两个优点:1.1.由于它描述的是一种状态到另一种状态的转移,而非直接处理长由于它描述的是一种状态到另一种状态的转移,而非直接处理长短不一的原始序列数据,因此无论序列的长度如何,最终学成的模短不一的原始序列数据,因此无论序列的长度如何,最终学成的模型始终具有相同的输入大小;型始终具有相同的输入大小;2.2.我们可以在每个时间步使用相同参数的转移函
27、数。我们可以在每个时间步使用相同参数的转移函数。这两个优点保证了在所有时间步和所有序列长度上操作单一的模这两个优点保证了在所有时间步和所有序列长度上操作单一的模型是可能的,而不需要在所有可能时间步学习独立的模型型是可能的,而不需要在所有可能时间步学习独立的模型g(t)。也。也就是说不需要在每一个时间步都学习一个单独的参数。就是说不需要在每一个时间步都学习一个单独的参数。5.2.2 5.2.2 循环神经网络循环神经网络的输出的输出目前为止,我们上述的循环网络例子中损失目前为止,我们上述的循环网络例子中损失L L(t)(t)是训练目标是训练目标y y(t)(t)和和输出输出o o(t)(t)之间的
28、交叉熵。与前馈网络类似,从理论上讲,循环网络之间的交叉熵。与前馈网络类似,从理论上讲,循环网络几乎可以使用任何损失函数,但具体的损失函数类型必须根据具几乎可以使用任何损失函数,但具体的损失函数类型必须根据具体的工程任务来选择。体的工程任务来选择。(5-5-6 6)当我们使用一个预测性对数似然的训练目标,我们将当我们使用一个预测性对数似然的训练目标,我们将RNNRNN训练为能训练为能够根据之前的输入估计下一个序列元素的条件分布。这意味着最大够根据之前的输入估计下一个序列元素的条件分布。这意味着最大化对数似然为:化对数似然为:在在RNNRNN图图模模型型中中引引入入状状态态变变量量,尽尽管管它它是
29、是输输入入的的确确定定性性函函数数,但但它它有有助助于于计计算算的的便便捷捷化化。序序列列中中的的每每个个阶阶段段使使用用相相同同的的结结构构,并并且且与与其其他他阶阶段共享相同的参数。如图段共享相同的参数。如图5 5-8-8所示。所示。图图5 5-8-8 RNN RNN的高效计算方式的高效计算方式如如图图5.16所所示示,相相隔隔较较远远的的过过去去变变量量y(t)可可 以以 通通 过过 其其 对对 隐隐 藏藏 层层 h的的 影影 响响 来来 影影 响响 输输 出出 变变 量量 y(t)。节节点点之之间间相相互互连连接接结结构构表表明明可可以以在在不不同同的的时时间间步步使使用用相相同同的的
30、条条件件概概率率分分布布,并并且且当当观观察察到到全全部部变变量量时时,可可以以高高效效地地评评估估联联合合分分配给所有变量的概率。配给所有变量的概率。但即便我们已经使用高效计算、参数化的模型结构,某些应用需但即便我们已经使用高效计算、参数化的模型结构,某些应用需求在计算上仍然具有挑战性。例如求在计算上仍然具有挑战性。例如RNN模型难以预测序列中缺少模型难以预测序列中缺少的值的值。同时,虽然提出的循环网络可以减少参数的数目,但是它。同时,虽然提出的循环网络可以减少参数的数目,但是它付出的代价是可能影响到优化参数。付出的代价是可能影响到优化参数。5.2.3 5.2.3 上下文依赖型数据处理上下文
31、依赖型数据处理我们之前讨论的都是由输入序列逐步迭代,最后得到输出序列的我们之前讨论的都是由输入序列逐步迭代,最后得到输出序列的情况。但是在实际工程中不仅仅单纯地对序列类数据进行简单预情况。但是在实际工程中不仅仅单纯地对序列类数据进行简单预测或分类。测或分类。例如在许多中文语句中,在不同的上下文环境里相同的语句具有例如在许多中文语句中,在不同的上下文环境里相同的语句具有不同的文意。我们希望这个深度学习模型能够很好地根据上下文不同的文意。我们希望这个深度学习模型能够很好地根据上下文的语义环境进行识别或预测。的语义环境进行识别或预测。以下是将额外输入提供到以下是将额外输入提供到RNNRNN的一些常见
32、方法:的一些常见方法:1.1.在每一个时间步增加一个额外输入;在每一个时间步增加一个额外输入;2.2.作为或者影响初始状态作为或者影响初始状态h h(o)(o);3.3.综合以上两种方法。综合以上两种方法。前前面面已已经经提提到到,循循环环性性状状态态h h在在时时间间上上向向前前传传播播信信息息,而而循循环环性性状状态态g g在在时时间间上上向向后后传传播播信信息息。因因此此在在每每个个时时间间步步t t,输输出出单单元元o o(t)(t)都都可可以以接接收收到到输输入入h h(t)(t)中中关关于于过过去去的的相相关关信信息息以以及及输输入入g g(t)(t)中中所所包包括括的的关关于于未
33、未来来的相关要素。的相关要素。值值得得注注意意的的是是,虽虽然然我我们们一一直直使使用用时时间间步步来来进进行行说说明明,但但是是RNNRNN也也可可以以应应用用于于非非时时间间序序列列的的序序列列数数据据,此此时时时时间间步步索索引引就就变变成成了了序序列列数数据据的的位位置置索索引引。例例如如,上上述述的的双双向向RNNRNN也也可可以以应应用用于于处处理理图图像像数数据据:由由四四个个RNNRNN组组成成,每每一一个个网网络络沿沿着着四四个个方方向向中中的的一一个个计计算算:上上、下下、左左、右右。相相比比卷卷积积网网络络,应应用用于于图图像像的的RNNRNN计计算算成成本本通通常常更更
34、高高,但但允允许许同同一特征图的特征之间存在长期横向的相互作用。一特征图的特征之间存在长期横向的相互作用。5.2.4 5.2.4 序列到序列的数据处理序列到序列的数据处理上面章节中讨论了上面章节中讨论了RNNRNN如何将输入序列映射成固定大小的向量、如如何将输入序列映射成固定大小的向量、如何将固定大小的向量映射成一个序列,以及何将固定大小的向量映射成一个序列,以及RNNRNN如何将一个输入序如何将一个输入序列映射到等长的输出序列。列映射到等长的输出序列。但是在实际的工程应用中我们还需要将输入序列映射到长度不等但是在实际的工程应用中我们还需要将输入序列映射到长度不等的输出序列。如语音识别、机器翻
35、译或问答等。它们训练集的输的输出序列。如语音识别、机器翻译或问答等。它们训练集的输入和输出序列的长度通常不相同,即使它们的长度可能存在某些入和输出序列的长度通常不相同,即使它们的长度可能存在某些固定的关系。固定的关系。我们经常将我们经常将RNNRNN的输入称为的输入称为“上下文上下文”。希望产生此上下文的抽象。希望产生此上下文的抽象表示,这个抽象表示我们利用表示,这个抽象表示我们利用C C来表示。上下文来表示。上下文C C可能是一个对输入可能是一个对输入序列抽象表示的向量或者向量序列。序列抽象表示的向量或者向量序列。用用于于将将一一个个可可变变长长度度序序列列映映射射到到另另一一个个可可变变长
36、长度度序序列列最最简简单单的的RNN架架构构通常被称为编码通常被称为编码-解码架构或序列到序列架构,原理如图解码架构或序列到序列架构,原理如图5-9所示。所示。图图5 5-9-9 序列到序列的序列到序列的RNNRNN结构结构 这这个个结结构构主主要要由由读读取取输输入入序序列列的的编编码码器器RNNRNN和和生生成成输输出出序序列列的的解解码码器器RNNRNN组组成成。编编码码器器RNNRNN的的最最终终隐隐藏藏状状态态用用于于计计算算一一般般为为固固定定大大小小的的上上下下文文抽抽象象表表示示,而而表表示示输输入入序序列列的的语语义义概概要要并并且且作作为为解解码码器器RNNRNN的输入。的
37、输入。这个结构的实现过程十分简单:这个结构的实现过程十分简单:1.1.编码器(编码器(encoderencoder)处理输入)处理输入RNNRNN的序列。编码器最终输出上的序列。编码器最终输出上下文下文C C,即对输入序列的抽象表示。,即对输入序列的抽象表示。2.2.解码器(解码器(decoderdecoder)以固定长度的向量为条件产生输出序列)以固定长度的向量为条件产生输出序列我我们们观观察察之之前前讲讲述述的的所所有有RNNRNN架架构构,不不难难发发现现大大多多数数RNNRNN的的计计算算可可以分解成以分解成3 3个不同阶段的参数及其相关变换:个不同阶段的参数及其相关变换:1.1.从输
38、入从输入x x到隐藏状态到隐藏状态h h;2.2.从前一隐藏状态从前一隐藏状态h h(t)(t)到下一隐藏状态到下一隐藏状态h h(t+1)(t+1);3.3.从隐藏状态从隐藏状态h h到输出到输出y y。我们可以理解,适当地增加模型的深度会对训练有着一定的积极作我们可以理解,适当地增加模型的深度会对训练有着一定的积极作用。增加用。增加RNNRNN架构深度的方法有许多,如下三种最为常见架构深度的方法有许多,如下三种最为常见:1.1.隐藏的循环状态可以被分解为具有层次的状态组隐藏的循环状态可以被分解为具有层次的状态组2.2.可以在输入到隐藏、隐藏到隐藏以及隐藏到输出的各部分中引入可以在输入到隐藏
39、、隐藏到隐藏以及隐藏到输出的各部分中引入更深的计算,如之前介绍的全连接更深的计算,如之前介绍的全连接3.3.引入跳跃连接来缓解梯度引起的问题引入跳跃连接来缓解梯度引起的问题5-3 5-3 递归递归神经网络神经网络5.3.1 5.3.1 递归神经网络基本原理递归神经网络基本原理递递归归神神经经网网络络(recursive recursive neural neural networknetwork)是是循循环环网网络络的的另另一一种种类类型型,是是树树状状结结构构而而不不是是循循环环神神经经网网络络的的链链状状结结构构,适适用用于于输输入入是是数数据据结结构构,如如自自然然语语言言处处理理和和计
40、计算算机机视视觉觉。递递归归神神经经网网络络经经典典数数据据流流图图如如图图5 5-10-10所示。所示。图图5 5-1 10 0 经典递归神经网络数据流图经典递归神经网络数据流图递递归归网网络络将将循循环环网网络络的的链链状状数数据据流流图图扩扩展展成成树树状状数数据据流流图图。其其中中,可可变变大大小小的的序序列列x x(t)(t)可可以以通通过过固固定定的的参参数数集集合合,即即权权重重矩矩阵阵U U、V V、W W映映射射到到固固定定大大小小的的抽抽象象o o表表示示。图图5 5-10-10展展示示了了监监督督学学习习的的情情况况,因因为提供了与整个序列相关的目标输出为提供了与整个序列
41、相关的目标输出y y。递归神经网络最显著的优点就是对于具有相同长度递归神经网络最显著的优点就是对于具有相同长度t t的序列,由于的序列,由于采用了树状结构,计算量可由采用了树状结构,计算量可由o(t)o(t)锐减至锐减至o(logt)o(logt),可以缓解长期,可以缓解长期依赖的问题(参见依赖的问题(参见5.3.25.3.2节)。递归网络的变种有很多。比如将数节)。递归网络的变种有很多。比如将数据与树结构相关联,并将输入和目标与树的单独节点相关联。据与树结构相关联,并将输入和目标与树的单独节点相关联。5.3.2 5.3.2 长期依赖性长期依赖性当网络的深度增加以后,模型可能会出现梯度消失或是
42、梯度爆炸当网络的深度增加以后,模型可能会出现梯度消失或是梯度爆炸的情况,这种情况我们称之为长期依赖。由于循环神经网络中存的情况,这种情况我们称之为长期依赖。由于循环神经网络中存在比相邻的时间步之间相互作用的参数更小的权重,所以即使我在比相邻的时间步之间相互作用的参数更小的权重,所以即使我们假设循环网络的参数是稳定的,但还是存在长期依赖的现象。们假设循环网络的参数是稳定的,但还是存在长期依赖的现象。循环神经网络所使用的函数组合与矩阵乘法相似。将不同时间步之循环神经网络所使用的函数组合与矩阵乘法相似。将不同时间步之间的隐藏层状态联系写为:间的隐藏层状态联系写为:(5-5-7 7)这是一个非常简单的
43、、缺少非线性激活函数和输入的循环神经网这是一个非常简单的、缺少非线性激活函数和输入的循环神经网络。它的迭代式为:络。它的迭代式为:(5-5-8 8)假设假设W W存在特征值分解,即:存在特征值分解,即:其中若其中若Q Q为正交的,那么带入式(为正交的,那么带入式(5 5-8-8)后得到:)后得到:(5-5-9 9)当特征值经过高次幂的运算后,幅值小于当特征值经过高次幂的运算后,幅值小于1 1的特征值将会衰减到零,的特征值将会衰减到零,而幅值大于而幅值大于1 1的就会激增。任何不与最大特征向量对齐的的就会激增。任何不与最大特征向量对齐的h h(0)(0)的部的部分将最终被丢弃。分将最终被丢弃。(
44、5-5-1010)该乘积消失还是爆炸取决于该乘积消失还是爆炸取决于w w的幅值,当的幅值,当w1w1时高次幂的运算会导时高次幂的运算会导致爆炸,而当致爆炸,而当w1w1时高次幂的值最终会消失。但是如果能够在每个时高次幂的值最终会消失。但是如果能够在每个时间步使用不同权重时间步使用不同权重w w(t)(t)的非循环网络,就可以避免高次幂运算可的非循环网络,就可以避免高次幂运算可能带来的梯度消失或爆炸的问题。能带来的梯度消失或爆炸的问题。关关于于RNNRNN梯梯度度消消失失和和爆爆炸炸问问题题,有有些些学学者者希希望望通通过过简简单单地地停停留留在在梯梯度度不不消消失失或或不不爆爆炸炸的的参参数数
45、空空间间来来避避免免这这个个问问题题。不不幸幸的的是是,为为了了储储存存记记忆忆并并对对小小扰扰动动具具有有鲁鲁棒棒性性,RNNRNN必必须须进进入入参参数数空空间间中中的的梯度消失区域。梯度消失区域。循环神经网络学习的就是循环神经网络学习的就是h h(t-1)(t-1)到到h h(t)(t)的循环权重映射参数以及从的循环权重映射参数以及从x x(t)(t)到到h h(t)(t)的输入权重映射参数。研究者提出避免上述问题的方法是设定的输入权重映射参数。研究者提出避免上述问题的方法是设定循环隐藏单元,使其能很好地捕捉过去的输入历史,并且只学循环隐藏单元,使其能很好地捕捉过去的输入历史,并且只学习
46、输出权重。如图习输出权重。如图5 5-11-11所示的回声状态网络(所示的回声状态网络(Echo State Echo State Network,ESNNetwork,ESN)就是一个很好的示例。)就是一个很好的示例。该网络将任意长度的序列映射为一个长度固定的向量,把循环网该网络将任意长度的序列映射为一个长度固定的向量,把循环网络视为动态系统,并设定让动态系统接近稳定边缘的输入和循环络视为动态系统,并设定让动态系统接近稳定边缘的输入和循环权重,之后施加一个预测算法以解决实际工程问题。权重,之后施加一个预测算法以解决实际工程问题。图图5-11 5-11 回声状态网络原理图回声状态网络原理图5-
47、4 5-4 长短期记忆长短期记忆LSTM网络网络5.4.1 5.4.1 长短期记忆网络基本原理长短期记忆网络基本原理实实际际应应用用中中最最有有效效的的序序列列模模型型称称为为门门控控RNNRNN,包包括括基基于于长长短短期期记记忆忆(LSTMLSTM)和基于门控循环单元(和基于门控循环单元(GRUGRU)的网络。)的网络。门门控控RNNRNN在在每每个个时时间间步步都都可可能能改改变变连连接接权权重重。我我们们希希望望神神经经网网络络学学会会自自行行决决定定何何时时清清除除旧旧的的状状态态,也也就就是是希希望望门门控控RNNRNN能能够够清清除除不不太太重重要要的的历历史信息,以解决长期依赖
48、的问题和减少不必要的计算存储资源的浪费。史信息,以解决长期依赖的问题和减少不必要的计算存储资源的浪费。引引入入自自循循环环结结构构以以产产生生梯梯度度长长时时间间持持续续流流动动的的路路径径是是长长短短期期记记忆忆LSTMLSTM模模型型的的核核心心机机制制。其其中中一一个个关关键键就就是是使使自自循循环环的的权权要要依依照照上上下下文文而而定定,而而不不是是固固定定的的。另另一一个个关关键键就就是是隐隐藏藏单单元元可可以以控控制制这这个个自自循循环环的的权权重重,累累积的时间尺度可以动态地改变。积的时间尺度可以动态地改变。在在这这种种情情况况下下,因因为为时时间间常常数数是是模模型型本本身身
49、的的输输出出,所所以以即即使使是是具具有有固固定定参数的参数的LSTMLSTM,累积的时间尺度也可以因输入序列而改变。,累积的时间尺度也可以因输入序列而改变。传传统统的的循循环环神神经经网网络络难难以以学学习习相相隔隔较较远远的的历历史史数数据据,这这也也是是推推动动LSTM的的主主要要原原因因之之一一。原原始始RNN的的隐隐藏藏层层只只有有一一个个状状态态,即即h,它它只只对对短短期期的的输输入入非非常常敏敏感感。那那么么假假如如我我们们再再增增加加一一个个状状态态,即即s,让让它它来来保保存存长长期期的的状状态,就能解决模型长期依赖的问题了。如图态,就能解决模型长期依赖的问题了。如图5-1
50、2所示。所示。图图5-12 5-12 LSTMLSTM在每一个时间步增加保存长期状态的参数在每一个时间步增加保存长期状态的参数我我们们把把图图5 5-12-12的的单单个个时时间间步步的的LSTMLSTM按按时时间间展展开开,可可以以得得到到如如图图5 5-13-13所所示示的原理图。的原理图。通通过过原原理理图图不不难难看看出出,LSTM在在每每个个时时间间步步上上有有3个个输输入入:当当前前时时刻刻网网络络的的输输入入值值、上上一一时时刻刻LSTM的的输输出出值值、以以及及上上一一时时刻刻的的单单元元状状态态。而而LSTM的输出有两个:当前时刻的输出有两个:当前时刻LSTM输出值和当前时刻