循环神经网络

介绍

可以在 this great article 查看循环神经网络(RNN)以及 LSTM 的介绍。

语言模型

此教程将展示如何在高难度的语言模型中训练循环神经网络。该问题的目标是获得一个能确定语句概率的概率模型。为了做到这一点,通过之前已经给出的词语来预测后面的词语。我们将使用 PTB(Penn Tree Bank) 数据集,这是一种常用来衡量模型的基准,同时它比较小而且训练起来相对快速。

语言模型是很多有趣难题的关键所在,比如语音识别,机器翻译,图像字幕等。它很有意思--可以参看 here。

本教程的目的是重现 Zaremba et al., 2014 的成果,他们在 PTB 数据集上得到了很棒的结果。

教程文件

本教程使用的下面文件的目录是 models/rnn/ptb:

文件 作用
ptb_word_lm.py 在 PTB 数据集上训练一个语言模型.
reader.py 读取数据集.

下载及准备数据

本教程需要的数据在 data/ 路径下,来源于 Tomas Mikolov 网站上的 PTB 数据集http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz

该数据集已经预先处理过并且包含了全部的 10000 个不同的词语,其中包括语句结束标记符,以及标记稀有词语的特殊符号 (<unk>) 。我们在 reader.py 中转换所有的词语,让他们各自有唯一的整型标识符,便于神经网络处理。

模型

LSTM

模型的核心由一个 LSTM 单元组成,其可以在某时刻处理一个词语,以及计算语句可能的延续性的概率。网络的存储状态由一个零矢量初始化并在读取每一个词语后更新。而且,由于计算上的原因,我们将以 batch_size 为最小批量来处理数据。

基础的伪代码就像下面这样:

lstm = rnn_cell.BasicLSTMCell(lstm_size)
# 初始化 LSTM 存储状态.
state = tf.zeros([batch_size, lstm.state_size])loss = 0.0
for current_batch_of_words in words_in_dataset:# 每次处理一批词语后更新状态值. output, state = lstm(current_batch_of_words, state) # LSTM 输出可用于产生下一个词语的预测 logits = tf.matmul(output, softmax_w) + softmax_b probabilities = tf.nn.softmax(logits) loss += loss_function(probabilities, target_words)

截断反向传播

为使学习过程易于处理,通常的做法是将反向传播的梯度在(按时间)展开的步骤上照一个固定长度(num_steps)截断。 通过在一次迭代中的每个时刻上提供长度为 num_steps 的输入和每次迭代完成之后反向传导,这会很容易实现。

一个简化版的用于计算图创建的截断反向传播代码:

# 一次给定的迭代中的输入占位符.
words = tf.placeholder(tf.int32, [batch_size, num_steps])lstm = rnn_cell.BasicLSTMCell(lstm_size)
# 初始化 LSTM 存储状态.
initial_state = state = tf.zeros([batch_size, lstm.state_size])for i in range(len(num_steps)):# 每处理一批词语后更新状态值. output, state = lstm(words[:, i], state) # 其余的代码. # ... final_state = state

下面展现如何实现迭代整个数据集:

# 一个 numpy 数组,保存每一批词语之后的 LSTM 状态.
numpy_state = initial_state.eval()
total_loss = 0.0
for current_batch_of_words in words_in_dataset:numpy_state, current_loss = session.run([final_state, loss],# 通过上一次迭代结果初始化 LSTM 状态. feed_dict={initial_state: numpy_state, words: current_batch_of_words}) total_loss += current_loss

输入

在输入 LSTM 前,词语 ID 被嵌入到了一个密集的表示中(查看 矢量表示教程)。这种方式允许模型高效地表示词语,也便于写代码:

# embedding_matrix 张量的形状是: [vocabulary_size, embedding_size]
word_embeddings = tf.nn.embedding_lookup(embedding_matrix, word_ids)

嵌入的矩阵会被随机地初始化,模型会学会通过数据分辨不同词语的意思。

损失函数

我们想使目标词语的平均负对数概率最小

实现起来并非很难,而且函数 sequence_loss_by_example 已经有了,可以直接使用。

论文中的典型衡量标准是每个词语的平均困惑度(perplexity),计算式为

同时我们会观察训练过程中的困惑度值(perplexity)。

多个 LSTM 层堆叠

要想给模型更强的表达能力,可以添加多层 LSTM 来处理数据。第一层的输出作为第二层的输入,以此类推。

MultiRNNCell 可以无缝的将其实现:

lstm = rnn_cell.BasicLSTMCell(lstm_size)
stacked_lstm = rnn_cell.MultiRNNCell([lstm] * number_of_layers)initial_state = state = stacked_lstm.zero_state(batch_size, tf.float32)
for i in range(len(num_steps)):# 每次处理一批词语后更新状态值.output, state = stacked_lstm(words[:, i], state)# 其余的代码.# ... final_state = state

编译并运行代码

首先需要构建库,在 CPU 上编译:

bazel build -c opt tensorflow/models/rnn/ptb:ptb_word_lm

如果你有一个强大的 GPU,可以运行:

bazel build -c opt --config=cuda tensorflow/models/rnn/ptb:ptb_word_lm

运行模型:

bazel-bin/tensorflow/models/rnn/ptb/ptb_word_lm \--data_path=/tmp/simple-examples/data/ --alsologtostderr --model small

教程代码中有 3 个支持的模型配置参数:"small", "medium" 和 "large"。它们指的是 LSTM 的大小,以及用于训练的超参数集。

模型越大,得到的结果应该更好。在测试集中 small 模型应该可以达到低于 120 的困惑度(perplexity),large 模型则是低于 80,但它可能花费数小时来训练。

除此之外?

还有几个优化模型的技巧没有提到,包括:

  • 随时间降低学习率,
  • LSTM 层间 dropout.

继续学习和更改代码以进一步改善模型吧。

原文:Recurrent Neural Networks 翻译:Warln

转载于:https://www.cnblogs.com/bonelee/p/7903145.html

tensorflow LSTM相关推荐

  1. tensorflow LSTM + CTC实现端到端OCR

    最近在做OCR相关的东西,关于OCR真的是有悠久了历史了,最开始用tesseract然而效果总是不理想,其中字符分割真的是个博大精深的问题,那么多年那么多算法,然而应用到实际总是有诸多问题.比如说非等 ...

  2. TensorFlow LSTM 注意力机制图解

    TensorFlow LSTM Attention 机制图解 深度学习的最新趋势是注意力机制.在接受采访时,现任OpenAI研究主管的Ilya Sutskever提到,注意力机制是最令人兴奋的进步之一 ...

  3. tensorflow lstm 实现 RNN / LSTM 的关键几个步骤 多层通俗易懂

    https://blog.csdn.net/Jerr__y/article/details/61195257?depth_1-utm_source=distribute.pc_relevant.non ...

  4. Tensorflow LSTM时间序列预测的尝试

    一.网上的资源 网上有不少用LSTM来预测时间序列的资源,如下面: 深度学习(08)_RNN-LSTM循环神经网络-03-Tensorflow进阶实现 http://blog.csdn.net/u01 ...

  5. tensorflow lstm 预测_解析seq2seq原理+tensorflow实现

    1 写在前面 最近抽时间写文章,将自己以前学过的知识总结一下,通过文章记录下来,以后忘记了也可以随时翻阅. 本文主要介绍最基础的seq2seq模型,并尝试使用tensorflow实现.很多朋友都说py ...

  6. tensorflow lstm 预测_图卷积神经网络GCN与递归结构RNN相结合的时间序列预测

    时间序列预测任务可以按照不同的方法执行.最经典的是基于统计和自回归的方法.更准确的是基于增强和集成的算法,我们必须使用滚动周期生成大量有用的手工特性.另一方面,我们可以使用在开发过程中提供更多自由的神 ...

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

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

  8. Tensorflow LSTM实现多维输入输出预测实践详解

    摘要:算法模型基于动态多隐层LSTM RNN搭建,损失函数使用cross_entropy损失最大值,输入M维度.输出N维度.代码基于Python3.6.X和Tensorflow1.13.X实现. 1. ...

  9. tensorflow LSTM+CTC实现端到端的不定长数字串识别

    转载地址: https://www.jianshu.com/p/45828b18f133 上一篇文章tensorflow 实现端到端的OCR:二代身份证号识别实现了定长18位数字串的识别,并最终达到了 ...

最新文章

  1. php类方法语法错误捕获,php语法错误捕获
  2. 2019-2020中国趋势报告,203页PPT解读16大机会
  3. JAVA NIO - Buffer Channel
  4. androidwakelock_Android中的WakeLock
  5. Facebook广告费用如何出价?
  6. HTML5 定位 —— Geolocation API的正确使用
  7. DelphiX中的DXSprite单元中涉及到修改
  8. 孪生网络图像相似度_文本蕴含之孪生网络(Siamese Network)
  9. 【RT-Thread 作品秀】空气质量监测系统
  10. /分数化简和加减乘除
  11. hbase regionserver挂掉报错has too many store files delaying flush up to 90000ms
  12. 计算机晋级职称考试内容,职称计算机考试内容
  13. DoublyLinkedList
  14. 仓库货架通道宽度的设计要求和注意事项
  15. XXE实体注入漏洞详解
  16. 3d打印英语文献_3D打印合集,从设计,技术到工业制造应用!
  17. Application was not properly initialized at startup, could not find Factory:
  18. IntelliJ IDEA 2019从入门到癫狂
  19. Prolog教程 14--cut的功能
  20. Stm32的GPIO PB10 驱动固态继电器

热门文章

  1. MySQL协议.NET Core实现(一)
  2. 小学计算机课总目标,小学信息技术课堂教学目标的确定与实现
  3. 手机显示服务器无数据返回,服务器无返回数据处理
  4. ff14服务器维护怎么办,《FF14》8月20日维护到几点 最终幻想14服务器迁移维护公告...
  5. 等值连接_干货:16种等值线图的解读与应用,用快速规律解题
  6. java中min用法,java11教程--类MinguoDate用法
  7. 【迁移学习(Transfer L)全面指南】零次学习(Zero-Shot Learning)入门
  8. 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(三)
  9. 【深度学习】深度神经网络后处理之全连接CRFs(DenseCRF)
  10. 【PL/SQL的优点】