说明:本文依据《Sklearn 与 TensorFlow 机器学习实用指南》完成,所有版权和解释权均归作者和翻译成员所有,我只是搬运和做注解。

进入第二部分深度学习

第十四章循环神经网络

循环神经网络可以分析时间序列数据,诸如股票价格,并告诉你什么时候买入和卖出。在自动驾驶系统中,他们可以预测行车轨迹,避免发生交通意外。

循环神经网络可以在任意长度的序列上工作,而不是之前讨论的只能在固定长度的输入上工作的网络。

举个例子,它们可以把语句,文件,以及语音范本作为输入,使得它们在诸如自动翻译,语音到文本或者情感分析(例如,读取电影评论并提取评论者关于该电影的感觉)的自然语言处理系统中极为有用。

另外,循环神经网络的预测能力使得它们具备令人惊讶的创造力。

可以要求它们去预测一段旋律的下几个音符,随机选取这些音符的其中之一并演奏它。然后要求网络给出接下来最可能的音符,演奏它,如此周而复始。

同样,循环神经网络可以生成语句,图像标注等。

在本章中,教程介绍以下几点

  • 循环神经网络背后的基本概念
  • 循环神经网络所面临的主要问题(在第11章中讨论的消失/爆炸的梯度),广泛用于反抗这些问题的方法:LSTM 和 GRU cell(单元)。
  • 展示如何用 TensorFlow 实现循环神经网络。最终我们将看看及其翻译系统的架构。

7.长时训练困难

在训练长序列的 RNN 模型时,那么就需要把 RNN 在时间维度上展开成很深的神经网络。正如任何深度神经网络一样,其面临着梯度消失/爆炸的问题,使训练无法终止或收敛。

在之前教程中提到过不少方法(参数初始化方式,非饱和的激活函数(如 ReLU),批量规范化(Batch Normalization), 梯度截断(Gradient Clipping),更快的优化器),但是在实际使用中仍会遇到训练缓慢的问题。

最简单的方法是在训练阶段仅仅展开限定时间步长的 RNN 网络,称为截断时间反向传播算法

在TensorFlow中通过截断输入序列来简单实现这种功能。例如在时间序列预测问题上可以在训练时减小n_steps来实现截断。这种方法会限制模型在长期模式的学习能力。

另一种变通方案是确保缩短的序列中包含旧数据和新数据,从而使模型获得两者信息(如序列同时包含最近五个月的数据,最近五周的和最近五天的数据)。

其实就是在解决RNN的记忆问题,包括两个问题:

1.如何确保从之前的细分类中获取的数据有效性。

2.第一个输入的记忆会在长时间运行的RNN网络中逐渐淡去。

为了解决这些问题,就出现了各种能够携带长时记忆的神经单元的变体。

8.长短时记忆LSTM

长短时记忆单元,如果把 LSTM 单元看作一个黑盒,从外围看它和基本形式的记忆单元很相似,但 LSTM 单元会比基本单元性能更好,收敛更快,能够感知数据的长时依赖。TensorFlow 中通过BasicLSTMCell实现 LSTM 单元。

lstm_cell = tf.contrib.rnn.BasicLSTMCell(num_units=n_neurons)

LSTM 单元状态分为两个向量:h^{(t)} 和 c^{(t)}(c代表 cell)。可以简单认为 h^{(t)} 是短期记忆状态,c^{(t)} 是长期记忆状态。

LSTM 单元的核心思想是其能够学习从长期状态中存储什么,忘记什么,读取什么

  • 长期状态 c^{(t-1)} 从左向右在网络中传播,依次经过遗忘门(forget gate)时丢弃一些记忆;
  • 加法操作增加一些记忆(从输入门中选择一些记忆)。
  • 输出 c^{(t)} 不经任何转换直接输出。

每个单位时间步长后,都有一些记忆被抛弃,新的记忆被添加进来。

另一方面,长时状态经过 tanh 激活函数通过输出门得到短时记忆 h^{(t)},同时它也是这一时刻的单元输出结果 y^{(t)}。

LSTM 单元能够学习到识别重要输入(输入门作用),存储进长时状态,并保存必要的时间(遗忘门功能),并学会提取当前输出所需要的记忆。

这也解释了 LSTM 单元能够在提取长时序列,长文本,录音等数据中的长期模式的惊人成功的原因。

其中主要的全连接层输出 g^{(t)},它的常规任务就是解析当前的输入 x^{(t)} 和前一时刻的短时状态 h^{(t-1)}。在基本形式的 RNN 单元中,就与这种形式一样,直接输出了 h^{(t)} 和 y^{(t)}。与之不同的是 LSTM 单元会将一部分 g^{(t)} 存储在长时状态中。

其它三个全连接层被称为门控制器(gate controller)。其采用 Logistic 作为激活函数,输出范围在 0 到 1 之间。在图中,这三个层的输出提供给了逐元素乘法操作,当输入为 0 时门关闭,输出为 1 时门打开。分别为:

  • 遗忘门(forget gat)由 f^{(t)} 控制,来决定哪些长期记忆需要被擦除;
  • 输入门(input gate) 由 i^{(t)} 控制,它的作用是处理哪部分 g^{(t)} 应该被添加到长时状态中,也就是为什么被称为部分存储。
  • 输出门(output gate)由 o^{(t)} 控制,在这一时刻的输出 h^{(t)} 和 y^{(t)} 就是由输出门控制的,从长时状态中读取的记忆。

9.窥孔连接

基本形式的 LSTM 单元中,门的控制仅有当前的输入 x^{(t)} 和前一时刻的短时状态 h^{(t-1)}。不妨让各个控制门窥视一下长时状态,获取一些上下文信息不失为一种尝试。

在tensorflow中使用use_peepholes=True来进行设置。

lstm_cell = tf.contrib.rnn.LSTMCell(num_units=n_neurons, use_peepholes=True)

10.GRU单元

门控循环单元是 LSTM 单元的简化版本,能实现同样的性能,这也说明了为什么它能越来越流行。

  • 长时状态和短时状态合并为一个向量 h^{(t)}。
  • 用同一个门控制遗忘门和输入门。如果门控制输入 1,输入门打开,遗忘门关闭,反之亦然。也就是说,如果当有新的记忆需要存储,那么就必须实现在其对应位置事先擦除该处记忆。这也构成了 LSTM 本身的常见变体。(没看懂)
  • GRU 单元取消了输出门,单元的全部状态就是该时刻的单元输出。与此同时,增加了一个控制门 r^{(t)} 来控制哪部分前一时间步的状态在该时刻的单元内呈现。

在tensorflow中创建GRU

  • gru_cell = tf.contrib.rnn.GRUCell(n_units=n_neurons)
n_steps = 28n_inputs = 28n_neurons = 150n_outputs = 10n_layers = 3reset_graph()learning_rate = 0.001X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])y = tf.placeholder(tf.int32, [None])lstm_cell = [ tf.nn.rnn_cell.BasicLSTMCell(num_units=n_neurons) for layer in range(n_layers)]multi_cell = tf.nn.rnn_cell.MultiRNNCell(lstm_cell)outputs, states = tf.nn.dynamic_rnn(multi_cell, X, dtype=tf.float32)top_layer_h_state = states[-1][1]logits = tf.layers.dense(top_layer_h_state, n_outputs, name="softmax")xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)loss = tf.reduce_mean(xentropy, name="loss")optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)training_op = optimizer.minimize(loss)correct = tf.nn.in_top_k(logits, y, 1)accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))init = tf.global_variables_initializer()# print(states)n_epochs = 10batch_size = 150(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()X_train = X_train.astype(np.float32).reshape(-1, 28 * 28) / 255.0X_test = X_test.astype(np.float32).reshape(-1, 28 * 28) / 255.0y_train = y_train.astype(np.int32)y_test = y_test.astype(np.int32)X_valid, X_train = X_train[:5000], X_train[5000:]y_valid, y_train = y_train[:5000], y_train[5000:]X_test=X_test.reshape((-1,n_steps,n_inputs))def shuffle_batch(X, y, batch_size): rnd_idx = np.random.permutation(len(X)) n_batches = len(X) // batch_size for batch_idx in np.array_split(rnd_idx, n_batches): X_batch, y_batch = X[batch_idx], y[batch_idx] yield X_batch, y_batchwith tf.Session() as sess: init.run() for epoch in range(n_epochs): for X_batch, y_batch in shuffle_batch(X_train, y_train, batch_size): X_batch = X_batch.reshape((-1, n_steps, n_inputs)) sess.run(training_op, feed_dict={X: X_batch, y: y_batch}) acc_batch = accuracy.eval(feed_dict={X: X_batch, y: y_batch}) acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test}) print(epoch, "Last batch accuracy:

tensorflow lstm从隐状态到预测值_机器学习100天-Day2405 循环神经网络RNN(LSTM)相关推荐

  1. sklearn 神经网络_机器学习100天-Day2404 循环神经网络RNN(预测时间序列)

    说明:本文依据<Sklearn 与 TensorFlow 机器学习实用指南>完成,所有版权和解释权均归作者和翻译成员所有,我只是搬运和做注解. 进入第二部分深度学习 第十四章循环神经网络 ...

  2. keras 多层lstm_机器学习100天-Day2403 循环神经网络RNN(训练多层RNN)

    说明:本文依据<Sklearn 与 TensorFlow 机器学习实用指南>完成,所有版权和解释权均归作者和翻译成员所有,我只是搬运和做注解. 进入第二部分深度学习 第十四章循环神经网络 ...

  3. 深度学习~循环神经网络RNN, LSTM

    目录 1. 循环神经网络RNN 1.1 RNN出现背景 1.2 RNN概念 2. LSTM 2.1 LSTM出现背景 2.2 LSTM结构 参考 1. 循环神经网络RNN 1.1 RNN出现背景 pr ...

  4. 机器学习Basics-第十一期-循环神经网络RNN

    https://www.toutiao.com/a6655276573958078987/ 2019-02-08 17:34:05 背景 本系列已经经历十期,上一期涵盖了卷积神经网络.从上一期大家也能 ...

  5. 深度学习笔记——循环神经网络RNN/LSTM

    原文来自知乎专栏NLP进阶之路,作者韦伟. 以下文章是摘录了原文部分内容的学习笔记,侵删. 循环神经网络(Rerrent Neural Network) RNN是神经网络的一种,RNN对具有序列特性的 ...

  6. [Python人工智能] 十二.循环神经网络RNN和LSTM原理详解及TensorFlow编写RNN分类案例

    从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇讲解了TensorFlow如何保存变量和神经网络参数,通过Saver保存神经网络,再通过Restore调用训练好的 ...

  7. RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测

    全文链接:http://tecdat.cn/?p=25133 2017 年年中,R 推出了 Keras 包 _,_这是一个在 Tensorflow 之上运行的综合库,具有 CPU 和 GPU 功能(点 ...

  8. Tensorflow与keras学习 (3)——循环神经网络RNN

    循环神经网络RNN 3.1 RNN与LSTM介绍: 循环神经网络中的神经单元类似于模拟数字电路技术中的门电路,具有很多控制门来控制输入输出. RNN结构: LSTM结构: 相比与传统的神经网络,RNN ...

  9. python输出一首诗_基于循环神经网络(RNN)的古诗生成器

    基于循环神经网络(RNN)的古诗生成器,具体内容如下 之前在手机百度上看到有个"为你写诗"功能,能够随机生成古诗,当时感觉很酷炫= = 在学习了深度学习后,了解了一下原理,打算自己 ...

最新文章

  1. HTML5 canvas绘制雪花飘落
  2. 微服务架构及其最重要的 10 个设计模式!
  3. Java并发编程:Thread类的使用
  4. 5.QT5中的connect的实现
  5. 比世界纪录快3倍 阿里云377秒完成100TB数据排序
  6. OpenCV图像缩放函数resize()的使用
  7. oracle报表范例1 (转载)
  8. LeetCode 767. 重构字符串
  9. nodemcu固件_从无到有玩NodeMcu:web端控制
  10. 如何创建SQL Server报告服务(SSRS)报告
  11. jquery ajax html php区别,ajax与jquery的区别是什么
  12. OJ1047: 对数表(C语言)
  13. 了解uni-app只需这一篇就足够了
  14. 记录一次浏览器HTTPS“你的连接不是私密连接”错误NET::ERR_CERT_REVOKED
  15. Mathorcup数学建模竞赛第五届-【妈妈杯】A题:城市相邻两交叉口信号配时优化(附一等奖获奖论文和matlab代码实现)
  16. 2020年度个人总结--一个前端技术LD的年终盘点
  17. win10系统mongodb 5.0安装配置+自动启动
  18. php 1为false,false是1还是0
  19. CAD转换技巧:高版本CAD文件转换成低版本在线版最简单
  20. 让AURIX Development Studio变得更好用

热门文章

  1. SAP Commerce Cloud 里的 Solr 架构简介
  2. Chrome 浏览器扩展 - Dark Web - Dark Theme for Chrome
  3. Angular路由错误消息 - router-outlet is not a known element
  4. Angular里ngModel双向绑定的一个使用例子
  5. SAP Spartacus delivery mode continue button enable与否的逻辑
  6. Why SAP SQL view is not recommended to use in SQL ?
  7. 使用PHP应用查询SAP HANA Express Edition里的数据
  8. SAP OData服务的catalog service
  9. how SAP gateway parse_meta_tags
  10. 怎么判断当前的os类型,手机类型