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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你了解虚拟专用网络(VPN)吗?
虚拟专用网络(VPN, Virtual Private Network) 是一种通过公共网络(如互联网)建立私密、安全网络连接的技术。VPN 允许用户或设备通过加密的隧道与远程服务器或内部网络进行通信,从而保护数据传输的安全性,并模拟与远程网络的直接连接。
神的孩子都在歌唱
2025/03/05
5080
你了解虚拟专用网络(VPN)吗?
华为、华三、思科高级网络工程师必经之路(6)我们的爱如同TCP连接,始终可靠,永不掉线——基于华为ENSP的VPN、GRE通用路由封装保姆级别详解
盛透侧视攻城狮
2024/12/29
2460
华为、华三、思科高级网络工程师必经之路(6)我们的爱如同TCP连接,始终可靠,永不掉线——基于华为ENSP的VPN、GRE通用路由封装保姆级别详解
什么是虚拟专用网以及有哪些实现方式(VPN篇)
虚拟专用网(VPN)相信IT人员是最熟悉的了,就算是一个不懂技术的多多少少也听过这个技术名词,特别是去年疫情其间流行的远程办公,大部分就通过VPN技术实现的,下面博主用实际场景介绍来带你走进新的知识点篇,企业组网常见的VPN系列。
网络之路一天
2024/01/08
9090
什么是虚拟专用网以及有哪些实现方式(VPN篇)
一文读懂华为防火墙不同类型 VPN 常见问题总结
远程办公和跨区域网络协作越来越普遍,VPN(虚拟专用网络)技术成为企业保障网络通信安全与便捷的重要工具。华为防火墙在 VPN 领域有着广泛的应用,不过,在实际使用过程中,不同类型的 VPN 难免会出现各种各样的问题。今天,阿祥就以华为防火墙为例,讲讲不同类型 VPN 常遇到的问题,希望能帮大家排忧解难。
ICT系统集成阿祥
2025/04/10
2280
一文读懂华为防火墙不同类型 VPN 常见问题总结
这些VPN知识你肯定没听过
在VPN出现之前,企业分支之间的数据传输只能依靠现有物理网络(例如Internet)。由于Internet中存在多种不安全因素,报文容易被网络中的黑客窃取或篡改,最终造成数据泄密、重要数据被破坏等后果。
ICT系统集成阿祥
2024/12/03
2110
这些VPN知识你肯定没听过
Cisco路由器之IPSec 虚拟专用网(内附配置案例)
一、虚拟专用网的定义 虚拟专用网就是在两个网络实体之间建立的一种受保护的连接,这两个实体可以通过点到点的链路直接相连,但通常情况下他们会相隔较远的距离。
小手冰凉
2019/11/07
3.1K1
VPN的消亡史:是谁在“炒作”零信任?
在过去的几十年里,企业虚拟专用网络 (VPN) 一直是远程办公的首选解决方案,它简单、价格合适且相对安全,但是这几年,关于企业 VPN是否已死的争论层出不穷。 分析公司 Gartner 甚至早在 2019 年就预言了VPN的消亡,Gartner预测(疫情前):“到 2023 年,60 % 的企业将逐步淘汰大部分VPN,转而使用 ZTNA(零信任网络访问)。” 在疫情出现之后,许多公司都开启了远程工作或混合工作模式,甚至这种情况将会常态化。这也让很多人开始好奇VPN和零信任之间到底应该如何选择。 VPN的消
SDNLAB
2022/06/17
4.7K0
VPN的消亡史:是谁在“炒作”零信任?
网络设备硬核技术内幕 防火墙与安全网关篇 (十一) 零接触办公的奥秘 上
早在十几年前,远程办公的概念就已经兴起,而直到最近,席卷半个地球的公共卫生危机才让远程办公真正火了一把。
用户8289326
2022/07/27
1.1K0
网络设备硬核技术内幕 防火墙与安全网关篇 (十一) 零接触办公的奥秘 上
虚拟专用网和IPv6路由配置【Cisco】
一、单播地址:最高4位是0010开头 —》2 相当于IPv4里的公网地址 如:2001::1 二、链路本地地址:最高10位是1111111010000000 --》FE80 只能在同一链路节点间使用。每台主机都会给自己配置一个链路本地地址 三、唯一本地地址:最高7位是1111110—》 FC00 只能在本地网络中使用 相当于IPv4中的私有地址 这类地址一般很少使用。 四、组播地址:最高位是11111111----》FF 相当于IPv4中的D类地址 在IPv6中,没有广播地址,广播使用组播实现 如:FF02::1 本地链路中的所有主机 FF02::2本地链路中的所有路由器
MIKE笔记
2023/03/23
1.3K0
虚拟专用网和IPv6路由配置【Cisco】
FastLearn-计网
除了以上指标,还有一些其他指标如网络帧率、网络响应时间、噪音和抖动等也可以用来评估计算机网络的性能。这些性能指标对于评估和优化网络性能,确保网络运行正常和满足用户需求非常重要。
浪漫主义狗
2023/09/04
2480
FastLearn-计网
tun设备的妙用-VPN篇
疫情期间,二哥在家远程工作了。因为每天都要通过VPN访问公司内部服务,二哥想起来,何不给大家介绍下VPN的工作原理呢?VPN协议有很多个,最典型的有IPSec和OpenVPN,这里二哥只聊OpenVPN。
LanceZhang
2022/06/20
5.9K0
tun设备的妙用-VPN篇
互联网十万个为什么之什么是WAN?
WAN(Wide Area Network,广域网)是指覆盖广泛地理区域的计算机网络,连接跨城市、跨国家乃至跨洲的不同局域网(LANs)或子网。WAN通过高速数据传输线路(如光纤、卫星链路)和公共网络传输控制协议,允许用户在远距离分享资源、数据和应用程序。常见例子包括互联网、企业或政府机构内部的私有网络以及电信运营商提供的VPN服务。
linus_lin
2024/09/25
3070
互联网十万个为什么之什么是WAN?
玉龙小栈: | DMVPN的基础工作原理
工作原理:DMVPN是一种基于mGRE的IPSec VPN技术,由mGRE、NHRP、IPSec和动态路由协议四个部分组成;mGRE是多点GRE隧道接口,使得单一的GRE接口可以支持多个IPsec隧道且简化配置;IPSec是对mGRE流量进行加密处理;保护根据NHRP和动态路由协议建立起来的网络间的临时隧道;NHRP允许分支机构采用动态IP地址,由中心站点来维护每个分支机构公网地址的NHRP数据库。
Ponnie
2021/02/24
2.5K0
L2TP 与 SSL 有什么区别?
L2TP 是一种 VPN,它将 PPP 数据包封装在隧道中,以便移动员工可以从 DCHP 服务器获取 IP 地址。换言之,L2TP VPN 在移动用户和 L2TP 网络服务器之间创建了一条私有路径。L2TP VPN建立后,移动用户和内网服务器之间的所有流量都是使用获取的内网IP地址发起的。并且这些数据包将再次被移动用户的公共IP地址封装,以便它们可以传输到Internet。整个过程,移动用户直接访问内网服务器(无需L2TP LNS代理)。
网络技术联盟站
2023/03/13
2.4K0
L2TP 与 SSL 有什么区别?
深入解析IDS/IPS与SSL/TLS和网络安全
防火墙是一种网络安全设备,用于监控和控制网络流量,保护网络免受未经授权的访问、恶意攻击和威胁。防火墙可以基于规则进行数据包过滤,允许或阻止特定类型的流量通过。常见的防火墙类型包括网络层防火墙和应用层防火墙。
久绊A
2023/12/18
5530
Cisco 路由器之Easy虚拟专用网(解决出差员工访问公司内网)
在之前写过了Cisco路由器之IPSec 虚拟专用网;在Cisco的ASA防火墙上实现IPSec虚拟专用网。这两篇博文都是用于实现总公司和分公司之间建立虚拟专用网的,那么还有一种使用很多的情况,就是出差人员想要访问公司内网的资源呢?由于出差人员只是单一的一个客户端,所以和前两篇博文不一样,前两篇博文.da.建.虚.拟.专.用网,两端设备都是路由器或防火墙,有固定的IP地址,所以呢,并不能实现出差人员访问,这篇博文的目的,就是实现出差人员可以访问公司内网资源的,这个技术被称之为——Easy 虚拟专用网。
小手冰凉
2019/11/13
1K0
L2TP 与 SSL 有什么区别?
L2TP VPN 和 SSL VPN 都用于 Internet 用户访问内部网络。那么,它们之间有什么区别,我们应该选择哪一个呢?
网络技术联盟站
2022/04/30
1.8K0
L2TP 与 SSL 有什么区别?
网络安全技术复习
网络系统的软件、硬件以及系统中存储和传输的数据受到保护,不因偶然的或者恶意的原因而遭到破坏、更改、泄露,网络系统连续可靠正常地运行,网络服务不中断。
小简
2022/12/29
1.2K0
网络安全技术复习
一文读懂IPSec
IPSec(互联网协议安全)是一个安全网络协议套件,用于保护互联网或公共网络传输的数据。IETF在 1990 年代中期开发了 IPSec 协议,它通过 IP网络数据包的身份验证和加密来提供 IP 层的安全性。 IPSec简介 IPSec 可为通信两端设备提供安全通道,比如用于两个路由器之间以创建点到点 VPN,以及在防火墙和 Windows 主机之间用于远程访问 VPN等。IPSec可以实现以下4项功能: 数据机密性:IPSec发送方将包加密后再通过网络发送,可以保证在传输过程中,即使数据包遭截取,信息也无
SDNLAB
2022/07/08
13.3K0
一文读懂IPSec
华为ensp中路由器IPSec VPN原理及配置命令(超详解)
虚拟专用网络(VPN)通过在您的设备和远程服务器之间创建加密隧道来工作。该隧道可保护您的互联网流量免受窥探,即使您使用的是公共 Wi-Fi 网络。
神秘泣男子
2024/06/03
2.9K0
华为ensp中路由器IPSec VPN原理及配置命令(超详解)
推荐阅读
相关推荐
你了解虚拟专用网络(VPN)吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验