https://www.zhihu.com/question/299549788/answer/516572794html
nlp小萌新也來湊個熱鬧...github
下面大概是我看過的一些論文和資料,附上連接和一些開源實現...web
如今常見的詞向量好比word2vec、glove、fasttext...:算法
還有一個有意思的工做power mean word embeddings:論文Concatenated Power Mean Word Embeddings as Universal Cross-Lingual Sentence Representations以及代碼。網絡
......app
還有一些詞向量工做好比:框架
想提一下這三個工做是由於感受它們都是使用額外的外部數據來學習或改進表示~~並無對太大的算法創新~~機器學習
權重好比tfidf、sif權重wordpress
權重也能夠聯合train:
好比論文:Learning Sentence Representation with Guidance of Human Attention
不少方法利用預訓練詞向量經過各類設計的編碼器(encoder),而後經過一些任務來訓練~~
國外有個叫John Wieting的博士一直在作這一塊工做,看他近些年發表的工做就能看出來:
我感受sentence embedding包括通用的和特定任務的~~
感受這種思想相似CV裏面的先預訓練model~~
每週一答。方法不是最新的,但求提供一些結構化的思考。
sentence embedding(SenVec) 在 word embedding 之上,須要進行一步額外的「語義壓縮」,即將「不定長「的文本序列轉換爲「固定維度」的向量。word embedding 已經完成了文本空間到向量空間的轉換,接下來要考慮的就是如何把這 n 個詞各自的向量,揉到一塊兒。
題主會以爲沒有思路,多是由於你把它看成了一個「獨立任務」—— 已經肯定的數據集、已經肯定的評價指標、已經肯定的訓練方式。實際上,它並非這樣的。
換個角度想一想,若是你已經計算出了 SenVec,你要如何評價它的質量呢?你想要的「比較好」,是如何衡量的?這個任務是沒有 ground truth 的對吧,你只能經過 SenVec 在下游任務中的表現,來評測其質量 —— 好比情感分析、機器翻譯、句法樹生成、下句預測、答案排序等等。
換句話說,其實並不存在單獨的 sentence embedding 算法,只有嵌在 NLP 系統中的 sentence embedding 模塊。咱們一般把這種模塊,叫做 encoder(認識了吧)。
WordVec 訓練完以後,每一個詞對應一個向量,存起來隨用隨查。但 SenVec 可不是這樣一個查找表,咱們真正須要的是一個「網絡」,輸入文本序列,輸出其向量化表示。因此,把特定 NLP 任務的 encoder 拿出來就好了。
計算 SenVec 有兩個核心問題。
固然,若是不想這麼複雜,把句子裏全部詞的 embedding 作 average(或者 sum,效果差很少),也是能夠的。
Paragraph Embedding 是另外一個問題,等我本身理解了再來答。
最直接最簡單的思路就是對一個句子中全部詞的word embedding進行組合。這種方法最明顯的缺點是沒有考慮詞序信息,可是足夠簡單高效。複雜一點的方法是在無標籤語料上訓練句子表示學習模型,基本思想都是在無標籤訓練數據上設計監督學習任務進行學習。下面是一些總結:
基於監督學習方法學習sentence embeddings能夠概括爲兩個步驟:
Sentence Embedding的質量每每由訓練數據和Encoder共同決定。Encoder不必定是越複雜越好,須要依據下游任務、計算資源、時間開銷等多方面因素綜合考慮。
以上是我近期閱讀sentence embedding相關論文的總結,更詳細的介紹記錄在個人兩篇博客中:
前段時間由於完成做業的關係,看了些文章資料,整理了一篇《關於句子表徵的學習筆記》文章出來,這裏偷個懶直接粘貼,主要是一些經典模型和算法的淺薄認知,但願能對你們有所幫助。若是有謬誤缺漏,煩請指正。
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。
此外,爲了引入語序信息,還經過在詞表中增長 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) 來改進加權平均的方法,冪均值公式以下:
模型將不一樣 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 的一個缺點是須要人工指定卷積核的尺寸,而這個超參數對結果的影響很大。
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 層進行分類。這是爲了引導模型着重訓練句子編碼器,從而得到更好的句子向量。
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 模型的成功,使學界開始探索經過不一樣的監督任務,豐富並加強句子表徵,提高其在下游任務中的效果。
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。
做者認爲,通用的句子表徵應該經過側重點不一樣的任務來聯合學習到,而不是隻有一個特定任務來學習句子表徵。因此模型將同時在多個任務和多個數據源上進行訓練,而且共享句子表徵。
實驗的具體作法是,先用聯合學習的方法在上述四個任務上進行訓練,訓練結束後,將聯合學習的模型做爲特徵提取器提取句子表徵,而後直接接上全鏈接層做爲分類器,而且同時凍結特徵提取器中的參數,而後在新的分類任務上訓練分類器。做者發現不少任務上簡單分類器都要超過當時的最好結果,而且他們還發現聯合訓練中不一樣的任務對於句子表徵中的不一樣方面有不一樣的貢獻。
沒空去把具體的論文連接拿過來了,直接擺關鍵詞好了,按照時間順序,建議閱讀如下工做,就能借鑑或者思考出比較好的sentence embedding的方法
幾個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)
基於Self-Attention和BiLSTM的文本Embedding,親測序列長度500都沒問題
詳細的總結見下方連接。