這類sentence-level的建模問題,對於bert而言是理所當然的事情。bert在Masked LM之外的另一個pretraining任務就是Next Sentence Prediction,即成對句子構成的句子級問題。

bert原文中本身就給出了這一類問題的Fine-tuning解決方案:

以題主所說的句子相似度計算為例,只需要把兩個句子用分隔符隔開送到bert的輸入(首位加特殊標記符CLS的embedding),然後取bert輸出中和CLS對應的那個vector(記為c)進行變換就可以了。

原文中提到的是多分類任務,給出的輸出變換是P=softmax(cW)。如果是相似度計算的話,P=sigmoid(cw)就可以了。

至於題主提到的句向量表示,上文中提到的向量c即可一定程度表示整個句子的語義,原文中有提到「 The final hidden state (i.e., output of Transformer) corresponding to this token is used as the aggregate sequence representation for classification tasks.」這句話中的「this token」就是CLS位。

補充:除了直接使用bert的句對匹配之外,還可以只用bert來對每個句子求embedding。之後再通過向Siamese Network這樣的經典模式去求相似度也可以~


你可以搜一下bert-as-service


Using BERT to extract fixed feature vectors (like ELMo)

看Bert裡面extract_features.py這個文件,可以得到類似預訓練的詞向量組成的句子表示,類似於Keras裡面第一步Embedding層


BertModel() 裡面有個get_pooled_output的方法, 調用就行了,會返回[CLS]+一層全連接(激活函數tanh)的向量。為啥是還有接個全連接我也不知道,但是預訓練中的NSP任務就是用這個向量的。 另外數據集讀取的時候可以做個交換, 別憨憨就讀數據進去。


對於語義相似度任務,本身有提供代碼,簡單修改一下數據處理就可以用,實測效果比絕大多數模型要好。

對於句子語義向量我記得看到過 Github上有一個開源的service,可以搜一下,但是我沒用到。


請問你實現了嗎?能說說嗎?


推薦閱讀:
相關文章