從word2vec到node2vec

word2vec

1. 什麼是word2vec

在自然語言處理任務(NLP)中,最細粒度是詞語,所以處理NLP問題,首先要處理好詞語。
由於所有自然語言中的詞語,都是人類的抽象總結,是符號形式的。而對於數學模型,如果要建立詞語到詞性關係的映射,必須使用數值形式的輸入。因此,需要把他們都嵌入到一個數學空間中,就叫詞嵌入(word embedding),而word2vec就是詞嵌入的一種。

大部分有監督機器學習模型都可以歸結爲:

f(x) -> y

在NLP中,把x看作一個句子裏的一個詞語,y是這個詞語的上下文詞語,那麼這裏的f,便是NLP中經常出現的『語言模型』(language model)。這個模型的目的,便是判斷(x,y)這個樣本是否符合自然語言的法則。

word2vec便是來源於這種思想,但是它最終的目的不在於把f訓練的完美,而是關心模型輸出的模型參數,是否能夠完整地向量化整個句子。

2. Skip-gram和CBOW模型

對於上面提到的語言模型

  • 如果是用一個詞語作爲輸入,預測其上下文,這個模型叫做『Skip-gram』模型。
  • 如果是拿一個詞語的上下文作爲輸入,預測這個詞語本身,則是『CBOW』模型。
2.1. Skip-gram和CBOW的簡單情形

一個例子。y是x的上下文,當y只取上下文中的一個詞語時,語言模型變成:

用當前詞x預測它的下一個詞y

但這時輸入顯然不能使x本身,也不能是word2vec,因爲這是訓練後的產物。對於初始階段,我們想要的是x的一個原始輸入形式,這時我們就會採用one-hot encoder

skip-gram
圖1. skip-gram的1v1結構

對於skip-gram網絡結構,如圖1所示,x就是上面提到的one-hot encoder形式的輸入,y是在這v個詞上輸出的概率,我們希望真實的y的one-hot encoder一樣。

在這個網絡中,隱層的激活函數其實是線性的。如果要訓練這個模型,用反向傳播算法本質上其實是鏈式求導。

當模型訓練完了之後,最後得到的是神經網絡的權重。比如一個特定詞語它的one-hot encoder:[1,0,0,…,0],則在輸入層到隱含層的權重裏,只有對應1這個位置的權重被激活,這些權重的個數,跟隱含層節點數是一致的,從而這些向量vx來表示x,並且又因爲每個詞語的one-hot表示方法都不同,所以vx也可以用來唯一地表示x。

對於輸入向量和輸出向量,我們一般使用『輸入向量』作爲壓縮後的詞向量。需要注意的是,一般情況下詞向量的維度遠遠小於詞語總數的大小,所以word2vec本質上是一種降維操作

2.2. Skip-gram更一般情形

當x只有一個詞,y有多個詞時,網絡結構如下:
在這裏插入圖片描述
圖2. skip-gram的一般結構

這種情況下可以看成是單個x到單個y模型的並聯,本質上是cost function變成了所有單個cost function的累加(取log之後)。

2.3. CBOW更一般的情形

與Skip-gram的類似,只不過Skip-gram是預測一個詞的上下文,而CBOW是用上下文預測這個詞。
在這裏插入圖片描述
圖3. CBOW的一般結構

這裏輸入變成了多個單詞,所以對輸入需要進行處理,一般是求和後平均,輸出的cost function不變。

3. word2vec訓練tricks

hierarchical softmax

用霍夫曼樹的結構解決了softmax計算量大的問題,本質是將N分類變成了log(N)次的二分類。

negative sampling
  1. 在模型中將共同出現的單詞對或者短語當做單個詞。
  2. 二次採樣經常出現的單詞,以減少數據的數量。
  3. 將會使訓練樣本更新少量模型的weights。

本質是預測總體類別的一個子集。並且對頻繁詞進行二次抽樣和應用負抽樣不僅減少了訓練過程的計算負擔,而且還提高了結果詞向量的質量。

4. Reference

  1. Gensim:官網 & 教程
  2. word2vec的數學原理詳解: 鏈接
  3. Python interface to Google word2vec: github
  4. word2vec本質的解釋:知乎

node2vec

1. 論文地址

名稱:node2vec: Scalable Feature Learning for Networks
node2vec: 原文鏈接

2. 與word2vec關聯

前文提到的word2vec任務主要是將人類語言符號轉化爲可輸入到模型的數學符號。與之類似類似,擁有網絡結構數據的,通常也無法直接輸入到模型中進行計算,這就需要我們用相類似的方法,將一個圖所包含的信息儘可能的用向量表示。

圖數據其實非常常見,例如社交網絡關係、分子結構、論文相互引用的關係網絡等等,所以如何表達網絡節點的特徵就十分重要。表達好了節點的特徵,我們就可以用它來做下游的分類、預測、聚類、可視化等等的任務。

3. 傳統的圖特徵表示方法

既然需要處理圖數據,那麼就必須首先通過合適的方法將圖的重要特徵提取出來。在node2vec之前,主要還是選用一些基礎的方法。

3.1 特徵工程

處理圖數據,直接請專家人工定義網絡節點的特徵,這其中涉及到許多圖論的知識和領域知識。

優點:

  • 這種特徵工程方法往往最後可以在特定的任務上取得比較好的效果。

缺點:

  • 泛化性能差。效果好往往僅針對單一任務。
  • 需要耗費巨大的人力無力。(主要問題)
  • 人工判斷出現偏差的可能較大。
3.2 在任務中學特徵

通過定義一個下游任務,將這些特徵作爲參數,通過大量數據去學。

這種方法解決了3.1中人力開銷的問題,但是大量的數據又帶來了很大的計算開銷。並且同樣是也監督學習,泛化能力就會大打折扣。

3.3 隱模型法/降維/矩陣分解法

這類方法總體思想和推薦系統中的矩陣分解法十分類似,屬於無監督學習。該方法嘗試將原來的網絡結構表達成一個巨大的稀疏矩陣,然後通過Factorization來得到隱表示,作爲各個節點的表示向量。這一類方法主要問題同樣在於計算的開銷過大,另外,很多實證表明這樣的方法效果並不好。

4. 本文方法

首先word2vec方法從大量無標註文本中學得詞語的分佈式表示,不僅蘊含了大量的信息,而且可以遷移到各種下游任務中。同樣,在網絡中也存在很多很多通路,將各個節點連成一條線,這些連線同樣也蘊含着節點之間的相互關係,就如同句子中各個詞語的關係一樣。

因此,本文的作者嘗試將這些節點序列當做句子,用word2vec方法進行訓練,就能夠得到比較好的node的向量表示了。

那麼現在的問題就變成了:如何生成有效的Node序列

4.1 如何生成node sequence

論文中給出了一個圖來輔助說明:
在這裏插入圖片描述
上圖中可以明顯看到有兩個小團體,分別以u和s6爲中心。如果這就是一個簡單的社交網絡關係,可以猜測u與s1,s2,s3,s4及s6與s5,s7,s8,s9都是同班同學的關係,但是兩者並不屬於同一個班。其中u和s6可能是兩個班長(與所有人都保持聯繫)。

接下來需要定義生成節點序列的規則。
首先需要確定的是,多個節點放入到同一個序列中,說明你認爲他們在某種意義上是相似的。這種相似可以是網絡中直接的鄰居(這種情況稱爲homophily),也可以是結構上的相似,如互爲班長的u和s6(structural equivalence)。

要想從一個節點去尋找它的直接鄰居,需要通過BFS的方法去搜(如上圖紅色箭頭),而如果想要儘快找到結構相似的,就需要通過DFS的方法去搜(如上圖藍色箭頭)。

node2vec使用的方法:

biased random walk

在網絡的表示中,位置相似(鄰居點)和結構相似都很重要,我們希望在生成隨機序列的時候可以同時考慮這兩種相似性。

並且,我們希望可以有參數控制一個偏重,在不同的任務中可以隨時調整這個參數達到泛化的效果。針對這一想法作者給出了下圖:

在這裏插入圖片描述
上圖是作者對node2vec中隨機遊走策略的一個解釋。假設從t節點開始一個random walk,現在到達了v節點。如果採取BFS策略的話,應該走到x1,因爲v和x1都是t節點的直接鄰居,如果採取DFS策略的話,應該走向x2或x3,因爲它們和t都中間隔了一步。當然也可能又返回到t節點。

於是作者設計了一個二階轉移概率算法:
兩個節點之間的轉移概率爲:

πvx=αpq(t,x)ωvx \pi_{vx}=\alpha_{pq}(t,x)\cdot\omega_{vx}

其中w爲這兩個節點之間邊的權重,這個權重根據實際的場景而定,而α\alpha爲search bias,定義爲:

αpq(t,x)={1pifdtx=01ifdtx=11qifdtx=2 \alpha_{pq}(t,x) = \left\{ \begin{aligned} \frac{1}{p} \quad if \quad d_{tx}=0 \\ 1 \quad if \quad d_{tx}=1 \\ \frac{1}{q} \quad if \quad d_{tx}=2 \end{aligned} \right.

這也就是說,一個節點的下一步應該怎麼走,取決於它的上一步和下一步的關係

對這個公式解釋一下:v是當前節點,t是v上一步所在的節點,而x代表下一步的位置。
d(t,x)代表t和x之間的最短距離:

  • 當d=0時,就是從v又回到t節點的意思,這個時候search bias爲1/p,可以理解爲以1/p的概率返回上一步;
  • 當d=1時,則x爲t的直接鄰居,相當於BFS,這時的bias爲1;
  • 當d=2時,x是t鄰居的鄰居,相當於dfs,這時bias爲1/q

作者稱p爲return parameter,因爲p控制回到原節點的概率;稱q爲in-out parameter,因爲這個參數控制着BFS和DFS的關係。

這樣,當我們設置不同的p和q時,就可以得到不一樣偏重的node sequence。在訓練模型的時候,可以使用grid search來尋找最優的p和q。也可以根據場景需求來自行確定p和q。

4.3 如何學習節點特徵

這裏就是完全借鑑word2vec的方法。
總的目標函數是:
maxfuVlogPr(NS(u)f(u)). \max \limits_{f} \sum_{u \in V} \log Pr(N_{S}(u)|f(u)).
這裏的f就是把節點u映射到特徵空間的函數,N(u)是通過前面的node sequence得到的u的近鄰節點,相當於上下文。

具體計算:
Pr(NS(u)f(u))=niNS(u)Pr(nif(u)). Pr(N_{S}(u)|f(u)) = \prod_{n_{i} \in N_{S}(u)}Pr(n_{i}|f(u)).
Pr(nif(u))=exp(f(ni)f(u))uVexp(f(v)f(u)). Pr(n_{i}|f(u)) = \frac{exp(f(n_{i})\cdot f(u))}{\sum_{u \in V} exp(f(v) \cdot f(u))} .

與前文中提到的word2vec的方法一致。

4.4 node2vec算法框架

在這裏插入圖片描述

4.5 如何表示邊的特徵

對於點的特徵上面已經學習到了,但是在圖中,很多任務是針對邊的,因此對圖嵌入我們也需要邊的特徵。

作者提到,一條邊實際上就是由兩個節點決定的,因此可以用兩個節點的特徵來表示,作者給出了一些可選選項:
在這裏插入圖片描述

5. 可視化

作者在一個任務關係網絡上嘗試了node2vec,通過kmeans聚類,並做了一個可視化,看看node2vec得到的節點向量反映出網絡的什麼特點。

p=1, q=0.5的效果:
在這裏插入圖片描述
可以看出這個時候各個小區、小團體被聚爲一類。

p=1, q=2的效果:
在這裏插入圖片描述
這個時候,可以發現各個社區之間的橋樑藍色節點被聚成一類,因爲他們有類似的結構特點,而淡黃色的點,是屬於人物關係中比較邊緣化的人。

對於節點分類和鏈路預測的結果就不作過多贅述。

6. 現成資源

斯坦福官網:鏈接

7. Reference

  1. 簡書博客
  2. 知乎論文筆記
發佈了67 篇原創文章 · 獲贊 94 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章