🐬双向循环神经网络
2021-12-4
| 2023-8-7
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

 
 
未来很重要
在序列学习中,以往假设的目标是: 在给定观测的情况下 (例如,在时间序列的上下文中或在语言模型的上下文中), 对下一个输出进行建模。 虽然这是一个典型情景,但不是唯一的。 还可能发生什么其它的情况呢? 考虑以下三个在文本序列中填空的任务:
  • ___
  • ___饿了。
  • ___饿了,我可以吃半头猪。
根据可获得的信息量,可以用不同的词填空, 如“很高兴”("happy")、“不”("not")和“非常”("very")。 很明显,每个短语的“下文”传达了重要信息, 而这些信息关乎到选择哪个词来填空, 所以无法利用这一点的序列模型将在相关任务上表现不佳。 例如,如果要做好命名实体识别 (例如,识别“Green”指的是“格林先生”还是绿色), 不同长度的上下文范围重要性是相同的。
 
 

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

如果想用概率图模型来解决这个问题, 可以设计一个隐变量模型: 在任意时间步,假设存在某个隐变量 , 通过概率 控制观测到的。 此外,任何 转移 都是由一些状态转移概率给出。 这个概率图模型就是一个隐马尔可夫模型(hidden Markov model,HMM)
notion image
因此,对于有个观测值的序列, 在观测状态和隐状态上具有以下联合概率分布:
现在,假设观测到所有的 ,除了 , 并且目标是计算 , 其中 。 由于 中没有隐变量, 因此考虑对 选择构成的所有可能的组合进行求和。 如果任何 可以接受 个不同的值(有限的状态数), 这意味着需要对 个项求和, 这个任务显然难于登天。 幸运的是,有个巧妙的解决方案:动态规划(dynamic programming)
要了解动态规划的工作方式, 考虑对隐变量 的依次求和:
通常将“前向递归”(forward recursion)写为:
递归被初始化为。 符号简化,也可以写成 , 其中 是一些可学习的函数。 这看起来就像循环神经网络中讨论的隐变量模型中的更新方程。
与前向递归一样,也可以使用后向递归对同一组隐变量求和。这将得到:
因此,可以将“后向递归”(backward recursion)写为:
初始化 。 前向和后向递归都允许我们对 个隐变量在 (线性而不是指数)时间内对 的所有值求和。 这是使用图模型进行概率推理的巨大好处之一。 它也是通用消息传递算法的一个非常特殊的例子。 结合前向和后向递归,我们能够计算
因为符号简化的需要,后向递归也可以写为 , 其中 是一个可以学习的函数。 同样,这看起来非常像一个更新方程, 只是不像我们在循环神经网络中看到的那样前向运算,而是后向计算。 事实上,知道未来数据何时可用对隐马尔可夫模型是有益的。 信号处理学家将是否知道未来观测这两种情况区分为内插和外推。
 

双向模型

如果我们希望在循环神经网络中拥有一种机制, 使之能够提供与隐马尔可夫模型类似的前瞻能力, 我们就需要修改循环神经网络的设计。 幸运的是,这在概念上很容易, 只需要增加一个“从最后一个词元开始从后向前运行”的循环神经网络, 而不是只有一个在前向模式下“从第一个词元开始运行”的循环神经网络。 双向循环神经网络(bidirectional RNNs) 添加了反向传递信息的隐藏层,以便更灵活地处理此类信息。下图描述了具有单个隐藏层的双向循环神经网络的架构。
notion image
 
notion image
 
事实上,这与隐马尔可夫模型中的动态规划的前向和后向递归没有太大区别。 其主要区别是,在隐马尔可夫模型中的方程具有特定的统计意义。 双向循环神经网络没有这样容易理解的解释,只能把它们当作通用的、可学习的函数。 这种转变集中体现了现代深度网络的设计原则: 首先使用经典统计模型的函数依赖类型,然后将其参数化为通用形式。

定义

双向循环神经网络是由[Schuster & Paliwal, 1997]提出的。
对于任意时间步 ,给定一个小批量的输入数据 (样本数: ,每个示例中的输入数: ), 并且令隐藏层激活函数为 。 在双向架构中,设该时间步的前向和反向隐状态分别为 , 其中 是隐藏单元的数目。 前向和反向隐状态的更新如下:
权重 和偏置 都是模型参数。
接下来,将前向隐状态 和反向隐状态 连接起来, 获得需要送入输出层的隐状态 。 在具有多个隐藏层的深度双向循环神经网络中, 该信息作为输入传递到下一个双向层。 最后,输出层计算得到的输出为 是输出单元的数目):
这里,权重矩阵 和偏置 是输出层的模型参数。 事实上,这两个方向可以拥有不同数量的隐藏单元。
 

模型的计算代价及其应用

双向循环神经网络的一个关键特性是:使用来自序列两端的信息来估计输出。 也就是说使用来自过去和未来的观测信息来预测当前的观测。 但是在对下一个词元进行预测的情况中,这样的模型并不是我们所需的。 因为在预测下一个词元时,终究无法知道下一个词元的下文是什么, 所以将不会得到很好的精度。 具体地说,在训练期间,能够利用过去和未来的数据来估计现在空缺的词; 而在测试期间,只有过去的数据,因此精度将会很差。 下面的实验将说明这一点。
 
 
 
 
notion image
 
另一个严重问题是,双向循环神经网络的计算速度非常慢。 其主要原因是网络的前向传播需要在双向层中进行前向和后向递归, 并且网络的反向传播还依赖于前向传播的结果。 因此,梯度求解将有一个非常长的链。
双向层的使用在实践中非常少,并且仅仅应用于部分场合。 例如,填充缺失的单词、词元注释(例如,用于命名实体识别) 以及作为序列处理流水线中的一个步骤对序列进行编码(例如,用于机器翻译)。
  • PyTorch
  • 深度循环神经网络机器翻译与数据集
    目录