第十五章 使用CNN和RNN处理序列
前言
在我们的实际生活中会遇到很多的数据信息,大致分为两种1、有规则的,例如:时间、日期、距离、气温…都是由一定的规则组成然后传递给我们或者计算机。2、无规则的,例如:文本内容,音频、自然语言。同样是信息的载体,但是计算机可以很容易的处理有规则的数据,但是对于无规则的数据却很难处理。科学家们提出了循环神经网络(RNN),用于处理分析这些无规则的数据。由于RNN可以处理任何长度的序列,所以它在处理文本、句子、音频时有很好的效果,不过我们在训练一个RNN时同样也会遇到问题。下面就让我们来了解一下这个优秀的神经网络。
一、思维导图
二、主要内容
1、循环神经元和层
- 简介
循环神经元 循环神经元是循环神经网络中最基础的一个单元,它工作时会接受输入并产生输出然后再在一个时间步长之后传递自身循环一次。步长有时也称为帧,它定义循环神经元多长时间循环一次。每次循环,神经元都会接受本次的输入x(t)与上一个循环的输出y(t-1)。
循环层 一个循环层是由多个循环神经元组成。我们在训练神经网络时,如果只是单个神经元那么它只有两个权重,一个是输入权重Wx,还有一个循环输入权重Wy,但是如果是在循环层中,我们就需要讲所有的权重向量放入两个权重矩阵中。
-
记忆单元 由于循环神经网络的递归性质,神经元的每一次输出都包含先前所有时间步长的信息,简而言之就是神经元中保留了一部分先前时间步长的信息,所以可以看做神经元有记忆功能,神经网络中的这一部分就称为记忆单元。 -
输入和输出序列 由于循环神经网络的可以同时接受输入序列和产生输出序列,所以就有了几种不同输入输出方式。 1、序列到序列,例如股票数据的预测。 2、序列到向量,文字信息的情感分析。 3、向量到序列,对一张图片的进行文字描述。4、编码器和译码器模式的翻译软件。
2、训练RNN
训练RNN的方式与正常的训练神经网络的方式相似,使用一种称为时间反向传播的方式。首先正向传播一遍记录所有的计算结果,使用成本函数计算损失,然后再反向转播一遍,使用梯度下降计算所有神经元的权重。与常规反向传播不同的是,由于RNN的输出特殊性,有些输出会被忽略掉,不参与到计算。
3、预测时间序列
-
时间序列 时间序列指的是数据的形式为每个时间步长一个或者多个值的序列。使用这种序列我们可以做很多的任务,最为典型的两种是:未来值的预测,残缺值的补充。 -
基准指标 我们在训练一个RNN模型的时候同样需要一个指标来评估模型的性能。我们需要使用两个模型来与之后的模型进行对比,第一个是只对序列的最后一个值进行预测这种方式称为单纯预测。第二个是使用全连接的网络以线性回归的方式进行预测。 -
实现一个简单的RNN 我们可以使用Keras轻松的实现一个简单的RNN,编译并训练出来的结果已经超过了之前的单纯预测,但是没有超过线性回归,不过从参数的复杂度上一个简单的RNN已经优于了全连接的线性回归。 还有一种加权移动平均模型同样可以处理时间序列,但是使用这种模型时,需要考虑到时间序列中的趋势性和季节性。 综合上述对比我们会发现我,当我们处理的数据为时间序列是,RNN是一种最优的选择。 -
深度RNN 我们可以通过堆叠多层循环层的方式来实现深层RNN。由于循环层在工作时接受的是上一个循环层的所有时间步长数据,所以在深度神经网络中如果下一层隐藏为循环层,那么前一层的循环层就必须输出每个时间步长的值。一般情况下循环神经网络的输出层不会为循环层而是一个基础的Dense层,然后根据实际所需选择激活函数。 -
预测未来几个时间步长 我们前面所提到的所有预测都只是预测了一个时间步长,但是实际生活中我们会遇到需要一次预测多个时间步长的情况,我们有几种方式来解决预测多个时间步长的情况。 1、多次循环预测一个时间步长的模型,并把每次的预测结果加到预测数据当中。 2、一次直接预测多个时间步长,也就是把模型的输出层神经元数量从一个改为10个。 3、在训练模型的时候就使得每个时间步长都往后预测多个值,这样就会使得我们的输出结果就是当前时间步长往后的多个值。
4、处理长序列
- 应对梯度不稳定问题
我们在用于解决全连接的深度神经网络训练梯度不问题的解决方式同样适用于循环神经网络。例如:良好的初始化、更快的优化器、dropout,但是非饱和激活函数不行。 还可以适用批量归一化,但是只能在递归层中使用不能在循环层中使用,所以原则上可以实现不过很困难。 最后一种也是最常用的一种,使用层归一化。它不是跨批量维度进行归一化而是在特征的维度上进行归一化,他的优点是可以在每个时间步长针对每个实例独立的及时计算所需的统计信息。 - 应对短期记忆问题
长短期记忆单元(LSTM) LSTM从外部来看与基本单元一样,并且使用方式也与基本单元相同。当我们打开LSTM的内部,我们会发现LSTM接受到的前一个时间步长的状态分为两个部分,一个为长期状态,一个为短期状态。长期状态每次进入单元都会经过一个遗忘门,忘记掉长期状态中一些不重要的信息,然后与经过筛选的短期状态相加然后从长期状态中输出。神经元的输出同样也是有两个状态,长期和短期。简而言之就是LSTM可以学习识别数据中重要的输入,将其长期保存在长期状态中,并在需要的时候取出来使用。
门控循环单元(GRU) GRU算是LSTM的一个简化版,他在原始LSTM的基础上做了以下操作。 1、把两个状态结合为一个状态 2、把输入门和遗忘门结合为一个门 3、删除了输出门 4、添加了一个控制门控制前一个时间步长的状态哪一部分需要显示给主要层。
三、课后练习
- 你能想到序列对序列RNN的一些应用吗?序列到向量RNN和向量到序列RNN呢?
序列到序列:预测天气或者任何其他时间序列,机器翻译(使用编码器-译码器结构),视频字幕,语音到文本,音乐生成或者是生成其他的序列,识别歌曲的和弦。 序列到向量:按音乐流派对音乐样本进行分类、分析书评的情绪,根据脑植入物的读数预测失语症患者正在思考的单词,根据用户的观看记录来预测他们观看一个电影的概率。 向量到序列:图像字幕,基于当前艺术家来创建音乐播放列表、基于一组参数生成旋律,在图片中定位行人。 - RNN层的输入必须具有多少个维度?每个维度代表什么?它的输出如何?
RNN层的输入必须有三个维度。第一个是批处理的维度(其大小是批处理的大小),第二维度是时间(其大小是时间的步长),第三个维度是每个时间步长的输入(其大小是每个时间步长的输入特征的数量)。例如如果需要处理包含5个时间序列(每个批次有十个时间步长),每个时间步长有两个特征(例如:温度和风速),那么这个输入的维度就为[5, 10, 2]。层的输出也是三维的,钱两个维度想同,但是最后一个维度等于神经元的数量。例如,如果一个具有32个神经元的RNN层处理刚刚的序列,那么它的输出维度就是[5,10,32]。 - 如果要构建深度序列对序列RNN,则哪个RNN层应具有return_sequences=True?序列到向量RNN呢?
如果要构建序列到序列的深度RNN,就需要为所有的RNN层设置return_sequences为True。如果要构建的是一个序列到向量的RNN那么就得保证除了最顶层的RNN层所有的RNN层都必须设置return_sequences为True。 - 假设你有一个日常不变的时间序列,并且希望预测接下来的7天。你应该使用哪种RNN架构?
如果你有日常不变的时间序列,并且需要预测接下来的七天。那么可以使用堆叠RNN的架构(处理顶层的RNN以外,其他的所有循环层都设置return_sequences=True),在输出RNN层中使用7个神经元,然后使用时间序列中的随机窗口来训练该模型(例如连续三十天的序列作为输入,而包含接下来七天的值的向量作为目标)这是序列到向量的RNN。还有一种是序列到序列的RNN,设置所有的层return_sequences为True然后使用时间序列中的随机窗口来训练模型,作为目标序列的长度等于输入序列的长度,每个目标序列的每个时间步长应该具有七个值。 - 训练RNN的主要困难是什么?你如何处理它们?
训练RNN的两个主要困难是梯度不稳定和非常有限的短期记忆,并且在面对长序列时这两个问题会更加的糟糕。为了解决梯度不稳定的问题,我们可以使用较小的学习率,使用饱和激活函数,并在每个时间步长中使用梯度裁剪、层归一化或者是dropout。要解决有限的短期问题,可以使用LSTM层和GRU层。 - 你能勾勒出LSTM单元的架构吗?
LSTM单元的架构看起来很复杂,但是如果你了解了底层逻辑,实际上并不难。该单元具有短期状态向量和长期状态向量。在每个时间步长,输入和先前的短期状态被馈送到一个简单的RNN单元和三个门。遗忘门决定长期状态中删除什么,输入门决定简单RNN单元的输出那一部分应该添加到长期状态,输出门决定长期状态的那一部分应该输出,新的短期状态等于单元的输出。 - 为什么要在RNN中使用一维卷积层?
一个RNN基本上是顺序的:为了在时间步长t上计算输出,它必须首先在所有较早的时间步长计算输出。这使得不可能进行并行计算。另一方面,一维卷积层很适合并行化,因为它不保持时间步长的状态。换句话说,它没有内存:在任何时间步长的输出都基于输入值的小窗口进行计算,而不必知道所有过去的值,此外,由于一维卷积层不是递归的,因此受梯度不稳定的影响较小。RNN中的一个或多个一维卷积层可用于有效的预处理输入,例如降低其时间分辨率,从而帮助RNN层检测长期模式。实际上,通过构建WaveNet架构,可以仅使用卷积层。 - 你可以使用哪种神经网络架构对视频进行分类?
为了根据视频的视觉内容对视频进行分类,一种可能的架构是每秒取一帧,然后通过相同的卷积神经网络运行每一帧(例如,预先训练的Xception模型,如果你的数据集不大,那么可能不需要修改),将CNN的输出序列提供给序列到向量的RNN,最后通过softmax层运行,输出所有类的概率。进行训练时,你可以将交叉熵作为成本函数。如果你还想用音频进行分类,则可以使用堆叠的一维卷积层将时间分辨率从每秒数千个音频降低到每秒一个,并将输出连接到序列到 向量的RNN。
四、总结
至此,这一章的所有内容我们已经全部了解完成,内容篇幅偏短,但是重要部分很多,对本章做一个总结就是:
- 循环神经网络的最基础单位为循环神经元。循环的神经元的会在工作时在一定的时间步长内将自己输出传递给本身。
- 循环层是有多个循环神经元组成的层,循环神经网络是由一个或多个循环层堆叠起来的神经网络。
- 由于循环神经元递归的特性,使得循环神经网络有记忆的功能,这也是为什么循环神经网络能够在处理长序列的任务中能取得不错的成绩的原因。
- 我们可以使用RNN一次预测多个时间步长的数据。
- 除了非饱和激活函数其他的所有应用在全连接神经网络中解决梯度不稳定的方法都可以应用在循环神经网络中。
- 我们可以使用LSTM单元以及它的变体来解决短期记忆问题。
对文章有任何疑惑或者想要和博主一起学机器学习一起进步的朋友们可以添加 群号:666980220。需要机器学习实战电子版或是思维导图的也可以联系我。祝你好运!
项目地址: github
|