第3章 3.2 循环神经网络_第1页
第3章 3.2 循环神经网络_第2页
第3章 3.2 循环神经网络_第3页
第3章 3.2 循环神经网络_第4页
第3章 3.2 循环神经网络_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

循环神经网络循环神经网络循环神经网络是一类以序列数据为输入,在序列的演进方向递归且所有节点(循环单元)按链式连接的递归神经网络(RecursiveNeuralNetwork)。对循环神经网络的研究始于20世纪80年代至90年代,并在21世纪初发展为深度学习算法之一,其中双向长短时记忆循环神经网络(Bi-directionalLSTMRNN)和长短时记忆(LongShort-TermMemory,LSTM)网络是常用的循环神经网络。循环神经网络具有记忆性,因此在对序列的非线性特征进行学习时具有一定优势。循环神经网络被用于自然语言处理领域,如语音识别、语言建模、机器翻译等,也被用于各类时间序列预报。引入卷积神经网络的循环神经网络可以处理包含序列输入的计算机视觉问题。循环神经网络

循环神经网络

1基于循环神经网络和SelfAttention网络的新闻摘要分类实例目录循环神经网络中的常用网络层2循环神经网络中的常用网络层1.Embedding层在自然语言处理中,需要对文本中的每个单词用一个向量进行编码,即单词向量化。一种常用的单词向量化方法叫独热编码,可以将单词编码成除了某个元素是1之外其他元素都是0的向量。例如,给定一个英文句子“Thecatjumpoverthedog”,该句子有5个不同的单词,则可以将“the”编码为[1,0,0,0,0]、将“cat”编码为[0,1,0,0,0]、将“jump”编码为[0,0,1,0,0]、将“over”编码为[0,0,0,1,0]、将“dog”编码为[0,0,0,0,1]。但是独热编码有很多缺点:一是向量过于“稀疏”,每个向量都包含很多个0且只有一个1,浪费存储空间;二是独热编码向量不能表达单词间的逻辑关系,不利于文本数据挖掘;三是当单词总量扩大时,每个单词向量都要重新修改。循环神经网络中的常用网络层Embedding层将正整数(索引)转换为固定大小的向量,该向量的每个元素是一个浮点数而不仅仅是0或1。一个独热编码可以用一个正整数代替,因此Embedding层可以改正独热编码的缺点。例如,将[[4],[20]]转换为[[0.25,0.1],[0.6,-0.2]]。Embedding层只能用作网络的第一层。输入的大小为(batch_size,input_length),输出的大小为(batch_size,input_length,output_dim)。Embedding类的语法格式如下。tf.keras.layers.Embedding(input_dim,output_dim,embeddings_initializer="uniform",embeddings_regularizer=None,activity_regularizer=None,embeddings_constraint=None,mask_zero=False,input_length=None,**kwargs)常用参数及其说明循环神经网络中的常用网络层参数名称说明input_dim接收整数,表示词汇量,即最大整数索引加1,无默认值output_dim接收整数,表示输出单词编码的维度,无默认值embeddings_initializer接收函数句柄,表示初始化函数,默认为"uniform"embeddings_regularizer接收函数句柄,表示正则化函数,默认为Noneactivity_regularizer接收函数句柄,表示正则化激活函数,默认为Noneembeddings_constraint接收函数句柄,表示约束函数,默认为Nonemask_zero接收布尔值,表示是否排除0,默认为Falseinput_length接收整数,表示输入序列的长度,默认为NoneEmbedding类的用法如代码所示fromkerasimportSequential,layersimportnumpyasnpmodel=Sequential()model.add(layers.Embedding(1000,64,input_length=10))input_array=np.random.randint(1000,size=(32,10))pile('rmsprop','mse')predict(input_array)在代码中,Embedding层包含一个可训练的矩阵,矩阵的行值为单词数量1000,矩阵的列值为每个单词的编码长度64,即矩阵的一行对应一个单词的编码向量。循环神经网络中的常用网络层如果把单词编号转换成独热编码向量(即构造一个包含1000个元素的全0向量,然后把对应编号处的元素设为1),则Embedding层的计算过程可表示如下。循环神经网络中的常用网络层也就是说,设一个句子有10个单词,每个单词用长度为1000的向量进行独热编码,形成一个10×1000的矩阵作为输入,乘Embedding层中的1000×64的权重矩阵,得到一个10×64的输出,即可把一个单词由原来的1000维的独热编码向量降维编码成一个64维的普通向量。实际上,为了有效地计算,这种稀疏状态下不会进行矩阵乘法计算。因为矩阵的计算结果实际上是矩阵对应的向量中值为1的索引,这样网络中的Embedding层的权重矩阵便成了一个“查找表”,进行矩阵计算时,可以直接去查输入向量中取值为1的维度下对应的权重值。Embedding层的输出就是每个输入单词的“嵌入词向量”。循环神经网络中的常用网络层循环神经网络中的常用网络层2.

循环层SimpleRNN类用SimpleRNN类可以实现一个如图3-18的循环层。SimpleRNN类的语法格式如下。keras.layers.SimpleRNN(units,activation='tanh',use_bias=True,kernel_initializer='glorot_unifom',recurrent_initializer='orthogonal',bias_initializer='zeros',kernel_regularizer=None,recurrent_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,recurrent_constraint=None,bias_constraint=None,dropout=0.0,recurrent_dropout=0.0,return_sequences=False,return_state=False,go_backwards=False,stateful=False,unroll=False)参数名称说明units接收正整数,表示输出空间的维度。无默认值activation接收要使用的激活函数(详见activations)。tanh表示双曲正切。如果传入None,则不使用激活函数。默认为'tanh'return_sequences接收布尔值。为False时返回输出序列中的最后一个输出,否则返回全部序列。默认为Falsereturn_state接收布尔值,表示除了输出之外是否返回最后一个状态。默认为False常用参数及其说明循环神经网络中的常用网络层参数名称说明go_backwards接收布尔值。如果为True,则向后处理输入序列并返回相反的序列。默认为Falsestateful接收布尔值。如果为True,则批中索引为i的样品的最后状态将用作下一批中索引为i的样品的初始状态。默认为Falseunroll接收布尔值。如果为True,则网络将展开,否则将使用符号循环。展开可以加快RNN的训练速度,但这往往会占用更多的内存。展开只适用于短序列。默认为False常用参数及其说明循环神经网络中的常用网络层SimpleRNN类的用法如代码所示fromkerasimportSequential,layersimportnumpyasnpmodel=Sequential()model.add(layers.Embedding(1000,64,input_length=10))model.add(layers.SimpleRNN(128))model.summary()input_array=np.random.randint(1000,size=(32,10))output_array=model.predict(input_array)print(output_array.shape)fromkerasimportModel,Input循环神经网络中的常用网络层xin=Input((10,))x=layers.Embedding(1000,64)(xin)y1,y2=layers.SimpleRNN(128,return_sequences=True,return_state=True)(x)model2=Model(xin,[y1,y2])model2.summary()whole_sequence_output,final_state=model2.predict(input_array)print(whole_sequence_output.shape)print(final_state.shape)其中,Embedding层的权重矩阵有1000×64=64000个可训练的参数。在SimpleRNN中,每个单词的输入维度为64,隐藏层有128个节点,然后直接经过传递函数得到128维的输出。因此,输入层到隐藏层的权重矩阵有128×64=8192个可训练的参数,上一个时刻的隐藏层的输出向量作为这一次的输入的权重矩阵有128×128=16384个可训练的参数,偏置向量有128个可训练的参数。所以SimpleRNN中一共有128×64+128×128+128=24704个可训练的参数。循环神经网络中的常用网络层循环神经网络中的常用网络层LSTM类LSTM的全称是LongShortTermMemory,顾名思义,它具有记忆长短期信息的能力的神经网络。LSTM类的语法格式如下,常用参数及其说明类似Embedding类。keras.layers.LSTM(units,activation='tanh',recurrent_activation='hard_sigmoid',use_bias=True,kernel_initializer='glorot_uniform',recurrent_initializer='orthogonal',bias_initializer='zeros',unit_forget_bias=True,kernel_regularizer=None,recurrent_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,recurrent_constraint=None,bias_constraint=None,dropout=0.0,recurrent_dropout=0.0,implementation=1,return_sequences=False,return_state=False,go_backwards=False,stateful=False,unroll=False)SimpleRNN的记忆功能不够强大,当输入的数据序列比较长时,它无法将序列中之前获取的信息有效地向下传递。LSTM网络则能够改正SimpleRNN的这个缺点。在Keras中,LSTM类和SimpleRNN类的用法完全一致,可以直接把tf.keras.layers.SimpleRNN替换为tf.keras.layers.LSTM。循环神经网络中的常用网络层

循环神经网络中的常用网络层LSTM网络内部主要分为3个阶段,首先是忘记阶段,然后是选择记忆阶段,最后是输出阶段。①忘记阶段。这个阶段主要对上一个节点传进来的输入进行选择性忘记,即将计算得到的(表示forget)作为忘记门控,以控制上一个状态的有哪些数据需要留下来,哪些数据需要忘记。②选择记忆阶段。这个阶段的输入会被有选择地进行“记忆”,主要是会对输入进行选择记忆。当前的输入内容由前面计算得到的表示,而选择的门控信号则由(代表information)控制。将上面两步得到的结果相加,即可得到传输给下一个状态的。③输出阶段。这个阶段将决定当前状态的输出值,主要是通过来进行控制的,并且还对上一阶段得到的(0时刻的两个输出)进行了放缩操作。放缩操作通过tanh激活函数进行变化。与经典RNN类似,输出往往也是通过变化得到的。LSTM网络通过门控状态来控制传输状态,记住需要长时间记忆的信息,忘记不重要的信息;而不像普通的RNN那样,只能够“呆萌”地具有一种记忆叠加方式。但也因为LSTM网络引入了很多内容,导致参数变多,使得训练难度加大了很多。因此很多时候会使用效果和LSTM网络相当,但参数更少的门控循环单元(GatedRecurrentUnit,GRU)来构建大训练量的网络。循环神经网络中的常用网络层3.

注意力模型注意力模型(AttentionModel)被广泛使用在自然语言处理、图像识别及语音识别等各种类型的深度学习任务中,是深度学习技术中值得关注与深入了解的核心技术之一。无论是在图像处理、语音识别还是自然语言处理等各种类型的任务中,都很容易遇到注意力模型。了解注意力模型的工作原理对于关注深度学习技术发展的技术人员来说有很大的必要。循环神经网络中的常用网络层(1)人类的视觉注意力机制从注意力模型的命名来看,其借鉴了人类的注意力机制。这里先简单介绍人类的视觉注意力机制。视觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,找到需要重点关注的目标区域,也就是一般所说的注意力机制焦点,而后对这一区域投入更多注意力机制资源,以获取更多需要关注的目标的细节信息,而忽略其他无用信息。这是人类利用有限的注意力机制资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制。人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。循环神经网络中的常用网络层(2)Encoder-Decoder框架要了解深度学习中的注意力模型,就要先了解Encoder-Decoder框架。目前大多数注意力模型都附着在Encoder-Decoder框架下。当然,其实注意力模型可以看作一种通用的思想,本身并不依赖于特定框架,这点需要注意。Encoder-Decoder框架可以看作深度学习领域的一种研究模式,其应用场景异常广泛。循环神经网络中的常用网络层抽象的文本处理领域的Encoder-Decoder框架如下图所示。

循环神经网络中的常用网络层

循环神经网络中的常用网络层抽象的文本处理领域的Encoder-Decoder框架不仅在文本领域广泛使用,而且在语音识别、图像处理等领域也经常使用。对于语音识别来说,Encoder的输入是语音流,Decoder的输出是对应的文本信息;对于图像描述任务而言,Encoder的输入是一张图片,Decoder的输出则是能够描述图片语义内容的一句描述;如果Encoder的输入是一句话,Decoder的输出是一张图片,则可以构造智能绘图的应用;如果Encoder的输入是一张有噪声的图片,Decoder的输出是一张无噪声的图片,则可以用于图像去噪;如果Encoder输入的是一张黑白图片,Decoder输出的是一张彩色图片,则可以用于黑白图像上色。一般而言,文本处理和语音识别的Encoder通常采用RNN,图像处理的Encoder一般采用CNN。循环神经网络中的常用网络层

循环神经网络中的常用网络层

循环神经网络中的常用网络层(4)SelfAttention网络SelfAttention(自注意力)网络经常被称为IntraAttention(内部注意力)网络,最近获得了比较广泛的使用。在一般任务的Encoder-Decoder框架中,输入Source和输出Target的内容是不一样的,如对于英-中机器翻译而言,Source是英文句子,Target是翻译出的中文句子,注意力机制出现在Target的元素和Source中的所有元素之间。而SelfAttention指的不是Target和Source之间的注意力机制,而是Source内部元素之间或者Target内部元素之间发生的注意力机制,也可以理解为在Target和Source相等这种特殊情况下的注意力计算机制。如果是常规的、Target不等于Source情况下的注意力计算,其数学意义正如上文Encoder-Decoder框架部分所讲。循环神经网络中的常用网络层可视化地表示SelfAttention在同一个英语句子内的单词间产生的联系,如右图所示。从图中可以看出,翻译“making”的时候会注意到“more”“difficult”,因为这两者组成了一个常用的短语关系。采用SelfAttention不仅可以捕获同一个句子中单词之间的一些句法特征或者语义特征,在计算过程中还可以直接将句子中任意两个单词通过一个计算步骤直接联系起来,所以远距离的相互依赖的特征之间的距离被极大缩短,有利于有效地利用这些特征。RNN和LSTM网络均需要按序列顺序依次计算,对于远距离的相互依赖的特征,要经过若干时间序列的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。而引入SelfAttention后,捕获句子中远距离的相互依赖的特征就相对容易了。除此之外,SelfAttention对于增加计算的并行度也有直接帮助。循环神经网络中的常用网络层

循环神经网络中的常用网络层

循环神经网络中的常用网络层(5)注意力模型的使用实例随机构造了n个句子,每个句子含有time_steps个单词,每个单词有input_dim维。第attention_column个单词的编码是全0或全1的向量,并和句子的类别(0或1)相同。对于所有的句子,大部分的注意力应该集中在第attention_column个单词,准确地预测出句子的类别。也就是说,注意力模型的权重在第attention_column个分量处应该是显著增大的。循环神经网络中的常用网络层注意力模型的使用实例代码如下所示。#注意力模型开始#(batch_size,time_steps,lstm_units)→(batch_size,lstm_units,time_steps)a=Permute((2,1))(lstm_out)#对最后一维进行全连接,参数数量:time_steps*time_steps+time_steps#相当于获得每一个step中,每个lstm维度在所有step中的权重#(batch_size,lstm_units,time_steps)→(batch_size,lstm_units,time_steps)a=Dense(TIME_STEPS,activation='softmax')(a)#(batch_size,lstm_units,time_steps)→(batch_size,time_steps,lstm_units)a_probs=Permute((2,1),name='attention_vec')(a)#权重和输入的对应元素相乘,注意力模型加权,lstm_out=lstm_out*a_probslstm_out=multiply([lstm_out,a_probs],name='attention_mul')#ATTENTIONPARTFINISHES--------------#(batch_size,time_steps,lstm_units)→(batch_size,time_steps*lstm_units)lstm_out_fla=Flatten()(lstm_out)output=Dense(1,activation='sigmoid')(lstm_out_fla)model=Model([inputs],output)pile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])model.summary()循环神经网络中的常用网络层在代码中,注意力模型权重矩阵a_probs通过全连接层得到(全连接层中可训练的权重数量为10×10+10=110个),即不同的句子、不同的单词具有不同的注意力模型权重a_probs。对某一个句子,对应有大小为time_steps×lstm_units的权重矩阵,该矩阵的每一列的和为1,即按lstm_units特征对所有的time_steps单词进行加权。理想情况下,该矩阵编号为attention_column的列的值显著地比其他列大。运行代码可以得到的输出如右图所示,即加权系数a_probs在所有测试样本和所有lstm_units维数上的平均值。可以看到,attention_column=2的列的值显著地比其他列的值大。也就是说,网络成功注意到编号为2的单词编码是对分类有显著影响的。循环神经网络中的常用网络层在MNIST手写数字识别中使用注意力模型:将一个图像样本看成一个句子,图像的每一行看成一个单词,图像的列数看成一个单词的编码维数。使用和代码3-14相同的注意力模型,可以得到比单纯使用全连接网络更高的分类精度。由于图像的行之间并没有顺序,可以使用双向LSTM网络,将得到2倍的lstm_units维数的输出。1基于循环神经网络和SelfAttention网络的新闻摘要分类实例目录循环神经网络中的常用网络层2基于循环神经网络和SelfAttention网络的新闻摘要分类实例在3.2.1小节的Embedding层中,讨论了单词向量化的算法原理。要得到比较好的单词向量,大约需要40亿个文本数据的训练数据,然而通常很难获得如此巨量的数据以及相应的算力。斯坦福大学基于GloVe的向量化算法(Skip-Gram算法的变种),用维基百科中的所有文本数据训练后得到了比较精准的单词向量。在这个预先训练好的GloVe单词向量空间上,本小节使用循环神经网络来实现对新闻摘要的分类,并对比加上SelfAttention网络的结果。基于循环神经网络和SelfAt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论