本文涉及的内容:
如何构造HuffMan树Hierarchical Softmax似然函数skip-gram似然函数CBOW似然函数Negative Sampling方法
一 HuffMan树构造方法
构造一颗颗的单结点树,树的值为单词的出现频率在森林中找到值最小的两颗树合并,两颗树的和为根节点的和,两颗树作为左右子树。删除两颗子树,左子树的值大于右子树的值。重复2和3,直到只有一棵树。哈夫曼树构造过程
哈夫曼树编码过程
二 Hierarchical Softmax
背景:
,算法的复杂度为 ,利用Hierarchical Softmax可以将复杂度降为 。
例如
同时出现在一个窗口中, 是 对应的词向量,我们希望 从根节点出发到达 的概率最大。在 独立同分布的假设下,似然函数为:
三 Skip-gram参数更新
skip-gram是利用中间的单词窗口中的上下文,用
表示中间单词, 表示窗口中的另外一个单词,注意上下文是相互的,在期望 最大的同时, 也是最大的。在实际操作中,是利用梯度上升让 最大。这样做的好处是,在每一个窗口中,不仅更新了 ,还更新了 个 , 为窗口的大小;坏处是比CBOW的训练时间长 倍。下面是skip-gram更新参数伪代码:
for i in range(1, 2c):e = np.zeros_like(x_i)for j in range(2, l_w):f = 1 / (1 + np.exp(np.dot(x_i, sitaw_j)))g = (1 - dw_j - f) * yitasitaw_j = sitaw_j + g * x_ie = e + g * sitaw_j;x_i = x_i + e
四 CBOW参数更新
CBOW是利用上下文单词的平均向量预测中间单词,
。伪代码如下:
for i in range(1, 2c):x_w += x_ix_w = xw / acfor j in range(2, lw):f = 1 / (1 + np.exp(np.dot(x_w, sitaw_j)))g = (1 - dw_j - f) * yitasitaw_j = sitaw_j + g * x_we = e + g * sitaw_jfor i in range(1, 2c):x_i = x_i + e
五 Negative Sampling
Hierachical softmax需要构造HuffMan树,每次都要循环求概率积。Negative Sampling的思路是每次训练的时候从整个训练库当中按照单词概率抽取几个负样本,损失函数定义为:
求导数很简单,可以手动推导一下。
参考链接:
yuyuqi:word2vec(cbow+skip-gram+hierarchical softmax+Negative sampling)模型深度解析word2vec原理(二) 基于Hierarchical Softmax的模型