1. 程式人生 > >Paragraph2vec(段向量)-------基於《Distributed Representations of Sentences and Documents》

Paragraph2vec(段向量)-------基於《Distributed Representations of Sentences and Documents》

目錄

一、概要

1)背景

2)摘要

二、內容

1)傳統的bag of words

2)本文的paragraph vector

3)演算法

(1)word2vec的演算法原理

(2)paragraph vector演算法

三、總結


一、概要

1)背景

本文是我學習word2vec和paragraph2vec之後寫下的一篇文章,如有錯誤,請指正以共同學習。

2)摘要

paragraph vector,顧名思義——段向量,是對段落的一種的向量化表示。如果之前對word vector瞭解較少,建議閱讀《word2vec 的數學原理》。那麼paragraph vector有什麼用呢?說白了就是儲存上下文資訊。舉個簡單的例子,一個句子的下一個詞是什麼,一定只和本句子有關嗎?答案自然是否定的。例如,一個句子為:那是(),請填空。顯然,根據句子本身無法推斷出括號裡需要填的是什麼,有可能那是豬,也有可能那是貓。這就需要根據整個段落的資訊來判斷到底是豬還是貓了。這個時候,段向量就派上了用場。

本文主要是根據Mikolov的《Distributed Representations of Sentences and Documents》總結得到的。其英文原文很容易閱讀,英語不錯的同學建議直接閱讀原文(強烈推薦作者其他關於word embedding的的文章)。

論文百度網盤連結:https://pan.baidu.com/s/1mY3QwUzbRLD9gYcYPhf9mA 密碼:nns4。

二、內容

1)傳統的bag of words

詞袋模型:對於一個文字,忽略詞序和文法,將整個文字僅僅看作一些詞語的集合。顯然,這種模型的侷限性很大。例如對於詞序,“草吃牛”和“牛吃草”的意義相去甚遠,但是在詞袋模型中並不考慮詞序,因此詞袋模型將其同一對待。

2)本文的paragraph vector

本文所介紹的paragraph vector的特點如下:

    1、能為不同長度的段落訓練出同一長度的向量(具體這個向量的含義是什麼,沒人能解釋清楚)。

    2、不同段落的詞向量不共享。說白了就是,每出現一個新段落,就要訓練一個新的向量與之對應。其實也很好理解,不同段落的主題的不一樣,其段向量自然不一樣。

    3、詞向量共享。根據訓練集訓練出來的詞向量在任何地方都是通用的,不同段落的同一詞語的意思應該是一致的,所以詞向量不變。

3)演算法

(1)word2vec的演算法原理

本文不是講解word2vec的,因此在這裡只是簡要提一下。如有不懂,強烈建議閱讀《word2vec 的數學原理》

其主要作用機理如圖所示。假設要預測“the cat sat”的下一個單詞“on”:

輸入:"the"、"cat"、"sat"的詞向量。(實際情況可能還要輸入on後面的單詞。也有人可能會問,不是要求這些單詞的詞向量嗎,怎麼變成了輸入呢。其實初始時,要求給每個單詞初始化一個隨機向量,然後通過BP演算法不斷調整,最後得到的向量才是我們想要的)

中間層:將輸入的向量求和;將輸入的向量求和再平均;將輸入的向量按順序連線起來。以上三種方法都有可能出現,講道理第三種應該是最合適的,因為連線保留了順序資訊,但對應的引數量也會變大,所以效率和精度實在難以兼顧。

輸出層:根據softmax函式計算概率。

優化:根據BP演算法,使這個網路輸出為"on"的概率不斷變大,直到收斂或者滿足條件。此時得到的向量便是我們所需要的詞向量。

注:無論是CBOW還是skip_gram都只是模型(上圖對應CBOW模型)。而針對這兩種模型,都有不同的優化方法,例如Hierarchical Softmax和Negative sampling方法。

(2)paragraph vector演算法

理解了上面的演算法,剩下的就簡單了。

其差別就是在一個輸入上:多了一個paragraph vector。將此段向量和其他詞向量通過拼接或相加的方式輸入到隱藏層,然後根據softmax函式計算輸出層的概率。演算法和上面的一樣,只不過多了一個輸入。

注意點:

1、測試時,會出現不同的段落。例如,我們要測試the dog sat 的下一個單詞,這個句子出現在段落P中,但段落P在之前並未出現過,也就是我們尚不知道段落P的向量("the"、“dog”,“ sat”的詞向量都是知道的,已經訓練出來了)。此時的做法是固定詞向量,只將段向量當作變數來進行BP演算法,直到收斂,得到最終的段向量。再根據這個新訓練的段向量去進行預測

2、論文中提到,將CBOW和Skip_gram模型結合起來一起來訓練段向量效果更佳。

3、主要的演算法流程如上,具體實施時會進行很多優化,例如霍夫曼樹的使用。

三、總結

論文中提到的段向量的演算法只是眾多段向量演算法的一種。而這個演算法又是由word2vec演化而來的,所以理解了word2vec之後,再來了解這個演算法就會很容易。但是至今為止,詞向量乃至神經網路都缺少現實的理論基礎(現實意義?),例如我們得到的詞向量或者段向量的每一維到底代表什麼,都無從得知。所以,詞向量還有很長的路要走!!再說點題外話,BP演算法類似於現實中的負反饋調節,根據結果不斷調整引數,讓引數去適應結果。詞向量的訓練亦是如此。但是,我們是否可以從另一個角度出發:我們能否為語言設計一個數據結構(類似向量這種),使得這種資料結構在數學上的意義和在現實中的意義一致,然後我們用這種資料去預測或者翻譯就簡單多了(因為計算機能夠理解其數學意義,而數學意義又對應著現實意義)。當然這是一種猜測(用word2vec訓練出的詞向量在數學意義上確實達到了某種一致,例如同義的詞語其歐式距離會很接近)。