我正在尝试使用负抽样在python中实现skip-gram word2vec。 根据我的理解,我应该通过Mikolov Et al从论文中最大化等式(4)。
我已经根据Vc,U和U_rand取了这个等式的梯度。其中Vc是对应于中心字的中心向量,U是对应于中心字上下文中的字的上下文向量,U_rand是随机采样字的上下文向量。
然后我计算每个单词和上下文单词组合的成本函数,将它们相加并打印出整个语料库的总和。我正在运行这几次,并没有看到整个语料库成本总和有所改善。成本上升然后反复下降。
我得到了以下渐变
关于Vc的渐变J =(1-sigma(V•U))* U - 随机求和 向量(1-sigma(-V•U_rand))* U_rand
关于U =(1-sigma(V·U))* V ,grad J.
关于U_rand的渐变J =(1-sigma(-V•U_rand))* - V
所以说到这里,我有几个问题:
答案 0 :(得分:0)
我不明白您的问题2-4。似乎您不知道自己不知道的东西。
首先,Skip-Gram(SG和SGNS)都具有以下成本函数(derivation of cost function):
上面的等式适用于批次梯度下降-在扫描大小为T
的整个语料库后进行一次更新。这是低效的,因为T
在NLP应用程序中很大。因此,我们使用Stochastic Gradient Descent(SGD)更新每个训练样本的权重:
SGNS使用sigmoid函数来计算二进制概率分布。 mikolove的论文的公式(4)替换了以上成本函数::
w
是输入词,h
是隐藏层。 h
等效于w
的单词向量,因为输入层是单热编码的。 c_pos
是肯定词的词向量,c_neg
是randomly drawn中否定词noise distribution的词向量。 W_neg
表示所有K
个否定词的词向量。
任何机器学习模型的一般更新方程为:
对theta取SGNS成本函数的导数:
从这一点出发,我们需要针对输入权重矩阵和输出权重矩阵计算梯度:
输入权重矩阵的梯度
在SG和SGNS中,输入权重矩阵中仅对应于输入单词的一个单词向量被更新。由于输入单词的单词向量等效于隐藏层,因此我们采用成本函数J
相对于h
的导数:
更新公式如下:
输出权重矩阵的梯度
c_pos
和c_neg
都是输出权重矩阵中的单词向量,我们分别针对它们两个采用梯度:
在这里,σ(c_j⋅h)−t_j
被称为prediction error。随着模型优化权重,此预测误差将最小化。
我要最大化还是最小化?
机器学习中的约定是最小化成本函数J
。但是许多论文说,他们最大化 ... bla bla bla的可能性。为什么会这样?
否定采样的最初思想是最大化观察正对的概率,并最小化观察负对的概率。从数学上讲,它可以翻译为:
argmax theta
表示我们通过调整theta
来最大化以下概率。在机器学习中,通常的做法是对目标方程采用自然对数以简化推导(为什么采用自然对数?请读here)。然后:
作者说他们最大化了概率。但是,在机器学习中,惯例是最小化成本函数,而不是最大化成本函数。为了遵守约定,我们在等式(11)中添加了一个负号。之所以可以这样做,是因为最小化对数对数可能性等于最大化对数对数可能性。经过一些数学操作(derivation)之后,我们获得了可以最小化的成本函数: