《python深度学习》笔记---6.3、循环神经网络的高级用法

《python深度学习》笔记---6.3、循环神经网络的高级用法

一、总结

一句话总结:

循环dropout(recurrent dropout):这是一种特殊的内置方法,在循环层中使用dropout 来降低过拟合。
堆叠循环层(stacking recurrent layers):这会提高网络的表示能力(代价是更高的计算负 荷)。
双向循环层(bidirectional recurrent layer):将相同的信息以不同的方式呈现给循环网络,可以提高精度并缓解遗忘问题。

1、提高循环神经网络的性能和泛化能力的三种高级技巧?

循环dropout(recurrent dropout):这是一种特殊的内置方法,在循环层中使用dropout 来降低过拟合。
堆叠循环层(stacking recurrent layers):这会提高网络的表示能力(代价是更高的计算负 荷)。
双向循环层(bidirectional recurrent layer):将相同的信息以不同的方式呈现给循环网络,可以提高精度并缓解遗忘问题。

2、温度、适度等数据我们如何做预处理?

【不需要向量化】:数据已经是数值型的,所以不需 要做向量化。
【需要标准化】:但数据中的每个时间序列位于不同的范围(比如温度通道位于-20 到 +30 之间,但气压大约在1000 毫巴上下)。你需要对每个时间序列分别做标准化,让它们在 相似的范围内都取较小的值。

3、如何更节约内存的处理温度预测的输入数据?

【用Python生成器】:编写一个 Python 生成器,以当前的浮点数数组作为输入,并从最近的数据中生成数据批 量,同时生成未来的目标温度。
【原始数据即时生成样本】:因为数据集中的样本是高度冗余的(对于第 N 个样本和 第N+1 个样本,大部分时间步都是相同的),所以显式地保存每个样本是一种浪费。相反, 我们将使用原始数据即时生成样本。
【每个生成器分别读取原始数据的不同时间段】:训练生成器读取前 200 000 个时间步,验证生成器读取随后的 100 000 个时间步,测试生成器读取剩下的时间步。

4、一种基于常识的、非机器学习的基准方法 在深度学习之前是非常必要的?

【合理性检查和基准】:基准方法可以作为合理性检查,还可以建立一个基准,更高级的机器学习模型需要打败这个基准才能 表现出其有效性。

5、模型的基准方法实例?

【比如这里的始终预测为A】:如果数据集中包含 90% 的类别A 实例和10% 的类别B 实例,那么分类任务的一种基于常识的方法就是对新样本 始终预测类别“A”。
【方法大于基准才能有效】:这种分类器的总体精度为90%,因此任何基于学习的方法在精度高于90% 时才能证明其有效性。有时候,这样基本的基准方法可能很难打败。

6、温度预测模型的基准方法?

【始终预测24小时后的温度】:我们可以放心地假设,温度时间序列是连续的(明天的温度很可能接近今天的温 度),并且具有每天的周期性变化。因此,一种基于常识的方法就是始终预测24 小时后的温度 等于现在的温度。

7、温度预测的指标评估?

平均绝对误差(MAE):np.mean(np.abs(preds - targets))

8、基准和简单模型的意义(做复杂任务的时候)?

【建立一个基于常识的基准方法是很有用的】:在尝试机器学习方法之前,建立一个基于常识的基准方法是很有用的;
【尝试使用简单且计算代价低的机器学习模型也是很有用的】:同样,在开始研究 复杂且计算代价很高的模型(比如RNN)之前,尝试使用简单且计算代价低的机器学习模型也 是很有用的,比如小型的密集连接网络。
【保证进一步增加问题的复杂度是合理的】:这可以保证进一步增加问题的复杂度是合理的,并且 会带来真正的好处。

9、温度预测的简单模型?

【密集连接模型】:密集连接模型,首先将数据展平,然后通过两个 Dense 层并运行。
【回归问题最后一层不需要激活函数】:注意,最后一个 Dense 层没有使用激活函数,这对于回归问题是很常见的。
【MAE作为损失】:我们使用MAE 作 为损失。评估数据和评估指标都与常识方法完全相同,所以可以直接比较两种方法的结果。

10、为什么超越基准不是件很容易的事情?

【我们的常识中包含了大量有价值的信息】:我们的常识中包含了大量有价值的信息,而机器学习模型并不知道这些信息。

11、你可能会问,如果从数据到目标之间存在一个简单且表现良好的模型(即基于常识的基准 方法),那为什么我们训练的模型没有找到这个模型并进一步改进呢?

【这个简单的解决方案并不是训练过程所要寻找的目标。】
【复杂模型的空间可能无法学到简单且性能良好的基准方法】:我们在模型空间(即假设空间)中搜索解决方案,这 个模型空间是具有我们所定义的架构的所有两层网络组成的空间。这些网络已经相当复杂了。 如果你在一个复杂模型的空间中寻找解决方案,那么可能无法学到简单且性能良好的基准方法, 虽然技术上来说它属于假设空间的一部分。
【如果没有被硬编码,简单解可能找不到】:通常来说,这对机器学习是一个非常重要的限制: 如果学习算法没有被硬编码要求去寻找特定类型的简单模型,那么有时候参数学习是无法找到 简单问题的简单解决方案的。

12、GRU和LSTM性能比较?

GRU运行的计算代价更低(虽然表示能力可能不如 LSTM)


门控循 环单元(GRU,gated recurrent unit)层的工作原理与LSTM 相同。但它做了一些简化,因此运 行的计算代价更低(虽然表示能力可能不如 LSTM)

13、使用循环 dropout 来降低过拟合?

【在循环层前面应用dropout,这种正则化会妨碍学习过程】:但在循环网络中如何正确地使用 dropout,这并不是一个简单的问题。人们早就知道,在循环层前面应用 dropout,这种正则化会 妨碍学习过程,而不是有所帮助。
【对每个时间步应该使用相同的 dropout 掩码(dropout mask,相同模式的舍弃单元)】:使用 dropout 的正确方法:对每个时间步应该使用相同的 dropout 掩码(dropout mask,相同模式的舍弃单元),而不是让dropout 掩码随着时间步的增加而随机变化。
【将不随时间变化的dropout掩码应用于层的内部循环激活(叫作循环 dropout 掩码)】:此外,为 了对 GRU、LSTM 等循环层得到的表示做正则化,应该将不随时间变化的dropout 掩码应用于层 的内部循环激活(叫作循环 dropout 掩码)。
【随时间随机变化的dropout掩码会破坏这个误差信号,并且不利于学习过程】:对每个时间步使用相同的 dropout 掩码,可以让网络 沿着时间正确地传播其学习误差,而随时间随机变化的dropout 掩码则会破坏这个误差信号,并 且不利于学习过程。

14、Keras 的每个循环层都有两个与dropout 相关的参数?

【输入单元的dropout比率】:一个是 dropout,它是一个浮点数,指定该层 输入单元的dropout 比率;
【循环单元的dropout比率】:另一个是 recurrent_dropout,指定循环单元的dropout 比率。

15、dropout正则化对训练次数的影响?

【使用dropout正则化的网络总是需要更长的时间才能完全收敛】:因为使用dropout 正则化的网络总是需要更长的时间才能完全收敛,所以网络训练轮次增加为原来的 2 倍。

16、机器学习的通用工作流程?

【过拟合】:增加网络容量通常是一个好主意,直到过拟合变成主要的障碍(假设 你已经采取基本步骤来降低过拟合,比如使用dropout)。
【容量不足】:只要过拟合不是太严重,那么很可能 是容量不足的问题。

17、循环层堆叠?

【增加每层单元数或增加层数】:增加网络容量的通常做法是增加每层单元数或增加层数。
【堆叠循环层来增加网络容量】:循环层堆叠(recurrent layer stacking)是构建更加强大的循环网络的经典方法,
【7个大型LSTM层的堆叠】:例如,目前谷歌翻译算法就是7个大型LSTM 层的堆叠——这个架构很大。

18、循环层堆叠 实例?

就是循环层的叠加
model = Sequential()
model.add(layers.GRU(32,
                     dropout=0.1,
                     recurrent_dropout=0.5,
                     return_sequences=True,
                     input_shape=(None, float_data.shape[-1])))
model.add(layers.GRU(64, activation='relu',
                     dropout=0.1, 
                     recurrent_dropout=0.5))
model.add(layers.Dense(1))

19、双向 RNN ?

【RNN特别依赖于顺序或时间】:RNN 特别依赖于顺序或时间,RNN 按顺序处理输入序列的时间步,而打乱时间步或反转 时间步会完全改变RNN 从序列中提取的表示。正是由于这个原因,如果顺序对问题很重要(比 如温度预测问题) ,RNN 的表现会很好。
【每个RNN分别沿一个方向对输入序列进行处理 (时间正序和时间逆序),然后将它们的表示合并在一起】:双向RNN 利用了RNN 的顺序敏感性:它包含两个普 通 RNN,比如你已经学过的 GRU 层和 LSTM 层,每个RNN分别沿一个方向对输入序列进行处理 (时间正序和时间逆序),然后将它们的表示合并在一起。
【通过沿这两个方向处理序列,双向 RNN 能够捕捉到可能被单向 RNN 忽略的模式】

20、双向 RNN 中反向网络怎么实现?

【直接数据逆向,超简单】:你只需要编写一个数据生成器的变体,将输入序列沿着时间维度反转(即将最后一行 代码替换为 yield samples[:, ::-1, :], targets)。
# 将序列反转
x_train = [x[::-1] for x in x_train]   
x_test = [x[::-1] for x in x_test] 

21、为什么温度预测中 逆序 GRU 的效果甚至比基于常识的基准方法还要差很多?

【GRU层通常更善于记住最近的数据,而不是久远的数据】:在本例中,按时间正序处 理对成功解决问题很重要。这非常合理:GRU 层通常更善于记住最近的数据,而不是久远的数据, 与更早的数据点相比,更靠后的天气数据点对问题自然具有更高的预测能力(这也是基于常识 的基准方法非常强大的原因)。

22、IMDB电影评论中,为什么正序RNN和逆序RNN的效果差不多?

【本例中使用哪种顺序对理解语言并不重要】:虽然单词顺序对理解语言很重要,但使用哪种顺 序并不重要。
【逆序序列上训练的RNN学到的表示不同于在原始序列上学到的表示】:重要的是,在逆序序列上训练的 RNN 学到的表示不同于在原始序列上学到的表示, 正如在现实世界中,如果时间倒流(你的人生是第一天死去、最后一天出生),那么你的心智模 型也会完全不同。

23、为什么双向RNN能提高性能?

【提供了查看数据的全新角度】:在机器学习中,如果一种数据表示不同但有用,那么总是值得加以利用,这 种表示与其他表示的差异越大越好,它们提供了查看数据的全新角度,抓住了数据中被其他方 法忽略的内容,因此可以提高模型在某个任务上的性能。
【它从两个方向查看数据,从而得到更加丰富的表示,并捕捉到仅使用正序 RNN 时可能忽略的一些模式】:双向RNN 正是利用这个想法来提高正序RNN 的性能。它从两个方向查看数据,从而得到更加丰富的表示,并捕捉到仅使用正序 RNN 时可能忽略的一些模式。

24、Keras 中双向RNN 层?

Bidirectional层:model.add(layers.Bidirectional(layers.LSTM(32)))
model = Sequential()
model.add(layers.Embedding(max_features, 32))
model.add(layers.Bidirectional(layers.LSTM(32)))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(x_train, y_train, epochs=10, batch_size=128, validation_split=0.2)

25、为什么温度预测中双向RNN模型的表现与普通 GRU 层差不多一样好?

【所有的预测能力肯定都来自于正序的那一半网络】:因为我们已经知道,逆序的那一半在这个任务上的表现非常糟糕(本 例同样是因为,最近的数据比久远的数据更加重要)。

26、为了提高温度预测问题的性能,你还可以尝试下面这些方法?

【调节每层的单元个数】:在堆叠循环层中调节每层的单元个数。当前取值在很大程度上是任意选择的,因此可能 不是最优的。
【调节学习率或者网络】:调节 RMSprop 优化器的学习率。尝试使用 LSTM 层代替 GRU 层。
【尝试使用更大的密集连接回归器】:在循环层上面尝试使用更大的密集连接回归器,即更大的 Dense 层或 Dense 层的堆叠。
【验证MAE最小的模型】:不要忘记最后在测试集上运行性能最佳的模型(即验证MAE 最小的模型)。否则,你开 发的网络架构将会对验证集过拟合。

27、6.3章循环神经网络的高级用法 知识点总结一?

【基于常识的基准】:遇到新问题时,最好首先为你选择的指标建立一个基于常识的基准。 如果没有需要打败的基准,那么就无法分辨是否取得了真正的进步。
【尝试简单模型】:在尝试计算代价较高的模型之前,先尝试一些简单的模型,以此证明增加计算代价是有 意义的。有时简单模型就是你的最佳选择。
【时间序列用循环网络】:如果时间顺序对数据很重要,那么循环网络是一种很适合的方法,与那些先将时间数据 展平的模型相比,其性能要更好。

28、6.3章循环神经网络的高级用法 知识点总结二?

【dropout掩码与循环dropout掩码】:想要在循环网络中使用dropout,你应该使用一个不随时间变化的dropout 掩码与循环 dropout 掩码。这二者都内置于 Keras 的循环层中,所以你只需要使用循环层的 dropout 和 recurrent_dropout 参数即可。
【堆叠RNN的表示能力更加强大】:与单个RNN 层相比,堆叠RNN 的表示能力更加强大。但它的计算代价也更高,因此不 一定总是需要。虽然它在机器翻译等复杂问题上很有效,但在较小、较简单的问题上可 能不一定有用。
【双向RNN对自然语言处理问题非常有用】:双向RNN 从两个方向查看一个序列,它对自然语言处理问题非常有用。但如果在序列 数据中最近的数据比序列开头包含更多的信息,那么这种方法的效果就不明显。

29、市场与机器学习?

【如果你只能访问公开可用的数据,那么想要用机器学习来打败市场是一项非常困难的任务】:市场的统计特征与天气模式等自然现象有很大差别。如果你 只能访问公开可用的数据,那么想要用机器学习来打败市场是一项非常困难的任务,你很可 能会白白浪费时间和资源,却什么也得不到。
【面对市场时,过去的表现并不能很好地预测未来的收益】:永远要记住,面对市场时,过去的表现并不能很好地预测未来的收益,正如靠观察后 视镜是没办法开车的。与此相对的是,如果在数据集中过去能够很好地预测未来,那么机器 学习非常适合用于这种数据集。

二、6.3、循环神经网络的高级用法

博客对应课程的视频位置:

 
我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
博主25岁,前端后端算法大数据人工智能都有兴趣。
大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
聊技术,交朋友,修心境,qq404006308,微信fan404006308
26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
人工智能群:939687837

作者相关推荐

原文地址:https://www.cnblogs.com/Renyi-Fan/p/13814545.html