《NLP中有什麼比較好的sentence/paragraph embedding方法 ?》

 

https://www.zhihu.com/question/299549788/answer/516572794html

 

NLP中有什麼比較好的sentence/paragraph embedding方法 ?

如題,困擾我一直的問題。據我所知,fasttext能夠直接拿文本做爲輸入,有的人拿詞向量直接平均做爲文本向量,可是有什麼比較好的方法呢,請教各位,謝謝~git

 

12 個回答

默認排序
等 158 人贊同了該回答

nlp小萌新也來湊個熱鬧...github

下面大概是我看過的一些論文和資料,附上連接和一些開源實現...web

 


 

簡單的作法拿預訓練的詞向量求平均:

如今常見的詞向量好比word2vec、glove、fasttext...:算法


還有一個有意思的工做power mean word embeddings:論文Concatenated Power Mean Word Embeddings as Universal Cross-Lingual Sentence Representations以及代碼網絡

......app

還有一些詞向量工做好比:框架

  1. Dependency-Based:利用 dependency-based contexts而不是常見的linear contexts,這種embedding可以更多學到functional similarity。論文Dependency-Based Word Embeddings以及代碼

  2. Dict2vec:利用 natural language dictionaries構建單詞對,以便語義相關的單詞更接近。論文Dict2vec : Learning Word Embeddings using Lexical Dictionaries以及代碼

  3. PARAGRAM word vectors:利用來自PPDB的短語對構建參數化釋義模型。論文From Paraphrase Database to Compositional Model and Back以及代碼


想提一下這三個工做是由於感受它們都是使用額外的外部數據來學習或改進表示~~並無對太大的算法創新~~機器學習

 

或者拿預訓練的詞向量加權平均:

權重好比tfidf、sif權重wordpress

 

權重也能夠聯合train:

好比論文:Learning Sentence Representation with Guidance of Human Attention

 


 

 

其餘sentence embedding:

不少方法利用預訓練詞向量經過各類設計的編碼器(encoder),而後經過一些任務來訓練~~

國外有個叫John Wieting的博士一直在作這一塊工做,看他近些年發表的工做就能看出來:

而後~~

 

我感受sentence embedding包括通用的和特定任務的~~

 


 

而後就是目前很火的語境詞向量(Contextualized Word Embeddings):

感受這種思想相似CV裏面的先預訓練model~~

 


 

最後最後~~

推薦個框架:Flair以及目前最全中文詞向量~~請各位大佬笑納~~

​贊同 158​​11 條評論
​分享
​收藏​喜歡
收起​
 
等 13 人贊同了該回答

首先我要吐槽一下 知乎匹配的這個書 是什麼雞毛

其次,具體的回答先留坑

​贊同 13​​10 條評論
​分享
​收藏​喜歡
收起​
等 36 人贊同了該回答

每週一答。方法不是最新的,但求提供一些結構化的思考。

sentence embedding(SenVec) 在 word embedding 之上,須要進行一步額外的「語義壓縮」,即將「不定長「的文本序列轉換爲「固定維度」的向量。word embedding 已經完成了文本空間到向量空間的轉換,接下來要考慮的就是如何把這 n 個詞各自的向量,揉到一塊兒。

題主會以爲沒有思路,多是由於你把它看成了一個「獨立任務」—— 已經肯定的數據集、已經肯定的評價指標、已經肯定的訓練方式。實際上,它並非這樣的。

換個角度想一想,若是你已經計算出了 SenVec,你要如何評價它的質量呢?你想要的「比較好」,是如何衡量的?這個任務是沒有 ground truth 的對吧,你只能經過 SenVec 在下游任務中的表現,來評測其質量 —— 好比情感分析、機器翻譯、句法樹生成、下句預測、答案排序等等。

換句話說,其實並不存在單獨的 sentence embedding 算法,只有嵌在 NLP 系統中的 sentence embedding 模塊。咱們一般把這種模塊,叫做 encoder(認識了吧)。

WordVec 訓練完以後,每一個詞對應一個向量,存起來隨用隨查。但 SenVec 可不是這樣一個查找表,咱們真正須要的是一個「網絡」,輸入文本序列,輸出其向量化表示。因此,把特定 NLP 任務的 encoder 拿出來就好了。

以上是思路,接下來是方法論

計算 SenVec 有兩個核心問題。

  1. encoder 結構,也就是公衆號常常推的「三大特徵抽取器」—— RNN \ CNN \ Transformer。具體來講,RNN 使用雙向 BiLSTM 的形式,各個時刻的隱層進行最大池化(BiLSTM-max)的效果比直接取最後時候的隱層(BiLSTM-last)效果好。CNN 的經典版本是 TextCNN,即把詞向量 stack 成矩陣,把這個矩陣當成「圖像」。進階版爲 FairSeq 中使用的 Gated ConvNet。Transformer 也有單向和雙向兩種版本。以上的這些,各個開源框架裏都有能夠直接調用的封裝,不須要本身實現。
  2. 訓練任務,也就是我上面說的「NLP系統」。不一樣訓練任務獲得的 SenVec,所攜帶的語義信息各有側重。因此,這一步須要結合本身能夠得到的訓練數據以及應用場景來作。須要句法信息,那就用生成句法樹的任務;須要文本語義,那就用機器翻譯任務;須要上下文推理,那就用 SkipThought。若是沒有太多監督數據,先自編碼再解碼重建,也是能夠的。

固然,若是不想這麼複雜,把句子裏全部詞的 embedding 作 average(或者 sum,效果差很少),也是能夠的。

Paragraph Embedding 是另外一個問題,等我本身理解了再來答。

=____=
讚揚
尚未人讚揚,快來當第一個讚揚的人吧!
​贊同 36​​10 條評論
​分享
​收藏​喜歡
收起​
8 人贊同了該回答

無監督學習方法

最直接最簡單的思路就是對一個句子中全部詞的word embedding進行組合。這種方法最明顯的缺點是沒有考慮詞序信息,可是足夠簡單高效。複雜一點的方法是在無標籤語料上訓練句子表示學習模型,基本思想都是在無標籤訓練數據上設計監督學習任務進行學習。下面是一些總結:

  • 詞向量的平均或加權平均是一個簡單有效的baseline,基於SIF詞向量加權平均的在一些任務上甚至比複雜模型的效果好。
  • Paragraph Vector模型足夠簡單,而且可以編碼文檔級文本,可是對於sentence embedding,其效果相較於其餘方法不具競爭力。
  • Skip-Thought,FastSent和Quick-Thought都是基於句子連貫性設計任務:
    • 基於encoder-decoder的Skip-Thought模型最複雜,在監督類型評測上比FastSent模型效果好,但在非監督類型評測上,FastSent要好於Skip-Thought。
    • Quick-Thought做爲一個三者中最新的模型,其複雜度介於FastSent和Skip-Thought之間,但在大多數任務上的效果比其餘兩個模型都好。
  • 相較於Skip-Thought,FastSent和Quick-Thought,SDAE模型與利用n-grams的Sent2Vec模型的優勢是隻須要輸入單個句子。此外,Sent2Vec模型效果比SDAE模型好一些。

監督學習方法

基於監督學習方法學習sentence embeddings能夠概括爲兩個步驟:

    • 第一步選擇監督訓練數據,設計相應的包含句子編碼器Encoder的模型框架;
    • 第二步選擇(設計)具體的句子編碼器,包括DAN、基於LSTM、基於CNN和Transformer等。

Sentence Embedding的質量每每由訓練數據和Encoder共同決定。Encoder不必定是越複雜越好,須要依據下游任務、計算資源、時間開銷等多方面因素綜合考慮。

以上是我近期閱讀sentence embedding相關論文的總結,更詳細的介紹記錄在個人兩篇博客中:

  1. 將句子表示爲向量(上):無監督句子表示學習(sentence embedding)
  2. 將句子表示爲向量(下):基於監督學習的句子表示學習(sentence embedding)
​贊同 8​​添加評論
​分享
​收藏​喜歡
收起​
等 30 人贊同了該回答

前段時間由於完成做業的關係,看了些文章資料,整理了一篇《關於句子表徵的學習筆記》文章出來,這裏偷個懶直接粘貼,主要是一些經典模型和算法的淺薄認知,但願能對你們有所幫助。若是有謬誤缺漏,煩請指正。

本文結構

  • 1. 基線模型
    • 1.1. 詞袋模型
      • 1.1.1. 基於統計的詞袋模型
      • 1.1.2. 基於詞向量的詞袋模型
      • 1.1.3. 詞袋模型的根本問題
    • 1.2. PV-DM / PV-DBOW 模型
    • 1.3. 基於 RNN/CNN 的模型
  • 2. 無監督模型
  • 3. 監督模型
  • 4. 多任務學習
  • 5. Reference

1. 基線模型

1.1. 詞袋模型

1.1.1. 基於統計的詞袋模型

在詞向量技術未出現前,句子表徵通常採用基於統計的詞袋模型。

以 「I like you and you like me.」 和 「I love you and you love me.」 爲例,詞表爲 {I, like, you, and, me, love},詞表大小爲 6。

  • 在基於 One-hot 的詞袋模型中,兩句的向量表示分別爲: [公式] ​
  • 在基於詞頻 / TF-IDF 的詞袋模型中,向量中的每一個元素再也不僅是 0 1,而是更換爲詞頻 / TF-IDF,以詞頻爲例,上例的表示爲: [公式] ​。
  • Term Frequency–Inverse Document Frequency (TF-IDF) 是一種用於信息檢索與數據挖掘的經常使用加權技術。
  • 其中 TF 意爲詞頻 Term Frequency,指單詞在文檔中的出現頻率;IDF 意爲 逆文本頻率指數 Inverse Document Frequency ,指單詞在語料庫的全部文檔中出現的頻率的倒數。
  • TF-IDF 認爲詞的重要性隨着它在文件中出現的次數成正比增長,但同時會隨着它在語料庫中出現的頻率成反比降低。

此外,爲了引入語序信息,還經過在詞表中增長 n-grams 項對詞表進行擴展,可是這樣會使得詞表更大,向量也會更加的稀疏。

上述方法存在於高維、稀疏、離散的表示以及詞袋模型弱化語序的問題,效果不佳。

1.1.2. 基於詞向量的詞袋模型

這類模型也被稱爲 word-wise 模型,基於詞向量進行提取、組合,造成高階特徵。 最多見的方法是將一句話中的每一個詞的詞向量求平均,做爲句子表徵。例如:Word2Vec, GloVe, FastText 等。

這樣的模型能爲許多下游任務提供強的基線,具備簡單高效的優勢。

很快,人們意識到簡單求均值的方法過於粗糙,便提出了不少加權求平均的方法,例如以詞頻、TF-IDF 等爲權重。

SIF加權平均詞向量

A Simple but Tough-to-Beat Baseline for Sentence Embeddings ICLR 2017

該模型以平滑倒詞頻 (smooth inverse frequency, SIF) 做爲權重進行加權平均獲得句子向量,即認爲頻率越低的詞在在句子中的重要性更大。最後令每一個句子向量都減去其在,全部句子向量組成的矩陣的第一個主成分(principal component)上的投影,即抹去全部句子的共有信息,增大每一個句子向量之間的距離。

Power Mean 均值模型

Concatenated Power Mean Word Embeddings as Universal Cross-Lingual Sentence Representations arXiv 2018

本模型經過引入「冪均值」 (Power Mean) 來改進加權平均的方法,冪均值公式以下:

[公式]

  • 記句子 ​ [公式] , [公式] 爲每一個詞的詞向量
  • [公式] ​ 時即爲直接求平均的模型,​ [公式] 實際上指的是 max /min 操做,即對每一個維度求取全部單詞中的最大/最小值做爲這一維度的值

模型將不一樣 p 值獲得的不一樣的句子向量拼接起來做爲句子表徵,保留了不一樣 p 值獲得的不一樣的信息。

此外,除了拼接不一樣的 p 值的向量,模型還拼接不一樣 word embedding 算法獲得的向量。

從上圖中的實驗結果中能夠看出,這確實如做者所言,是一個 hard-to-beat 的 baseline。

1.1.3. 詞袋模型的根本問題

詞袋模型存在兩個主要的缺點:忽略詞序和語法。

因爲詞袋模型缺失了語序信息,在對語序較爲敏感的下游任務中效果不佳,如情感分析 sentiment analysis:

I like this movie because it doesn't have an overhead history. Positive
I don't like this movie because it has an overhead history. Negative.

don’t 的位置不一樣,決定了這兩句話的情感取向是一正一負的,但在詞袋模型中,這兩句話獲得的句子表徵倒是一致的。

1.2. PV-DM / PV-DBOW 模型

Distributed Representations of Sentences and Documents ICML 2014

word2vec 的做者 Mikolov 將 CBOW 和 Skip-gram 這兩個 word embedding 的訓練方法應用到 sentence embedding 中。

PV-DM 的全稱是 Distributed Memory Model of Paragraph Vectors。與 CBOW 相似,也是經過上下文預測下一個詞。但在輸入層處維護了一個文檔 ID 映射到一個向量的表格,目的是將當前文檔的向量以及上下文向量聯合輸入模型,並讓模型預測下一個詞,訓練結束後,對於現有的文檔,即可以直接經過查表的方式快速獲得該文檔的向量,而對於新的一篇文檔,那麼則須要將已有的表格添加相應的列,而後從新走一遍訓練流程,只不過此時固定好其餘的參數,只調整表格便可,收斂後即可以獲得新文檔對應的向量了。

PV-DBOW 的全稱則是 Distributed Bag of Words version of Paragraph Vector。和 Skip-gram 相似,經過文檔來預測文檔內的詞。訓練時隨機採樣一些文本片斷,而後再從這個片斷中採樣一個詞令 PV-DBOW 模型來預測這個詞,藉助這一分類任務做爲訓練方法。

兩個模型的優勢是它們不只能獲取句子向量,也能獲取文檔級別向量,弱點在於:爲了獲取新文檔的向量,須要從新訓練一遍流程,而且因爲模型主要是針對文檔向量預測詞向量的過程進行建模,其實很難去表徵詞語之間的更豐富的語義結構,因此這兩種獲取文檔向量的方法都未能大規模應用開來。

1.3. 基於 RNN/CNN 的模型

天然而然的,咱們能夠利用 RNN (LSTM/GRU等) 來克服詞袋向量的語序問題,以最後一個隱狀態做爲整個句子的 Embedding,或者對每一時間步的隱狀態進行平均、max/min或者加權平均。

基於 RNN 的 Sentence Embedding 每每用於特定的有監督任務中,缺少可擴展性/遷移性(transferrable),即便在某個task中能夠效果不錯,也須要在新的任務中須要從新訓練,可是因爲 RNN 自己難以並行訓練的缺陷,開銷較大。

A Convolutional Neural Network for Modelling Sentences ACL 2014

Kalchbrenner 提出的 TextCNN 將 CNN 成功應用到 NLP 中。TextCNN 使用卷積核提取局部特徵,利用 CNN 能夠提取句子中相似 n-gram 的局部信息,並經過整合不一樣大小的 n-gram 特徵做爲整個句子的表示。

網絡結構簡單,參數數目少,計算量少,訓練速度快,經過引入已經訓練好的詞向量依舊有很不錯的效果。

TextCNN 的一個缺點是須要人工指定卷積核的尺寸,而這個超參數對結果的影響很大。

2. 無監督模型

Skip-Thought Vectors NIPS 2015

借鑑 Skip-gram 的思想,Skip-thoughts 直接在句子間進行預測,也就是將 Skip-gram 中以詞爲基本單位,替換成了以句子爲基本單位。具體作法就是選定一個窗口,遍歷其中的句子,而後分別利用當前句子去預測和輸出它的上一句和下一句。這裏的 Decoder 能夠看做是以 Encoder 輸出爲條件的神經語言模型。不過和普通框架不同的是,Skip-thoughts 有兩個 Decoder。

此外,因爲 Skip-thoughts 模型的詞表規模每每是遠小於現實中的詞表,爲了讓模型可以對任意句子進行編碼,受論文 Exploiting similarities among languages for machine translation 的啓發,訓練 word2vec 與 Skip-thoughts 的 encoder 端的詞向量矩陣之間的線性映射模型,若是待編碼的句子中的某個詞不屬於 Skip-thoughts 詞表,則首先在 word2vec 詞表中進行查詢獲得對應的 word2vec 詞向量,再經過線性模型映射爲 Skip-thoughts 模型的 encoder 對應空間的詞向量。

An efficient framework for learning sentence representations ICLR 2018

Google Brain的 Logeswaran 等人認爲 Skip-thoughts 的效率過低,且沒法在大規模語料上很好的訓練。他們提出了一種簡單且有效用於學習句子表示的框架 Quick-thoughts —— 將生成任務改成分類任務。

訓練時,輸入一個句子以及其候選句子集合,集合中包含一個與句子出如今同一上下文窗口中的句子做爲正例,其他不出如今同一上下文窗口中,記爲負例。將這些句子輸入模型,讓模型判斷這些句子對是不是同一個上下文窗口中。模型的 Encoder 有兩個如上圖所示,分別是 ​,測試時,給定待編碼句子 ​ ,經過該模型獲得的句子表示是句子編碼器和候選句子編碼器的鏈接 ​。

有趣的是,模型使用的分類器很是簡單,其輸入爲向量內積,即 ​ ,如上圖所示,計算出四個句子的句子向量並分別算出向量內積後,輸入到 softmax 層進行分類。這是爲了引導模型着重訓練句子編碼器,從而得到更好的句子向量。

3. 有監督模型

Deep Unordered Composition Rivals Syntactic Methods for Text Classification ACL 2015

論文首先提出了 NBOW (Neural Bag-of-Words) 模型,即直接將文本中全部詞向量的平均值做爲文本的表示,而後輸入到 softmax 層進行文本分類。

隨後討論了 Recursive neural networks (RecNNs) 這類基於句法結構進行句子表徵的方法,儘管在有些狀況下有很是好的效果,可是其不適合長文本以及不規範文本 (如口語) 而且十分依賴於句法樹的準確性,訓練時間很長,效果通常。

因而,在 NBOW 的基礎上提出了Deep Averaging Networks (DAN) ,經過增長多個隱藏層來增長網絡的深度,訓練速度快,效果不錯,可是模型顯然沒有考慮單詞之間的順序,缺陷難以免。

A Structured Self-attentive Sentence Embedding ICLR 2017

本文再也不使用一維向量做爲句子表徵,而是使用二維矩陣做爲句子表徵,以解決句子被壓縮成一維向量時的信息損失,而且爲此對損失函數加以改進。

假設模型的輸入是一個含有 n 個 Token 的句子,LSTM 的隱層維度爲 h,那麼通過 BiLSTM 獲得 ​ [公式] ,再如上圖右側的所示,經過簡單前饋神經網絡生成 self-attention 權重:

[公式] 其中 [公式] ,從而獲得句子中每一個單詞的權重。但如此獲得的 [公式] ​ 仍是一種一維向量的句子表徵。做者認爲該向量表示一般集中在句子中的特定組成上,就像一個相關的詞或短語的特殊集合,只會反映在句子語義的一個方面或一種組成。

然而,特別是對於長句,一個句子能夠有多種組成來共同組成整個句子的總體語義。因此咱們須要執行屢次 attention,因而將 ​ [公式] 升級爲矩陣 ​ [公式] ,公式變爲

[公式] 因而最終的句子向量也就變爲了 [公式] ​,即二維句子表徵。

Supervised Learning of Universal Sentence Representations from Natural Language Inference Data EMNLP 2017

InferSent 認爲從 NLI (Natural Language Inference NLI) 是一個理解任務,涉及推理句子間的語義關係) 數據集中訓練獲得的句向量也適合遷移到其餘 NLP 任務中。例如將訓練好的模型當作特徵提取器,以此來得到一個句子的向量表示,再將這個句子的表示應用在新的分類任務上,來評估句子向量的優劣。框架結構以下圖所示:

這個框架最底層是一個 Encoder,也就是最終要獲取的句子向量提取器,輸入是一對句子,分別是前提 premise 與假設 hypothesis,而後將獲得的句子向量經過一些向量操做後獲得句子對的混合語義特徵,最後接上全鏈接層並作數據集上的三分類任務 (entailment 蘊含, contradiction 矛盾, neutral 中性) 。

論文對比了7種不一樣的句子編碼器,主要包括 RNN 與 CNN,其中 RNN 包括取LSTM/GRU最後一個隱狀態,BiGRU,BiLSTM的 mean/max pooling 以及 self-attention,公式以下。取得效果最優的是 BiLSTM+maxpooling 做爲編碼器。

[公式] InferSent 模型的成功,使學界開始探索經過不一樣的監督任務,豐富並加強句子表徵,提高其在下游任務中的效果。

4. 多任務學習

Universal Sentence Encoder EMNLP 2018

Google 於 2018 年初發布的通用句子編碼器,綜合利用無監督訓練數據和有監督訓練數據,進行多任務訓練,從而學習一個通用的句子編碼器。無監督訓練數據包括問答(QA)、維基百科和網頁新聞等,有監督訓練數據爲SNLI。多任務模型設計以下圖所示,其中灰色的 encoder 爲共享參數的句子編碼器。SNLI 上的訓練模型與Facebook 推出的 InferSent 相似。共享編碼器使得模型訓練時間大大減小,同時還能保證各種遷移學習任務的性能,力求爲儘量多的應用提供一種通用的句子編碼器。

論文對比了 DAN 和 Transfomer 這兩種編碼器。Transformer 模型在大部分任務上的表現都優於簡單的 DAN 模型,而且處理短句子時只稍慢一些。DAN模型也能具備很不錯的表現,而且相較於Transformer模型,當句子較長時訓練時間和內存的開銷都更小。

Learning General Purpose Distributed Sentence Representations via Large Scale Multi-task Learning ICLR 2018

微軟在論文中提出了利用四種不一樣的監督任務來聯合學習句子的表徵,這四種任務分別是:Natural Language Inference, Skip-thougts, Neural Machine Translation 以及 Constituency Parsing。

做者認爲,通用的句子表徵應該經過側重點不一樣的任務來聯合學習到,而不是隻有一個特定任務來學習句子表徵。因此模型將同時在多個任務和多個數據源上進行訓練,而且共享句子表徵。

實驗的具體作法是,先用聯合學習的方法在上述四個任務上進行訓練,訓練結束後,將聯合學習的模型做爲特徵提取器提取句子表徵,而後直接接上全鏈接層做爲分類器,而且同時凍結特徵提取器中的參數,而後在新的分類任務上訓練分類器。做者發現不少任務上簡單分類器都要超過當時的最好結果,而且他們還發現聯合訓練中不一樣的任務對於句子表徵中的不一樣方面有不一樣的貢獻。

Reference

NLP的巨人肩膀

句子嵌入

https://www.cnblogs.com/llhthinker/p/10335164.html

​贊同 30​​2 條評論
​分享
​收藏​喜歡
收起​
1 人贊同了該回答
self-attention算是一種吧。
​贊同 1​​添加評論
​分享
​收藏​喜歡
5 人贊同了該回答

沒空去把具體的論文連接拿過來了,直接擺關鍵詞好了,按照時間順序,建議閱讀如下工做,就能借鑑或者思考出比較好的sentence embedding的方法

  • Paragraph Vectors
  • Skip-Thought Vectors
  • SDAE, FastSent
  • Quick-Thought
  • ELMo
  • BERT(這篇工做感受上其實吸取了上述一些工做的精華)
​贊同 5​​添加評論
​分享
​收藏​喜歡
3 人贊同了該回答

幾個pre-trained sentence encoder:

CBoW

Skip-Thought (Kiros et al., 2015)

InferSent (Coneau et al., 2017)

DisSent (Nie et al., 2017)

GenSen (Subramanian et al., 2018)

​贊同 3​​1 條評論
​分享
​收藏​喜歡
1 人贊同了該回答

基於Self-Attention和BiLSTM的文本Embedding,親測序列長度500都沒問題

論文 《A Structured Self-attentive Sentence Embedding》

代碼github/EmbolismSoil/SelfAttentiveSentenceEmbedding-TF

​贊同 1​​4 條評論
​分享
​收藏​喜歡
1 人贊同了該回答

就算是bert也無法對付語法和拼寫雜亂的社交網絡,最終仍是要本身訓練embedding。。。

​贊同 1​​添加評論
​分享
​收藏​喜歡
2 人贊同了該回答
  1. 從word vector到sentence vector的方法。
  2. 基於distributed的思想,就像word2vec同樣,一個word的向量表達由它周圍的contexts來展示。
  3. 從多任務中學習。
  4. 從對話中學習等等。

詳細的總結見下方連接。

天然語言處理中句向量

​贊同 2​​添加評論
​分享
​收藏​喜歡

BERT啊

​贊同​​添加評論
​分享
​收藏​喜歡
 
寫回答
相關文章
相關標籤/搜索