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程序段(代码段