【问题标题】:How to access BERT intermediate layer outputs in TF Hub Module?如何在 TF Hub Module 中访问 BERT 中间层输出?
【发布时间】:2019-08-15 10:39:14
【问题描述】:

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

模型托管在here。我探索了元图,发现唯一可用的签名是“tokens”、“tokenization_info”和“mlm”。前两个在examples on github 中有说明,掩码语言模型签名没有多大帮助。一些模型like 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 的更清洁的解决方案吗?

【问题讨论】:

  • 可能你破解的方式是读取中间层的唯一方法,因为它们没有通过集线器签名暴露。另一种选择是提出功能请求,要求在 github 上提供其他输出。
  • 谢谢!我就是这么想的。我可能会提出一个功能请求。如果我错了,请纠正我,但我在 BERT 文献中阅读的越多,似乎连接这些其他层的好处就越多。
  • 是的,我看到一些人(一些特定的领域/用例),使用中间层是有帮助的。但您的里程可能会有所不同。总之,值得一试。
  • 您能否发布详细的代码以提取图层功能?我收到一个错误InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float
  • 签出这个问题@sourabhxiii github.com/tensorflow/hub/issues/290

标签: python tensorflow nlp bert-language-model tensorflow-hub


【解决方案1】:

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

从图片中可以看出,通常建议将最后四层相加。与串联相比,对最后四层求和提供的嵌入维度更少,结果差异为 %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

在 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 并提供更多反馈。

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 2020-07-09
    • 2019-12-16
    • 1970-01-01
    • 2016-12-01
    • 2021-05-12
    • 2020-07-03
    • 2020-08-11
    • 2021-04-25
    相关资源
    最近更新 更多