双向RNN:bidirectional_dynamic_rnn()函数

先说下为什么要使用到双向RNN,在读一篇文章的时候,上文提到的信息十分的重要,但这些信息是不足以捕捉文章信息的,下文隐含的信息同样会对该时刻的语义产生影响。

举一个不太恰当的例子,某次工作会议上,领导进行“简洁地”总结,他会在第一句告诉你:“下面,为了节约时间,我简单地说两点…”,(…此处略去五百字…),“首先,….”,(…此处略去一万字…),“碍于时间的关系,我要加快速度了,下面我简要说下第二点…”(…此处再次略去五千字…)“好的,我想说的大概就是这些”(…此处又略去了二百字…),“谢谢大家!”如果将这篇发言交给一个单层的RNN网络去学习,因为“首先”和“第二点”中间隔得实在太久,等到开始学习“第二点”时,网络已经忘记了“简单地说两点”这个重要的信息,最终的结果就只剩下在风中凌乱了。。。于是我们决定加一个反向的网络,从后开始往前听,对于这层网络,他首先听到的就是“第二点”,然后是“首先”,最后,他对比了一下果然仅仅是“简要地两点”,在于前向的网络进行结合,就深入学习了领导的指导精神。

上图是一个双向LSTM的结构图,对于最后输出的每个隐藏状态 h h h 都是前向网络和后向网络的元组,即 h=(h←,h→)" role="presentation">h=(h←,h→)h=(h←,h→)h = (\overleftarrow{h},\overrightarrow{h})。其中每一个 h← h ← \overleftarrow{h}或者 h→ h → \overrightarrow{h}又是一个由隐藏状态和细胞状态组成的元组(或者是concat)。同样最终的output也是需要将前向和后向的输出concat起来的,这样就保证了在最终时刻,无论是输出还是隐藏状态都是有考虑了上文和下文信息的。

下面就来看下tensorflow中已经集成的 tf.nn.bidirectional_dynamic_rnn() 函数。似乎双向的暂时只有这一个动态的RNN方法,不过想想也能理解,这种结构暂时也只会在encoder端出现,无论你的输入是pad到了定长或者是不定长的,动态RNN都是可以处理的。具体的定义如下:

tf.nn.bidirectional_dynamic_rnn(cell_fw,cell_bw,inputs,sequence_length=None,initial_state_fw=None,initial_state_bw=None,dtype=None,parallel_iterations=None,swap_memory=False,time_major=False,scope=None
)

仔细看这个方法似乎和dynamic_rnn()没有太大区别,无非是多加了一个bw的部分,事实上也的确如此。先看下前向传播的部分:

with vs.variable_scope(scope or "bidirectional_rnn"):# Forward directionwith vs.variable_scope("fw") as fw_scope:output_fw, output_state_fw = dynamic_rnn(cell=cell_fw, inputs=inputs,  sequence_length=sequence_length,initial_state=initial_state_fw, dtype=dtype,parallel_iterations=parallel_iterations, swap_memory=swap_memory,scope=fw_scope)

完全就是一个dynamic_rnn(),至于你选择LSTM或者GRU,只是cell的定义不同罢了。而双向RNN的核心就在于反向的bw部分。刚才说过,反向部分就是从后往前读,而这个翻转的部分,就要用到一个reverse_sequence()的方法,来看一下这一部分:

with vs.variable_scope("bw") as bw_scope:#  ———————————— 此处是重点 ———————————— inputs_reverse = _reverse(inputs, seq_lengths=sequence_length,seq_dim=time_dim, batch_dim=batch_dim)#  ————————————————————————————————————tmp, output_state_bw = dynamic_rnn(cell=cell_bw, inputs=inputs_reverse, sequence_length=sequence_length,initial_state=initial_state_bw, dtype=dtype,parallel_iterations=parallel_iterations,swap_memory=swap_memory,time_major=time_major, scope=bw_scope)

我们可以看到,这里的输入不再是inputs,而是一个inputs_reverse,根据time_major的取值,time_dim和batch_dim组合的 {0,1} 取值正好相反,也就对应了时间维和批量维的词序关系。

而最终的输出:

outputs = (output_fw, output_bw)
output_states = (output_state_fw, output_state_bw)

这里还有最后的一个小问题,output_states是一个元组的元组,我个人的处理方法是用c_fw,h_fw = output_state_fwc_bw,h_bw = output_state_bw,最后再分别将c和h状态concat起来,用tf.contrib.rnn.LSTMStateTuple()函数生成decoder端的初始状态。

双向RNN:bidirectional_dynamic_rnn()函数相关推荐

  1. rnn按时间展开_双向RNN的理解

    我们在学习某种神经网络模型时,一定要把如下几点理解透了,才算真正理解了这种神经网络. 网络的架构:包含那些层,每层的输入和输出,有那些模型参数是待优化的 前向传播算法 损失函数的定义 后向传播算法 什 ...

  2. BiLSTM+CRF (一)双向RNN 浅谈

    引言 为什么要使用双向的RNN? 一般的按序列顺序过来的RNN会记录.保存来自前面序列的信息,这些历史信息对当前的输出是很有帮助的.但是有些问题,序列当前位置历史信息和这个位置未来的信息会共同对计算当 ...

  3. 深度学习学习笔记——RNN(LSTM、GRU、双向RNN)

    目录 前置知识 循环神经网络(RNN) 文本向量化 RNN 建模 RNN 模型改进 LSTM(Long Short Term Memory) LSTM变形与数学表达式 门控循环单元GRU(Grated ...

  4. lstm原始论文_RNN及其改版(LSTM, 双向RNN, seq2seq)总结

    RNN(Recurrent Neural Networks) 循环神经网络 目的:考虑连续数据的前后关联影响. 方法:将前(和/或 后)方的数据作为一个权重加入到原有推断中. 作用:预测分析,语义分析 ...

  5. JCIM| 基于双向RNN的分子生成模型

    今天给大家介绍的是被誉为"欧陆第一名校"苏黎世联邦理工学院(ETH Zurich)化学与应用生物科学系博士生Francesca Grisoni和制药行业顾问Gisbert Schn ...

  6. Tensorflow:tf.contrib.rnn.DropoutWrapper函数(谷歌已经为Dropout申请了专利!)、MultiRNNCell函数的解读与理解

    Tensorflow:tf.contrib.rnn.DropoutWrapper函数(谷歌已经为Dropout申请了专利!).MultiRNNCell函数的解读与理解 目录 1.tf.contrib. ...

  7. 【Pytorch神经网络理论篇】 18 循环神经网络结构:LSTM结构+双向RNN结构

    1 深层循环神经网络的构建 在深层网络结构中,会将简单的RNN模型从两个角度进行改造,具体如下. 使用更复杂的结构作为RNN模型的基本单元,使其在单层网络上提取更好的记忆特征. 将多个基本单元结合起来 ...

  8. Lasagne教程+实现双向RNN

    一.Run the MNIST example 1. 多层感知机(Multi-Layer Perceptron) (1)InputLayer是一个输入基础. 其中输入的input_var是一个thea ...

  9. 双向LSTM (BiLSTM) (双向RNN)

    为什么用双向 RNN? 单向的 RNN,是根据前面的信息推出后面的,但有时候只看前面的词是不够的, 例如, 我今天不舒服,我打算____一天. 只根据'不舒服',可能推出我打算'去医院','睡觉',' ...

最新文章

  1. python自动修图_程序员不会用PS给女朋友修图?没关系,用Python十行代码轻松搞定-站长资讯中心...
  2. 哈佛成功金句25则(看一遍,都会很有收获!)
  3. IOS atomic与nonatomic,assign,copy与retain的定义和区别
  4. 【软件设计师】2020-08-06
  5. 分布式光伏补贴_光伏发电上网电价政策综述
  6. python property作用_python中@property的作用和getter setter的解释
  7. C++:成绩类Score
  8. GoF著作中未提到的设计模式(4):Double Dispatch
  9. 一张图学会python3高清图-一张图理清 Python3 所有知识点
  10. Linux文件压缩,解压常用命令
  11. 类的运用,求矩形面积
  12. android 开源项目介绍
  13. 如何选择白盒测试工具
  14. 联想开机壁纸存放位置
  15. 数理逻辑 | 自然演绎规则整理
  16. linux公社_又一个Linux发行版宣告死亡!曾经是最好的桌面版BSD操作系统
  17. 如何在表格里做计算机统计表,如何运用Excel编制统计表并做一般数据分析?-excel统计怎么做,最简单的统计表格怎么做...
  18. 深入boot.img格式文件结构解析
  19. 【科普】第二章 SIS 系统简介
  20. 微信小程序开发之——拍照上传

热门文章

  1. Lum Proxy的主要功能以及优缺点剖析
  2. 打工人,打工魂,打工都是人上人!愿你悄悄打工,然后惊艳所有人!
  3. 心理账户:一个重要的影响你财富的因素
  4. 基于BES蓝牙芯片PCBA测试程序接口实验
  5. SWAN之ikev2协议mobike配置测试
  6. JavaScript队列结构——击鼓传花游戏
  7. 修改Xmind的试用时间,近乎无限时长试用
  8. 扎克伯格曾获蒂姆·库克免费赠送iPhone 5
  9. 小视频源码炙手可热的秘密,短视频行业先驱者们给我们留下启示
  10. 微信APP支付开发(java)关联openId和appID不匹配问题