python生成詞向量 詞向量是如何生成的

2021-10-12 14:48:03 字數 2609 閱讀 3294

遇到這個問題的時候,網上有個很經典的 《word2vec的數學原理》上面一文解釋得很詳細,但小白入門會看得很蒙逼,不知道初始向量值是怎麼來的,全域性來呼叫是怎樣執行的。所以我就希望寫一篇文章,舉一些例子,去闡述這個詞向量到底是怎樣產生的。

《word2vec的數學原理》傳送門 ( ・ˍ・) word2vec數學原理

這次我們主要以基於hierarchical softmax的cbow模型講講。這個模型有輸入層,對映層,輸出層(這些層具體怎麼操作後面)首先我們有一些分好詞的語料庫。一般泛泛而談的話,這兩者區別在於cbow是乙個詞**周圍的詞,skip-gram是周圍的詞去**中心詞。

下面我們列簡單的幾句話看怎麼產生詞向量。

日本的/新垣結衣/演技/好

初始化在這個模型中,我們得設定好,我們生成的向量是幾維的,視窗取多大。

解釋:維數:就是指詞向量的維數,一般不能低於32維,畢竟如果語料庫大,需要涵蓋的資訊多

視窗:就是取某個詞的前後n個作為這個詞的文字。比如我取n=1,詞=『新垣結衣』,那麼前後有的詞就是 『日本的』 『演技』 『演員』『演技』這4個詞。

首先,對於cbow,其目標函式都是似然對數函式:

建立霍夫曼樹

首先統計詞頻

這個霍夫曼樹在輸出層,後面會用到。我們回到輸入層和對映層。

現在我們乙個6個詞,組成詞庫。視窗長度選1,此時詞庫中每個詞依次進入模型。

輸入層確定是哪幾個詞作為輸入。比如第乙個詞『日本的』,那麼進入模型的就是『日本的』前後1個詞,由於『日本的』前面沒有詞,所以只有後面的『新垣結衣』進入模型。同理,如果輪到『新垣結衣』這個詞時,進入模型的就是該詞前後的『日本的』『演技』,這兩個詞就是content我們接下來以第二個『新垣結衣』這個中心詞作為例子講述下面的模型。

對映層將content中的詞向量加和

對於初始化向量,網上有兩種說法,一種是one-hot的形式(形如(1,0,0,0),每個詞在固定位置顯示1,1萬個詞就是1萬維度),另一種是按照預設的維度隨機生成。在mikolov的**就是以one-hot的形式,在對映層中乘以權重矩陣(這個矩陣也是隨機初始化)降維成我們預設的維度。在google開源的word2vec中,看回原始碼可以發現其實是根據預設的維度隨機生成初始化向量。假設我們預設的維度是2,初始化向量為:日本的(1,0),演技(0,1),所以對映層輸出為(1,0)+(0,1)=(1,1)

輸出層所以其實我們要求的是:p(新垣結衣|content(新垣結衣)),詞向量是附帶產生的東西(當然啦,現在很多人都是拿來產生詞向量),這個p就是說基於這個content的情況下,出現『新垣結衣』這個詞的概率。

而對於cbow模型,其目標函式是:

看回霍夫曼樹,看到其路徑為,每個節點都有ɵ作為結點向量,對映層產生的向量w和結點向量想乘作用於sigmoid函式,就是這個結點拐向這邊的概率。

假設我們定義向左為0,向右為1.即0為負類,1為正類。

此時,其實每個節點中,路徑每次轉左或者轉右,其實都是進行一種判斷,這裡用的判斷函式是sigmoid函式,形式如下:

x是對映層的輸出函式,

為節點對應的向量(隨機初始化),最後算出來即為拐向這邊的概率。

當然啦,如果拐向另外一邊,概率就是

看回霍夫曼樹

顯然,中心詞是『新垣結衣』的話,從頂端往下走的路徑是 右-左 對應 0-1.所以每個節點的概率為

c為『新垣結衣』

到了這裡,其實我們不知道的是

,而x是向量隨機化得到的,所以算已知。接下來就是求

的過程。

說了那麼久,那麼多功夫其實都是為了目標函式,這是我們終於和目標函式取得聯絡了。

將上面的公式代回進最初列出的目標函式公式

我們要對上述目標函式用梯度求解,看回目標函式,是代表中心詞出現的概率,而引數應該是使這個概率最大,所以我們用梯度上公升法求極大值。

當學習完後,我們就要考慮怎麼更新詞向量了。

同理x和

其實在目標函式中位置相同,所以可以互換而得出x的梯度

所以按照cbow的理論,我們可以這樣更新詞向量

但我們發現,視窗中每個詞增減的幅度是一樣的,那怎麼區別呢?答案就是不同的詞進模型,視窗的詞(附近的詞)就會不一樣,最後更新得也不一樣。

假設初始時我們都是(0,0),每次都增加(1,1)(當然實際得到的結果肯定複雜很多)

我們看看結果

橫座標的詞代表當這個進入模型後,各詞的詞向量變化情況,縱座標代表每個詞的詞向量

.所以詞向量就是這樣產生的啦o(*≧▽≦)ツ

###################我是可愛的分割線\("▔□▔)/\("▔□▔)/\("▔□▔)/#####################

對於skip-gram做法類似,但有幾個區別

目標函式

所以此時進入對映層的只有w中心詞本身,這裡有別於cbow模型。

計算次數

cbow中,每個中心詞,只用在霍夫曼樹找中心詞對應的路徑就可以了,但在skip-gram模型,遍歷每個詞w時,需要對w詞周圍的詞都遍歷一次霍夫曼樹,顯然計算量會增大,所以一般資料量小的時候很多人都推薦用skip-gram模型。

########################彩蛋ヾ (o ° ω ° o )##############################

最近在看《legal high》 ,好喜歡新垣結衣跟堺雅人這對組合啊,所以拿gakki做例子了(。-`ω´-)

附上幾張劇照~

keras 生成句子向量 詞向量 詞向量評估方法

作者 一句話概述鏈結原始碼資料詞向量評估方法cornellacl 2015 得出兩個結論 詞向量是在大規模語料上訓練出來的中間產物。本文是對如何評估word embeding的質量的乙個綜述。詞向量提供語法 語義資訊。目前評估詞向量的方法可以分為兩類 通過亞馬遜勞務眾包平台 amazon mecha...

詞向量 詞嵌入 word embedding

embedding 嵌入 embedding 嵌入,在數學上表示乙個對映f x y,是將x所在的空間對映到y所在空間上去,並且在x空間中每乙個x有y空間中唯一的y與其對應。嵌入,也就是把x在y空間中找到乙個位置嵌入,乙個x嵌入為乙個唯一的y。word embedding 詞嵌入 也就是把當前預料文字...

詞向量原始碼解析 (1)詞向量(詞表示)簡單介紹

在未來的一段時間內,我會全面細緻的解析包括word2vec,glove,hyperwords,context2vec,ngram2vec等一系列詞向量 詞表示 工具包。用合理的向量去表示單詞是自然語言處理 nlp 領域中很經典很基本的乙個任務。乙份高質量的詞向量或是詞表示是很多任務取得更好表現的關鍵...