以下图像通常用于表示带有skip-gram的word2vec模型:
但是,在stackoverflow上读取this discussion后,似乎word2vec实际上需要1个字输入和1个字作为输出。输出字是从窗口随机抽样。 (这将执行X次以生成X输入/输出对。)
在我看来,上面的图像没有正确描述网络。我的问题是:1输入/ 1输出标准(Tensorflow word2vec教程采用这种方法并将其称为skip-gram)或者是否有些网络实际采用上述图像的结构?
答案 0 :(得分:0)
这不是一个很棒的图表。
在CBOW中,那些会聚箭头是一次性发生的平均值,以创建一个单一的训练示例' (期望预测)即(平均值(context1,context2,...,contextN) - > target-word)。 (实际上,平均值比图中显示的'更常见。)
在Skip-Gram中,那些不同的箭头是一个接一个地制作的多个训练样例(期望的预测)。
在两个图中,虽然它们看起来有点像神经网络节点架构,但实际的隐藏层和内部连接权重仅隐含在中间列到右列箭头内。
Skip-gram始终为1"输入"上下文单词用于预测附近的1个(在有效的'窗口内)"输出"目标词。
实现倾向于遍历整个有效窗口,因此每个(context - > target)对都被用作训练示例。在实践中,如果你认为目标词的中心词和它周围的每个词都是上下文词,或者上下文词的中心词和它周围的每个词都是目标词,那就无所谓了。 - 两种方法都会导致训练完全相同的(单词 - >单词)对集合,只是稍微不同的迭代顺序。 (我相信最初的Word2Vec论文以一种方式描述了它,但是由于缓存效率稍微提高的原因,谷歌发布的代码却采用了另一种方式。)
实际上,对于考虑的每个中心字,有效窗口被选择为从1到配置的最大window
值的随机数。事实证明这是一种廉价的方式,基本上可以对更近的词进行加权:直接邻居总是训练对的一部分,有时只是进一步的词。也就是说,从整个窗口中随机采样 - 它只是一个随机窗口大小。 (还有另一个下采样,其中最频繁的单词将被随机丢弃,以免以不太频繁的单词为代价来推翻它们,但这是一个完全独立的过程,未在上面反映出来。 )
在CBOW中,不是最多2 *窗口输入 - 输出对(context-word - > target-word)形式,而是单个输入 - 输出对(context-words-average) - > target-word)。 (在CBOW中,循环为单个N:1训练创建一个中心词的训练示例的平均值,然后在所有贡献单词中分割反向传播的错误。在skip-gram中,循环创建多个备用1:1训练 - 一个中心词的例子。)