word2vec和node2vec笔记(更新ing)
最近仔細看了一下Node2vec,這里匯總一下相關知識點。
首先Node2vec和Deepwalk都是NLP中的word2vec在圖中的拓展應用,其中Node2vec又是在Deepwalk基礎上的拓展,主要有以下兩個方面的改進:
- 在圖中隨機游走生成序列時,Node2vec從Deepwalk的無偏進階到參數可控的有偏。
- Node2vec采用Negtive Sampling代替了Deepwalk中的Hierarchical Sampling
word2vec
word2vec相關知識點:
- SkipGram
根據中心詞推測上下文的模型,詞向量是模型參數 - CBOW (continuous bag of words)
根據上下文推測中心詞的模型,詞向量是模型參數 - Hierarchical Softmax (如果只是想把word2vec用起來,這個知識點可以不看,因為目前已經差不多退出舞臺)
- 哈夫曼樹/霍夫曼樹 Huffman Tree
最優二叉樹,是一種帶權路徑長度最短的二叉樹 - 根據詞頻構造Huffman Tree,更新路徑上的參數,將復雜度從kV降低到klog(V),其中k是詞向量的維度,V是詞的個數
- 哈夫曼樹/霍夫曼樹 Huffman Tree
- Negtive Sampling
word2vec理論相關博文:
https://blog.csdn.net/qq_38890412/article/details/107658406,這篇博文將Huffman Tree講得很清楚。
https://zhuanlan.zhihu.com/p/56139075,這篇知乎推導了Huffman Tree中參數更新。
https://blog.csdn.net/BGoodHabit/article/details/106163130,這篇博文講了模型訓練和預測的具體細節。關于其中的label和score相乘部分,還沒太理清楚,后續需要再看一下。
https://wmathor.com/index.php/archives/1430/,這篇博文寫了word2vec參數更新公式推導。
https://lonepatient.top/2019/01/18/Pytorch-word2vec,這篇博文的理論部分也寫的比較仔細。
word2vec實戰相關博文:
https://wmathor.com/index.php/archives/1435/,pytorch實現word2vec,代碼已經嘗試過,可以跑出博主展示的效果。
其中一開始容易困惑的點,有兩個參數矩陣,也就是兩個embedding,第一個embedding是詞作為中心詞,第二個embedding是詞作為背景詞。
1,為什么用第一個參數矩陣,也就是詞作為中心詞的參數矩陣來作為學到的embedding
如果沒有用hierarchical softmax或者negtive sampling這樣的近似的話,兩個矩陣都是可以的,但是用了這兩種優化方法后,就不再完全計算或者更新第二個矩陣,所以使用第一個參數矩陣。
2,代碼中是否可以用nn.Linear來代替nn.Embedding
可以,其實他們兩個本質上做的是一樣的事情,nn.Embedding是bias設置成0的nn.Linear。但是nn.Linear需要傳入one-hot向量,而nn.Embedding只需要傳入index。
3,向量dot相乘作為loss時需要注意的(這個是我自己在實現的過程中犯的一個錯誤,記錄一下)
為了讓正樣本pair中的點向量距離相近,負樣本pair的點向量距離更遠,先計算內積,再用sigmoid函數,下面是偽代碼:
我自己在實現的過程里,調換了負號的順序,寫成了如下,就出現了loss為負的問題,因為logsigmoid函數的結果一定是負的。
# 有問題 pos_dot = dot(center_words, pos_words) neg_dot = dot(center_words, neg_words) pos_loss = F.logsigmoid(-pos_dot) neg_loss = F.logsigmoid(neg_dot) loss = (pos_loss+neg_dot)node2vec
總結
以上是生活随笔為你收集整理的word2vec和node2vec笔记(更新ing)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vdbench(一)
- 下一篇: c语言 程序段 数据段,C程序段(代码段