Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TensorFlow深度学习笔记 循环神经网络实践

TensorFlow深度学习笔记 循环神经网络实践

作者头像
梦里茶
发布于 2018-01-15 07:33:40
发布于 2018-01-15 07:33:40
1K00
代码可运行
举报
文章被收录于专栏:梦里茶室梦里茶室
运行总次数:0
代码可运行

加载数据

  • 使用text8作为训练的文本数据集

text8中只包含27种字符:小写的从a到z,以及空格符。如果把它打出来,读起来就像是去掉了所有标点的wikipedia。

  • 直接调用lesson1中maybe_download下载text8.zip
  • 用zipfile读取zip内容为字符串,并拆分成单词list
  • 用connections模块统计单词数量并找出最常见的单词

达成随机取数据的目标

构造计算单元

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
embeddings = tf.Variable(
        tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
  • 构造一个vocabulary_size x embedding_size的矩阵,作为embeddings容器
  • 有vocabulary_size个容量为embedding_size的向量,每个向量代表一个vocabulary,
  • 每个向量的中的分量的值都在-1到1之间随机分布
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
embed = tf.nn.embedding_lookup(embeddings, train_dataset)
  • 调用tf.nn.embedding_lookup,索引与train_dataset对应的向量,相当于用train_dataset作为一个id,去检索矩阵中与这个id对应的embedding
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss = tf.reduce_mean(
        tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,
                                   train_labels, num_sampled, vocabulary_size))
  • 采样计算训练损失
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)
  • 自适应梯度调节器,调节embedding列表的数据,使得偏差最小
  • 预测,并用cos值计算预测向量与实际数据的夹角作为预测准确度(相似度)指标

传入数据进行训练

  • 切割数据用于训练,其中:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data_index = (data_index + 1) % len(data)
  • 依旧是每次取一部分随机数据传入
  • 等距离截取一小段文本
  • 构造训练集:每个截取窗口的中间位置作为一个train_data
  • 构造标签:每个截取窗口中,除了train_data之外的部分,随机取几个成为一个list,作为label(这里只随机取了一个)
  • 这样就形成了根据目标词汇预测上下文的机制,即Skip-gram
  • 训练100001次,每2000次输出这两千次的平均损失
  • 每10000次计算相似度,并输出与验证集中的词最接近的词汇列表
  • 用tSNE降维呈现词汇接近程度
  • 用matplotlib绘制结果

实现代码见word2vec.py

CBOW

上面训练的是Skip-gram模型,是根据目标词汇预测上下文,而word2vec还有一种方式,CBOW,根据上下文预测目标词汇。

实际上就是将Skip-gram中的输入输出反过来。

  • 修改截取数据的方式
  • 构造标签:每个截取窗口的中间位置作为一个train_label
  • 构造训练集:每个截取窗口中,除了train_label之外的部分,作为train_data(这里只随机取了一个)
  • 这样就形成了根据上下文预测目标词汇的机制,即CBOW
  • 分别从embeding里找到train_data里每个word对应的vector,用tf.reduce_sum将其相加,将相加结果与train_label比较
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Look up embeddings for inputs.
embed = tf.nn.embedding_lookup(embeddings, train_dataset)
# sum up vectors on first dimensions, as context vectors
embed_sum = tf.reduce_sum(embed, 0)
  • 训练中依旧是调节embeding的参数来优化loss
  • 训练结果如下图,可以看到不同单词的接近程度

代码见: cbow.py

RNN 造句

整体思路是,以一个文本中的一个词作为train data,后续的所有词作为train label,从而能够根据一个给定词,预测后续的片段。

训练数据

  • BatchGenerator
  • text: 全部的文本数据
  • text_size:全部文本的字符串长度
  • batch_size:每段训练数据的大小
  • num_unrollings:要生成的训练数据段的数目
  • segment:整个训练数据集可以分成几个训练数据片段
  • cursor:重要,
  • 一开始记录每个训练数据片段的起始位置坐标,即这个片段位于text的哪个index
  • 执行next_batch生成一个训练数据的时候,游标会从初始位置自增,直到取够batch_size个数据
  • last_batch:上一个训练数据片段
  • 每调用一次next,生成一个num_unrollings长的array,以last_batch开头,跟着num_unrollings个batch
  • 每个batch的作为train_input,每个batch后面的一个batch作为train_label,每个step训练num_unrolling个batch

lstm-cell

  • 为了解决消失的梯度问题,引入lstm-cell,增强model的记忆能力
  • 根据这篇论文设计lstm-cell: http://arxiv.org/pdf/1402.1128v1.pdf
  • 分别有三个门:输入门,遗忘门,输出门,构成一个cell
  • 输入数据是num_nodes个词,可能有vocabulary_size种词
  • 输入门:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  input_gate = sigmoid(i * ix + o * im + ib)

- 给输入乘一个vocabulary_size * num_nodes大小的矩阵,给输出乘一个num_nodes * num_nodes大小的矩阵; - 用这两个矩阵调节对输入数据的取舍程度 - 用sigmoid这个非线性函数进行激活

  • 遗忘门:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  forget_gate = sigmoid(i * fx + o * fm + fb)

思路同输入门,用以对历史数据做取舍

  • 输出门:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  output_gate = sigmoid(i * ox + o * om + ob)

思路同输入门,用以对输出状态做取舍

  • 组合:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  update = i * cx + o * cm + cb
  state = forget_gate * state + input_gate * tanh(update)
  lstm_cell = output_gate * tanh(state)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 用同样的方式构造新状态update
- 用遗忘门处理历史状态state
- 用tanh激活新状态update
- 用输入门处理新状态update
- 整合新旧状态,再用tanh激活状态state
- 用输出门处理state

lstm优化

上面的cell中,update,output_gate,forget_gate,input_gate计算方法都是一样的, 可以把四组参数分别合并,一次计算,再分别取出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
values = tf.split(1, gate_count, tf.matmul(i, input_weights) + tf.matmul(o, output_weights) + bias)
input_gate = tf.sigmoid(values[0])
forget_gate = tf.sigmoid(values[1])
update = values[2]

再将lstm-cell的输出扔到一个WX+b中调整作为输出

实现代码见singlew_lstm.py

Optimizer

  • 采用one-hot encoding作为label预测
  • 采用交叉熵计算损失
  • 引入learning rate decay

Flow

  • 填入训练数据到placeholder中
  • 验证集的准确性用logprob来计算,即对可能性取对数
  • 每10次训练随机挑取5个字母作为起始词,进行造句测试
  • 你可能注意到输出的sentence是由sample得到的词组成的,而非选择概率最高的词,这是因为,如果一直取概率最高的词,最后会一直重复这个概率最高的词

实现代码见lstm.py

Beam Search

上面的流程里,每次都是以一个字符作为单位,可以使用多一点的字符做预测,取最高概率的那个,防止特殊情况导致的误判

在这里我们增加字符为2个,形成bigram,代码见:bigram_lstm.py

主要通过BigramBatchGenerator类实现

Embedding look up

由于bigram情况下,vocabulary_size变为 27*27个,使用one-hot encoding 做predict的话会产生非常稀疏的矩阵,浪费算力,计算速度慢

因此引入embedding_lookup,代码见embed_bigram_lstm.py

  • 数据输入:BatchGenerator不再生成one-hot-encoding的向量作为输入,而是直接生成bigram对应的index列表
  • embedding look up调整embedding,使bigram与vector对应起来
  • 将embedding look up的结果喂给lstm cell即可
  • 输出时,需要将label和output都转为One-hot-encoding,才能用交叉熵和softmax计算损失
  • 在tensor里做data到one-hot-encoding转换时,主要依赖tf.gather函数
  • 在对valid数据做转换时,主要依赖one_hot_voc函数

Drop out

  • 在lstm cell中对input和output做drop out
  • Refer to this article

Seq2Seq

  • 最后一个问题是,将一个句子中每个词转为它的逆序字符串,也就是一个seq到seq的转换
  • 正经的实现思路是,word 2 vector 2 lstm 2 vector 2 word
  • 不过tensorflow已经有了这样一个模型来做这件事情:Seq2SeqModel,关于这个模型可以看这个分析 以及tensorflow的example
  • 只需要从batch中,根据字符串逆序的规律生成target sequence,放到seq2seqmodel里即可,主要依赖rev_id函数
  • 实现见seq2seq.py
  • 注意,用Seq2SeqModel的时候,size和num_layer会在学习到正确的规律前就收敛,我把它调大了一点
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def create_model(sess, forward_only):
    model = seq2seq_model.Seq2SeqModel(source_vocab_size=vocabulary_size,
                                       target_vocab_size=vocabulary_size,
                                       buckets=[(20, 21)],
                                       size=256,
                                       num_layers=4,
                                       max_gradient_norm=5.0,
                                       batch_size=batch_size,
                                       learning_rate=1.0,
                                       learning_rate_decay_factor=0.9,
                                       use_lstm=True,
                                       forward_only=forward_only)
    return model
  • 参数含义
  • source_vocab_size: size of the source vocabulary.
  • target_vocab_size: size of the target vocabulary.
  • buckets: a list of pairs (I, O), where I specifies maximum input length that will be processed in that bucket, and O specifies maximum output length. Training instances that have inputs longer than I or outputs longer than O will be pushed to the next bucket and padded accordingly. We assume that the list is sorted, e.g., [(2, 4), (8, 16)].
  • size: number of units in each layer of the model.
  • num_layers: number of layers in the model.
  • max_gradient_norm: gradients will be clipped to maximally this norm.
  • batch_size: the size of the batches used during training; the model construction is independent of batch_size, so it can be changed after initialization if this is convenient, e.g., for decoding.
  • learning_rate: learning rate to start with.
  • learning_rate_decay_factor: decay learning rate by this much when needed.
  • use_lstm: if true, we use LSTM cells instead of GRU cells.
  • num_samples: number of samples for sampled softmax.
  • forward_only: if set, we do not construct the backward pass in the model.

参考链接

觉得我的文章对您有帮助的话,不妨点个star

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-06-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tensorflow实现word2vec
摘要总结:本文研究了如何通过使用技术社区中的内容编辑人员来提高内容质量,并总结了相关的方法和实践。
GavinZhou
2018/01/02
1.4K0
Tensorflow实现word2vec
【NLP实战】如何基于Tensorflow搭建一个聊天机器人
实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式。因此,NLP专栏计划推出一个实战专栏,让有兴趣的同学在看文章之余也可以自动动手试一试。
用户1508658
2019/11/06
8340
【NLP实战】如何基于Tensorflow搭建一个聊天机器人
Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化|附代码数据
本文探索Python中的长短期记忆(LSTM)网络,以及如何使用它们来进行股市预测 ( 点击文末“阅读原文”获取完整代码数据******** )。
拓端
2023/06/06
5610
TensorFlow实现Attention机制原理介绍论文阅读代码实现
原理介绍 图片1 图片2 图片3 更多资料: https://distill.pub/2016/augmented-rnns/#attentional-interfaces https://
致Great
2018/06/13
8.8K0
Word2vec原理浅析及tensorflow实现
词向量的重要意义在于将自然语言转换成了计算机能够理解的向量。相对于词袋模型、TF-IDF等模型,词向量能抓住词的上下文、语义,衡量词与词的相似性,在文本分类、情感分析等许多自然语言处理领域有重要作用。
用户1332428
2018/07/30
6360
Word2vec原理浅析及tensorflow实现
mxnet RNN简单剖析官方github教程部分代码
import mxnet as mx 官方github教程部分代码 网络生成 num_layers = 2 num_hidden = 256 stack = mx.rnn.SequentialRNNCell() for i in range(num_layers): stack.add(mx.rnn.LSTMCell(num_hidden=num_hidden, prefix='lstm_l%d_'%i)) mx.rnn.SequentialRNNCell():RNN容器,用于组合多个RNN层
月见樽
2018/04/27
1.3K0
mxnet RNN简单剖析官方github教程部分代码
使用TensorFlow训练循环神经网络语言模型
读了将近一个下午的TensorFlow Recurrent Neural Network教程,翻看其在PTB上的实现,感觉晦涩难懂,因此参考了部分代码,自己写了一个简化版的Language Model,思路借鉴了Keras的LSTM text generation。
Gaussic
2018/08/17
8980
使用TensorFlow训练循环神经网络语言模型
深度学习 | 时序问题LSTM入门讲解
Recurrent Neural NetWork (RNN) 用于处理序列数据,序列数据预测模型的特点是某一步的输出不仅依赖于这一步的输入,还依赖于其他步的输入或输出。传统的序列数据机器学习模型有Hidden Markov Model (隐马尔可夫模型)、Conditional Random Field (条件随机场)。近年来,深度学习模型又带来了RNN,标准RNN结构极为简单,只有一个tanh层,其模型结构见图1。
郭好奇同学
2021/07/30
2.7K0
深度学习 | 时序问题LSTM入门讲解
学习笔记 TF059 :自然语言处理、智能聊天机器人
本文介绍了自然语言处理技术在金融智能客服系统中的应用和实践。通过引入对话智能引擎,将自然语言处理技术应用于客服场景,实现快速、准确地回答客户问题,提升客户体验。同时,利用深度学习技术对大量语料进行训练,使得系统能够更好地理解用户意图和上下文信息,从而提供更准确的服务。
利炳根
2017/11/06
1.8K0
《Scikit-Learn与TensorFlow机器学习实用指南》 第14章 循环神经网络
击球手击出垒球,你会开始预测球的轨迹并立即开始奔跑。你追踪着它,不断调整你的移动步伐,最终在观众的掌声中抓到它。无论是在听完朋友的话语还是早餐时预测咖啡的味道,你时刻在做的事就是在预测未来。在本章中,我们将讨论循环神经网络 -- 一类预测未来的网络(当然,是到目前为止)。它们可以分析时间序列数据,诸如股票价格,并告诉你什么时候买入和卖出。在自动驾驶系统中,他们可以预测行车轨迹,避免发生交通意外。更一般地说,它们可在任意长度的序列上工作,而不是截止目前我们讨论的只能在固定长度的输入上工作的网络。举个例子,它们可以把语句,文件,以及语音范本作为输入,使得它们在诸如自动翻译,语音到文本或者情感分析(例如,读取电影评论并提取评论者关于该电影的感觉)的自然语言处理系统中极为有用。
SeanCheney
2018/12/14
7810
《Scikit-Learn与TensorFlow机器学习实用指南》 第14章 循环神经网络
(一)Tensorflow搭建普通神经网络实现MNIST手写字体识别及预测
输入层数据为维度(1, 784),其中1表示数据数量,因为网络一次只处理一张图片,所以为1,784是图像数据维度,将$28\times 28 \times1$的数据处理成一个列向量,便于存储,若向显示,则需要将其回复到源尺寸,参见博客MNIST手写字体数据集解析.
xdq101
2019/05/31
1.2K0
(一)Tensorflow搭建普通神经网络实现MNIST手写字体识别及预测
如何用 TensorFlow 实现基于 LSTM 的文本分类(附源码)
引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实例,这个星期就用tensorflow实现了一下,感觉和之前使用的theano还是
AI研习社
2018/03/29
1.5K0
如何用 TensorFlow 实现基于 LSTM 的文本分类(附源码)
【NLP实战】tensorflow词向量训练实战
实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式。因此,NLP专栏计划推出一个实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试。
用户1508658
2019/10/14
1.1K0
【NLP实战】tensorflow词向量训练实战
【深度学习入门篇 ⑨】循环神经网络实战
循环神经网络 (RNN)是一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接受其它神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。
@小森
2024/07/25
1400
【深度学习入门篇 ⑨】循环神经网络实战
图解一致性哈希算法,全网(小区局域网)最通俗易懂
word2vec是google 2013年提出的,从大规模语料中训练词向量的模型,在许多场景中都有应用,信息提取相似度计算等等。也是从word2vec开始,embedding在各个领域的应用开始流行,所以拿word2vec来作为开篇再合适不过了。本文希望可以较全面的给出Word2vec从模型结构概述,推导,训练,和基于tf.estimator实现的具体细节。完整代码戳这里https://github.com/DSXiangLi/Embedding
不会飞的小鸟
2020/08/02
4580
tensorflow学习笔记(二十六):构建TF代码
本文介绍了如何使用TensorFlow和Keras构建一个简单的基于LSTM的文本分类器,并使用PTB数据集进行训练。首先,我们介绍了如何使用TensorFlow构建一个简单的LSTM模型,然后使用Keras封装了LSTM模型,并使用PTB数据集进行训练。最后,我们介绍了如何使用训练好的模型进行分类,并给出了代码示例。
ke1th
2018/01/02
8660
循环神经网络(RNN)与LSTM
循环神经网络(Recurrent Neural Networks, RNN)是一种专门用于处理序列数据的神经网络。RNN通过将前一个时间步的输出反馈到当前时间步,使得模型能够“记住”之前的输入信息,从而适合处理时间序列或文本等有序数据。
LucianaiB
2025/01/24
3780
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
LSTM(长短期记忆网络)是一种循环神经网络(RNN)的变体,用于处理序列数据。它具有记忆单元和门控机制,可以有效地捕捉长期依赖关系。
Qomolangma
2024/07/30
1.4K0
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
[TensorFlow深度学习深入]实战一·使用embedding_lookup模块对Word2Vec训练保存与简单使用
One hot representation用来表示词向量非常简单,但是却有很多问题。最大的问题是我们的词汇表一般都非常大,比如达到百万级别,这样每个词都用百万维的向量来表示简直是内存的灾难。这样的向量其实除了一个位置是1,其余的位置全部都是0,表达的效率不高,能不能把词向量的维度变小呢?
小宋是呢
2019/06/27
1.8K0
深度学习算法中的长短期记忆网络(Long Short-Term Memory)
深度学习是一种在人工智能领域中具有重要影响力的技术,它已经在各种任务中取得了显著的成果。而在深度学习算法中,长短期记忆网络(Long Short-Term Memory,LSTM)是一种特殊的循环神经网络(Recurrent Neural Network,RNN),它在序列数据建模中具有出色的能力。本文将深入探讨LSTM网络的原理和应用,以及它在深度学习领域的重要性。
大盘鸡拌面
2023/09/19
1.5K0
推荐阅读
相关推荐
Tensorflow实现word2vec
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验