双向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. fatal error C1021: 无效的预处理器命令“warning”
  2. 生态聚伙伴 方案联价值 华为首次发布企业业务解决方案伙伴计划
  3. .net core读取配置文件
  4. 阿里大数据分析与应用(part7)--机器学习平台PAI
  5. 让SAP云平台上的Web应用使用destination服务
  6. caffe 提取特征并可视化(已测试可执行)及在线可视化
  7. linux 发送http请求方式
  8. linux nfs iscsi,对比平台--iSCSI和NFS之间的区别
  9. HTML5 WebRTC API无需网络获取本地IP
  10. 【形状检测】基于matlab Hough变换形状检测【含Matlab源码 468期】
  11. BlazeDS 整合 Flex
  12. python符号怎么打_「符号怎么打出来」```这个符号怎么打出来 - seo实验室
  13. 电脑网络看不到其它计算机,解决网络和共享中看不到其他计算机的问题
  14. 系统集成项目管理工程师备考资料(口袋应试第二版)14
  15. 关于手机常见音频POP音产生的原因以及解决思路(一)——耳机插入与拔出
  16. 网络安全-文件上传漏洞的原理、攻击与防御
  17. 华为手机免root改mac_华为手机这些默认设置一定要改,不然会卡顿占内存加耗电...
  18. 备考OCJP认证知识点总结(二)
  19. 客服软件强攻略——改善客户自助服务
  20. 023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于C程序课程的题库在线平台81wd2

热门文章

  1. 人脑能用计算机算法吗,计算机和人类大脑相比,谁才是“最强大脑”?
  2. 国产安全芯片,请关注他们!
  3. BLS12-381 pairing-friendly 曲线
  4. 一起读论文 | 高质量的同行评审意见应该写哪些内容及如何组织?
  5. [imgFS]最初的想法
  6. No documents matching “xxx.h“ could be found<解决方法>
  7. 用html编写古诗词欣赏,关于立夏的经典古诗词句欣赏
  8. page页面跳转到子页面和category页面跳转到子页面有区别:
  9. action中实现对批量文件上传的封装
  10. python 多进程并发 阻塞_python并发编程多进程(一)