Python word2vec负采样跳过gram模型的正确梯度
我试图在python中使用负采样实现skip gram word2vec。 根据我的理解,我应该最大化论文中的等式(4) 我已经取了这个方程关于Vc,U和U_的梯度。其中Vc是对应于中心词的中心向量,U是对应于中心词上下文中的词的上下文向量,U_rand是随机采样词的上下文向量 然后,我计算每个单词和上下文单词组合的成本函数,将它们相加,打印出整个语料库的总和。我已经运行过几次了,我看不到整个成本总额有什么改善。成本一涨再跌 我得到了以下梯度 关于Vc的梯度J=(1-西格玛(V•U))*U-随机变量上的求和 向量(1-sigma(-V•U_-rand))*U_-rand 相对于U的梯度J=(1-西格玛(V•U))*V 关于U_rand的梯度J=(1-西格玛(-V•U_rand))*-V 说到这里,我有几个问题:Python word2vec负采样跳过gram模型的正确梯度,python,machine-learning,nlp,word2vec,word-embedding,Python,Machine Learning,Nlp,Word2vec,Word Embedding,我试图在python中使用负采样实现skip gram word2vec。 根据我的理解,我应该最大化论文中的等式(4) 我已经取了这个方程关于Vc,U和U_的梯度。其中Vc是对应于中心词的中心向量,U是对应于中心词上下文中的词的上下文向量,U_rand是随机采样词的上下文向量 然后,我计算每个单词和上下文单词组合的成本函数,将它们相加,打印出整个语料库的总和。我已经运行过几次了,我看不到整个成本总额有什么改善。成本一涨再跌 我得到了以下梯度 关于Vc的梯度J=(1-西格玛(V•U))*U-随机
我不明白你的问题2-4。似乎你不知道你不知道的东西 首先,Skip Gram(SG和SGNS)具有以下成本函数(): 上面的公式适用于批量梯度下降-扫描整个语料库大小
T
后进行一次更新。这是低效的,因为在NLP应用程序中,T
非常大。因此,我们使用(SGD)更新每个训练样本的权重:
SGNS使用该函数计算二进制概率分布。mikolove论文的方程式(4)取代了上述成本函数:
w
是输入字,h
是隐藏层h
相当于w
的字向量,因为输入层是一个热编码层c_pos
是表示肯定词的词向量,c_neg
是表示否定词的词向量W_neg
表示所有K
字向量的否定字
任何机器学习模型的一般更新方程为:
取SGNS成本函数关于θ的导数:
从这一点开始,我们需要计算关于输入权重矩阵和输出权重矩阵的梯度:
输入权重矩阵的梯度
在SG和SGNS中,仅更新输入权重矩阵中与输入字对应的一个字向量。由于输入字的字向量相当于隐藏层,因此我们采用成本函数J
对h
的导数:
更新公式为:
输出权重矩阵的梯度
c_pos
和c_neg
都是来自输出权重矩阵的字向量,我们分别对它们取梯度:
这里,σ(c_j⋅h)−t_j
称为。当模型优化权重时,该预测误差将最小化
我是最大化还是最小化?
机器学习的惯例是最小化成本函数J
。但许多论文说,他们最大限度地提高了。。。呜呜呜呜。为什么呢
负采样的最初想法是最大化观测正对的概率,最小化观测负对的概率。从数学上讲,它可以翻译为:
argmax theta
意味着我们通过调整theta
来最大化以下概率。在机器学习中,一种常见的做法是将自然对数引入目标方程以简化推导(为什么要采用自然对数?读取)。然后:
作者说他们最大化了可能性。然而,在机器学习中,约定是最小化代价函数,而不是最大化代价函数。为了遵守惯例,我们在等式(11)中添加了一个负号。这是因为最小化负对数似然等于最大化正对数似然。经过一些数学运算(),我们得到了可以最小化的代价函数:
在方程式21)为什么乙状结肠(-c_-negh)变成乙状结肠(c_-negh)?