在處理文字模型的時候,將文字轉化成可以放進模型的數字,最簡單方法是用 one-hot
編碼。但是這種方法有弊端,轉化後的每個詞之間在數字上都是相互獨立的,任何一對詞的one-hot向量的餘弦相似度都爲0。
Google團隊發表的 word2vec 工具。word2vec工具主要包含兩個模型:跳字模型(skip-gram)和連續詞袋模型(continuous bag of words,簡稱CBOW)。值得一提的是,word2vec詞向量可以較好地表達不同詞之間的相似和類比關係。
下面就介紹一下Skip-Gram。
訓練樣本
確認窗口大小,比如這裏設置爲2。指定某個詞後,例 brown
,與其窗口爲2的範圍內的其他詞可組成一對Training Sample,例 (brown,the) (brown,quick) (brown,fox) (brown,jumps)
。這樣每組Training Sample就對應每次訓練的 (輸入,輸出)
。
網絡結構
輸入是使用 one-hot
所表示的輸入word,經過隱藏層,和 softmax 處理後得到輸出結果。這裏輸入和輸出的words所表示的向量大小與詞庫大小相同。
例如,假設詞庫中有10000個words,輸入 和輸出 理論上均是長度爲10000的 one-hot
向量。但輸出結果由於經過了softmax,所以實際輸出結果 是由不同的概率值組成。使用 與 的交叉熵損失函數進行優化。
輸出結果
假設隱藏層節點數設置爲300,隱藏層所對應的 W
維度 爲 10000*300
。最終訓練結果中,隱藏層 W
的結果,就是總的詞庫對應的詞向量。爲什麼這麼說呢?
這是由於每個詞最初由長度爲10000的 one-hot
向量表示,除了對應的位置爲1外,其餘全部爲0 。每個詞與總的隱藏層的矩陣相乘後,得到的長度爲300的新向量則是我們想要的對應 詞向量表示結果了。這就讓隱藏層中的信息變成了一張“查找表”,我們給定 one-hot
輸入,得到相應的“查找結果”。只是“查找結果”的大小和數字表示都變了,變的不再稀疏,而是由實實在在的非零數字表示。
理解
其實某種程度上可以說,這是個“假的”監督學習訓練模型,雖然整個流程是完整的。有輸入和輸出,有損失函數和優化方法。但是我們想要的結果並不是模型本身,因爲並沒有其他測試樣本需要帶入模型。想要的結果只是隱藏層的信息,是可以讓 one-hot
向量轉化成一個新的向量的信息,因爲它使得新向量所能表達的含義更加豐富。而且整個神經網絡模型中是沒有激活函數的。
再舉個例子,假設有多個訓練樣本(juice,apple) (juice,pear) (juice,banana)
,這裏指定中心詞是 juice ,規定窗口內有apple、pear、banana等單詞。這些訓練樣本的特點是,共同的輸入 juice
對應多個不同詞的輸出。如果用這些樣本訓練後,得到的概率結果中,apple、pear、banana處的概率值肯定都相對較高。從而使得它們在對應隱藏層中的參數可能是相似的,這樣才能得到相似的結果。如果我們用這些“水果”單詞對應的新向量去計算它們之間餘弦相似度的話,肯定是相對較高的。這也從另一個角度解釋了,爲什麼word2vec方法得到的結果可以讓單詞之間具有相似性和類比關係。
其實這個模型確實還挺簡單的。只是如果不能從根本上理解這麼做的目的和意義,思維轉不過來的話,可能會很難理解。本文只是想通過簡單的語言解釋Skip-Gram模型,並沒有去堆公式來證明。公式的話我另一篇博客 中有詳細描述。
當然,上面描述這個模型的方法有弊端,每次訓練的時候,輸入和輸出計算量都是針對整個詞庫大小來的,假如詞庫有一百萬個詞,計算量就會變得非常大。針對這個問題,有兩種高效訓練的方法:負採樣(negative sampling)和層序softmax(hierarchical softmax),以後有機會再介紹。
部分文字引用自 詞向量 - - gluon.ai
部分圖片引用自 Word2Vec Tutorial - The Skip-Gram Model