什么是word2vector
原文地址:https://www.julyedu.com/questions/interview-detail?quesId=2761&cate=NLP&kp_id=30
什么是 Word2vec?
在聊 Word2vec 之前,先聊聊 NLP (自然語言處理)。NLP 里面,最細粒度的是 詞語,詞語組成句子,句子再組成段落、篇章、文檔。所以處理 NLP 的問題,首先就要拿詞語開刀。
舉個簡單例子,判斷一個詞的詞性,是動詞還是名詞。用機器學習的思路,我們有一系列樣本(x,y),這里 x 是詞語,y 是它們的詞性,我們要構建 f(x)->y 的映射,但這里的數學模型 f(比如神經網絡、SVM)只接受數值型輸入,而 NLP 里的詞語,是人類的抽象總結,是符號形式的(比如中文、英文、拉丁文等等),所以需要把他們轉換成數值形式,或者說——嵌入到一個數學空間里,這種嵌入方式,就叫詞嵌入(word embedding),而 Word2vec,就是詞嵌入( word embedding) 的一種。
我在前作『都是套路: 從上帝視角看透時間序列和數據挖掘』提到,大部分的有監督機器學習模型,都可以歸結為:
f(x)->y
在 NLP 中,把 x 看做一個句子里的一個詞語,y 是這個詞語的上下文詞語,那么這里的 f,便是 NLP 中經常出現的『語言模型』(language model),這個模型的目的,就是判斷 (x,y) 這個樣本,是否符合自然語言的法則,更通俗點說就是:詞語x和詞語y放在一起,是不是人話。
Word2vec 正是來源于這個思想,但它的最終目的,不是要把 f 訓練得多么完美,而是只關心模型訓練完后的副產物——模型參數(這里特指神經網絡的權重),并將這些參數,作為輸入 x 的某種向量化的表示,這個向量便叫做——詞向量(這里看不懂沒關系,下一節我們詳細剖析)。
我們來看個例子,如何用 Word2vec 尋找相似詞:
對于一句話:『她們 夸 吳彥祖 帥 到 沒朋友』,如果輸入 x 是『吳彥祖』,那么 y 可以是『她們』、『夸』、『帥』、『沒朋友』這些詞
現有另一句話:『她們 夸 我 帥 到 沒朋友』,如果輸入 x 是『我』,那么不難發現,這里的上下文 y 跟上面一句話一樣
從而 f(吳彥祖) = f(我) = y,所以大數據告訴我們:我 = 吳彥祖(完美的結論)
Skip-gram 和 CBOW 模型
上面我們提到了語言模型
如果是用一個詞語作為輸入,來預測它周圍的上下文,那這個模型叫做『Skip-gram 模型』
而如果是拿一個詞語的上下文作為輸入,來預測這個詞語本身,則是 『CBOW 模型』
Skip-gram 和 CBOW 的簡單情形
我們先來看個最簡單的例子。上面說到, y 是 x 的上下文,所以 y 只取上下文里一個詞語的時候,語言模型就變成:
用當前詞 x 預測它的下一個詞 y
但如上面所說,一般的數學模型只接受數值型輸入,這里的 x 該怎么表示呢? 顯然不能用 Word2vec,因為這是我們訓練完模型的產物,現在我們想要的是 x 的一個原始輸入形式。
答案是:one-hot encoder
所謂 one-hot encoder,其思想跟特征工程里處理類別變量的 one-hot 一樣。本質上是用一個只含一個 1、其他都是 0 的向量來唯一表示詞語。
我舉個例子,假設全世界所有的詞語總共有 V 個,這 V 個詞語有自己的先后順序,假設『吳彥祖』這個詞是第1個詞,『我』這個單詞是第2個詞,那么『吳彥祖』就可以表示為一個 V 維全零向量、把第1個位置的0變成1,而『我』同樣表示為 V 維全零向量、把第2個位置的0變成1。這樣,每個詞語都可以找到屬于自己的唯一表示。
OK,那我們接下來就可以看看 Skip-gram 的網絡結構了,x 就是上面提到的 one-hot encoder 形式的輸入,y 是在這 V 個詞上輸出的概率,我們希望跟真實的 y 的 one-hot encoder 一樣。
首先說明一點:隱層的激活函數其實是線性的,相當于沒做任何處理(這也是 Word2vec 簡化之前語言模型的獨到之處),我們要訓練這個神經網絡,用反向傳播算法,本質上是鏈式求導,在此不展開說明了,
當模型訓練完后,最后得到的其實是神經網絡的權重,比如現在輸入一個 x 的 one-hot encoder: [1,0,0,…,0],對應剛說的那個詞語『吳彥祖』,則在輸入層到隱含層的權重里,只有對應 1 這個位置的權重被激活,這些權重的個數,跟隱含層節點數是一致的,從而這些權重組成一個向量 vx 來表示x,而因為每個詞語的 one-hot encoder 里面 1 的位置是不同的,所以,這個向量 vx 就可以用來唯一表示 x。
注意:上面這段話說的就是 Word2vec 的精髓!!
此外,我們剛說了,輸出 y 也是用 V 個節點表示的,對應V個詞語,所以其實,我們把輸出節點置成 [1,0,0,…,0],它也能表示『吳彥祖』這個單詞,但是激活的是隱含層到輸出層的權重,這些權重的個數,跟隱含層一樣,也可以組成一個向量 vy,跟上面提到的 vx 維度一樣,并且可以看做是詞語『吳彥祖』的另一種詞向量。而這兩種詞向量 vx 和 vy,正是 Mikolov 在論文里所提到的,『輸入向量』和『輸出向量』,一般我們用『輸入向量』。
需要提到一點的是,這個詞向量的維度(與隱含層節點數一致)一般情況下要遠遠小于詞語總數 V 的大小,所以 Word2vec 本質上是一種降維操作——把詞語從 one-hot encoder 形式的表示降維到 Word2vec 形式的表示。
Skip-gram 更一般的情形
上面討論的是最簡單情形,即 y 只有一個詞,當 y 有多個詞時,網絡結構如下:
可以看成是 單個x->單個y 模型的并聯,cost function 是單個 cost function 的累加(取log之后)
如果你想深入探究這些模型是如何并聯、 cost function 的形式怎樣,不妨仔細閱讀參考資料4. 在此我們不展開。
為什么采用負采樣
1.加速了模型計算
2.保證了模型訓練的效果,其一 模型每次只需要更新采樣的詞的權重,不用更新所有的權重,那樣會很慢,其二 中心詞其實只跟它周圍的詞有關系,位置離著很遠的詞沒有關系,也沒必要同時訓練更新,作者這點非常聰明。
第一個問題,我們每次只對窗口中出現的幾個單詞進行升級,但是在計算梯度的過程中,我們是對整個參數矩陣進行運算,這樣參數矩陣中的大部分值都是0。
第二個問題:我們使用的目標函數是softmax函數
我們觀察分母,分母需要把窗口中所有單詞的“得分”都算出來再求和,效率低下!
負采樣的核心思想是:計算目標單詞和窗口中的單詞的真實單詞對“得分”,再加一些“噪聲”,即詞表中的隨機單詞和目標單詞的“得分”。
真實單詞對“得分”和“噪聲”作為代價函數。
每次優化參數,只關注代價函數中涉及的詞向量。
我們僅對K個參數進行采樣
我們放棄softmax函數,采用sigmoid函數,這樣就不存在先求一遍窗口中所有單詞的‘“得分”的情況了。
總結
以上是生活随笔為你收集整理的什么是word2vector的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stack专题
- 下一篇: 选择更安全的方式执行你的puppet更新