• 在双向循环神经网络中,每个时间步的隐状态由当前时间步的前后数据同时决定。

  • 双向循环神经网络与概率图模型中的“前向-后向”算法具有相似性。

  • 双向循环神经网络主要用于序列编码和给定双向上下文的观测估计。

  • 由于梯度链更长,因此双向循环神经网络的训练代价非常高。

在序列学习中,我们以往假设的目标是: 在给定观测的情况下 (例如,在时间序列的上下文中或在语言模型的上下文中), 对下一个输出进行建模。 虽然这是一个典型情景,但不是唯一的。根据可获得的信息量,我们可以用不同的词填空,不同长度的上下文范围重要性是相同的。所以无法利用这一点的序列模型将在相关任务上表现不佳。

1.隐马尔可夫模型中的动态规划

这一小节是用来说明动态规划问题的, 具体的技术细节对于理解深度学习模型并不重要, 但它有助于我们思考为什么要使用深度学习, 以及为什么要选择特定的架构。

因此,对于有T个观测值的序列, 我们在观测状态和隐状态上具有以下联合概率分布:

动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。

要了解动态规划的工作方式, 我们考虑对隐变量h1,…,hT的依次求和。 根据 (9.4.1),将得出:

通常,我们将前向递归(forward recursion)写为:

 与前向递归一样,我们也可以使用后向递归对同一组隐变量求和。这将得到:

因此,我们可以将后向递归(backward recursion)写为:

初始化ρT(hT)=1。 前向和后向递归都允许我们对T个隐变量在O(kT) (线性而不是指数)时间内对(h1,…,hT)的所有值求和。 这是使用图模型进行概率推理的巨大好处之一。 它也是通用消息传递算法 (Aji and McEliece, 2000)的一个非常特殊的例子。 结合前向和后向递归,我们能够计算

 因为符号简化的需要,后向递归也可以写为=g(,), 其中g是一个可以学习的函数。 同样,这看起来非常像一个更新方程, 只是不像我们在循环神经网络中看到的那样前向运算,而是后向计算。 事实上,知道未来数据何时可用对隐马尔可夫模型是有益的。 信号处理学家将是否知道未来观测这两种情况区分为内插和外推, 有关更多详细信息,请参阅 (Doucet et al., 2001)。

2.双向模型

如果我们希望在循环神经网络中拥有一种机制, 使之能够提供与隐马尔可夫模型类似的前瞻能力, 我们就需要修改循环神经网络的设计。 幸运的是,这在概念上很容易, 只需要增加一个“从最后一个词元开始从后向前运行”的循环神经网络, 而不是只有一个在前向模式下“从第一个词元开始运行”的循环神经网络。 双向循环神经网络(bidirectional RNNs) 添加了反向传递信息的隐藏层,以便更灵活地处理此类信息。 图9.4.2描述了具有单个隐藏层的双向循环神经网络的架构。

事实上,这与隐马尔可夫模型中的动态规划的前向和后向递归没有太大区别。 其主要区别是,在隐马尔可夫模型中的方程具有特定的统计意义。 双向循环神经网络没有这样容易理解的解释, 我们只能把它们当作通用的、可学习的函数。 这种转变集中体现了现代深度网络的设计原则: 首先使用经典统计模型的函数依赖类型,然后将其参数化为通用形式。

2.1定义

双向循环神经网络是由 (Schuster and Paliwal, 1997)提出的, 关于各种架构的详细讨论请参阅 (Graves and Schmidhuber, 2005)。 让我们看看这样一个网络的细节。

2.2模型的计算代价及其应用

双向循环神经网络的一个关键特性是:使用来自序列两端的信息来估计输出。 也就是说,我们使用来自过去和未来的观测信息来预测当前的观测。 但是在对下一个词元进行预测的情况中,这样的模型并不是我们所需的。 因为在预测下一个词元时,我们终究无法知道下一个词元的下文是什么, 所以将不会得到很好的精度。 具体地说,在训练期间,我们能够利用过去和未来的数据来估计现在空缺的词; 而在测试期间,我们只有过去的数据,因此精度将会很差。 下面的实验将说明这一点。

另一个严重问题是,双向循环神经网络的计算速度非常慢。 其主要原因是网络的前向传播需要在双向层中进行前向和后向递归, 并且网络的反向传播还依赖于前向传播的结果。 因此,梯度求解将有一个非常长的链。

双向层的使用在实践中非常少,并且仅仅应用于部分场合。 例如,填充缺失的单词、词元注释(例如,用于命名实体识别) 以及作为序列处理流水线中的一个步骤对序列进行编码(例如,用于机器翻译)。

3.双向循环神经网络的错误应用

由于双向循环神经网络使用了过去的和未来的数据, 所以我们不能盲目地将这一语言模型应用于任何预测任务。 尽管模型产出的困惑度是合理的, 该模型预测未来词元的能力却可能存在严重缺陷。 我们用下面的示例代码引以为戒,以防在错误的环境中使用它们。

pip install mxnet==1.7.0.post1
pip install d2l==0.15.0
from mxnet import npx
from mxnet.gluon import rnn
from d2l import mxnet as d2lnpx.set_np()# 加载数据
batch_size, num_steps, device = 32, 35, d2l.try_gpu()
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
# 通过设置“bidirective=True”来定义双向LSTM模型
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
lstm_layer = rnn.LSTM(num_hiddens, num_layers, bidirectional=True)
model = d2l.RNNModel(lstm_layer, len(vocab))
# 训练模型
num_epochs, lr = 500, 1
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

上述结果显然令人瞠目结舌。

双向循环神经网络(隐马尔可夫模型)相关推荐

  1. NLP——part of speech (POS)中的隐马尔可夫模型 + Viterbi 算法

    文章目录 POS 隐马尔可夫模型 计算简介 转移概率矩阵(Transition matrix) 观察矩阵(Observation / emission Matrix) 预测 prediction Vi ...

  2. 隐马尔科夫模型HMM(一)HMM模型

    2019独角兽企业重金招聘Python工程师标准>>> 隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理 ...

  3. python做马尔科夫模型预测法_隐马尔可夫模型的前向算法和后向算法理解与实现(Python)...

    前言 隐马尔可夫模型(HMM)是可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型. 马尔可夫模型理论与分析 参考<统计学习方法>这本书,书上已经讲得 ...

  4. 隐马尔可夫模型:HMM

    隐马尔可夫模型求解三大问题实例剖析 HMM 模型如图所示: 一.隐马尔可夫模型定义 隐马尔可夫模型由初始概率分布.状态转移概率分布以及观测概率分布确定. 设 Q(图中的q)是所有可能的状态的集合,V( ...

  5. 条件随机场(CRF)和隐马尔科夫模型(HMM)最大区别在哪里?CRF的全局最优体现在哪里?

    作者:尔总的马甲 链接:https://www.zhihu.com/question/53458773/answer/554436625 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商 ...

  6. 用隐马尔可夫模型(HMM)做命名实体识别——NER系列(二)

    上一篇文章里<用规则做命名实体识别--NER系列(一)>,介绍了最简单的做命名实体识别的方法–规则.这一篇,我们循序渐进,继续介绍下一个模型--隐马尔可夫模型. 隐马尔可夫模型,看上去,和 ...

  7. 隐马尔可夫模型中的Viterbi算法zz

    隐马尔可夫模型中的Viterbi算法zz 这篇文章简单描述一下Viterbi算法--一年之前我听过它的名字,直到两周之前才花了一点时间研究了个皮毛,在这里做个简单检讨.先用一句话来简单描述一下:给出一 ...

  8. 【机器学习】用摸鱼学来解释隐马尔可夫模型(HMM)

    尝试用摸鱼学来解释隐马尔可夫模型 假如小明一周工作六天,每天工作状态都不相同,比如有活少.活多.心情好.心情差和双倍工资5种状态,不同工作状态下工作效率也不相同,活少和心情差的时候摸鱼时间多,活多.心 ...

  9. 【机器学习基础】数学推导+纯Python实现机器学习算法24:HMM隐马尔可夫模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab HMM(Hidden Markov Model)也就是隐马尔可夫模型,是一种由隐藏的马尔可夫链随机 ...

最新文章

  1. 正则表达式(javascript)
  2. 华为手机怎样复制加密门禁卡_手机NFC复制小区用的门禁卡
  3. Please use HDF reader for matlab v7.3 files
  4. DotNet_Performance_Tuning_ANTS_Performance_Profiler
  5. C++primer: 引用与 const 引用
  6. javascript字典中添加数组_在javascript中合并两个字典数组
  7. Apache Ant 1.9.13和1.10.5发布–支持Java 11单文件源程序
  8. java 多队列_java多线程实现简单队列
  9. android 模拟器 3D 开发环境配置
  10. 脚本制作Minilinux
  11. 经典神经网络 -- ResNet : 设计原理与pytorch实现
  12. linux adobe flash 安装,Ubuntu 12.10下为Firefox安装Adobe Flash Player
  13. rs485数据线接反_rs485接口怎么接线?弱电人必学RS485接口基础知识讲解
  14. 华硕天选笔记本电脑启动机器后搜索不到网络
  15. 大天使之剑服务器维修公告,大天使之剑————【维护】6月12日更新维护公告...
  16. 利用js制作的简单网页小游戏
  17. php和mysql不在一台机器上_MySQL_在同一台机器上运行多个 MySQL 服务,**************************************** - phpStudy...
  18. 计算机课导入语,信息技术课的提问和导入技巧
  19. 防saq注入_SAQ-TZh-025 危险源辨识、风险评价和风险控制措施表(003施工电源及用电设备)...
  20. matlab中bitget函数用法_Matlab函数大全

热门文章

  1. VSCode 插件(分类查找)
  2. float clearfix
  3. MY New curriculum vitae
  4. 图解Spring循环依赖
  5. filter:blur() 实现毛玻璃效果
  6. python的进程池map函数_python进程池map
  7. python进程池并行处理
  8. 唐老师讲运算放大器(第二讲)——运放的供电电压VS、输入偏置电流IB、噪声VN,输入失调电压VOS,增益带宽积,压摆率
  9. uniapp使用uni.createInnerAudioContext()实现在app 小程序 h5有声书的播放
  10. SQL 注入漏洞(十四)xff 注入攻击