繁体   English   中英

如何访问 TF Hub 模块中的 BERT 中间层输出?

[英]How to access BERT intermediate layer outputs in TF Hub Module?

有人知道从 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 的更清洁解决方案吗?

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 列表返回:outputs["encoder_outputs"][i] 是形状为 [batch_size, seq_length, 1024] 的张量,具有第 i 个输出转换器块,对于 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 并提供更多反馈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM