4

有人知道从 BERT 在 Tensorflow Hub 上托管的模型访问中间层输出的方法吗?

该模型托管在这里。我探索了元图,发现唯一可用的签名是“tokens”、“tokenization_info”和“mlm”。前两个在 github 上的示例中进行了说明,而掩码语言模型签名没有多大帮助。一些模型像 inception 一样,允许您访问所有中间层,但不能访问这一层。

现在,我能想到的只有:

  1. 运行[i.values() for i in tf.get_default_graph().get_operations()]以获取张量的名称,然后找到我想要的(从数千个中)
  2. tf.get_default_graph().get_tensor_by_name(name_of_the_tensor)访问这些值并将它们拼接在一起并将它们连接到我的下游层。

有人知道使用 Tensorflow 的更清洁的解决方案吗?

4

1 回答 1

1

BERT 是 Transformer 语言模型领域的最新成果之一。与前辈不同,BERT 可以使用 MLM(Masked Language Model)实现双向架构。这为各种 NLP 解决方案提供了更好的上下文化词/句子嵌入。至于一般用法。Bert 在其最后一层提供 SOTA 嵌入。但出于研究目的,还建议考虑文本表示的中间层。下图显示了具有中间层的不同用例的效果。

BERT 中间信息的影响

从图片中可以看出,通常建议将最后四层相加。与串联相比,对最后四层求和给出的嵌入维度更少,结果差异为 %0.2。中间层可以使用 BERT 原始 GitHub 页面提供的脚本来实现,但将此脚本实施到下游 NLP 任务需要自定义 Keras 层。相反,TensorFlow-Hub 提供了带有 Keras 层的单线 BERT。BERT TensorFlow-Hub 解决方案会定期更新。前两个版本只提供句子(pooled output)或单词(sequence_output)。v3 BERT 现在提供中间层信息。下面提供了到 BERT V3 的链接。

BERT-LARGE v3 TF-HUB

在给定页面中,名为“高级主题”的部分说明了以下信息。

所有 L=24 个 Transformer 块(隐藏层)的中间激活作为 Python 列表返回:输出["encoder_outputs"][i] 是形状为 [batch_size, seq_length, 1024] 的张量,其输出为第 i 个Transformer 块,对于 0 <= i < L。列表的最后一个值等于 sequence_output。

在 v3 中,可以使用 (encoder_outputs) 获得中间层信息。中间层作为 python 列表返回,以执行连接或求和操作或其他操作。v3 中的另一个扩展是 BERT TensorFlow-Hub 现在提供了预处理器。BERT 接受三个输入“input_word_ids、input_mask 和 input_type_ids”。预处理器可以将字符串作为输入并返回 BERT 所需的输入。

我还没有机会测试这种方法,但如果它不是很实用,我建议使用最后一层信息。与旧的查找表方法相比,BERT 是非常强大且依赖于 GPU 的文本表示器。研究人员面对 bert 的常见问题是单 GPU 的 OOM 问题。为了解决这个问题,请使用 tf2 和内存增长。我将尝试测试 BERT Hub v3 并提供更多反馈。

于 2020-12-12T13:37:11.917 回答