word2vec和sentence2vec的真正差別是什麼?後者和簡單用詞向量累加有什麼差別?

自然語言處理


我做過一些句子聚類的實驗,也看過一些paper,說一下大致結論。基本的順序是:

詞向量直接equal weight求mean &> 宇宙無敵句子embedding(非監督) &> 詞向量按tfidf權重求mean

這個順序似乎在做線性分類器的時候也是適用的

所以問題就來了,某些paper為了強調自己句子embedding的強大,完全可以把後者拿來做baseline,一般人不會覺得那個求和的weight會起到那麼大的作用吧。。。Naive

另外,我相信對具體的任務,監督學習下的embedding一般是比非監督好的,但適用範圍比較有限。


類比於word2vec, 這篇是比較典型的一篇sentence2vec的論文Skip thought vector (https://arxiv.org/pdf/1506.06726v1.pdf),發表在NIPS15上面。

word2vec的大致想法是利用詞於詞之間的context,來學習embedding. 模型本身很簡單,先one-hot vector, 然後投射到embedding space, 然後通過這個embedding space的feature過softmax去預測周圍的詞。這本身是個unsupervised learning的任務,可以分成CBOW和Skip-gram的兩種形式(如下圖所示)。

而skip-thought如下圖所示,是利用前後語句之間的關聯性來學句子的embedding. 其句子的表徵是用RNN來表示,模型先encode中間一個句子,然後用這個RNN的Output分別來decode前一個和後一個句子,直接類比於word2vec的Skip-gram的形式。skip-thought演算法的實現作者也有release,感興趣的同學可以玩玩:ryankiros/skip-thoughts。

另外,這個模型本身跟之前Ilya Sutskever的Sequence to Sequence model基本一致(https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf)。論文裡面skip-thought實驗效果要比單純疊加word2vec的embedding效果好一些。但它用的這個訓練資料庫 BookCorpus (https://pdfs.semanticscholar.org/f7f0/c1ef5f6f3fce9a15c6bf795baab330b5aaf3.pdf)並不是很好,是由10本小說疊加起來的。這裡小說裡面句子語言描述的bias還是蠻大。也許在sentence版本的GoogleNews上重新train效果會更好。


目前就沒有適合正式被叫做sentence2vec的東西。

對句子編碼的方式可以有很多。前面大牛提到的skip thought vectors算word2vec(skip-gram)在句子級別上的一種直接推廣,其實就是把skip-gram里每個詞換成一個句子,每個句子都用RNN來編碼。不難想像,要訓練這種句子表示需要的語料規模顯然要比訓練詞向量大得多……

當然也有更簡單的做法,比如直接用RNN讀完全句後最後一個隱狀態就可以認為是一種句子編碼,或者按你說的直接把所有詞向量累加求個平均拉倒。比較令人意外的是,直接加起來求平均也可以局部地保留一些句子級的信息。感興趣可以參見Yoav組的一個近期發現:

[1608.04207] Fine-grained Analysis of Sentence Embeddings Using Auxiliary Prediction Tasks

TL;DR: 如果在某種句子編碼上訓練分類器能準確預測句長、句子里包含哪些詞以及這些詞兩兩之間的排列先後,那麼有理由認為句子的信息在這種句子編碼里有所保存。實驗表明不光LSTM-RNN,就連CBOW求平均都能「保留」一些信息……


https://arxiv.org/pdf/1608.04207v2.pdf

這篇文章比較有趣。大致上比較了Continuous bag of words和LSTM sentence vector的信息量,結果發現bag of words也包含了相當大量的信息,例如句子長度,單詞先後順序。LSTM也沒有強太多,這至少說明了其實word embedding已經包含了相當大量的句子信息。


親測使用gensim訓練的word2vec取mean或者取每一維度的max要比sent2vec或者lstm表示sentence embedding效果好.


其實至今為止還沒有看到有效的sentence2vec

–––––––––––––––––––––分割線,找到有效的方法再來補充–––––––––––––––––––––


推薦doc2vec(PVDM)基於fastText的實現:fasttext-PVDM,實驗結果與論文一致:Distributed Representations of Sentences and Documents,工程實驗,效果好於weight求mean的方法 完勝gensim版本的doc2vec。


求平均、求和、sqrtn都可以的,可以用tf.nn.embedding_lookup_sparse的combiner。

https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/nn/embedding_lookup_sparse


推薦閱讀:

遷移學習在自然語言處理方面的應用?
深度學習對話系統理論篇--seq2seq入門
自然語言處理的智能問答(QA)和智能對話(conversation)哪一個更有前景?
Recurrent Convolutional Neural Networks for Text Classification

TAG:自然語言處理 | word2vec |