深度学习研究草稿笔记(1)

1. rnn的相关简单代码

from tensorflow.models.rnn import rnn改为
import tensorflow.contrib.rnn as rnn

rnn.rnn(cell, inputs, initial_state=self._initial_state)改为
rnn.static_rnn(cell, inputs, initial_state=self._initial_state)

tf.reshape(tf.concat(outputs,1), [-1, size])。
reshape中-1表示该维度的尺寸是从其它维度推算出来。
concat表示沿指定的维度重新拼接矩阵。
t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 0) # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 1) # [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]

state = m.initial_state.eval()
tf.Session().run() 与 Tensor.eval():假设 x 为 tf 下的一个 Tensor 对象,t.eval() 执行的动作就是 tf.Session().run(t) 。

import tensorflow as tf
x = tf.constant([5.])
print(tf.Session().run(x))
with tf.Session():
    print(x.eval())

2. LSTM时间序列预测的资源

2.1 2017820前
2.2 LSTM介绍的博客

3. LSTM理解博文阅读

  • RNN简单结构图。
    RNN图
  • 长期依赖使得训练很困难,Bengio分析其中根本原因,在这篇论文中分析了原因
  • LSTM网络,Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由 Hochreiter & Schmidhuber (1997) 提出,并在近期被 Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。
    1)标准的RNN
    这里写图片描述
    2)LSTM结构
    这里写图片描述
    图中图标元素的含义:
    这里写图片描述
    细胞状态:
    这里写图片描述
    门结构,一个细胞中共有3个这种门,用来在细胞之间传递状态:
    这里写图片描述
    门的数学计算公式:
    这里写图片描述
    其输入为h(t-1), x(t),输出为0-1之间的遗忘因子,再与信息相乘,得到遗忘后的信息。
    总结一下LSTM的关键数学公式,要多背!!
    ft=σ(Wf[ht1,xt]+bf)it=σ(Wi[ht1,xt]+bi)C~t=tanh(WC[ht1,xt]+bC)Ct=ftCt1+itC~tot=σ(Wo[ht1,xt]+bo)ht=ottanh(Ct)

    总结一下:一个细胞三个门六个公式
    3)LSTM的变体
  • Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”
  • coupled 忘记和输入门, Ct=ftCt1+(1ft)C~t
  • Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出。
  • Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出
    Jozefowicz, et al. (2015) 则在超过 1 万中 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。
    4)注意力(attention)、Grid LSTM、生成模型RNN有可能是未来的突破。注意力LSTMGrid LSTM生成模型RNN

4. 多层LSTM博文理解

4.1 DropoutWrapper
if is_training and config.keep_prob < 1: # 在外面包裹一层dropout
    lstm_cell = tf.nn.rnn_cell.DropoutWrapper(
        lstm_cell, output_keep_prob=config.keep_prob)

所谓dropout,就是指网络中每个单元在每次有数据流入时以一定的概率(keep prob)正常工作,否则输出0值。这是是一种有效的正则化方法,可以有效防止过拟合。在rnn中使用dropout的方法和cnn不同。
在rnn中进行dropout时,对于rnn的部分不进行dropout,也就是说从t-1时候的状态传递到t时刻进行计算时,这个中间不进行memory的dropout;仅在同一个t时刻中,多层cell之间传递信息的时候进行dropout,如下图所示:
这里写图片描述
上图中,t-2时刻的输入xt−2首先传入第一层cell,这个过程有dropout,但是从t−2时刻的第一层cell传到t−1,t,t+1的第一层cell这个中间都不进行dropout。再从t+1时候的第一层cell向同一时刻内后续的cell传递时,这之间又有dropout了。

4.2 梯度修剪

tf.clip_by_global_norm ,修正梯度值,用于控制梯度爆炸的问题。梯度爆炸和梯度弥散的原因一样,都是因为链式法则求导的关系,导致梯度的指数级衰减。为了避免梯度爆炸,需要对梯度进行修剪。

Lic=LitNcmax(Nc,Ng)Ng=i(Lit)2

进一步上式可写为,可以看出大于Nc就开始修剪:
Lic={Lit,(Ng<=Nc)LitNcNg,(Ng>Nc)Ng=i(Lit)2

其它

其实一个in-graph就是模型并行,将模型中不同节点分布式地运行;between-graph就是数据并行,同时训练多个batch的数据。要针对神经网络结构来设计,模型并行实现难度较大,而且需要网络中天然存在很多可以并行的节点。因此一般用数据并行的比较多。
会集成越来越多的contrib模块,添加很多方便的上层接口,支持更多的语言绑定。同时新推出的XLA(JIT编译器),Fold(Dynamics Batching)都是未来的大方向。
XLA会对几个层叠的操作进行JIT编译。cuda是一门语言,cudnn是深度学习的库,使用cuda加速也要看是怎么使用它加速,是一层计算执行一次,还是把几层的计算合并在一起执行,XLA做的就是这个,将一些简单的操作编译合并成一个操作。此前TensorFlow训练MLP等网络较慢,使用XLA后有。

黄文坚: Google内部非常多team在使用tensorflow,比如搜索、邮件、语音、机器翻译等等。数据越大,深度学习效果越好,而支持分布式的tensorflow就能发挥越大的作用。 6个月前
唐源Terry: 应用非常广的,谷歌已经在很多项目上用了TensorFlow,比如说Youtube watch next,还有很多研究型的项目,谷歌DeepMind以后所有的研究都会使用这个框架。如果对某段代码好奇,可以去参考参考源代码学习学习,很多的设计都是经过内部各种项目和用户的千锤百炼。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值