簡體   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