使用 BERT 时如何在序列对任务中预先计算一个序列?

数据挖掘 深度学习 nlp 伯特 标记化
2022-02-23 01:19:18

BERT 使用分隔符 ([SEP]) 为序列对任务输入两个序列。如果我正确理解了 BERT 架构,那么所有输入都会受到关注,从而从一开始就耦合两个序列。

现在,考虑一个序列对任务,其中一个序列是恒定的并且从一开始就已知。例如,回答关于已知上下文的多个未知问题。对我来说,如果仅使用上下文预先计算(部分)模型,似乎可能会有计算优势。但是,如果我的假设是正确的,即这两个序列从一开始就是耦合的,那么预计算是不可行的。

因此我的问题是: 如何在序列对任务中预先计算一个序列,同时仍然使用(预训练的)BERT?我们可以将 BERT 与其他类型的架构相结合来实现这一目标吗?就速度和准确性而言,这样做是否有意义?

1个回答

BERT的每个注意力层的每个标记位置都是在考虑两个序列的所有标记的情况下计算的。这样,没有一个元素只依赖于第一个序列,因此不可能预先计算任何东西以用于不同的第二个序列。

在此处输入图像描述

如您所见,BERT 网络架构的本质使您无法分解涉及第一个序列的计算。

在ALBERT等其他类似架构中,有一些部分可以重用,作为嵌入计算(因为 ALBERT 的嵌入被分解,使得嵌入矩阵更小,但在运行时添加了乘法),但我不确定重用这个计算会节省很多。

我不知道为序列对制作的任何架构可以让你做你所描述的事情,因为大多数序列对方法都源自 BERT,它本身依赖于计算每个令牌对之间的注意力。

一种选择是使用一个网络,该网络为您提供一个句子的固定大小表示(即向量):您将在成对的每个句子上使用它,然后将两个向量都提供给第二个网络(例如,接收两个向量连接的多层感知器)来计算最终输出。根据任务的不同,这可能会给您带来良好的结果并允许您进行上述预计算。要获得句子表示向量,您可以使用 BERT 本身(该[CLS]位置的输出)或其他一些架构,如LASER