天天看點

大型語言模型:SBERT — 句子BERT

作者:冷凍工廠

了解 siamese BERT 網絡如何準确地将句子轉換為嵌入

簡介

Transformer 在 NLP 領域取得了進化性的進步,這已不是什麼秘密。基于 Transformer,還發展出了許多其他機器學習模型。其中之一是 BERT,它主要由幾個堆疊的 Transformer 編碼器組成。除了用于一系列不同的問題(例如情感分析或問答)之外,BERT 在建構詞嵌入(表示單詞語義的數字向量)方面變得越來越流行。

以嵌入的形式表示單詞具有巨大的優勢,因為機器學習算法無法處理原始文本,但可以對向量的向量進行操作。這允許使用歐幾裡得距離或餘弦距離等标準度量來比較不同單詞的相似性。

問題在于,在實踐中,我們經常需要為整個句子而不是單個單詞建構嵌入。然而,基本的 BERT 版本僅在單詞級别建構嵌入。是以,後來開發了幾種類似 BERT 的方法來解決這個問題,本文[1]将對此進行讨論。通過逐漸讨論它們,我們将達到稱為 SBERT 的最先進模型。

BERT

首先,讓我們回顧一下 BERT 是如何處理資訊的。作為輸入,它需要一個 [CLS] 标記和由特殊 [SEP] 标記分隔的兩個句子。根據模型配置,該資訊由多頭注意力子產品處理 12 或 24 次。然後,輸出被聚合并傳遞到一個簡單的回歸模型以獲得最終标簽。

大型語言模型:SBERT — 句子BERT

交叉編碼器架構

可以使用 BERT 來計算一對文檔之間的相似度。考慮在一個大集合中找到最相似的一對句子的目标。為了解決這個問題,每個可能的對都被放入 BERT 模型中。這會導緻推理過程中出現二次複雜度。例如,處理 n = 10 000 個句子需要 n * (n — 1) / 2 = 49 995 000 次推理 BERT 計算,這并不是真正可擴充的。

其他方法

分析交叉編碼器架構的低效率,為每個句子獨立地預先計算嵌入似乎是合乎邏輯的。之後,我們可以直接計算所有文檔對上標明的距離度量,這比将平方數的句子對輸入 BERT 要快得多。

不幸的是,這種方法對于 BERT 來說是不可能的:BERT 的核心問題是,每次同時傳遞和處理兩個句子時,很難獲得僅獨立表示單個句子的嵌入。

研究人員試圖通過使用 [CLS] 令牌嵌入的輸出來消除這個問題,希望它包含足夠的資訊來表示一個句子。然而,事實證明 [CLS] 對于這項任務根本沒有用,因為它最初是在 BERT 中針對下一句預測進行預訓練的。

另一種方法是将單個句子傳遞給 BERT,然後對輸出标記嵌入進行平均。然而,獲得的結果甚至比簡單平均 GLoVe 嵌入還要糟糕。

推導獨立句子嵌入是 BERT 的主要問題之一。為了緩解這個問題,開發了 SBERT。

SBERT

SBERT 引入了 Siamese 網絡概念,這意味着每次兩個句子都通過相同的 BERT 模型獨立傳遞。在讨論 SBERT 架構之前,讓我們先參考一下 Siamese 網絡的一個微妙注釋:

  • 大多數時候,在科學論文中,暹羅網絡架構都是用多個接收如此多輸入的模型來描述的。實際上,它可以被認為是具有相同配置和在多個并行輸入之間共享權重的單個模型。每當更新單個輸入的模型權重時,它們也會同樣更新其他輸入。
大型語言模型:SBERT — 句子BERT

回到 SBERT,在将一個句子傳遞給 BERT 後,池化層被應用于 BERT 嵌入以獲得其較低次元的表示:初始 512 768 維向量被轉換為單個 768 維向量。對于池化層,SBERT 作者建議選擇平均池化層作為預設層,盡管他們也提到可以使用最大池化政策或簡單地采用 [CLS] 令牌的輸出。

當兩個句子都通過池化層時,我們有兩個 768 維向量 u 和 v。通過使用這兩個向量,作者提出了三種優化不同目标的方法,這将在下面讨論。

分類目标函數

該問題的目标是将給定的一對句子正确分類為幾個類别之一。

生成嵌入 u 和 v 後,研究人員發現從這兩個向量派生出另一個向量作為元素絕對差 |u-v| 很有用。他們還嘗試了其他特征工程技術,但這一技術顯示了最好的結果。

最後,三個向量 u、v 和 |u-v|連接配接起來,乘以可訓練的權重矩陣 W,并将乘法結果輸入到 softmax 分類器中,該分類器輸出對應于不同類别的句子的歸一化機率。交叉熵損失函數用于更新模型的權重。

大型語言模型:SBERT — 句子BERT

用于解決此目标的最流行的現有問題之一是 NLI(自然語言推理),其中對于定義假設和前提的給定句子 A 和 B,有必要預測假設是否為真(蘊涵),在給定的前提下,錯誤(沖突)或不确定(中立)。對于這個問題,推理過程與訓練相同。

正如論文中所述,SBERT 模型最初是在兩個資料集 SNLI 和 MultiNLI 上進行訓練的,這兩個資料集包含一百萬個句子對,并帶有相應的标簽蘊含、沖突或中性。之後,論文研究人員提到了有關 SBERT 調優參數的詳細資訊:

“我們使用 3 路 softmax 分類器目标函數對一個 epoch 的 SBERT 進行微調。我們使用了 16 的批量大小、學習率為 2e−5 的 Adam 優化器以及超過 10% 的訓練資料的線性學習率預熱。”

回歸目标函數

在這個公式中,在獲得向量 u 和 v 後,它們之間的相似度得分直接通過標明的相似度度量來計算。将預測的相似度得分與真實值進行比較,并使用 MSE 損失函數更新模型。預設情況下,作者選擇餘弦相似度作為相似度度量。

大型語言模型:SBERT — 句子BERT

在推理過程中,可以通過以下兩種方式之一使用該架構:

  • 通過給定的句子對,可以計算相似度得分。推理工作流程與訓練完全相同。
  • 對于給定的句子,可以提取其句子嵌入(在應用池化層之後)以供以後使用。當我們得到大量句子的集合并旨在計算它們之間的成對相似度分數時,這特别有用。通過将每個句子僅運作一次 BERT,我們提取了所有必要的句子嵌入。之後,我們可以直接計算所有向量之間所選的相似度度量(毫無疑問,它仍然需要二次比較次數,但同時我們避免了像以前那樣使用 BERT 進行二次推理計算)。

三重态目标函數

三元組目标引入了三元組損失,該損失是根據通常稱為錨、正和負的三個句子計算的。假設錨定句和肯定句非常接近,而錨定句和否定句則非常不同。在訓練過程中,模型會評估該對(錨,正)與該對(錨,負)相比的接近程度。從數學上講,以下損失函數被最小化:

大型語言模型:SBERT — 句子BERT

間隔 ε 確定正句子與錨點的距離至少比負句子與錨點的距離近 ε。否則,損失将大于0。預設情況下,在這個公式中,作者選擇歐氏距離作為向量範數,參數ε設定為1。

三元組 SBERT 架構與前兩種架構的不同之處在于,該模型現在并行接受三個輸入句子(而不是兩個)。

大型語言模型:SBERT — 句子BERT

Code

SentenceTransformers 是一個用于建構句子嵌入的最先進的 Python 庫。它包含多個針對不同任務的預訓練模型。使用 SentenceTransformers 建構嵌入很簡單,下面的代碼片段中顯示了一個示例。

大型語言模型:SBERT — 句子BERT

然後建構的嵌入可用于相似性比較。每個模型都是針對特定任務進行訓練的,是以參考文檔選擇合适的相似性度量進行比較始終很重要。

總結

我們已經了解了一種用于擷取句子嵌入的進階 NLP 模型。通過将 BERT 推理執行的二次次數減少為線性,SBERT 在保持高精度的同時實作了速度的大幅增長。

為了最終了解這種差異有多麼顯着,參考論文中描述的例子就足夠了,在這個例子中,研究人員試圖在 n = 10000 個句子中找到最相似的一對。在現代 V100 GPU 上,此過程使用 BERT 大約需要 65 小時,而使用 SBERT 隻需 5 秒!這個例子表明 SBERT 是 NLP 的巨大進步。

Reference

[1]Source: https://towardsdatascience.com/sbert-deb3d4aef8a4

繼續閱讀