关于skip gram的输出

首先,网络的目的不是要预测上下文会出现啥词,这只是一个fake task,网络的真正目的正如 @Stark Einstein 所说,是为了实现嵌入。这一点与AntoEncoder是类似的,AutoEncoder的真正目的也不是为了复现输入,而是为了获得隐层压缩的特征。

关于题主所说的权值共享问题,我从下面的角度尝试解释一下。从隐层到输出层的计算过程是:center word的词向量,与每个context的词向量进行内积,会计算一个相似度,再用softmax做一下归一化。
下面来举个例子,例如“I really love machine learning and deep learning",假如我们选择machine作为中间词,由这个句子构造出的训练集长这个样子(window_size=2的话):(machine,really),(machine,love),(machine,learning),(machine,and),也就是说通过context可以构造出4个训练样本。这个时候我们只训练一下这4个样本,意味着给定machine这个词以后,really,love,learning,and的出现的概率都一样。但是这里有个问题,我们的样本是多种多样的,我们下一个句子如果是”I like machine learning“,再训练一下,是不是给定machine这个中心词,context中出现learning的概率就更高了呢?同样的道理,如果我们训练样本足够大且无偏,根据这样训练下来的结果就会出现,给定machine这个center word,其输出的context word的概率也会有一个排序,这就意味着它对应的context的word的词向量肯定不一样。

再回过头来说,如果你的100W个句子都是”I really love machine learning and deep learning“,加上权值共享,结果就是给定machine以后,它输出really,love,learning,and这四个词的概率完全相同,这就意味着这四个词的词向量也肯定完全一样了。

■网友
实际上这个loss就是降不下来的,所以本来就不能用于真正预测上下文,而初衷也不是用于预测上下文,只是利用上下文信息去实现嵌入
■网友
感觉题主没太明白映射是怎么算的?隐层(暂且这样说,其实没有隐层,就直接是中心词的词向量作为输入)到输出层的计算过程是和多分类问题里softmax回归完全一样的,分类类别数就是词表大小: 隐层的向量和整个词表中的每个词所对应的权值向量分别做内积(也可以看做隐层词向量和整个权值向量构成的矩阵做乘法),得到一个词表那么大的向量,再用softmax对得到的这个向量做归一化,归一化之后的结果就可以看成一个概率分布列,每维代表词表里一个词的概率,在这个概率分布列里拿出上下文词所对应的概率,作负对数再加起来就是损失函数。损失函数的参数既包括输入的那个向量也就是中心词的词向量,也包括计算输出层时所乘的词表中每个词的权值向量(也就是整个权值矩阵)。
【关于skip gram的输出】 当然由于词表很大导致计算量过大,因为上述过程需要词向量和词表中所有词的权值向量做内积,所以word2vec的实现里用了负采样或者哈夫曼树做多层二分类做优化,这就不说了。


    推荐阅读