詞向量word to vector通俗理解

dxwell6發表於2020-11-01

word2vec

概述

之前使用one-hot編碼來表示詞向量,比如貓為(1,0,0),狗為(0,1,0),這種稀疏編碼,維度大,詞與詞之間是孤立的,無法表示詞與詞之間的語義資訊!

word2vec就是為了解決這個問題,下圖就是表示形式,我們從圖中可以看到man和woman的兩個詞矩陣相似度更高,這種表示方法能捕捉到詞與詞之間的關聯資訊

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-twJTNR9t-1604238319814)(/Users/mac/Library/Application Support/typora-user-images/image-20201101203713193.png)]

一個詞向量是一個一維向量,將所有單詞的向量按照行堆疊起來就被稱為embedding矩陣,像下面一樣
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-kZ9E6yce-1604238319819)(/Users/mac/Library/Application Support/typora-user-images/image-20201101211445124.png)]

訓練得到embedding矩陣

如何為每一個單詞都生成一個這樣的向量呢,下面來慢慢介紹:

下面的模型,先看看整體情況,不考慮細節。先僅僅看一下模型的輸入輸出。輸入一個單詞,輸出當前句子的下一個單詞,也就是通過前面的單詞預測下一個單詞。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-4wCHhQhC-1604238319822)(/Users/mac/Library/Application Support/typora-user-images/image-20201101205859229.png)]

比如下面圖中的句子,輸入Thou和shalt,輸出就是not(下面所有圖中的綠色部分為輸入,紅色為輸出),然後慢慢滑動這個紫色的視窗,就可以得到大量的資料樣本(例如下一個視窗是shalt和not,輸出make)

在這裡插入圖片描述

或者我們也可以通過兩邊的單詞來預測中間的單詞,即從上下文這個角度這樣可以讓預測更加準確

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-yFCWUXkp-1604238319832)(/Users/mac/Library/Application Support/typora-user-images/image-20201101211112092.png)]

回到訓練模型,我們剛開始不知道這個embedding矩陣,就先隨機給一個,然後輸入不同的單詞時,在embedding矩陣中查詢對應的向量,輸入到模型中進行訓練,迭代使之與輸出值一致。最後就可以得到embedding矩陣,為其他領域所應用。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-FkiJtbtv-1604238319833)(/Users/mac/Library/Application Support/typora-user-images/image-20201101205859229.png)]

但是實際上,word2vec並不是上面這樣訓練

因為從計算的角度來看,第三步更新迭代是非常昂貴的——尤其是知道我們將為資料集中的每個訓練樣本執行一次(很容易達到數千萬次)。我們需要做些什麼來提高效能。

我們可以把輸入輸出改一下,我們一開始是not來預測thou

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ovdIfR68-1604238319834)(/Users/mac/Library/Application Support/typora-user-images/image-20201101213243996.png)]

現在我們把not和thou同時作為輸入,如果他們兩個詞相鄰,那麼我們就輸出1,如果兩個詞不相鄰就輸出0,這樣就不用像之前那樣更新很大的引數矩陣,這樣做效率更高
在這裡插入圖片描述

參考部落格:https://jalammar.github.io/illustrated-word2vec/

相關文章