word embedding技術如word2vec,glove等已經普遍應用於NLP,極大地推進了NLP的發展。既然詞能夠embedding,句子也應該能夠(其實,萬物皆可embedding,Embedding is All You Need ^_^)。近年來(2014-2018),許多研究者在研究如何進行句子表示學習,從而得到質量較高的句子向量(sentence embedding)。事實上,sentence embedding在信息檢索,句子匹配,句子分類等任務上均有普遍應用,而且上述任務每每做爲下游任務來評測sentence embedding的好壞。本文將介紹如何用無監督學習方法來獲取sentence embedding,是對近期閱讀的sentence embedding論文筆記的總結(https://github.com/llhthinker/NLP-Papers#distributed-sentence-representations)。歡迎轉載,請保留原文連接http://www.javashuo.com/article/p-ccbbvuzf-dd.htmlhtml
獲取sentence embedding最直接最簡單的思路就是對一個句子中全部詞的word embedding進行組合。這種方法最明顯的缺點是沒有考慮詞序信息,可是足夠簡單高效,在一些任務上是很好的baseline。git
平均詞向量就是將句子中全部詞的word embedding相加取平均,獲得的向量就當作最終的sentence embedding。這種方法的缺點是認爲句子中的全部詞對於表達句子含義一樣重要。TFIDF加權平均詞向量就是對每一個詞按照tfidf進行打分,而後進行加權平均,獲得最終的句子表示。github
發表於2016年的論文A simple but tough-to-beat baseline for sentence embeddings提出了一種很是簡單可是具備必定競爭力的句子向量表示算法。算法包括兩步,第一步是對句子中全部的詞向量進行加權平均,獲得平均向量\(v_s\);第二步是移出(減去)\(v_s\)在全部句子向量組成的矩陣的第一個主成分(principal component / singular vector)上的投影,所以該算法被簡記爲WR(W:weighting, R: removing)。算法
第一步主要是對TFIDF加權平均詞向量表示句子的方法進行改進。論文提出了一種平滑倒詞頻 (smooth inverse frequency, SIF)方法用於計算每一個詞的加權係數,具體地,詞\(w\)的權重爲\(a / (a+p(w))\),其中\(a\)爲平滑參數,\(p(w)\)爲(估計的)詞頻。直觀理解SIF,就是說頻率越低的詞在當前句子出現了,說明它在句子中的重要性更大,也就是加權係數更大。事實上,若是把一個句子認爲是一篇文檔而且假設該句中不出現重複的詞(TF=1),那麼TFIDF將演變成IF,即未平滑的倒詞頻。可是相較於TFIDF這種經驗式公式,論文經過理論證實爲SIF提供理論依據。對於第二步,我的的直觀理解是移出全部句子的共有信息,所以保留下來的句子向量更可以表示自己並與其它句子向量產生差距。算法描述以下(其中\(v_s, u\)的shape均爲[d, 1],\(uu^T\)爲[d,d]的矩陣,d爲詞向量維度):網絡
論文實驗代表該方法具備不錯的競爭力,在大部分數據集上都比平均詞向量或者使用TFIDF加權平均的效果好,在使用PSL做爲詞向量時甚至能達到最優結果。固然,因爲PSL自己是基於有監督任務(短語對)來訓練詞向量,所以PSL+WR能在文本蘊含或類似度計算任務上達到甚至戰勝LSTM的效果也在情理之中。代碼開源在https://github.com/PrincetonML/SIF架構
下面介紹的方法是在無標籤語料上訓練句子表示學習模型,基本思想都是在無標籤訓練數據上設計監督學習任務進行學習,所以這裏所說的無監督句子表示學習着重於訓練數據是無標籤的。框架
發表於2014年的論文Distributed representations of sentences and documents提出了兩個模型用於學習句子和文檔分佈式表示(段落向量,Paragraph vector)。Paragraph Vector: A distributed memory model(PV-DM) 是論文提出的第一個學習段落向量的模型,以下圖:分佈式
模型的具體步驟以下:函數
這個段落向量能夠被認爲是另外一個詞。能夠將它理解爲一種記憶單元,記住當前上下文所缺失的內容或段落的主題 。矩陣\(D\) 和\(W\) 的區別是:學習
Paragraph Vector without word ordering: Distributed bag of words (PV-DBOW) 是論文提出的第二個學習段落向量的模型,以下圖:
PV-DM與PV-DBOW的優勢它們不只能獲取句子向量,也能獲取文檔級別向量。論文的工做頗有影響力,具體實現已經集成在gensim包中。
2014年發表的論文A Model of Coherence Based on Distributed Sentence Representation提出了一種基於分佈式句子表示的模型,用來判斷文本連貫性(Coherence)。模型的輸入是多個句子(a window of sentences),輸出是這些句子是連續的機率。模型的主要步驟以下:
給定一篇包含\(N_d\)個句子的文檔\(d={s_1,s_2, ...,s_{N_d}}\),假設\(L=3\),能夠生成以下的樣本:
\[ < s _ { \text{start} } , s _ { 1 } , s _ { 2 } > , < s _ { 1 } , s _ { 2 } , s _ { 3 } > , \ldots \\ < s _ { N _ { d } - 2 } , s _ { N _ { d } - 1 } , s _ { N _ { d } } > , < s _ { N _ { d } - 1 } , s _ { N _ { d } } , s _ { e n d } > \]
文檔\(d\)的連貫性得分\(S_d\)能夠定義爲因此樣本連貫性機率的乘積(得分越大表示越連貫),即
\[ S _ { d } = \prod _ { C \in d } p \left( y _ { C } = 1 \right) \]
雖然論文的任務是判斷文本連貫性,給了後續的研究者研究句子分佈式表示的啓示:相似於word2vec中使用相鄰詞預測的方式來得到word embedding,能夠經過句子連貫性這個任務自動構建數據集,無需標註便可獲得sentence embedding。
2015年發表的論文Skip-Thought Vectors提出了Skip-Thought模型用於獲得句子向量表示Skip-Thought Vectors。基本思想是word2vec中的skip-gram模型從詞級別到句子級別的推廣:對當前句子進行編碼後對其周圍的句子進行預測。具體地,skip-thought模型以下圖,給定一個連續的句子三元組,對中間的句子進行編碼,經過編碼的句子向量預測前一個句子和後一個句子。Skip-Thought向量的實驗結果代表,能夠從相鄰句子的內容推斷出豐富的句子語義。代碼開源在https://github.com/tensorflow/models/tree/master/research/skip_thoughts
模型的基本架構與encoder-decoder模型相似,論文中使用的encoder和decoder都爲GRU,使用單向GRU稱爲uni-skip,雙向GRU稱爲bi-skip,將uni-skip和bi-skip生成的sentence embedding進行concat稱爲combine-skip。論文經過大量實驗對比了上述三種變體的效果,整體上來講是uni-skip < bi-skip < combine-skip。
詞表擴展是該篇論文的重要trick。skip-thought模型的詞表規模每每是遠小於現實中的詞表(如用海量數據訓練的word2vec)。爲了讓模型可以對任意句子進行編碼,受論文Exploiting similarities among languages for machine translation的啓發,本文訓練一個線性映射模型,將word2vec的詞向量映射爲skip-thought模型encoder詞表空間的詞向量。假設訓練後的skip-thought模型的詞向量矩陣爲X,大小爲[num_words,dim1],即詞表大小爲num_words,詞向量維度爲dim1,這num_words個詞在word2vec中對應的詞向量矩陣爲Y,大小爲[num_words, dim2],即word2vec的詞向量維度爲dim2。咱們的目的是word2vec中的詞向量經過線性變換後獲得詞向量與skip-thought模型encoder空間的詞向量無限接近,所以最小化線性迴歸\(loss= || X - Y * W ||^2\)。獲得這個線性模型後,假設待編碼的句子中的某個詞不屬於skip-thought詞表,則首先在word2vec詞表中進行look up獲得word2vec對應的詞向量,再經過線性模型映射爲skip-thought模型encoder空間的詞向量。
2016年發表的論文Learning Distributed Representations of Sentences from Unlabelled Data提出的第一種模型稱爲序列去噪自編碼器(SDAE: Sequential Denoising AutoEncoder)。AutoEncoder包括編碼器和解碼器兩部分,輸入信息經過編碼器產生編碼信息,再經過解碼器獲得輸入信息,模型的目標是使輸出信息和輸入信息原來越接近。DAE (Denoising AutoEncoder)表示模型的輸入信息首先通過了噪聲處理後再進行編碼和解碼,而且但願解碼的輸出信息是不含噪聲的輸入信息,即去噪。DAE經常使用於圖像處理,本文提出SDAE模型表示用來處理變長的句子(序列)。具體地,給定句子\(S\),採用噪聲函數:\(N(S|p_0,p_x)\),其中\(p_0, p_x\)爲0到1之間的機率值。首先,對於\(S\)中的每一個詞\(w\),噪聲函數\(N\)按照機率\(p_0\)隨機刪除\(w\),而後對於\(S\)中每一個不重疊的bigram \(w_iw_{i+1}\),噪聲函數\(N\)按照機率\(p_x\)對\(w_i\)和\(w_{i+1}\)進行交換。論文采用基於LSTM的encoder-decoder模型,SDAE的目標是預測出原始句子\(S\)。SDAE模型在驗證集上對超參數\(p_0,p_x \in {0.1, 0.2, 0.3}\)進行搜索,獲得當\(p_0=p_x=0.1\)爲最優結果。論文還嘗試令\(p_0=p_x=0\)進行對比實驗,SDAE模型即變成了SAE模型。 SDAE模型相較於Skip-Thought的優勢是隻須要輸入單個句子,即不要求句子所在的文本是有序的,而Skip-Thought的輸入必須是三個有序的句子。
2016年發表的論文Learning Distributed Representations of Sentences from Unlabelled Data提出的第二種模型稱爲FastSent,Skip-Thought模型採起語言模型形式的編碼解碼方式,致使其訓練速度會很慢。FastSent採起了BoW(詞袋)形式的編碼方式,使得模型訓練速度大幅提升,所以稱爲FastSent。具體地,給定一個連續的句子三元組\(S_{i-1}, S_i, S_{i+1}\),對中間的句子\(S_{i}\)進行編碼,編碼方式是\(S_i\)中全部詞的詞向量之和,即\(\mathbf { s } _ { \mathbf { i } } = \sum _ { w \in S _ { i } } u _ { w }\),而後根據\(\mathbf { s } _ { \mathbf { i } }\)對\(w \in S_{i-1} \cup S_{i+1}\)進行預測,這與word2vec模型中的skip-gram基本一致,而無需像Skip-Thought同樣按照句子中詞的順序生成(預測)。所以FastSent的損失函數以下:
\[ \sum _ { w \in S _ { i - 1 } \cup S _ { i + 1 } } \phi \left( \mathbf { s } _ { \mathbf { i } } , v _ { w } \right) \]
其中\(\phi \left( v _ { 1 } , v _ { 2 } \right)\)爲softmax函數,\(v_w\)爲目標句子中的詞\(w\)的embedding。論文還提出了一種變體模型FastSent+AE,該變體不光是預測先後兩個句子中的詞,還預測自己句子的詞,損失函數即爲:
\[ \sum _ { w \in S _ { i - 1 } \cup S _ { i } \cup S _ { i + 1 } } \phi \left( \mathbf { s _ { i } } , v _ { w } \right) \]
模型訓練後,測試階段,FastSent可以經過計算句子中全部詞向量的和迅速獲得句子embedding,即:\(\mathbf { s } = \sum _ { w \in S } u _ { w }\)。
論文經過兩種類型的下游任務來評測句子分佈式表示的質量,分別爲監督類型(包括釋義識別,文本分類)和非監督類型(語義相關性:SICK數據集與STS數據集,直接計算句子向量的餘弦類似度並與人類打分進行比較)。實驗結果爲SDAE模型在監督類型評測上比CBOW(將CBOW類型詞向量直接相加獲得句子向量)和Skipgram等簡單模型要好,可是在非監督類型評測上結果卻相反。相似地,Skip-Thought模型在監督類型評測上比FastSent模型效果好,但在非監督類型評測上,FastSent要好於Skip-Thought。實驗結果代表,最佳方法主要取決於預期的應用。 更深,更復雜的模型(同時也須要更多的計算資源和訓練時間)更適用於監督類型評測,但淺的對數線性模型更適合無監督類型評測。
2017年發表的論文Unsupervised Learning of Sentence Embeddings using Compositional n-Gram Features 提出利用n-grams來學習句子表示模型Sent2Vec,是word2vec模型中CBOW形式的擴展:不只僅使用窗口中的詞(uni-gram)來預測目標詞,而是使用窗口中全部的n-grams來預測目標詞(uni-gram)。爲了獲得句子向量,將句子當作一個完整的窗口,模型的輸入爲句子中的n-grams,目標是預測句子中的missing word(目標詞),而句子向量是全部n-grams向量表示的平均。本文的模型與論文Enriching word vectors with subword information(FastText)很相似,主要區別有兩點,其一是本文的模型輸入是詞級別的n-grams序列而FastText是字符級別的n-grams序列,其二是本文最終的表示是對輸入的n-grams embedding進行平均而FastText是相加。代碼開源在https://github.com/epfml/sent2vec
2018年發表的論文An efficient framework for learning sentence representations提出了一種簡單且有效的框架用於學習句子表示。和常規的編碼解碼類模型(如skip-thoughts和SDAE)不一樣的是,本文采用一種分類器的方式學習句子表示。具體地,模型的輸入爲一個句子\(s\)以及一個候選句子集合\(S_{cand}\),其中\(S_{cand}\)包含一個句子\(s_{ctxt}\)是\(s\)的上下文句子(也就是\(s\)的前一個句子或後一個句子)以及其餘不是\(s\)上下文的句子。模型經過對\(s\)以及\(S_{cand}\)中的每一個句子進行編碼,而後輸入到一個分類器中,讓分類器選出\(S_{cand}\)中的哪一個句子是\(s_{ctxt}\)。實驗設置候選句子集合大小爲3,即\(S_{cand}\)包含1個上下文句子和兩個無關句子。模型結構以下:
模型有以下兩個細節須要注意:
論文將上述模型命名爲quick thoughts(QT),意味着該模型可以迅速有效地學習句子表示向量。模型使用GRU做爲Encoder,爲了和Skip-Tought模型進行比較,模型包含三種變體,使用單向GRU稱爲uni-QT,雙向GRU稱爲bi-QT,將uni-QT和bi-QT生成的sentence embedding進行concat稱爲combine-QT。此外,論文將同時使用預訓練詞向量和隨機初始化詞向量的模型稱爲MultiChannel-QT(MC-QT),這種設置是參照multi-channel CNN模型。
論文經過多個句子分類任務證實QT模型了的優越性:
論文還經過image-sentence ranking和nearest neighbors兩個實驗來爲QT有效性提供依據。代碼開源在https://github.com/lajanugen/S2V
給讀到這裏的朋友點個贊,下一篇介紹了如何利用有監督學習來訓練sentence embedding。個人github倉庫https://github.com/llhthinker/NLP-Papers包含了近年來深度學習在NLP各領域應用的優秀論文、代碼資源以及論文筆記,歡迎你們star~