如何访问TF集线器模块中的BERT中间层输出?

时间:2019-03-25 08:10:39

标签: python tensorflow nlp

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

该模型托管于here。我浏览了元图,发现唯一可用的签名是“令牌”,“ tokenization_info”和“ mlm”,前两个在examples on 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提供更清洁的解决方案吗?

1 个答案:

答案 0 :(得分:0)

BERT是转换器语言模型领域的最新成就之一。与先前的产品不同,BERT可以使用MLM(屏蔽语言模型)实现双向体系结构。这为各种NLP解决方案提供了更好的上下文化单词/句子嵌入。至于一般用法。 Bert为SOTA嵌入提供了最后一层。但是出于研究目的,还建议考虑将中间层用于文本表示。下图显示了具有中间层的不同用例的效果。

Effect of BERT Intermediate Information

从图片中可以看出,通常建议对最后四层进行求和。与串联相比,对最后四层求和可得到更少的嵌入尺寸,并且结果相差%0.2。可以使用BERT原始GitHub页面提供的脚本来实现中间层,但是将这些脚本实现到下游NLP任务需要自定义Keras层。相反,TensorFlow-Hub提供具有Keras层的单行BERT。 BERT TensorFlow-Hub解决方案会定期更新。前两个版本仅提供句子(合并输出)或单词(sequence_output)。现在,借助v3,BERT提供了中间层信息。下面提供了到BERT V3的链接。

BERT-LARGE v3 TF-HUB

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

所有L = 24个Transformer块(隐藏层)的中间激活均作为Python列表返回:output [“ encoder_outputs”] [i]是形状为[batch_size,seq_length,1024]的张量,其输出为第i个Transformer块,表示0 <= i

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

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