到目前为止,我们的序列学习任务的工作示例是语言建模,我们的目标是在给定序列中所有先前标记的情况下预测下一个标记。在这种情况下,我们只希望以左向上下文为条件,因此标准 RNN 的单向链接似乎是合适的。然而,还有许多其他序列学习任务上下文,在这些上下文中,在向左和向右上下文的每个时间步调整预测是非常好的。例如,考虑词性检测。在评估与给定词相关的词性时,为什么我们不应该考虑两个方向的上下文?
另一项常见任务(通常在针对感兴趣的实际任务微调模型之前用作预训练练习)是屏蔽文本文档中的随机标记,然后训练序列模型以预测缺失标记的值。请注意,根据空白后面的内容,缺失标记的可能值会发生显着变化:
-
我是
___
。 -
我
___
饿了。 -
我
___
饿了,我能吃半头猪。
在第一句话中,“快乐”似乎是一个可能的候选者。“不”和“非常”这两个词在第二句中似乎说得通,但“不”与第三句似乎格格不入。
幸运的是,一种简单的技术可以将任何单向 RNN 转换为双向 RNN (Schuster 和 Paliwal,1997)。我们简单地实现两个单向 RNN 层,它们以相反的方向链接在一起并作用于相同的输入(图 10.4.1)。对于第一个 RNN 层,第一个输入是x1最后的输入是 xT,但是对于第二个 RNN 层,第一个输入是 xT最后的输入是x1. 为了产生这个双向 RNN 层的输出,我们只需将两个底层单向 RNN 层的相应输出连接在一起。
正式地为任何时间步长t,我们考虑一个小批量输入 Xt∈Rn×d(示例数量: n,每个示例中的输入数量:d) 并令隐藏层激活函数为ϕ. 在双向架构中,这个时间步长的前向和后向隐藏状态是H→t∈Rn×h 和H←t∈Rn×h,分别在哪里h是隐藏单元的数量。前向和后向隐藏状态更新如下:
权重在哪里 Wxh(f)∈Rd×h,Whh(f)∈Rh×h,Wxh(b)∈Rd×h, and Whh(b)∈Rh×h, 和偏见bh(f)∈R1×h和 bh(b)∈R1×h都是模型参数。
接下来,我们连接前向和后向隐藏状态
评论
查看更多