这不是一个很好的图表。
在 CBOW 中,这些收敛箭头是一次发生的平均,以创建一个单一的“训练示例”(期望的预测),即 (average(context1, context2, ..., contextN) -> 目标-单词)。 (实际上,平均比图中显示的“SUM”更常见。)
在 Skip-Gram 中,那些发散的箭头是一个接一个地进行的多个训练示例(期望的预测)。
在这两个图中,虽然它们看起来有点像神经网络节点架构,但实际的隐藏层和内部连接权重只是隐含在中间列到右列的箭头内。
Skip-gram 始终是 1 个“输入”上下文词,用于预测附近(在有效“窗口”内)的 1 个“输出”目标词。
实现倾向于遍历整个有效窗口,因此每个(上下文 -> 目标)对都被用作训练示例。在实践中,如果你认为中心词是目标词和它周围的每个词都是上下文词,或者中心词是上下文词和它周围的每个词都是目标词,这并不重要——两者方法导致训练完全相同的一组(单词->单词)对,只是迭代顺序略有不同。 (我相信最初的 Word2Vec 论文以一种方式描述了它,但后来 Google 发布的代码以另一种方式进行了描述,原因是缓存效率略高。)
实际上,对于所考虑的每个中心词,有效窗口被选择为从 1 到配置的最大 window 值的某个随机数。事实证明,这实际上是一种廉价的方式,可以对更近的词进行加权:直接的邻居总是训练对的一部分,有时只是更远的词。也就是说,对不是从整个窗口中随机采样的——它只是一个随机的窗口大小。 (还有另一个下采样,其中最常用的词将被随机丢弃,以免过度训练它们而牺牲不常用的词,但这是一个完全独立的过程,没有反映在上面。)
在 CBOW 中,最多有 2*window 输入-输出对的 (context-word -> target-word) 形式,有一个输入-输出对 (context-words-average -> target-单词)。 (在 CBOW 中,循环为一个中心词创建单个 N:1 训练示例的平均值,然后将反向传播的错误拆分到所有贡献的词中。在 skip-gram 中,循环创建多个交替的 1:1 训练-一个中心词的例子。)