循环神经网路(RNN)在工作时一个重要的优点在于,其能够在输入和输出序列之间的映射过程中利用上下文相关信息。然而不幸的是,标准的循环神经网络(RNN)能够存取的上下文信息范围很有限。这个问题就使得隐含层的输入对于网络输出的影响随着网络环路的不断递归而衰退。因此,为了解决这个问题,**长短时记忆(LSTM)**结构诞生了。与其说长短时记忆是一种循环神经网络,倒不如说是一个加强版的组件被放在了循环神经网络中。具体地说,就是把循环神经网络中隐含层的小圆圈换成长短时记忆的模块
LSTM处理序列问题有效的关键在于门结构,通过门结构去除或者增加信息到细胞状态的能力。
**

1.Bi-directional Long Short-Term Memory(双向LSTM)结构

**
简单来说双向LSTM就是把BRNN中隐含层的小圆圈换成了长短时记忆的模块。与其说长短时记忆是一种循环神经网络,倒不如说是一个加强版的组件被放在了循环神经网络中。这个模块的样子如下图所示:

参数介绍:

计算公式:
**

  • 遗忘门
    遗忘门能决定应丢弃或保留哪些信息。来自先前隐藏状态的信息和当前输入的信息同时输入到Sigmoid函数,输出值处于0和1之间,越接近0意味着越应该忘记,越接近1意味着越应该保留。这个f就可以用来操控遗忘哪些数据。
  • 输入门
    f是forget的意思,i是input的意思。
    输入门用来更新单元状态。先将先前隐藏状态的信息和当前输入的信息输入到Sigmoid函数,在0和1之间调整输出值来决定更新哪些信息,0表示不重要,1表示重要。也可将隐藏状态和当前输入传输给Tanh函数,并在-1和1之间压缩数值以调节网络,然后把Tanh输出和Sigmoid输出相乘,Sigmoid输出将决定在Tanh输出中哪些信息是重要的且需要进行保留。

    **
  • 更新细胞状态:下图展示了两个门是如何控制遗忘和输出的。

    **
  • 输出门
    我们确定了当前的状态,那么当前状态的多少可以进行输出呢?控制Ct输出的门叫输出门,用Ot表示。
    输出门能决定下个隐藏状态的值,隐藏状态中包含了先前输入的相关信息。当然,隐藏状态也可用于预测。首先把先前的隐藏状态和当前输入传递给Sigmoid函数;接着把新得到的单元状态传递给Tanh函数;然后把Tanh输出和Sigmoid输出相乘,以确定隐藏状态应携带的信息;最后把隐藏状态作为当前单元输出,把新的单元状态和新的隐藏状态传输给下个时间步。

LSTM的变种GRU

**

**
**

知乎中讨论LSTM为何如此有效

**

2.双向LSTM

**
RNN和LSTM都只能依据之前时刻的时序信息来预测下一时刻的输出,但在有些问题中,当前时刻的输出不仅和之前的状态有关,还可能和未来的状态有关系。比如预测一句话中缺失的单词不仅需要根据前文来判断,还需要考虑它后面的内容,真正做到基于上下文判断。即:
对于每个时刻t,输入会同时提供给两个方向相反的RNN,输出由这两个单向RNN共同决定。

#Tensorflow中实现双向RNNs

在tensorflow中已经提供了双向RNNs的接口,使用**tf.contrib.rnn.bidirectional_dynamic_rnn()**这个函数,就可以很方便的构建双向RNN网络。

def bidirectional_dynamic_rnn(
cell_fw, # 前向RNN
cell_bw, # 后向RNN
inputs, # 输入
sequence_length=None,# 输入序列的实际长度(可选,默认为输入序列的最大长度)
initial_state_fw=None,  # 前向的初始化状态(可选)
initial_state_bw=None,  # 后向的初始化状态(可选)
dtype=None, # 初始化和输出的数据类型(可选)
parallel_iterations=None,
swap_memory=False,
time_major=False,
# 决定了输入输出tensor的格式:如果为true, 向量的形状必须为 `[max_time, batch_size, depth]`.
# 如果为false, tensor的形状必须为`[batch_size, max_time, depth]`.
scope=None
)

当输入的inputs张量的维度为:[batch_size,max_len,embeddings_num],此时time_major = False(一般设为这个);当输入的inputs张量的维度为:[max_len,batch_size,embeddings_num],此时time_major = True
返回值:
元组: (outputs, output_states)

  • outputs为(output_fw, output_bw),是一个包含前向cell输出tensor和后向cell输出tensor组成的元组。假设
    time_major=false, output_fw和output_bw的shape为**[batch_size, max_len,
    hiddens_num]。在此情况下,最终的outputs可以用tf.concat([output_fw,
    output_bw],-1)tf.cocat([output_fw, output_bw],2)**

  • output_states为(output_state_fw, output_state_bw),包含了前向和后向最后的隐藏状态的组成的元组。 output_state_fw和output_state_bw的类型为LSTMStateTuple。 LSTMStateTuple由**(c,h)**组成,分别代表memory cell和hidden state。

最近在做文本分类,使用到了双向LSTM(BiLSTM),其具体实现为:

#前向LSTM
fw_cell = tf.nn.rnn_cell.LSTMCell(self.cell_hidden_size, name="fw_lstm")
#后向LSTM
bw_cell = tf.nn.rnn_cell.LSTMCell(self.cell_hidden_size, name ="bw_lstm")
#构建双向LSTM网络
outputs, _ = tf.nn.bidirectional_dynamic_rnn(fw_cell,bw_cell,embedding_inputs_dense,sen_len,dtype=tf.float32)
#outputs包含一个前向的cell和后向的cell组成的元组
lstm_contact = tf.concat(outputs, 2)
lstm_contact = tf.reduce_mean(lstm_contact, axis=1)

LSTM模型、双向LSTM模型以及模型输入输出的理解相关推荐

  1. 使用Keras进行深度学习:(六)LSTM和双向LSTM讲解及实践

    ###欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 长短期记忆(Long Short Term Memor ...

  2. LSTM和双向LSTM讲解及实践

    目录: RNN的长期依赖问题 LSTM原理讲解 双向LSTM原理讲解 keras实现LSTM和双向LSTM RNN 的长期依赖问题 在上篇文章中介绍的循环神经网络RNN在训练的过程中会有长期依赖的问题 ...

  3. IMDB影评的情感分析任务:双层bi-LSTM模型(双向LSTM)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) IMDB影评的情感分析任务 学习目标 了解影评情感分析任务和I ...

  4. PaddlePaddle︱开发文档中学习情感分类(CNN、LSTM、双向LSTM)、语义角色标注

    PaddlePaddle出教程啦,教程一部分写的很详细,值得学习. 一期涉及新手入门.识别数字.图像分类.词向量.情感分析.语义角色标注.机器翻译.个性化推荐. 二期会有更多的图像内容. 随便,帮国产 ...

  5. LSTM和双向LSTM

    文章目录 1. RNN 2. LSTM 2.1 简介 2.2 细胞状态 2.3 遗忘门 2.4 输入门 2.5 输出门 3. 双向LSTM(Bi-directional LSTM) 4. keras ...

  6. tensorflow中对lstm及双向lstm的理解

    双向RNN(LSTM)的实现参考: https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_Neural ...

  7. 单向LSTM与双向LSTM对比

    一个简单的DEMO:实现手写数字图片的识别 单向LSTM 利用的数据集是tensorflow提供的一个手写数字数据集.该数据集是一个包含55000张28*28的数据集. 训练100次 识别准确率还不是 ...

  8. 基于Pytorch实现LSTM(多层LSTM,双向LSTM)进行文本分类

    LSTM原理请看这:点击进入 LSTM: nn.LSTM(input_size, hidden_size, num_layers=1, nonlinearity=tanh, bias=True, ba ...

  9. 猿创征文丨深度学习基于双向LSTM模型完成文本分类任务

    大家好,我是猿童学,本期猿创征文的第三期,也是最后一期,给大家带来神经网络中的循环神经网络案例,基于双向LSTM模型完成文本分类任务,数据集来自kaggle,对电影评论进行文本分类. 电影评论可以蕴含 ...

  10. Tensorflow 使用Bidirectional()包装器构建双向LSTM模型,预测DNA序列功能

    循环神经网络(RNN) 循环神经网络RNN能处理时间序列,过去几年中,应用 RNN 在语音识别,语言建模,翻译,图片描述等问题上已经取得一定成功,并且这个列表还在增长.RNN模型的一个代表是LSTM ...

最新文章

  1. 太原理工大学计算机专业多少分录取分数线,多少分能上山西太原理工大学,往年全国各省各专业录取分数线出炉...
  2. PyTorch训练加速17种技巧
  3. 【CF526F】Pudding Monsters
  4. 出去旅行带上这些常用日语就够啦!
  5. 关于序列建模,是时候抛弃RNN和LSTM了
  6. Video 对象方法 canPlayType()
  7. Mysql中代替like模糊查询的一种方法
  8. ajax离开页面方法,如果用户在页面加载完成之前离开页面,则触发jQuery ajaxError()处理程序...
  9. ·必须《飞鸽~飞鸽传书》
  10. Oracle触发器4-数据库事件触发器
  11. @Scope注解的proxyMode的作用以及如何影响IoC容器的依赖查找
  12. sql优化的几种思路
  13. FASTBOOT教程
  14. windows下Navicat 过期如何解决
  15. 抽奖活动前端源码-可录入抽奖人名单
  16. 李晨光:向着兴趣一路前行
  17. 面向对象:感受温柔,领略山河,遇见不容易,喜欢望珍惜
  18. Bsgrid表格插入日期表头
  19. web4.0之万能密码登录
  20. 八个常见Java项目,献给初学编程的你!

热门文章

  1. Ubuntu引导修复(Boot Repair)
  2. android sdk 4.0 安装,Android SDK 4.0.3 安装教程
  3. k8s如何实现容器编排?一次性说清!
  4. 史上最全Fragment介绍,包括fragment的定义,生命周期,用法
  5. JDBC连接MySQL时日志出现警告WARN: Establishing SSL connection without server's identity verification is not re
  6. 铁肩担责任 淬炼造奇迹——专访鸿策集团董事长陈圆道
  7. 哪些耳机戴着不容易掉、推荐几款不容易掉的运动蓝牙耳机
  8. java 印章生成工具
  9. 【嗜血GO笔记】如何在goclipse 中配置代码自动补全。
  10. 【19/04/18 膜赛】 Jams倒酒(pour)