https://zhuanlan.zhihu.com/p/26306795
https://arxiv.org/pdf/1411.2738.pdf
https://zhuanlan.zhihu.com/p/53194407
https://zhuanlan.zhihu.com/p/58805184 embedding入門到精通的paper,包括graph embedding
Word2Vec算法原理:
skip-gram: 用一個詞語作為輸入,來預測它周圍的上下文
cbow: 拿一個詞語的上下文作為輸入,來預測這個詞語本身
Skip-gram 和 CBOW 的簡單情形:
當上下文只有一個詞時,語言模型就簡化為:用當前詞 x 預測它的下一個詞 y
V是詞庫中詞的數量,$x$ 是one-hot encoder 形式的輸入,$y$ 是在這 V 個詞上輸出的概率。
隱層的激活函數是線性的,相當於沒做任何處理(這也是 Word2vec 簡化之前語言模型的獨到之處)。當模型訓練完后,最后得到的其實是神經網絡的權重【輸入層到隱層、隱層到輸出層】,這就是生成的詞向量,詞向量的維度等於隱層的節點數。注意,由輸入層到隱層的網絡權重(輸入向量)以及隱層到輸出層的網絡權重(輸出向量)均可以作為詞向量,一般我們用“輸入向量”。
需要提到一點的是,這個詞向量的維度(與隱含層節點數一致)一般情況下要遠遠小於詞語總數 V 的大小,所以 Word2vec 本質上是一種降維操作—把詞語從 one-hot encoder 形式的表示降維到 Word2vec 形式的表示。
Skip-gram更一般的情形:
當 y 有多個詞時,網絡結構如下:

CBOW更一般的情形:
網絡結構如下:

Word2vec 的訓練trick
Word2vec 本質上是一個語言模型,它的輸出節點數是 V 個,對應了 V 個詞語,本質上是一個多分類問題,但實際當中,詞語的個數非常非常多,會給計算造成很大困難,所以需要用技巧來加速訓練。
hierarchical softmax:本質是把 N 分類問題變成 log(N)次二分類
negative sampling:本質是預測總體類別的一個子集
https://zhuanlan.zhihu.com/p/27234078 <= 這里闡述了word2vec樣本相關的細節,非常好
如何構建訓練集?
基於成對的單詞來對神經網絡進行訓練,訓練樣本是 ( input word, output word ) 這樣的單詞對(采集自原始的句子),input word和output word都是one-hot編碼的向量, 最終模型的輸出是一個概率分布.
假設我們擁有10000個單詞的詞匯表,我們如果想嵌入300維的詞向量,那么我們的輸入-隱層權重矩陣和隱層-輸出層的權重矩陣都會有 10000 x 300 = 300萬個權重,在如此龐大的神經網絡中進行梯度下降是相當慢的。更糟糕的是,你需要大量的訓練數據來調整這些權重並且避免過擬合。百萬數量級的權重矩陣和億萬數量級的訓練樣本意味着訓練這個模型將會是個災難。
解決方案:
- 將常見的單詞組合(word pairs)或者詞組作為單個“words”來處理。
- 對高頻次單詞進行抽樣來減少訓練樣本的個數。基本思想:對於我們在訓練原始文本中遇到的每一個單詞,它們都有一定概率被我們從文本中刪掉,而這個被刪除的概率與單詞的頻率有關。
- 對優化目標采用“negative sampling(負采樣)”方法,這樣每個訓練樣本的訓練只會更新一小部分的模型權重,從而降低計算負擔。
當我們用訓練樣本 ( input word: "fox",output word: "quick") 來訓練我們的神經網絡時,“ fox”和“quick”都是經過one-hot編碼的。如果我們的vocabulary大小為10000時,在輸出層,我們期望對應“quick”單詞的那個神經元結點輸出1,其余9999個都應該輸出0。在這里,這9999個我們期望輸出為0的神經元結點所對應的單詞我們稱為“negative” word。
當使用負采樣時,我們將隨機選擇一小部分的negative words(比如選5個negative words)來更新對應的權重。我們也會對我們的“positive” word進行權重更新(在我們上面的例子中,這個單詞指的是”quick“)。
回憶一下我們的隱層-輸出層擁有300 x 10000的權重矩陣。如果使用了負采樣的方法我們僅僅去更新我們的positive word-“quick”的和我們選擇的其他5個negative words的結點對應的權重,共計6個輸出神經元,相當於每次只更新300 * 6 = 1800個權重。對於3百萬的權重來說,相當於只計算了0.06%的權重,這樣計算效率就大幅度提高。
如何選擇negative words?
一個單詞被選作negative sample的概率跟它出現的頻次有關,出現頻次越高的單詞越容易被選作negative words。每個單詞被賦予一個權重,即
, 它代表着單詞出現的頻次,概率公式:

公式相關:https://www.cnblogs.com/pinard/p/7249903.html#!comments
Negative Sampling也是采用了二元邏輯回歸來求解模型參數,通過負采樣,我們得到了neg個負例$ (context(w_0), w_i), i = 1, 2...neg $。為了統一描述,我們將正例定義為$w_0$。
在邏輯回歸中,我們的正例應該期望滿足:![]()
我們的負例期望滿足:![]()
我們期望可以最大化下式:![]()
模型的似然函數為:
此時對應的對數似然函數為:
首先我們計算$\theta^{w_i}$的梯度:

$x_{w_0}$的梯度如下:

Item2vec算法原理
Item2vec中把用戶瀏覽的商品集合等價於word2vec中的word的序列,即句子(忽略了商品序列空間信息spatial information),出現在同一個集合的商品對視為 positive。缺點:1、忽略了user行為序列信息; 2、沒有建模用戶對不同item的喜歡程度高低。
Graph Embedding算法原理
基於word2vec的一系列embedding方法主要是基於序列進行embedding,在當前商品、行為、用戶等實體之間的關系越來越復雜化、網絡化的趨勢下,原有sequence embedding方法的表達能力受限,因此Graph Embedding方法的研究和應用成為了當前的趨勢。
DeepWalk 算法:
DeepWalk的思想類似word2vec,使用圖中節點與節點的共現關系來學習節點的向量表示。那么關鍵的問題就是如何來描述節點與節點的共現關系,DeepWalk給出的方法是使用隨機游走(RandomWalk)的方式在圖中進行節點采樣。
RandomWalk是一種可重復訪問已訪問節點的深度優先遍歷算法。給定當前訪問起始節點,從其鄰居中隨機采樣節點作為下一個訪問節點,重復此過程,直到訪問序列長度滿足預設條件。
獲取足夠數量的節點訪問序列后,使用skip-gram model 進行向量學習。
阿里論文閱讀:http://d0evi1.com/aliembedding/

淘寶graph embedding總覽: a) 用戶行為序列:用戶u1對應一個session,u2和u3分別各對應一個session;這些序列被用於構建item graph;b) 有向加權item graph $G = (V, E)$;c) 在item graph上由random walk生成的序列; d) 使用Skip-Gram生成embedding
1、根據用戶行為構建item graph
我們設置了一個時間窗口,只選擇用戶在該窗口內的行為,這被稱為是基於session的用戶行為(session-based)。經驗上,該時間窗口的區間是一個小時。
如果我們獲取基於session的用戶行為,若兩個items它們連續出現,會通過一個有向邊進行連接,例如:圖2(b)的item D和item A是連接的,因為在圖2(a)中用戶u1u1順序訪問了item D和A。通過利用在淘寶上所有用戶的協同行為,我們會為每條邊eijeij基於在所有用戶行為的行連接items中的出現總數分配一個權重。特別的,在所有用戶行為歷史中,該邊的權重等於item i轉向item j的頻次。這種方法中,構建的item graph可以基於所有用戶行為表示不同items間的相似度。
2、基於圖的embedding 【捕獲在用戶行為序列上的更高階相似度】
假設M表示G的鄰近矩陣(adjacency matrix),$M_{ij}$表示從節點i指向節點j的加權邊。我們首先基於隨機游走生成節點序列,接着在這些序列上運行Skip-Gram算法。隨機游走的轉移概率定義如下:
其中,$N_{+(v_i)}$表示出鏈(outlink)的鄰節點集合,例如,從$v_i$出發指向在$N_{+(v_i)}$所有節點的邊。通過運行隨機游走,我們可以生成如圖(c)所示的許多序列。
3、使用Side Information的GE
為了解決冷啟動問題,我們提出了增強式BGE,它會使用side information來與冷啟動items做綁定。在商業推薦系統的場景中,side information常指關於一個item的:類目(category),shop(商名),價格(price)等,我們可以通過將side information合並到graph embedding中來緩合cold-start問題。

SI表示side information,其中”SI 0”表示item自身。慣例上,1)對於items和不同的SIs,稀疏特征趨向於one-hot-encoder vectors。 2) Dense embeddings是items和相應的SI的表示 ;3) hidden representation是一個item和它相應的SI的聚合embedding。
為了合並side information,我們為item v將n+1個embedding vectors進行拼接,增加一個layer,使用average-pooling操作來進行聚合。
https://zhuanlan.zhihu.com/p/53194407
代碼實現:
https://spaces.ac.cn/archives/4515
https://github.com/xiaohan2012/sdne-keras
