在4/5章我們討論過用skip-thought,quick-thought任務來進行通用文字向量提取,當時就有一個疑問為什麼用Bookcorpus這種連續文字,通過預測前一個和後一個句子的方式得到的文字向量,能在下游任務裡取得比較好的效果呢?這一章我們來聊聊都有哪些SOTA通用文字框架,或許直接使用它們的場景已經不多,但你依舊能在各個前沿方法中看到它們的影子。我們會主要聊聊以下內容
- 通用性:為啥需要通用文字表達?通用具體指什麼?如何評價?
- 為什麼部分監督模型得到的文字表達不通用?
- 哪些模型結構和訓練任務可以得到更通用的文字向量?
通用性
人類語言有有近乎無限的統計複雜度,但可以在低維度上得到很好的近似。對通用文字表達的探索,都是希望能找到更優的語言模型框架,去儘可能全面地從文字中提取資訊。
NLP任務往往很難拿到大量標註樣本,通用文字表達通過特徵遷移把預訓練模型得到的文字向量,作為下游任務的模型輸入,幫助模型跳過從文字中提取資訊的步驟,資訊已經在文字向量中,模型只需要從向量中抽取用於當前任務的資訊即可,這樣可以大大降低對標註資料的需求,使很多缺乏樣本的不可能任務成為可能。
以下paper多選擇了特徵遷移的方式,即把預訓練模型得到的文字表達作為下游任務的輸入來評價通用性。下游任務主要包括分類任務和文字語義相似度任務,其中分類任務有
評價文字向量在分類問題中的表現,一般會採用最簡單的logistic classifier,輸入是文字向量,輸出是分類結果,這樣最小化模型結構帶來的影響,只去評價文字向量本身是否包含該分類問題所需的資訊。
文字語義相似度任務(STS Benchmark)包括
評價文字相似度,一般直接計算文字向量的cosine距離,然後計算和標註label的pearson correlation。
針對以上任務也有一些文字評估的開源library可以直接用,例如SentEval,GLUE Benchmark
模型框架
下面我們會分別介紹4種模型架構,以及它們在以上benchmark資料集上的表現。不過個人感覺不用太過在意每個新架構在Benchmark上的表現提升,之前看到有調侃刷榜現象的評論說:新模型一定使用grid-search進行超參搜尋直到它超越已有的SOTA方法,但絕不會對進行對比的其他方法也做調優,感覺雖不中亦不遠矣。所以我們只關注架構中有意思的創新點和它背後的邏輯就好~
FastSent|SDAE(Hill 2016)
Take Away:不同的下游資訊提取方式會從相同的文字中提取出不同資訊, log-bilinear類文字表達在文字相似度任務中表現更好
先簡單過下paper中提到的另外兩種文字向量的生成方式:
- FastSent: 快速版Skip-thought,其實就是忽略語序用詞向量加和作為句子向量,任務不變依舊是用中間句子來預測前後句子
- SDAE: skip-thought訓練依賴像小說一類的連續文字,SADE是針對像twitter一樣沒有上下文只有單一句子的訓練方案。先對句子本身進行隨機刪除單詞,替換順序,之後過autoencoder來預測原始句子本身。其實和Bert的MLM完形填空任務有些相似了,只不過Bert是隻預測Mask的單詞,而SDAE是預測整個句子。
這裡我們關注的重點不在這兩種演算法,而在於paper對比了skip-thought, Fastsent,SDAE, DBOW, BOW,DictRep用字典解釋的BOW或者RNN來擬合解釋的詞向量,CaptionRep用標題向量擬合圖片向量,以及NMT翻譯任務,得到不同文字表達在下游任務中的表現,有一些比較有意思的結論。
文字分類的下游任務沒啥說的,skip-thought整體表現最優(2016年)~
而文字相似度任務結果比較有趣,整體上log-bilinear類的模型包括Fastsent,DickRep, 以及直接對CBOW詞向量求平均得到的文字向量表達在STS和SICK資料集上有更好的表現。
這裡並非其他向量沒有學到Semantic Similarity資訊,而是資訊並不能簡單通過cosine距離被提取出來。因此不僅如何生成通用文字很重要,如何從文字中提取資訊也很重要。log-bilinear類的模型例如CBOW,在梯度更新時本就通過向量加/減進行計算,隱含了距離計算在內,因此更適用於cosine距離計算。想得到Semantically meaningful的文字表達,另一種解決思路就是在訓練embedding的過程中加入向量距離計算,下面的Infersent就用了類似的操作。
InferSent(Facebook 2017)
Take Away: 並非所有監督模型得到的通用表達都不好,NLI標註資料就可以!
在InfeSent之前,通用文字表達以Skip-thought/FastSent這類無監督模型為主,不是沒有其他監督模型的文字表達,但效果都不太好。文章指出監督模型文字表達通用性差的原因在於NN很容易學到特定監督任務的特殊性(Inductive Bias),例如判斷正負面的任務可能主要關注和正負面有關的關鍵詞資訊,翻譯更注重相同語法結構和詞之間的對應關係等等,從而忽視文字的整體語義。非監督任務例如自己預測自己的SDAE,預測前/後句子的NSP類任務因為沒啥特殊性,反而會得到包含更完整語義資訊的文字表達。但paper指出並非所有監督任務都不好,NLI就可以呀!
先來瞅一眼NLI資料集長啥樣, SNLI是文字蘊含的推理任務(RTE),由5個標註同學標註文字和假設之間是正向蘊含,矛盾蘊含還是獨立蘊含,最終major vote得到neutral, contradiction,entailment的分類標籤。作者認為NLI需要真正理解文字才能做出判斷,導致NLI更適合用來學習通用文字表達。。。這解釋的好抽象。。。簡直就像沒解釋一樣。。。。不過從某種程度講NLI相較文字相似任務,翻譯任務確實更難抽象出task-specific的模式,它對語法結構是否相同,是否包含相同或同義詞沒有非常一致的要求。
InferSent模型用了siamese結構,兩個句子共用一個encoder,分別得到u和v的文字向量表達。然後用3種計算方式,向量拼接\([u,v]\),相乘\(u \cdot v\),相減\(|u-v|\)(為了保證對稱性取絕對值),來幫助後面的全連線層提取向量間的互動資訊,最後跟一個3-class的分類器。
對於Encoder選擇作者對比了GRU/LSTM/BiLSTM+max/avg pooling,以及self-attention和Hierarchical ConvNet,發現BiLSTM+max pooling得到的文字向量,在下游任務的評估中幾乎全面超越了skip-thought,在CR等部分任務中和直接針對任務訓練的監督模型幾乎不相上下。
之後的Sentence-Bert也借鑑了InferSent的框架,只不過把encoder部分替換成了bert,這個留到Bert之後再說
GenSen(Microsoft 2018)
Take Away: 單一任務的文字表達存在inductive-bias,可以通過multi-task來融合
InferSent通過尋找相對抽象需要文字理解的監督任務來得到更通用的文字表達,而GenSen提出可以直接融合多個監督任務來提高通用性。GenSen總共選取了4大類任務,在滿足多樣性的前提下,每個任務本身要在文字表達上有不錯的效果且有足夠大的訓練樣本,包括Skip-thought,NMT翻譯任務,NLI推理任務和parsing句法分析。
GenSen用了相對簡單的針對不同資料來源的multi-task訓練方式,上述任務都是英文輸入所以共用1個GRU Encoder,保證不同任務都在更新相同的資訊提取方式,得到包含多個任務資訊的文字表達。這裡的Encoder沿用了Skip-though的conditional GRU,不熟悉的童鞋可以看這裡無所不能的Embedding4 - skip-thought & tf-Seq2Seq原始碼解析。每個任務各自有不同的Decoder,每一輪等權隨機選擇一個任務,從該任務中取相同batch_size的樣本進行梯度更新。以下是GenSen在下游任務的表現
最右側的\(\Delta\)是相對InferSent的提升,會發現隨著GenSen加入更多目標任務,相對Infsersent在10個任務上的平均表現會持續上升,雖然並非所有下游任務都是隨訓練目標增多而變得更好。之後很多預訓練語言模型包括Bert都沿用了multi-task的思路,只不過選用的多目標任務各有不同而已。
USE (Google 2018)
Take Away: 同樣通過multi-task生成通用文字向量
和GenSen同期,還有另一個multi-task的模型架構被提出就是universal-sentence-encoder。感覺USE名聲更大些,大概是因為在hub上開源了Large,Lite和MultiLingual的模型[Ref9],可以很方便的開箱即用,或者在新的場景做finetune。和GenSen的主要區別有兩個
- 多目標任務選擇不同,USE雖然依舊是通用文字,但它選擇的目標任務訓練方式導致文字表達更加Semantically Meaningful,通常預訓練模型就能在各類文字相似度任務中拿到非常好的結果。3個目標任務分別是Skip-thought類前後句子預測任務,Input-response對話任務,以及NLI推理任務。因此Semantic Similar的文字可能會有相似的上下文語境,相似的提問或回答,相似的推理內容,如下圖所示
- Encoder選擇不同,GenSen沿用了GRU Encoder,而USE給出了DAN和transformer兩種計算複雜度不同的encoder。DAN是Lite版的Encoder不考慮詞序只是詞向量求和作為輸入,Transfromer是Large版的Encoder複雜度更高,通常效果也更好。不熟悉transformer的同學看這裡無所不能的Embedding6 - 跨入Transformer時代~模型詳解&程式碼實現
通用文字框架就說這麼多,最後的最後來給兩大神器打個廣告
- Connected Paper 找paper神器,圖結構讓你不費吹灰之力就能扒出前後五百年
- Paper with code 新增Dataset功能一鍵定位Benchmark資料集,媽媽再也不用擔心我找不到資料啦
Reference
- [FastSent|DVAE] Learning Distributed Representations of Sentences from Unlabelled Data (2016)
- [InferSent] Supervised Learning of Universal Sentence Representations from Natural Language Inference Data (2017)
- [GenSen] LEARNING GENERAL PURPOSE DISTRIBUTED SENTENCE REPRESENTATIONS VIA LARGE SCALE MULTITASK LEARNING (2018)
- [USE] Universal Sentence Encoder (Google 2018)
- [SentEval] An Evaluation Toolkit for Universal Sentence Representations
- [GLUE]A MULTI-TASK BENCHMARK AND ANALYSIS PLATFORM FOR NATURAL LANGUAGE UNDERSTAND- ING
- https://github.com/Maluuba/gensen
- https://www.google.com/search?client=firefox-b-d&q=InferSent
- https://www.google.com/search?client=firefox-b-d&q=Fastsent
- https://ai.googleblog.com/2018/05/advances-in-semantic-textual-similarity.html
- https://tfhub.dev/google/universal-sentence-encoder/1
- https://zhuanlan.zhihu.com/p/50443871
- https://amitness.com/2020/06/universal-sentence-encoder/