TensorFlow系列专题(九):常用RNN网络结构及依赖优化问题

简介:

一、 常用的循环神经网络结构

前面的内容里我们介绍了循环神经网络的基本结构,这一小节里我们介绍几种更常用的循环神经网络的结构。

1. 多层循环神经网络

多层循环神经网络是最容易想到的一种变种结构,它的结构也很简单,就是在基本的循环神经网络的基础上增加了隐藏层的数量。

416e0ed007107c3fd589ab4bc18c2cafcbb38720

图1 多层循环神经网络结构

多层循环神经网络按时间展开后,每一层的参数和基本的循环神经网络结构一样,参数共享,而不同层的参数则一般不会共享(可以类比CNN的网络结构)。和基本结构的循环神经网络相比,多层循环神经网络的泛化能力更强,不过训练的时间复杂度和空间复杂度也更高。在TensorFlow里,我们可以借助MultiRNNCell这个类来实现深度循环神经网络,下面我们用一个具体的例子来演示TensorFlow中多层循环神经网络的实现。

示例:航班乘客人数预测

本示例所使用的数据来自DataMarket:https://datamarket.com/data/set/22u3/international-airline-passengers-monthly-totals-in-thousands-jan-49-dec-60#!ds=22u3&display=line。该数据集包含了从1949年到1960年共144个月的乘客总人数的数据,每个月的乘客人数是一条记录,共144条记录。其中部分数据显示如下:

c9b82e073a28e24d2e5cc683542394dcc3f5e2ef

我们将所有数据可视化显示:

54c39033f072cacecb2978a168267be46c86b1e2

图2 数据可视化效果图

从可视化的效果可以看到数据的变化呈现周期性,对于RNN来说,学习这种很明显的序列关系并非难事。我们定义一个多层循环神经网络(完整项目代码可以在本书配套的GitHub项目中找到):

fc7abf3ab7234b7b7b40c73e2c04aaa7771cabce

在第1行代码中定义了一个方法用来返回单层的cell,在第6行代码中,我们使用MultiRNNCell类生成了一个3层的循环神经网络。最终的预测结果如下图左侧所示:

66cf50c12890a179fbb377edda6258000a614a5e

图3 多层循环神经网络的预测结果

上图中,蓝色线条是原始数据,绿色线条是从原始数据中划分出来的测试数据,红色线条是在测试数据上的预测效果,左侧是多层循环神经网络的预测结果,右侧是单层循环神经网络的预测结果(除网络层数不同外,其它参数均相同)。可以看到两个预测结果都几乎和真实数据重合,仔细比较会发现,多层循环神经网络的拟合效果更好一些。

2. 双向循环神经网络

无论是简单循环神经网络还是深度循环神经网络[1],网络中的状态都是随着时间向后传播的,然而现实中的许多问题,并不都是这种单向的时序关系。例如在做词性标注的时候,我们需要结合这个词前后相邻的几个词才能对该词的词性做出判断,这种情况就需要双向循环神经网络来解决问题。

0fd66099deb14f35f0c3eec8a6416827c2850268

图4 双向循环神经网络结构

图片来源于http://www.wildml.com

双向循环神经网络可以简单的看成是两个单向循环神经网络的叠加,按时间展开后,一个是从左到右,一个是从右到左。双向循环神经网络的计算与单向的循环神经网络类似,只是每个时刻的输出由上下两个循环神经网络的输出共同决定。双向循环神经网络也可以在深度上进行叠加:

0f3c745f43bf72f7d1d721057a69e29ad72a0ae2

图5 深度双向循环神经网络结构

图片来源于http://www.wildml.com

在下一章的项目实战部分,我们会使用TensorFlow来实现深度双向循环神经网络解决文本多分类问题,会结合代码来介绍双向循环神经网络。

3. 递归神经网络

递归神经网络[2](recursive neuralnetwork,RNN)是循环神经网络的又一个变种结构,看它们的名称缩写,很容易将两者混淆(通常我们说的RNN均特指recurrent neural network,同时也不建议将recurrent neural network说成是递归神经网络。一般默认递归神经网络指的是recursive neural network,而循环神经网络指的是recurrentneural network)。我们前面所介绍的循环神经网络是时间上的递归神经网络,而这里所说的递归神经网络是结构上的递归。递归神经网络相较于循环神经网络有它一定的优势,当然这个优势只适用于某些特定场合。目前递归神经网络在自然语言处理和计算机视觉领域已经有所应用,并获得了一定的成功,但是由于其对输入数据的要求相对循环神经网络更为苛刻,因此并没有被广泛的应用。

5586a862ef97dc88dfcf1855293f8889784bc47e

图6 递归神经网络结构示意图

二、 长期依赖问题及其优化

1. 长期依赖问题

什么是长期依赖?我们知道循环神经网络具有记忆能力,凭着它的记忆能力,能够较好的解决一般的序列问题,这些序列问题的数据内部基本上都存在着一定的依赖性,例如我们在前面提到过的词性标注的问题以及我们在演示项目里面人工构造的二进制数据。在有些现实问题中,数据间的依赖都是局部的、较短时间间隔的依赖。还是以词性标注为例,判断一个词是动词还是名词,或者是形容词之类,我们往往只需要看一下这个词前后的两个或多个词就可以做出判断,这种依赖关系在时间上的跨度很小。

836fb63e7e5f3c08c31394902655ef1fcc01e911

图7 时间跨度较小的依赖关系示意图

如上图所示,时刻网络的输出(上图中到是隐藏层的输出)除了与当前时刻的输入相关之外,还受到和时刻网络的状态影响。像这种依赖关系在时间上的跨度较小的情况下,RNN基本可以较好地解决,但如果出现了像图6-12所示的依赖情况,就会出现长期依赖问题:梯度消失和梯度爆炸。

ac1ea31b8da4a4ceb03c6b3a234c1e665f6a285f

图8 时间跨度较大的依赖关系示意图

什么是梯度消失和梯度爆炸?图9是一个较为形象的描述,在深层的神经网络中,由于多个权重矩阵的相乘,会出现很多如图所示的陡峭区域,当然也有可能会出现很多非常平坦的区域。在这些陡峭的地方,Loss函数的倒数非常大,导致最终的梯度也很大,对参数进行更新后可能会导致参数的取值超出有效的取值范围,这种情况称之为梯度爆炸。而在那些非常平坦的地方,Loss的变化很小,这个时候梯度的值也会很小(可能趋近于0),导致参数的更新非常缓慢,甚至更新的方向都不明确,这种情况称之为梯度消失。长期依赖问题的存在会导致循环神经网络没有办法学习到时间跨度较长的依赖关系。

bf2b7fde3f97231351b9ab6f8e93489ec00d0e24

图9 导致梯度爆炸的情况

图片引用自Razvan Pascanu的论文:《On thedifficulty of training recurrent neural networks》

正如上面所说,长期依赖问题普遍存在于层数较深的神经网络之中,不仅存在于循环神经网络中,在深层的前馈神经网络中也存在这一问题,但由于循环神经网络中循环结构的存在,导致这一问题尤为突出,而在一般的前馈神经网络中,这一问题其实并不严重。

值得注意的是,在第三章中介绍激活函数的时候我们其实已经提到过梯度消失的问题,这是由于Sigmoid型的函数在其函数图像两端的倒数趋近于0,使得在使用BP算法进行参数更新的时候会出现梯度趋近于0的情况。针对这种情况导致的梯度消失的问题,一种有效的方法是使用ReLU激活函数。但是由于本节所介绍的梯度消失的问题并不是由激活函数引起的,因此使用ReLU激活函数也无法解决问题。下面我们来看一个简单的例子。

296b4451a28269a33725bd74681b27c01ca60d80

图10 参数W在循环神经网络中随时间传递的示意图

如上图所示,我们定义一个简化的循环神经网络,该网络中的所有激活函数均为线性的,除了在每个时间步上共享的参数W以外,其它的权重矩阵均设为1,偏置项均设为0。假设输入的序列中除了的值为1以外,其它输入的值均为0,则根据前一篇讲解RNN的原理内容,可以知道:

1b0ac75c3639bf248cae8eb85035e6e2e3eae41d

公式1

最终可以得到,神经网络的输出是关于权重矩阵W的指数函数。当W的值大于1时,随着n的增加,神经网络最终输出的值也成指数级增长,而当W的值小于1时,随着n的值增加,神经网络最终的输出则会非常小。这两种结果分别是导致梯度爆炸和梯度消失的根本原因。

从上面的例子可以看到,循环神经网络中梯度消失和梯度爆炸问题产生的根本原因,是由于参数共享导致的。

2. 长期依赖问题的优化

对于梯度爆炸的问题,一般来说比较容易解决。我们可以用一个比较简单的方法叫做“梯度截断”,“梯度截断”的思路是设定一个阈值,当求得的梯度大于这个阈值的时候,就使用某种方法来进行干涉,从而减小梯度的变化。还有一种方法是给相关的参数添加正则化项,使得梯度处在一个较小的变化范围内。

梯度消失是循环神经网络面临的最大问题,相较于梯度爆炸问题要更难解决。目前最有效的方法就是在模型上做一些改变,这就是我们下一节要介绍的门控循环神经网络。本篇主要介绍了RNN的一些常用的循环网络结构,以及长期问题和如何优化。下一篇我们将介绍基于门控制的循环神经网络,也就是大家常见的LSTM以及GRU模型原理。


原文发布时间为:2018-11-19

本文来自云栖社区合作伙伴“磐创AI”,了解相关信息可以关注“磐创AI”。

目录
打赏
0
0
0
0
73530
分享
相关文章
基于GA遗传优化TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB2022a开发,提供无水印算法运行效果预览及核心程序(含详细中文注释与操作视频)。通过结合时间卷积神经网络(TCN)和遗传算法(GA),实现复杂非线性时间序列的高精度预测。TCN利用因果卷积层与残差连接提取时间特征,GA优化超参数(如卷积核大小、层数等),显著提升模型性能。项目涵盖理论概述、程序代码及完整实现流程,适用于金融、气象、工业等领域的时间序列预测任务。
基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于遗传算法优化的时间卷积神经网络(TCN)用于时间序列预测的方法。算法运行于 Matlab2022a,完整程序无水印,附带核心代码、中文注释及操作视频。TCN通过因果卷积层与残差连接学习时间序列复杂特征,但其性能依赖超参数设置。遗传算法通过对种群迭代优化,确定最佳超参数组合,提升预测精度。此方法适用于金融、气象等领域,实现更准确可靠的未来趋势预测。
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
害虫识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了12种常见的害虫种类数据集【"蚂蚁(ants)", "蜜蜂(bees)", "甲虫(beetle)", "毛虫(catterpillar)", "蚯蚓(earthworms)", "蜚蠊(earwig)", "蚱蜢(grasshopper)", "飞蛾(moth)", "鼻涕虫(slug)", "蜗牛(snail)", "黄蜂(wasp)", "象鼻虫(weevil)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Djan
113 1
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
Hyper V上网优化:提升虚拟机网络速度
要优化Hyper-V虚拟机的网络速度,可从以下几方面入手:1. 优化虚拟交换机配置,如选择合适的交换机类型、启用SR-IOV、配置VLAN和QoS策略;2. 调整网络适配器设置,选择适当的适配器类型并启用VRQ等;3. 优化宿主机网络配置,更新网卡固件和驱动,启用硬件加速;4. 使用性能监视工具监控网络流量;5. 其他措施如启用硬件虚拟化、使用外部存储、配置NLB等。通过合理配置,可显著提升网络性能。
基于PSO粒子群优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-LSTM-SAM网络时间序列预测算法。使用Matlab2022a开发,完整代码含中文注释及操作视频。算法结合卷积层提取局部特征、LSTM处理长期依赖、自注意力机制捕捉全局特征,通过粒子群优化提升预测精度。适用于金融市场、气象预报等领域,提供高效准确的预测结果。
基于GA遗传优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB 2022a实现了一种结合遗传算法(GA)优化的时间卷积神经网络(TCN)时间序列预测算法。通过GA全局搜索能力优化TCN超参数(如卷积核大小、层数等),显著提升模型性能,优于传统GA遗传优化TCN方法。项目提供完整代码(含详细中文注释)及操作视频,运行后无水印效果预览。 核心内容包括:1) 时间序列预测理论概述;2) TCN结构(因果卷积层与残差连接);3) GA优化流程(染色体编码、适应度评估等)。最终模型在金融、气象等领域具备广泛应用价值,可实现更精准可靠的预测结果。
基于WOA鲸鱼优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本内容介绍了一种基于CNN-LSTM-SAM网络与鲸鱼优化算法(WOA)的时间序列预测方法。算法运行于Matlab2022a,完整程序无水印并附带中文注释及操作视频。核心流程包括数据归一化、种群初始化、适应度计算及参数更新,最终输出最优网络参数完成预测。CNN层提取局部特征,LSTM层捕捉长期依赖关系,自注意力机制聚焦全局特性,全连接层整合特征输出结果,适用于复杂非线性时间序列预测任务。
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
时间序列预测新突破:深入解析循环神经网络(RNN)在金融数据分析中的应用
【10月更文挑战第7天】时间序列预测是数据科学领域的一个重要课题,特别是在金融行业中。准确的时间序列预测能够帮助投资者做出更明智的决策,比如股票价格预测、汇率变动预测等。近年来,随着深度学习技术的发展,尤其是循环神经网络(Recurrent Neural Networks, RNNs)及其变体如长短期记忆网络(LSTM)和门控循环单元(GRU),在处理时间序列数据方面展现出了巨大的潜力。本文将探讨RNN的基本概念,并通过具体的代码示例展示如何使用这些模型来进行金融数据分析。
755 2