TensorFlow 教程 --教程--2.8循环神经网络
介绍
可以在 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_bprobabilities = 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 校对:HongyangWang
TensorFlow 教程 --教程--2.8循环神经网络相关推荐
- Tensorflow与keras学习 (3)——循环神经网络RNN
循环神经网络RNN 3.1 RNN与LSTM介绍: 循环神经网络中的神经单元类似于模拟数字电路技术中的门电路,具有很多控制门来控制输入输出. RNN结构: LSTM结构: 相比与传统的神经网络,RNN ...
- TensorFlow学习笔记之六(循环神经网络RNN)
文章目录 1. 循环神经网络简介 1. 循环神经网络简介 循环神经网络源自于1982年由 Saratha Sathasivam提出的霍普菲尔德网络. 循环神经网络的主要用途是处理和预测序列数据,循环神 ...
- Tensorflow基础教程5:循环神经网络(RNN)讲解
在开始学习之前推荐大家可以多在 FlyAI竞赛服务平台 多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供项目开源算法样例 ...
- 循环神经网络教程-第一部分 RNN介绍
循环神经网络教程-第一部分 RNN介绍 循环神经网络(RNN)是非常流行的模型,它在许多NLP任务上都表现出了巨大的潜力.虽然它很流行,但是详细介绍RNN以及如何实现RNN的文章却很少.这篇教程旨在解 ...
- 循环神经网络教程第二部分-用python,numpy,theano实现一个RNN
作者:徐志强 链接:https://zhuanlan.zhihu.com/p/22289383 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在本部分,我们将会从头 ...
- 深度学习与计算机视觉教程(11) | 循环神经网络及视觉应用(CV通关指南·完结)
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/37 本文地址:https://www.showmeai.tech/article-d ...
- 【深度学习】循环神经网络(RNN)简易教程
文章来源于磐创AI,作者VK 磐创AI分享 作者 | Renu Khandelwal 编译 | VK 来源 | Medium 我们从以下问题开始 循环神经网络能解决人工神经网络和卷积神经网络存 ...
- 循环神经网络(RNN)简易教程
作者|Renu Khandelwal 编译|VK 来源|Medium 我们从以下问题开始 循环神经网络能解决人工神经网络和卷积神经网络存在的问题. 在哪里可以使用RNN? RNN是什么以及它是如何工作 ...
- Tensorflow快餐教程(12) - 用机器写莎士比亚的戏剧
高层框架:TFLearn和Keras 上一节我们学习了Tensorflow的高层API封装,可以通过简单的几步就生成一个DNN分类器来解决MNIST手写识别问题. 尽管Tensorflow也在不断推进 ...
最新文章
- 跳一跳j算法ava代码_DBSCAN聚类算法的理解与应用
- Response.ContentType所有类型例举
- SharePoint 2010 产品六大功能模块
- 微软觊觎LinkedIn算法
- 你的php网页乱码了吗
- The DotNet Garbage Collection
- VC2008配置设置(转)
- Loadrunner2021安装教程
- 阐述游戏关卡设计中的色彩理论
- 移动端车牌识别SDK应用
- 小米note3如何打开usb调试
- 小程序战局最新动态!这些你应该知道
- 1.1 win10下wget的安装
- 三星s4流量显示无服务器,三星s4有什么隐藏功能
- 解决Google Drive 大文件下载过程中中途失败问题
- Http Live Streaming介绍和应用
- 远程视图 RemoteViews
- 对国家最新战略“新基建”的解读,一起把握赚钱的机会
- 石墨烯/SiO2复合气凝胶微球/包覆二氧化硅纳米颗粒/载Pt石墨烯中空二氧化硅微球
- qtCharts----柱状图、折线图、饼图、曲线图
热门文章
- 进程/线程间的同步方式
- 计算机主机的奥秘,揭秘网吧电脑为何流畅的奥秘
- 英语四级关于计算机阅读理解,英语四级阅读模拟训练附答案和精讲 第6篇:学习计算机...
- JavaScript重难点解析6(Promise)
- flush什么意思中文翻译_flush是什么意思
- 信访问题归并处理_最高法判例:行政机关以信访形式处理履行法定职责问题的起诉期限...
- mybatis 多参数处理
- 安卓模拟器切换横屏之后怎么返回竖屏
- jquery.imageScroller实现图片滚动
- HDU 1059 Dividing 多重背包