1、本章简介本章简介第第4 4章介绍了识别图像类数据的深度学习技术。但是在我们的生章介绍了识别图像类数据的深度学习技术。但是在我们的生活以及工程应用中,数据的表现形式不一定只有图像,还存在活以及工程应用中,数据的表现形式不一定只有图像,还存在着诸如特征序列,语音信号,文本等序列类数据,这些数据同着诸如特征序列,语音信号,文本等序列类数据,这些数据同样记录着十分重要的信息,我们也希望计算机能够准确地识别样记录着十分重要的信息,我们也希望计算机能够准确地识别它们。它们。本章将介绍一系列序列类数据处理的方法并利用本章将介绍一系列序列类数据处理的方法并利用KerasKeras实现它们。实现它们。同时,也会
2、介绍一些适用于处理序列类数据深度学习模型的优同时,也会介绍一些适用于处理序列类数据深度学习模型的优化方法。化方法。5-1 5-1 一维卷积神经网络一维卷积神经网络5.1.1 5.1.1 一维卷积神经网络原理一维卷积神经网络原理与二维卷积神经网络相似,一维卷积神经网络也是利用滤波器来识别与二维卷积神经网络相似,一维卷积神经网络也是利用滤波器来识别特征。为了减少计算的复杂程度,在识别一种特征的时候依旧使用权特征。为了减少计算的复杂程度,在识别一种特征的时候依旧使用权重共享技术。一维卷积的基本原理如图重共享技术。一维卷积的基本原理如图5 5-1 1所示。所示。图图5 5-1 1 一维卷积原理图一维卷
3、积原理图不难发现,图不难发现,图5-1中的输入序列数据维度为中的输入序列数据维度为8,滤波器,滤波器的维度为的维度为2。与二维卷积类似,卷积后输出的数据维。与二维卷积类似,卷积后输出的数据维度特征图个数为度特征图个数为82+1=7。由此可以得到一位卷积的。由此可以得到一位卷积的输出维度公式。输出维度公式。图图5-2 5-2 一维卷积补零策略一维卷积补零策略其中,为输出维度,为输入维度,为滤波器维度。其中,为输出维度,为输入维度,为滤波器维度。这样看来,一维卷积与二维卷积一样,同样存在这样看来,一维卷积与二维卷积一样,同样存在着维度减少的问题。为了保持信号的维度不发生着维度减少的问题。为了保持信
4、号的维度不发生变化,一维卷积也可以采用补零策略,如图变化,一维卷积也可以采用补零策略,如图5 5-2 2所所示。示。(5-15-1)1NIF 在得到特征图之后,为了进一步凝炼特征还要使用池化技术。和二在得到特征图之后,为了进一步凝炼特征还要使用池化技术。和二维卷积技术相同,在一维卷积中我们依旧可以使用最大池化、平均维卷积技术相同,在一维卷积中我们依旧可以使用最大池化、平均池化以及池化以及L2L2池化等。但是,在使用池化技术之前还需要利用激活函池化等。但是,在使用池化技术之前还需要利用激活函数来增加非线性因素。数来增加非线性因素。在获得凝炼的特征之后还可以利用压平(在获得凝炼的特征之后还可以利用
5、压平(FlattenFlatten)方法或者是全)方法或者是全局平均池化(局平均池化(Global Average PoolingGlobal Average Pooling)使众多特征图变成一个)使众多特征图变成一个特征向量以便使用分类函数对样本进行分类。特征向量以便使用分类函数对样本进行分类。压平方法就是将所有特征图的每一个元素各自连接到一个单独的神经压平方法就是将所有特征图的每一个元素各自连接到一个单独的神经元,原理如图元,原理如图5 5-3 3所示。所示。如图如图5-3所示,假如我们拥有所示,假如我们拥有4个特征图,每一个特征图的大小为个特征图,每一个特征图的大小为18,那么,那么全连
6、接层的神经元个数为全连接层的神经元个数为48=32个,这是一个个,这是一个“被压平被压平”的的32维特征向量。维特征向量。因此,压平方法就是将特征图中的所有元素进行全连接,使众多特征值变为因此,压平方法就是将特征图中的所有元素进行全连接,使众多特征值变为一个一维向量。最后将这个特征向量送入分类函数,最终可以获得分类结果。一个一维向量。最后将这个特征向量送入分类函数,最终可以获得分类结果。图图5 5-3-3 压平方法原理压平方法原理虽然压平方法看起来十分简单,但是它存在着很大的问题,即特征虽然压平方法看起来十分简单,但是它存在着很大的问题,即特征图的数量以及规模十分庞大时,加入全连接层会使模型的
7、参数数量图的数量以及规模十分庞大时,加入全连接层会使模型的参数数量剧增。为了解决这一问题,可以使用全局平均池化方法。剧增。为了解决这一问题,可以使用全局平均池化方法。全局平均池化方法就是计算每一个特征图中元素的平均值,然后将全局平均池化方法就是计算每一个特征图中元素的平均值,然后将每一个特征图的平均值构成特征向量,得到的特征向量再被送入分每一个特征图的平均值构成特征向量,得到的特征向量再被送入分类函数,最终得到样本的分类结果。由于全局平均池化只是求取了类函数,最终得到样本的分类结果。由于全局平均池化只是求取了每一个特征图的平均值而非使用全连接层,这样就节省了大量的计每一个特征图的平均值而非使用
8、全连接层,这样就节省了大量的计算资源。算资源。结合在第结合在第4 4章中所讲到的二维卷积神经网络,我们就得到了一章中所讲到的二维卷积神经网络,我们就得到了一维卷积神经网络的原理图,如图维卷积神经网络的原理图,如图5 5-4-4所示。所示。图图5 5-4 4 一维卷积神经网络原理一维卷积神经网络原理5.1.2 5.1.2 一维卷积神经网络实例一维卷积神经网络实例现在利用现在利用Keras来实现一个实际的工程问题,就是在第来实现一个实际的工程问题,就是在第3章讲述章讲述“实现简单实现简单神经网络神经网络”时所提到的对不同种类鸢尾花的识别,数据集如图时所提到的对不同种类鸢尾花的识别,数据集如图5-5
9、所示。所示。图图5 5-5-5 鸢尾花数据集鸢尾花数据集不难理解,鸢尾花数据集就是序列数据,每一条数据由鸢尾花的特不难理解,鸢尾花数据集就是序列数据,每一条数据由鸢尾花的特征值构成。因此,我们可以使用一维卷积神经网络对鸢尾花数据进征值构成。因此,我们可以使用一维卷积神经网络对鸢尾花数据进行识别。现在初步构造一个一维卷积神经网络来进行实验,看看它行识别。现在初步构造一个一维卷积神经网络来进行实验,看看它的效果如何。的效果如何。#导入所需要的包导入所需要的包import numpy as npimport numpy as npimport pandas as pdimport pandas as
10、 pdfrom keras import optimizersfrom keras import optimizersfrom keras import regularizersfrom keras import regularizersfrom keras.models import Sequentialfrom keras.models import Sequentialfrom keras.layers import Dense,Dropoutfrom keras.layers import Dense,Dropoutfrom keras.wrappers.scikit_learn im
11、port KerasClassifierfrom keras.wrappers.scikit_learn import KerasClassifierfrom keras.utils import np_utilsfrom keras.utils import np_utilsfrom sklearn.model_selection import train_test_split,from sklearn.model_selection import train_test_split,KFold,cross_val_scoreKFold,cross_val_scorefrom sklearn.
12、preprocessing import LabelEncoderfrom sklearn.preprocessing import LabelEncoderfrom keras.layers.core import Dense,Dropout,Activationfrom keras.layers.core import Dense,Dropout,Activationfrom keras.layers import Conv1D,from keras.layers import Conv1D,MaxPooling1D,GlobalAveragePooling1D,FlattenMaxPoo
13、ling1D,GlobalAveragePooling1D,Flattenfrom keras.callbacks import TensorBoardfrom keras.callbacks import TensorBoardfrom keras.callbacks import EarlyStoppingfrom keras.callbacks import EarlyStopping%matplotlib inline%matplotlib inline import matplotlibimport matplotlibimport matplotlib.pyplot as plti
14、mport 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=dataframe.values#读取范围的设定,共读取第读取范围的设定,共读取第0 0至第至第4 4列并转为列并转为floatfloat形式形式X=dataset:,0:4.astype(float)X=dataset:,0:4
15、.astype(float)#标签的设定,第标签的设定,第4 4列为标签列列为标签列Y=dataset:,4Y=dataset:,4#由于由于Conv1Conv1官方要求输入为一个官方要求输入为一个3D3D张量,形如(张量,形如(samplessamples,stepssteps,input_diminput_dim)的)的3D3D张量,因此要对输入的数据增扩张量,因此要对输入的数据增扩X=np.expand_dims(X,3)X=np.expand_dims(X,3)#将每一类值对应为一个整数将每一类值对应为一个整数encoder=LabelEncoder()encoder=LabelEnc
16、oder()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)#显示输入数据以及编码后的标签显示输入数据以及编码后的标签print(X)print(X)print(dummy_y)print(dummy_y)#搭建模型搭建模型model=Sequential()model=Sequenti
17、al()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)#使用最大池化使用最大池化model.add(Conv1D(128,3,activation=relu,input_shape=(4,model.add(Conv1D(128,3,activation=relu,i
18、nput_shape=(4,1),padding=same)1),padding=same)model.add(MaxPooling1D(2)model.add(MaxPooling1D(2)model.add(GlobalAveragePooling1D()#model.add(GlobalAveragePooling1D()#使用全局平均池化使用全局平均池化model.add(Dense(10,activation=relu)model.add(Dense(10,activation=relu)model.add(Dense(5,activation=relu)model.add(Dens
19、e(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=500,batch_size=20,valiHistory=model.fit(X,dummy_y,epochs=500,batch_size=20,validation_split=0.2)#dation_split
20、=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 accuracy)plt.ylabel(accuracy)plt.ylabel(accuracy)plt.xlabel(epoch)plt.xlabel(epoch)plt.legend(train,test,lo
21、c=upper left)plt.legend(train,test,loc=upper left)plt.show()plt.show()最后,我们可以观察到内嵌的训练最后,我们可以观察到内嵌的训练情况情况。图图5 5-6-6 一维卷积神经网络一维卷积神经网络训练情况训练情况5-2 5-2 循环神经网络循环神经网络RNN循环神经网络(循环神经网络(Recurrent Neural Network,RNNRecurrent Neural Network,RNN)具有固定的权值具有固定的权值和内部的状态,和内部的状态,是一类专门用于处理是一类专门用于处理任意长度序列信息的神经网络任意长度序列信息
22、的神经网络。通常用来描述动态时间行为序列,通常用来描述动态时间行为序列,循环网络通常是在序列的小批量元素上进行操作的,并且不同的小循环网络通常是在序列的小批量元素上进行操作的,并且不同的小批量数据可以具有不同的序列长度。此外,批量数据可以具有不同的序列长度。此外,循环神经网络在几个时循环神经网络在几个时间步内共享相同的权重,不需要分别学习句子每个位置的所有语言间步内共享相同的权重,不需要分别学习句子每个位置的所有语言规则。规则。同样可以应用于两个维度的空间数据(如图像和视频信号)。同样可以应用于两个维度的空间数据(如图像和视频信号)。5.2.1 5.2.1 循环神经网络基本原理循环神经网络基本
23、原理信号流图可以很好地显示深度学习模型的信号流向以及具体构造。信号流图可以很好地显示深度学习模型的信号流向以及具体构造。为了让循环神经网络变得更易被理解,我们结合信号流图来解释为了让循环神经网络变得更易被理解,我们结合信号流图来解释循环神经网络的原理。循环神经网络的原理。(5-25-2)首先考虑动态系统的基本形式首先考虑动态系统的基本形式:()(1)(;)ttsf s其中,是系统在时刻的状态,为系统参数。通过表达式不难看出其中,是系统在时刻的状态,为系统参数。通过表达式不难看出每一时刻的系统状态不仅仅由系统参数决定,还由系统上一时刻每一时刻的系统状态不仅仅由系统参数决定,还由系统上一时刻的状态
24、决定。由于系统在时刻还需要考虑时刻的状态,因此这样的状态决定。由于系统在时刻还需要考虑时刻的状态,因此这样的系统是循环的。的系统是循环的。图图5 5-7-7 迭代式的信号流图迭代式的信号流图对于有限时间步对于有限时间步t,例如,例如t=3,展开式(,展开式(5.2)得到:)得到:(5.35.3)不停地迭代下去就能得到最终的表达。图不停地迭代下去就能得到最终的表达。图5 5-7-7是利用传统的数据流图是利用传统的数据流图来表达这一过程。来表达这一过程。(3)(2)(;)sf s在自然语言建模的过程中使用在自然语言建模的过程中使用RNN,通常给定前一个词去预测下,通常给定前一个词去预测下一个词或者
25、一系列词来预测样本类别,此时没有必要存储时刻之一个词或者一系列词来预测样本类别,此时没有必要存储时刻之前输入序列中的所有信息,而仅仅存储足够的信息就可以了。当前输入序列中的所有信息,而仅仅存储足够的信息就可以了。当然,我们要求在稀疏的同时又足够丰富,尽可能无差别地恢复输然,我们要求在稀疏的同时又足够丰富,尽可能无差别地恢复输入序列。入序列。设一个函数设一个函数g g(t t)经)经t t步展开后的循环为步展开后的循环为()()()(1)(2)(1)(,.,)tttthgxxxx(5.45.4)(1)()(,;)ttf hx(5.55.5)函数函数g(t)将全部的过去序列作为输入来更新系统当前的
26、状态,通过将全部的过去序列作为输入来更新系统当前的状态,通过前面的分析允许将分解前面的分析允许将分解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-65-6)当我们使用一个预测性对数似然的训练目标,我们将当我们使用一个预测性对数似然的训练目标,我们将RNNRNN训练为能训练为能够根据之前的输入估计下一个序列元素的条件分布。这意味着最够根据之前的输入估计下一个序列元素的条件分布。这意味着最大化对数似然为:大化对数似然为:()(1)()log(|,.,)ttp yxx在在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的最终隐藏状态用于计算一般为固定大的最终隐藏状态用于计算一般为固定大小的上下文抽象表示,而表示输入序列的语义概要并且作为解码小的上下文抽象表示,而表示输入序列的语义概要并且作为解码器器R
37、NNRNN的输入。的输入。这个结构的实现过程十分简单:这个结构的实现过程十分简单:1.1.编码器(编码器(encoderencoder)处理输入)处理输入RNNRNN的序列。编码器最终输出上的序列。编码器最终输出上下文下文C C,即对输入序列的抽象表示。,即对输入序列的抽象表示。2.2.解码器(解码器(decoderdecoder)以固定长度的向量为条件产生输出序列)以固定长度的向量为条件产生输出序列()(1),.,ynYyy我们观察之前讲述的所有我们观察之前讲述的所有RNNRNN架构,不难发现大多数架构,不难发现大多数RNNRNN的计算可的计算可以分解成以分解成3 3个不同阶段的参数及其相关
38、变换:个不同阶段的参数及其相关变换:1.1.从输入从输入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 neural networkrecursive neural network)是循环网络的另一种类)是循环网络的另一种类型,是树状结构而不是循环神经网络的链状结构,适用于输入是数据型,是树状结构而不是循环神经网络的链状结构,适用
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、 长期依赖性长期依赖性当网络的深度增加以后,模型可能会出现梯度消失或是梯度爆炸当网络的深度增加以后,模型可能会出现梯度消失或是梯度爆炸的情况,这种情况我们称之为长期依赖。由于循环神经网络中存的情况,这种情况我们称之为长期依赖。由于循环神经网络中存在比相邻的时间步之间相互作用的参数更小的权重,所以即使我在比相邻的时间步之间相互作用的参数更小的权重,所以即使我们假设循环网络的参数是稳定的,但还是存在长期依赖的现象。们假设循环网络的参数是稳定的,但还是存在长期依赖的现象。循环神经网络所使用的函数组合与矩阵乘法相似。将不同时间步循环神经网络所使用的函数组合与矩阵乘法相似。将不同时间步之间的隐藏层状态联
43、系写为:之间的隐藏层状态联系写为:(1)()tTthW h(5-75-7)这是一个非常简单的、缺少非线性激活函数和输入的循环神经网这是一个非常简单的、缺少非线性激活函数和输入的循环神经网络。它的迭代式为:络。它的迭代式为:()(0)()ttThWh(5-85-8)假设假设W W存在特征值分解,即:存在特征值分解,即:其中若其中若Q Q为正交的,那么带入式(为正交的,那么带入式(5 5-8-8)后得到:)后得到:(5-95-9)当特征值经过高次幂的运算后,幅值小于当特征值经过高次幂的运算后,幅值小于1 1的特征值将会衰减到的特征值将会衰减到零,而幅值大于零,而幅值大于1 1的就会激增。任何不与最
44、大特征向量对齐的的就会激增。任何不与最大特征向量对齐的h h(0)(0)的部分将最终被丢弃。的部分将最终被丢弃。(5-105-10)TWQ Q()(0)tTthQQh该乘积消失还是爆炸取决于该乘积消失还是爆炸取决于w w的幅值,当的幅值,当w1w1时高次幂的运算会导时高次幂的运算会导致爆炸,而当致爆炸,而当w1w1时高次幂的值最终会消失。但是如果能够在每时高次幂的值最终会消失。但是如果能够在每个时间步使用不同权重个时间步使用不同权重w w(t)(t)的非循环网络,就可以避免高次幂运的非循环网络,就可以避免高次幂运算可能带来的梯度消失或爆炸的问题。算可能带来的梯度消失或爆炸的问题。关于关于RNN
45、RNN梯度消失和爆炸问题,有些学者希望通过简单地停留在梯度消失和爆炸问题,有些学者希望通过简单地停留在梯度不消失或不爆炸的参数空间来避免这个问题。不幸的是,为梯度不消失或不爆炸的参数空间来避免这个问题。不幸的是,为了储存记忆并对小扰动具有鲁棒性,了储存记忆并对小扰动具有鲁棒性,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 StEcho State Network,ESNate Network,ESN)就是一个很好的示例。)就是一个很好的示例。该网络将任意长度的序列映射为一个长度固定的向量,把循环网该网络将任意长度的序列映射为一个长度固定的向量,把循环网络视为动态系统,并设定让动态系统接近稳定边缘的输入和循环络视为动态系统,并设定让动态系统接近稳定边缘的输入和循环
47、权重,之后施加一个预测算法以解决实际工程问题。权重,之后施加一个预测算法以解决实际工程问题。图图5-11 5-11 回声状态网络原理图回声状态网络原理图5-4 5-4 长短期记忆长短期记忆LSTM网络网络5.4.1 5.4.1 长短期记忆网络基本原理长短期记忆网络基本原理实际应用中最有效的序列模型称为门控实际应用中最有效的序列模型称为门控RNNRNN,包括基于长短期记忆,包括基于长短期记忆(LSTMLSTM)和基于门控循环单元(和基于门控循环单元(GRUGRU)的网络。)的网络。门控门控RNNRNN在每个时间步都可能改变连接权重。我们希望神经网络学会自在每个时间步都可能改变连接权重。我们希望神
48、经网络学会自行决定何时清除旧的状态,行决定何时清除旧的状态,也就是也就是希望门控希望门控RNNRNN能够清除不太重要的历能够清除不太重要的历史信息,以解决长期依赖的问题和减少不必要的计算存储资源的浪费。史信息,以解决长期依赖的问题和减少不必要的计算存储资源的浪费。引入自循环结构以产生梯度长时间持续流动的路径是长短期记忆引入自循环结构以产生梯度长时间持续流动的路径是长短期记忆LSTMLSTM模型的核心机制。其中一个关键就是使自循环的权要依照上下文而定,模型的核心机制。其中一个关键就是使自循环的权要依照上下文而定,而不是固定的。另一个关键就是隐藏单元可以控制这个自循环的权重,而不是固定的。另一个关
49、键就是隐藏单元可以控制这个自循环的权重,累积的时间尺度可以动态地改变。累积的时间尺度可以动态地改变。在这种情况下,因为时间常数是模型本身的输出,所以即使是具有固定在这种情况下,因为时间常数是模型本身的输出,所以即使是具有固定参数的参数的LSTMLSTM,累积的时间尺度也可以因输入序列而改变。,累积的时间尺度也可以因输入序列而改变。传统的循环神经网络难以学习相隔较远的历史数据,这也是推动传统的循环神经网络难以学习相隔较远的历史数据,这也是推动LSTM的的主要原因之一。原始主要原因之一。原始RNN的隐藏层只有一个状态,即的隐藏层只有一个状态,即h,它只对短期的输,它只对短期的输入非常敏感。那么假如
50、我们再增加一个状态,即入非常敏感。那么假如我们再增加一个状态,即s,让它来保存长期的状,让它来保存长期的状态,就能解决模型长期依赖的问题了。如图态,就能解决模型长期依赖的问题了。如图5-12所示。所示。图图5-12 5-12 LSTMLSTM在每一个时间步增加保存长期状态的参数在每一个时间步增加保存长期状态的参数我们把图我们把图5 5-12-12的单个时间步的的单个时间步的LSTMLSTM按时间展开,可以得到如图按时间展开,可以得到如图5 5-13-13所示所示的原理图。的原理图。通过原理图不难看出,通过原理图不难看出,LSTM在每个时间步上有在每个时间步上有3个输入:当前时刻网络个输入:当前