9.4 双向循环神经网络

我们遗忘假定目标在给定观测情况下在时间序列上下文或者语言模型上下文中下一个输出进行建模虽然这是一个典型场景不是唯一可能发生什么其他情况考虑以下3文本序列填空任务

根据可获得信息我们可以分别不同填空很明显每个短语下文传达重要信息而这些信息关乎选择哪个词填空无法利用这一点序列模型将在相关任务上面表现不佳如果要做好命名实体识别不同长度上下文范围重要性相同位了获得一些解决问题灵感我们先回概率模型

9.4.1 马尔可夫模型动态规划

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

如果我们想用概率模型解决这个问题可以设计一个变量模型任意时间t假设存在某个变量h通过概率P(xt|Ht)控制我们观测Xt, 任何Ht - Ht+1 转移都由一些状态转移概率P(Ht+1|Ht)给出这个概率模型就是一个马尔可夫模型HMM

因此对于T观测值序列观测状态状态具有以下联合分布

P(X1,...Xt,Ht) = PI P(Ht|Ht-1) P(Xt|Ht) 其中P(Ht|Ho) = P(Ht)

假设出了Xt, 我们观测所有Xt, 并且我们目标计算P(Xj|X-j)其中X-j = (Xj,Xj-1, Xt) 由于P(Xj|X-j)没有变量因此我们考虑H1, Ht 选择构成所有可能组合进行求和如果任何Ht可以接受k不同意味我们需要K^t 求和这个任务显然难于登天幸运的有个巧妙解决方案动态规划

要了解动态规划工作方式我们考虑变量H1, Ht依次求和将得到

P(X1,,,Xt)

= Sigma P(X1,,,Xt, H1,,HT)

= Sigma Ht PiT()P(Xt|Ht)

通常我们将前向递归写为

Pit+1(Ht+1) = Sigma Pi(t)P(Xt|Ht) P(Ht+1|Ht)

递归初始化PiT(Ht) = P(ht), 也可以写成PIt+1 = f(PIt, Xt) 其中f学习函数这看起来就像我们循环神经网络讨论变量模型更新方程

P(Xt,,,XT)

我们可以后向传递

Pt-1(h-1) = SigmaP(Ht|Ht-1)P(Xt|Ht)

初始化Pt(Ht)1前向递归后向递归都允许T变量O(Kt)时间范围(ht,,,,Ht)所有求和这是使用模型进行概率推理巨大优势之一通用消息传递算法一个非常特殊例子结合前向递归后向递归我们能够计算

P(Xj|X-j) = Sigma Pi(Hj)Pj(Hj)P(Xj|Hj)

因为符号简化需要递归也可以Pt-1 = g(Pt, Xt)其中g是一个可以学习函数这样看起来非常像一个更新方程不像我们循环神经网络看到那样前向计算而是后向计算知道未来数据何时可用马尔可夫模型是有益信号处理学家知道未来观测这两种情况区分内插外推

9.4.2 双向模型

我们希望在循环神经网络拥有一种机制使之能够提供马尔可夫模型类似前瞻能力我们就需要修改循环神经网络设计在概念上很容易只需要增加一个从最后词元开始从后向前运行循环神经网络而不是只有一个前向模式下第一个词元开始运行循环神经网络双向循环神经网络添加了反向传递信息以便更灵活处理信息9-10展示了具有单个隐藏双向循环神经网络架构

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

1 定义

双向循环神经网络参考文献提出关于各类架构的详细讨论参阅 参考文献我们看看这样一个网络细节

对于任意时间t给定一个小批量输入数据Xt属于Rnxd,并且隐藏激活函数Sigma, 双向架构中我们时间前向隐藏状态反向状态分别Ht属于RnxhHt属于Rnxh其中h隐藏单元前向隐藏状态反向状态更新分别如下

Ht = Sigma(XtWxh + Ht-1Whh + Bh)

接下来前向状态Ht反向状态Ht连接起来获得需要送入输出状态Ht属于Rnx2h具有多个隐藏深度双向循环神经网络信息作为输入传递下一个双向输出计算得到输出Ot属于Rlxq输出模型参数这两个方向可以拥有不同数量的隐藏单元

2 模型计算成本及其应用

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

双向循环神经网络计算速度非常慢其主要网络前向传播需要双向进行前向传递后向传递并且网络反向传播依赖前向传播结果梯度求解经历一个非常

双向层使用实践非常少并且仅仅应用部分场景填充缺失单词词元注释以及作为序列处理流水线中一个步骤序列进行编码我们介绍如何使用双向循环神经网络文本序列进行编码

9.4.3 双向循环神经网络错误应用

由于双向循环神经网络使用了过去未来数据因此我们不能盲目将这一语言模型应用于任何预测任务尽管模型产生困惑度是合理模型预测未来词元能力却可能存在严重缺陷我们引以为戒用下面代码来说明

import torch

from torch import nn

from d2l import torch as d2l

#加载数据

batch_size, num_steps, device = 32, 35, d2l.try_gpu()

trian_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)

#通过设置 bidirectuve = True 来定义双向LSTM模型

vocab_szie, num_hiddens, num_layers = len(vocab), 256, 2

num_inputs = vocab_size

lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers, bidirectictional=True)

model = d2l.RNNModel(lstm_layer, len(vocab))

model = model.to(device)

#训练模型

num_epochs, lr = 500, l

d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

上述结果显然令人瞠目结舌关于如何更有效使用双向循环神经网络讨论

小结

1 循环神经网络每个时间步状态当前时间步数据同时决定

2 双向循环神经网络概率模型 前向 后向 算法具有相似性

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

4 由于梯度更长因此双向循环神经网络训练成本非常

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值