sentence-bert學習筆記
入職以來忙上加忙,少了很多看paper的時間,於是乎筆者決定,可以fellow一些寫論文解析補充的文章,然后直接跑代碼,看效果~
工程上的東西不能落下,前沿的東西也不能落下,感覺筆者此處有那么一丟丟的對抗網絡的感覺了有木有。
本文可以說是一篇摘抄筆記
參考劉聰nlp
一個沒啥廢話的知乎博主
Bert模型已經在NLP各大任務中都展現出了強者的姿態。在語義相似度計算(semantic textual similarity)任務上也不例外,但是,由於bert模型規定,在計算語義相似度時,需要將兩個句子同時進入模型,進行信息交互,這造成大量的計算開銷。例如,有10000個句子,我們想要找出最相似的句子對,需要計算(10000*9999/2)次,需要大約65個小時。Bert模型的構造使得它既不適合語義相似度搜索,也不適合非監督任務,比如聚類。劉聰nlp
在實際應用中,例如:在問答系統任務中,往往會人為地配置一些常用並且描述清晰的問題及其對應的回答,我們將這些配置好的問題稱之為“標准問”。當用戶進行提問時,常常將用戶的問題與所有配置好的標准問進行相似度計算,找出與用戶問題最相似的標准問,並返回其答案給用戶,這樣就完成了一次問答操作。如果使用bert模型,那么每一次一個用戶問題過來,都需要與標准問庫計算一遍。在實時交互的系統中,是不可能上線的。
Sentence-BERT網絡結構來解決bert模型的不足。簡單通俗地講,就是借鑒孿生網絡模型的框架,將不同的句子輸入到兩個bert模型中(但這兩個bert模型是參數共享的,也可以理解為是同一個bert模型),獲取到每個句子的句子表征向量;而最終獲得的句子表征向量,可以用於語義相似度計算,也可以用於無監督的聚類任務。對於同樣的10000個句子,我們想要找出最相似的句子對,只需要計算10000次,需要大約5秒就可計算完全。
[孿生網絡可以參考這篇](http://www.cs.utoronto .ca/~hinton/csc2535_06/readings/chopra-05.pdf)
孿生網絡一開始提出是在圖像識別領域(例如人臉識別),來求解兩張圖片(兩張人臉圖像)相似度,判斷兩張圖片是否相似。如下圖所示1,輸入兩張圖片,將兩張圖片經過同一個卷積神經網絡,得到每張圖片的向量表示,最后求解兩個向量的編輯距離(可以是余弦距離,歐式距離,等等),根據得到的編輯距離判斷兩張圖片是否相似。
Sentence-BERT主要從以下三個方面進行改進的
- CLS向量
CLS向量策略,就是將bert模型中,開始標記【cls】向量,作為整句話的句向量。
這個和bert中的CLS是一致的,作為每句分類的標記
- 平均池化
平均池化策略,就是將句子通過bert模型得到的句子中所有的字向量進行求均值操作,最終將均值向量作為整句話的句向量。
- 最大值池化
最大值池化策略,就是將句子通過bert模型得到的句子中所有的字向量進行求最大值操作,最終將最大值向量作為整句話的句向量。
兩個池化操作感覺並不是創新點
並且作者在對bert模型進行微調時,設置了三個目標函數,用於不同任務的訓練優化;
-
Classification Objective Function
-
Regression Objective Function
計算兩句話的余弦相似度
-
Triplet Objective Function
這個是常用的對比學習中的損失函數,巧妙的融入了對比學習,有內味了
在這個目標函數下,將模型框架進行修改,將原來的兩個輸入,變成三個句子輸入。給定一個針定 句 \(a\), 一個肯定句 \(p\) 和一個否定句 \(n\), 模型通過使 \(a\) 與 \(p\) 的距離小於 \(a\) 與 \(n\) 的距離,來優化 模型。使其目標函數o最小,即
\(\mathbf{o}=\max \left(\left\|s_{a}-s_{p}\right\|-\left\|s_{a}-s_{n}\right\|+\epsilon, 0\right)\)
其中, \(s_{a}, s_{p}\) 和 \(s_{n}\) 表示句子 \(a, p\) 和 \(n\) 的向量, \(\|\cdot\|\) 表示距離度量, \(\epsilon\) 表示邊距。在論文中, 距離度量為歐式距離,邊距大小為1。
這個可以與unlim進行比較了,unlim既包含生成又包含分類,但是最終的損失函數只有一個,而sentence-bert是三個
stentence-bert網絡結構利用孿生網絡和三胞胎網絡結構生成具有語義意義的句子embedding向量,語義相近的句子其embedding向量距離就比較近,從而可以用來進行相似度計算(余弦相似度、曼哈頓距離、歐式距離)。該網絡結構在查找最相似的句子對,從上述的65小時大幅降低到5秒(計算余弦相似度大概0.01s),精度能夠依然保持不變。這樣SBERT可以完成某些新的特定任務,例如相似度對比、聚類、基於語義的信息檢索。
作者也開源了,筆者要拿來試試
代碼地址:https://github.com/UKPLab/sentence-transformers