如何无监督地获得一个句子的向量表示?
?PaperWeekly 原創 ·?作者?|?張成蹊
單位?|?FreeWheel機器學習工程師
研究方向?|?自然語言處理
或許上過 NLP 或大數據課程的同學會想到課程小作業的王者:TF-IDF。掌握一些 NLP 基礎的同學可能還會想到靜態或動態的詞向量:Word2Vec、GloVe、ELMo,BERT——有著探索精神的同學或許會再試試 BERT 的一些為人所熟知的變種:RoBERTa、DistillBERT。
對 BERT 的結構及其各層表達能力有所了解的同學(底層學基礎特征,中部學句法信息,上層學語義信息)[1]?會試著取出多層的詞向量表示后再做聚合。當然,還需要將這些詞向量匯總成一個句子的最終向量,不外乎求和、平均、各種 Pooling…… 最后,也會有同學去尋找一些專門為詞向量表達能力進行過強化的預訓練模型 Sent2Vec、SentenceBERT。總之,換模型、換方法、換 idea,已經 21 世紀了,調參調包誰不會呢?
有所不同的是,除了盤點上述常用的無監督句向量獲得方式外(作為快速獲得無監督詞向量的途徑,上面的方法在落地時具有輪子齊全、即插即用的巨大優勢),本文還將介紹一些獲得無監督句向量表示的較新方法。這些方法或是解決了上述方法在形式上過于簡單粗暴而存在的一些問題,或是在句向量表達能力的評估系統(如 STS tasks)中具有壓倒性的優勢——眾所周知,在 21 世紀,SoTA 與 Accept 呈顯著正相關。
現在就讓我們開始吧。
本文第一部分會介紹基于詞袋模型的一系列句向量表示方法,第二部分主要講述基于預訓練詞向量的 Power Mean Embedding 表示方法,第三部分將通過 4 篇論文串講的方式,從 0 到 1 地介紹對比學習(Contrastive Learning)在無監督句向量中的應用,最后在文末整理了一些值得思考與討論的點,希望能為大家的工作帶來一些微小的啟發。
Real-unsupervised methods
首先進場的是無監督場景中的無監督代表隊。
顧名思義,這一類方法完全不需要額外的訓練或預訓練,它們大部分由 Bag-of-Words 的思想衍生而來,通過(1)從句子中提取表達能力相對較強的詞匯,并(2)采用某種編碼規則將其轉換為數字形式,最終獲得句子的向量。
值得注意的是,這類依賴于詞表的(包括下面的 Word2Vec 等——但經過了預訓練的 Word2Vec 模型不在此范圍內,因為它已經給定了詞表)方法會受到上游的一些諸如 tokenization、lemmatization 與 stemming 在內的數據預處理結果的影響。所以想要更好的使用這類方法,需要注意數據預處理的方式。
1.1 Bag-of-Words思想
假定我們已經擁有了一個分詞后的句子庫 ,通過掃描,就能獲得全量句子的一個總匯性詞表 (假設該詞表是有序的)。那么,我們就能將每條句子變成一個數值向量,這個向量的長度就是詞表的大小 ,向量在位置 0 處的值就是詞表中第 1 個單詞在該句子中出現的次數、位置 1 處的值就是詞表中第 2 個單詞在該句子中出現的次數,......,以此類推。
顯而易見的是,這個方法是存在問題的:在詞表大小很大的時候,儲存句子的向量會變成一件十分耗費資源的事情。從直覺上來說,我們應該使用的是一些能更好的有信息表達能力的單詞,而刪除一些總出現頻次過少(生僻字)或總出現頻率過高(常見字)的單詞,而 TF-IDF 就較好地具備了這些能力。
1.1.1 TF-IDF
解讀 TF-IDF 方法細節的博客十分常見,在此不再進行贅述。簡單來說,該方法通過 TF 項:單詞在當前句子中的出現頻次/頻率,來表示當前詞匯在句子中的重要程度;通過 IDF 項:單詞在所有句子中出現的頻率(的倒數的對數),來表示當前詞匯是不是過于常見。正好匹配原生 BoW 思想中所存在的缺陷。此外,類如 scikit-learn 等機器學習庫中的 TF-IDF 方法還有一些如 n-gram 或者 max-df 等額外參數,來幫助調參俠們更好地控制產出特征的質量。
1.1.2 Simhash
與 TF-IDF 不同,Simhash 走了另一條解決問題的道路——有損信息壓縮——來節省耗費的資源。Simhash 是一種局部敏感的 hash 算法,最初被 Google 用于億萬級別的網頁去重。所謂局部敏感,也就是當句子做出一些細微的改變的時候,基于 Simhash 獲得的句子向量也只會產生微小的變化,而非像傳統 hash 那樣整個簽名完全發生改變。
具體而言,對于一個句子,首先使用 TF-IDF 等 BoW 方法獲得句子內權重最大的 個單詞,隨后通過一種或若干種 hash 算法將每個單詞都變換為 64 位的 01 二進制序列。遍歷該序列,將值為 0 的位置手工修改為 -1。這樣,每個單詞都被變換為了只包含 的序列。在求整個句子的 hash 值的時候,只需要把它前 個單詞的序列對應位置相加。值得注意的是,相加操作后,我們需要將現在 的位置再次修改為 0,從而使得句向量重新變回一個二進制序列。
要判斷句子間(段落/文本)的相似度差異,只需要對這兩個句子的 Simhash 值進行異或,并判斷異或后 64 位中 1 的個數即可。1 的個數越多,則代表這兩個句子間不相似的位數越多,即越不相似。
1.2 SAUCE
SAUCE [2] 是今年的 CIKM 中一篇比較有趣的工作,同時也使用了 BoW 的思想來提取文本表示向量。SAUCE 的立意其實與 Simhash 更為相似一些,即為了快速檢索相似的文本 —— 再具體一點講,SAUCE 提出的大背景是:我們已經具有了相當豐富的預訓練模型,而我們往往希望將這些模型應用到我們 domain-specific 的任務中。
與這個目的相悖的是,BERT 等預訓練模型為了具有更加 general 的文本表示能力,都是在 Wiki 等通用語料上進行預訓練的。因此產生了一個新的需求:我們希望能夠給定一些領域相關的語料作為種子(corpus seed),來對大規模網頁文本進行檢索,獲得大量相似的領域內文本,從而對通用的預訓練模型進行進一步的訓練(post-pretrain),提升它們在具體領域內的表示能力。
假定總文檔數為 ,首先,像所有的 BoW 方法一樣,SAUCE 產生了一份所有文檔具有的單詞詞表 。上文已經提到,直接進行文檔的向量化會導致每個文檔的向量大小都是 。為了進一步縮小維度,SAUCE 計算了每個單詞出現的文檔數 (Document Count),即:
其中 是指示函數,當 出現在第 個文檔 中時為 1,否則為 0。
SAUCE 基于 來實現維度的縮減,提出了兩個用于控制維度的閾值:
用于篩除出現頻次過低的單詞,即簡單粗暴地刪除所有出現頻次不到 的單詞。刪除后的維度被快速縮減到:
用于控制保留的數量,即在經過 篩選后,接下來只保留剩余單詞中 最小的 個。這個控制方式更加粗暴,強行把向量維度控制到:
然后呢?然后沒有了。因為精美的食材,往往只需要簡單的烹飪。
下圖是作者提供的算法偽代碼,讓我們再過一遍:
(1)算詞表;(2)算 ;(3)卡閾值 ;(4)卡閾值 。偽代碼里用了一個 for 循環來實際執行每個文檔計算向量的方式,引入了 ,看起來比較繁復,實際上就是對篩選出來的 個單詞,依次判斷是不是在當前的文檔中。最后對每個文檔都算出一個 維度的 01 二進制向量。
盡管聽起來是一種非常粗暴的控制方式,但實際上 SAUCE 仍然為 BoW 提供了一個完整的解決方案: 用于刪除整體頻次過低的單詞,效果與 TF-IDF 中由于進行頻次控制的 TF 部分相似(并不完全相同,可以理解為將 TF 中的頻次控制從文檔層面上升到了整個語料層面); 用于保留剩下的單詞中出現頻次最低的數量,意味著出現頻次過高的單詞被刪除,效果與 TF-IDF 中刪除常見詞的 IDF 部分相似。
作者在 Astronomy 和 Bottle water 兩個領域的數據上,和 Random, TF-IDF, Hash, RoBERTa 等方法進行了比較,SAUCE 在計算時間與查詢覆蓋率上均顯著由于這些基線方法。由于文章主旨是 corpus expansion,在實驗時也沿用了這一類的 setting,與本文相關性不大,因此不再敘述。此外,SAUCE 也提出了完善的系統級更新語料的流程偽代碼,以及對應的部署細節,本文僅展示論文中的流程圖,感興趣的同學可以去看完整的論文。
總體而言,SAUCE 為我們提供了另一種文本表示的思路,同時也讓我們確信:想要使用好 BoW 類的方法,就要解決上面提到的兩個缺陷。SAUCE 使用兩個超參數 與 來實現了這一點,然而,相較于自適應所有大小語料的 TF-IDF,SAUCE 給定了兩個依賴于總文檔數、總詞匯數的超參,其實會給想要使用該方法的同學帶來一些困惑:我該怎么設置這兩個參數?大還是小,依據是什么?另外這種受限于語料統計特征的方法也無法進行快速的遷移。天下沒有免費的午餐,也希望同學們都對手上的任務與數據有充分的了解后,再來選擇適用的方法。
Bottom-up methods & Power mean pooling
由于 BoW 類方法的特性,上文中所提到的一些方法其實并不囿于句向量的計算 —— 或者說提出的初衷主要是用于對段落、文本的表示,這是因為較長的文本信息中更容易提取出有效的單詞或詞組。正因此,TF-IDF、Simhash 與 SAUCE 等方法都或多或少地強調了方法應用于大規模快速檢索的能力。而接下來的篇幅中,我們將真正回到主題,開始敘述詞向量的學習與表示。讓我們從一個奇妙的方法:power mean pooling [3](下稱 PMP)開始說起。
之所以說 PMP 奇妙,是因為它一定程度上實現了調參俠們的心愿:網格搜索找參數?逐步回歸選特征?我全都要!
文章最開始提到,由于預訓練語料、任務的選擇不同,市面上提供的預訓練的特征豐富多樣。而關于這些特征的選擇,不同的人具有不同的偏好:李某喜歡 GloVe 的任務中精巧設計的共現邏輯,王某認為簡單好用的 Word2Vec 是不朽的經典,而張某是預訓練模型的忠實擁躉,為大力出奇跡的 BERT 詞向量所傾倒,當然,想必也有同學嘗試過將這些預訓練向量拼起來。PMP 就向大家展示了:直接把現有的預訓練特征及其組合拼起來,也會在下游任務上有很好的效果。
具體地,首先文中引用了 power mean 的形式化定義:
其中, 表示一個長度為? 的句子中,第 個單詞的詞向量。 是一個超參,能取到任意實數或正負無窮。
顯然,在 時,上式就代表了最常用的取平均方法:將句子中所有 token 的向量求平均,作為句子的向量。而在 時,該方法等同于保留每個維度列中最大的值; 意味著保留每個維度中最小的值。雖然大家常用的是平均法,但是這些聚合方法都是有損的壓縮,其實很難說出孰優孰劣,因此作者認為:它們都從某種角度保留了自己覺得重要的信息,但同時又損失了一些信息,那么直接將它們拼接起來,是不是能夠保留更多有效的信息呢?
直覺上而言,取不同的 都有其獨特的意義(值得注意的是,文中也提到,當 取偶數的時候,詞向量的 embedding 會被消除負號,天然產生信息損失,因此并不是一個特別理想的選擇),作者選取了大家所常用的 三個 值。對于詞向量,作者選擇了以下四種:
(GV) GloVe embedding: trained on Common Crawl
(GN) Word2Vec: trained on GoogleNews
(AR) Attract-Repel
(MS) MorphSpecialized
每類詞向量都是?300 維,因此如果將所有出現的情況排列組合,最長的情況下維度會達到: ——和你目前可能在想的一樣,作者提到:用這么大的維度去比一些使用詞向量聚合、維度可能連 1000 都不到的方法是不太公平的,因此作者主要比較了 InferSent 方法,后者的詞向量達到了 4,096 維。當然為了基線方法的豐富性,作者也另外加入了對 SIF(dim=300)、Siamese-CBOW(dim=300)和 Sent2Vec(dim=700)方法的比較。
作者在 AM/AC/CLS 加上 SentEval 共計 9 個任務上評估了 PMP 的效果(具體的任務設定可以參看原文的表 1)。在使用 PMP 句向量時,作者加訓了一個邏輯回歸分類器,結果如下表所示:
表的上部第一個欄目比較了單獨使用詞向量與全部詞向量取平均之間的效果,可以看到把四個向量拼接以后,使用平均求得的句向量(Arithmetic mean 意為算術平均,即 )效果顯著優于獨立使用四種詞向量。但是話說回來,這一欄實際是在拿維度 1,200 去比較維度 300 的向量,顯得有些不公平。
說到這,不知道有沒有小伙伴比較好奇:如果使用 BERT+LR 的形式去做這些任務,效果會不會更好?因為 BERT 只用了 768 維度的詞向量,資源占用是比 1,200 維度低不少的。而如果是的話,是不是說明相較于拼接不同的詞向量,選擇一個表達能力更強、嵌入語義更豐富的詞向量,對于下游任務會有更明顯的幫助呢?
先來回答第一個問題:由于 BERT 原文在 GLUE 和 SQuAD 等數據集上進行了測試,沒辦法進行直觀的比較,但是 Sentence-BERT(SBERT)[4] 在實驗時使用了相同的 SentEval 評估數據,所以我們可以通過 SBERT 的實驗結果來進行間接的比較:
在 SBERT 的實驗結果中,第一行對標了 PMP 結果第一行的 GloVe,兩者的結果幾乎是一致的,說明實驗結果確實橫向可比,而我們略過表中所展示的 SBERT 實驗結果(對不起作者,把你當工具人了),直接看文中第四行所展示的使用? BERT CLS 向量作為句向量 時的評測結果。
可以發現,使用 768 維的 BERT CLS 已經在絕大部分的任務中超過了 3,600 維度的 PMP,甚至在一些組中超過了 InferSent。所以第一個問題的答案是顯而易見的:選擇一個表達能力更強的詞向量,會比拼接現有詞向量以及使用 PMP 效果更佳。結合作者在論文中的結論:拼接詞向量對于整體句向量表達能力的提升優于使用 PMP,我們可以對上面的第二個問題得到一個總括性的結論:
在內存等資源限制的情況下,對于有限的詞向量維度,選擇泛化能力更強的詞向量更佳;
在詞向量表示能力相近的情況下,對于有限的詞向量維度,優先使用已有詞向量拼接取平均(),效果會優于使用不同的 值得到的同一詞向量的擴展結果;
在資源允許的情況下,在以上條件里再加上 PMP,進一步擴展詞向量維度,能進一步提升最后生成的句向量的表示能力。
此外,作者還專門提到:在 PMP 基礎上加上 z-norm,能進一步提升 PMP 的應用效果。
在漫長的討論之后,我們回到正題:PMP 效果表中的第二欄主要展示了使用不同的 值對于結果的影響,可以發現,拼接不同 值的向量也會提升在評測數據上的效果。最后,使用全量數據集、全量?????????????????????????? 值的 3,600 維句向量,效果已經和 InferSent 不相上下。當然,在所有的結果中,只有全量拼接(3,600)與 InferSent 的比較是相對公平的。 作者主動提出了不同維度間的向量比較有失公平,卻在實驗中沒有進一步維護自己的觀點,這點有些令人遺憾。
當然,總的來看,這篇文章仍然為同學們提供了一個行之有效的方向,讓大家不再覺得自己把現有的詞向量拼接起來使用是一種玄學的事情,而是將其作為一個提升句向量表示能力的一個可選工具。
The road to constrastive learning
接下來是筆者覺得當前非常有意思的一個方向:對比學習(contrastive learning)在無監督句向量生成中的使用。在本節中,你會看到眾多才華橫溢的研究者們是如何從詞向量學習擴展到句向量學習、如何從單一的學習目標擴展到對比學習的目標、如何從傳統 hard label 的分類任務到 contrastive label 的對比學習任務,以及探索如何更好的選擇對比學習的正負例。
筆者精選了從 15 年開始的 5 篇文章,希望能通過對它們的解讀達到窺一斑而知全豹的效果,讓大家對這個方向有一個總括性的了解。
3.1 Skip-Tought Vectors
還記得 Word2Vec 里學習詞向量的經典方法:skip-gram 嗎?它的學習目標是:給定一個單詞,判別式地預測它前后出現過的單詞。這個學習目標本質上是希望(1)學到該單詞的上下文信息,并且(2)使得擁有相似上下文的單詞擁有相似的表示。從這一點來看,skip-gram 和 GloVe 通過共現矩陣(co-ocurrence matrix)進行學習,從而讓共現情況相似的單詞具有相似的表示有異曲同工的設計。
上文已經提到,如果使用 Word2Vec 具有的詞向量取平均作為句向量,這一類 bottom-up methods 會損失信息。PMP 方法使用不同的??值緩解了信息,卻沒有從學習目標的角度解決這一問題 —— Skip-Tought [5] 方法就為這一問題提供了一個解決思路:如果把?skip-gram 從句子角度放大到篇章角度,這樣學到的不就是句向量了嗎?唯一的區別在于,前者的訓練單元(unit)是 word,后者的訓練單元是 sentence。
當然,正如 skip-gram 隱式要求句子內單詞是有序的一樣,skip-tought 要求輸入的句子間是具有上下關系的,這一點或許會在應用 skip-tought 時成為制約。特別地,作者的實驗中要求輸入的語料需要是連貫的 三元組。
在實現的時候,還有一個直接的問題:句子的多樣性比單詞要大得多,訓練詞向量的時候有詞表,但訓練句向量不能用句表,否則 embedding table 可能大到整個恒河都裝不了。作者使用了當時熾手可熱的 Encoder-Decoder 結構來解決這個問題:使用 GRU 單元的 RNN 來作為 encoder,來獲取當前句子的表示向量,再使用 decoder 來產生該句子的上下文。
在文中,上下文特指上句與下句(好比 skip-gram 只預測當前單詞的上下各一個單詞)。特別地,因為句子的嵌入信息會比單一的單詞要更多,所以作者使用了兩個 decoder 來分別生成當前句子的上句與下句。下圖是輸入語料的示意圖:
輸入中間句“I could see the cat on the steps <eos>”后,分別用兩個 decoder 生成了上句“I got back home <eos>”以及下句“This was strange <eos>”。訓練目標定義上下句生成結果的概率和,即給定 encoder 的輸出 ,前面的時間步里已經生成的所有單詞 ,最終生成當前單詞的條件概率 之和:
在效果評估階段,作者在 sematic relatedness(SICK), paraphrase detection(MS Paraphrase Corpous), image-sentence ranking(COCO)三個任務上驗證了 skip-tought vector 的有效性,其中也嘗試了不同類型的 encoder(unidirectional/bidirectional)。
值得注意的是,作者設定的 encoder 輸出向量維度是 2,400,在用于評估的 sentence-pair 任務中,對于句子 ,,作者使用了 的形式構造得到用于分類的向量,也就是說分類向量達到了 4,800 維。最終的結果與 SoTA 都是可比的 —— 除了 Dependency Tree-LSTM,作者說這是因為后者在數據處理時引入了 parser 帶來的外部信息。
3.2 SDAE
和 skip-tought 使用 Encoder-Decoder 解決問題的思路不太一樣的是,SDAE?[6](顧名思義)選擇了用 DAE 來無監督地獲取句子的向量。上文中提到,skip-tought 有一個比較明顯的缺點是:輸入的語料必須是連貫的三元組,而 DAE(denoising auto-encoder)的特點是可以對加入噪聲前后的句子本身進行學習,從而避免同時輸入句子的上下句信息。
特別地,對于一個輸入的句子 ,作者通過兩個超參數 控制句子的兩種增強:
對于句子 中的每個單詞 ,以 的概率對它進行刪除;
對于句子 中的連續兩個單詞 ,以 的概率對它們進行交換。
以增強(加入噪聲)后的句子作為輸入,要求模型輸出原始的句子,這就是 SDAE(sequential denoising auto-encoder)的基礎思想。與 skip-tought 一樣,作者使用了基于 LSTM 結構的 encoder-decoder 進行訓練,在使用句向量時,對于有監督任務,作者在句向量上加入 LR 來進行模型的 tuning;對于無監督任務,直接計算句向量的 cos 相似度,并與標準結果進行比較。以下是在無監督評估數據上的實驗結果:
在第一欄中,比較 SAE 與 SDAE 的結果可以發現,后者在 Twitter 等比較 noisy 的數據上有明顯提升,這佐證了引入兩種概率增強方法的有效性;然而在完全無監督的情況下,整體效果最好的仍然是兩類 Word2Vec 的實現方法,并且即便是基于 unigram 的 TF-IDF 也在大部分的驗證任務上好于其它模型。對于論文本身而言,這并不是一個特別 fancy 的實驗結果,作者在文中也沒有明確給出這個現象的解釋(我們將在本文最后的思考部分正式拋出這個問題)。
3.3 中場休息
skip-tought 與 SDAE 都使用了 encoder-decoder 結構,但采用了兩種截然不同的思路:前者使用了兩個 decoder 分別預測當前句子的上下句,因此需要輸入連貫的句子;后者采取 DAE 的思路,輸入加入噪聲后的句子,讓 decoder 嘗試復原出原始的句子。這兩個方法雖然看起來有些差別,但有一個特性是相似的:decoder 學習過程中的學習目標都是?hard label。
什么是 hard label 呢?有對模型蒸餾或者噪聲學習等方向有所了解的同學可能知道,hard label 就是把模型要預測的目標設置成 1,即我們明確認為這個學習目標是絕對正確的:在對模型進行蒸餾時,我們一般認為 gold label 中會帶有少量噪聲(或者沒有噪聲,但某些樣本的 pattern 很難學習,從而對模型收斂有所影響),所以除了給定的 gold 標簽以外,我們同時要學習大模型預測的分布,一般是 softmax 前面層的輸出結果,被稱為 soft label。帶噪學習中,由于更加篤定標簽是具有噪聲的,所以更加傾向于部分使用 hard label 而非全部采納,如 co-teaching 等方法使用了不同模型間的相互學習。
回到正題,那么現在的問題是:我在 encoder-decoder 結構中,將上下句或是當前句設為學習目標,真的是正確的嗎?
這個問題誰也無法回答,但我們從最簡單的邏輯關系角度至少可以確定:以上兩種方法肯定不可能全是對的,因為他們的學習目標本身就是不一樣的。亦或是,他們可能是“對”的,但從 NLU 整體的發展方向上來說,不會都是“合適”的。
那么什么學習目標是合適的呢?至少可以說,相較于上面提到的兩類使用 hard label 的方法,對比學習(contrastive learning)能幫我們設定一個更加合適的目標,從而幫助我們往正確的道路上多走幾步。因為對比學習的目標不是設定一個 hard label 讓模型去學習,而是讓我們給定一個考察相似性的方法,隨后讓模型拉近相似類間的向量距離(alignment),同時盡量使不同的同類別在整個向量空間中均勻分布(uniformity)。作為例子,希望下面提到的 QuickTought 與 SimCSE 對大家有所啟發。
3.4 QuickToughts
結合上面的討論,筆者嘗試用最簡單的語言來解釋 QuickToughts [7] 的改進:將 skip-tought 的學習目標 —— 上下句的 hard label —— 修改為對比學習的學習目標。即拉近當前句與上下句之間的向量距離:
其中:
缺少了一些前置內容,可能公式不容易看懂,但是整體上能夠感覺出來,這個式子的目標是:在一系列候選句子 中挑選出和當前句子 最為相似的句子 。很容易發現,式子 2 本質上就是一個 softmax 過程, 意為一個計算相似度的函數,例如點積或余弦相似度, 與 代表這兩個不同的模型,可以簡單理解為 skip-tought 中的 encoder 與 decoder。式 2 的含義就是讓最相似的句子對具有更大的權重,并且同時降低不相似句子對之間的權重。這就是對比學習的典型思路了。
下圖也解釋了這兩類方法間的差異:
有趣的是,作者還在文中專門提到:在實驗過程中也嘗試過類似負采樣的方式,通過二元分類器來學習 hard label,但效果并不如上面的學習目標那么好,并給出了與上文類似的解釋:
We found object (2) work better, presumably due to the related constraint it imposes. Instead of requiring context windows to be classified as positive/negative, it only requires groud truth contexts to be more plausible than contrastive contexts.
換言之就是,我們不需要模型具有兩兩判斷是否是 NSP 的能力,我們只需要模型能從一系列候選句中挑出最相似的那個就好了。
在實驗階段,作者比較了 SDAE、skip-tought 等傳統方法,可以發現:
使用 BookCorpus 語料從頭訓練時,QuickToughts 能在相當一部分任務中和現有方法可比,部分任務上能夠超過現有的方法;
使用 BookCorpus+ 預訓練詞向量初始化后,QuickToughts 方法在所有任務上都能超過現有方法。
PMP 看到這里可能還是會忍不住怨念一下:諸君這樣始終用不同維度的詞向量進行相互比較真的大丈夫?
3.5 SimCSE
如 QuickToughts 可以理解為把 skip-tought 帶入了對比學習領域一樣,我們可以這樣描述:SimCSE [8] 把 SDAE 帶入了對比學習領域。
也正如 SimCSE 在文章開頭就直截了當地展示了該方法超越同儕的效果一樣,筆者也在開始就告訴大家 SimCSE 的方法:使用 dropout 作為噪聲。還記得 SDAE 嗎?它用了兩個概率 來構造帶噪聲的句子,然后用生成的方式復原原始句子。SimCSE 簡單粗暴地使用 dropout 前后的句向量作為學習目標 —— 當然,由于引入了對比學習,論文的目標變成了:
和 QuickToughts 的學習目標是不是很像? 表示使用 dropout 后的句子 的向量表示, 表示使用 dropout 后的句子 的向量表示,由于 是不一樣的 dropout,因此輸出的句向量會有所區別,作者就以這個區別作為了 DAE 中的噪聲。
在實驗階段,隨著論文的與時俱進,SimCSE 已經開始使用 BERT 預訓練模型作為初始化的模型了(上文的 也就是 transformer 里自帶的 dropout)。實驗結果如下表所示:
SimCSE?在 STS 的所有任務中都大幅領先于之前的基線方法,部分的提升幅度甚至超過了 10%。在有監督模型的比較中,SimCSE 仍能保持相當大的領先,可以說把 SoTA 向上提了一大步。如此細微的改動能帶來如此大幅度的提升,這個結果是十分驚艷的。
除了簡單但有效的對比目標以外,論文里還從理論角度解釋了其有效的原因,可讀性很強,推薦想詳細了解對比學習在無監督句向量中的應用的同學可以從這篇文章開始,根據相關工作往前回溯。
討論與思考
全文行文過程中其實會時不時地提出一些小問題(大部分都帶有答案),在這里,筆者主要是想提出一些值得思考的點,它們可能目前尚沒有明確的答案,又或者每個人都有自己的想法——興許思考這些問題,能給你帶來一些特別的 insights 呢?
奧卡姆剃刀:盡管篇幅所限,筆者只提到了兩篇對比學習的文章,但仍有相當一部分使用對比學習做無監督句向量學習的工作(比如作為 SimCSE 效果背景板之一的 IS-BERT,使用了全局與局部詞向量作為對比的目標),但 SimCSE 用了最簡單的方式實現了最出眾的效果。有時往往會發現,一些越簡單的思路,或許反而會取得越好的效果,如 SimCSE 之于 SDAE(dropout is all you need),MLM 之于 EDA(mask is all you need),如 PMP 之于雙塔(concatenation is all you need)。興許在做研究的時候,不要過分注重于模型的轉型升級,而是從其它角度試著簡化問題,會帶來更加有價值的結果。
Prompt-based Contrastive Learning:或許在很遠的未來,我們能獲得一個一統天下的模型,它能夠勝任所有的 NLP 任務,但至少從目前來看,我們離這一天還有很長的路要走,在當前,我們想要做一個特定領域的特定任務的時候,還是需要針對性地去設計訓練目標。在為人所廣泛研究的 Language Model(LM)領域,已經有了 Prompt-base LM [9] 這個思路,即針對下游想要優化的任務,來針對性地設計預訓練目標,定點強化預訓練模型在特定領域內的效果。在對比學習中,是否也可以借鑒這個思路(我們可以發現,從 SDAE 到 IS-BERT 到 SimCSE,就是一個尋找更好的自監督目標的過程),根據下游的任務,來設計一個更好的對比目標呢?
順序的重要性:你是否發現,句向量的獲取方法間有一個鮮明的區別:是否用到了上下文。例如:skip-tought 要求輸入的句子有序,而 SDAE 不用;QuickTought 要求輸入句子間的先驗關系,而 SimCSE 不用。更加廣泛的,BoW 類型的句向量獲取方法甚至不要求輸入句子里的詞匯具有先后順序。直覺上來說,人類在理解自然語言時,對于詞序與句序是有相當強的依賴的,但在 NLP 里,似乎不用這些順序信息就能得到很好的效果。是因為 NLP 的發展不能完全參考人類對于自然語言的理解方式,還是說我們仍未很好地發掘出這些順序信息所蘊含的潛能呢?
參考文獻
[1] Jawahar G, Sagot B, Seddah D. What does BERT learn about the structure of language?[C]//ACL 2019-57th Annual Meeting of the Association for Computational Linguistics. 2019.?
[2] Wahed M, Gruhl D, Alba A, et al. SAUCE: Truncated Sparse Document Signature Bit-Vectors for Fast Web-Scale Corpus Expansion[J]. arXiv preprint arXiv:2108.11948, 2021. (Accepted to CIKM 2021)?
[3] Rücklé A, Eger S, Peyrard M, et al. Concatenated power mean word embeddings as universal cross-lingual sentence representations[J]. arXiv preprint arXiv:1803.01400, 2018.?
[4] Reimers N, Gurevych I. Sentence-bert: Sentence embeddings using siamese bert-networks[J]. arXiv preprint arXiv:1908.10084, 2019. (Accepted to IJCAI 2019)?
[5] Kiros R, Zhu Y, Salakhutdinov R R, et al. Skip-thought vectors[C]//Advances in neural information processing systems. 2015: 3294-3302. [^6]: Hill F, Cho K, Korhonen A. Learning distributed representations of sentences from unlabelled data[J]. arXiv preprint arXiv:1602.03483, 2016. (Accepted NAACL 2016)?
[7] Logeswaran L, Lee H. An efficient framework for learning sentence representations[J]. arXiv preprint arXiv:1803.02893, 2018. (Accepted to ICLR 2018)
[8] Gao T, Yao X, Chen D. SimCSE: Simple Contrastive Learning of Sentence Embeddings[J]. arXiv preprint arXiv:2104.08821, 2021.?
[9] 蘇劍林. (Apr. 03, 2021). 《P-tuning:自動構建模版,釋放語言模型潛能 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/8295
更多閱讀
#投 稿?通 道#
?讓你的文字被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學術熱點剖析、科研心得或競賽經驗講解等。我們的目的只有一個,讓知識真正流動起來。
📝?稿件基本要求:
? 文章確系個人原創作品,未曾在公開渠道發表,如為其他平臺已發表或待發表的文章,請明確標注?
? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發送,要求圖片清晰,無版權問題
? PaperWeekly 尊重原作者署名權,并將為每篇被采納的原創首發稿件,提供業內具有競爭力稿酬,具體依據文章閱讀量和文章質量階梯制結算
📬?投稿通道:
? 投稿郵箱:hr@paperweekly.site?
? 來稿請備注即時聯系方式(微信),以便我們在稿件選用的第一時間聯系作者
? 您也可以直接添加小編微信(pwbot02)快速投稿,備注:姓名-投稿
△長按添加PaperWeekly小編
🔍
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
·
總結
以上是生活随笔為你收集整理的如何无监督地获得一个句子的向量表示?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ICML 2021 | Option-G
- 下一篇: 今日arXiv精选 | 13篇EMNLP