连续词袋(CBOW)网络架构?

数据挖掘 nlp 火炬 词嵌入 word2vec
2022-02-15 03:33:09

研究 word2vec 之类的嵌入,我在 PyTorch 的网站上发现了这个练习,它提示读者在 PyTorch 中实现一个 CBOW 网络。

我的问题是关于实现这个 CBOW 网络的架构。

这是我的理解:从许多来源看来,网络似乎应该有一个隐藏层(有权重且没有偏差),它连接到一个激活层(大多数来源说 softmax)。然后,网络将被训练以将 one-hot 编码的单词映射到可能的上下文。最后,隐藏层的权重将用作嵌入矩阵。

我的困惑是:我在谷歌上看到了很多这样的解决方案,其中有多个隐藏层在这个例子中,有一个嵌入层和两个通过 relu 连接的线性层。这是另一个使用一个线性层的。

我的问题是:

  • 训练 CBOW 编码的正确架构是什么?
  • 如果这种多隐藏层方法是正确的,那么当您只使用其中一层作为编码时,如何不丢失语义信息?
  • 如果单隐藏层方法是正确的,是否有人有在 PyTorch 中使用这种方法实现的示例(如果没有也可以)?

注意:对 ML 非常陌生,所以即使是在挑剔的事情上也可以随时纠正我,这样我就可以学习了!

1个回答
  • 训练 CBOW 编码的正确架构是什么?

Mikolov 等人的原始论文使用 1 个隐藏层。但是,对于 NLP 任务(以及一般的深度学习),没有“正确”的层数可供使用。

对于某些任务,您可能会发现使用更多隐藏层会更好,对于其他任务,可能一个隐藏层就足够了。层数是一个超参数,以及其他“设计选择”,例如嵌入向量的维度、词汇的大小等等。

  • 如果这种多隐藏层方法是正确的,那么当您只使用其中一层作为编码时,如何不丢失语义信息?

我是这样想的。在训练 CBOW 时,隐藏层会学习输入上下文词和输出目标词之间的一些“关系函数”。为了让“关系函数”表现良好,嵌入必须相应地排列(在 N 维空间中),而恰巧最佳排列方式对语义信息进行编码。

所以隐藏层不应该与语义信息有任何关系。然而,由于隐藏层(构成神经网络)的巨大建模能力,事实是嵌入将不可避免地向隐藏层丢失一些语义信息。

  • 如果单隐藏层方法是正确的,是否有人有在 PyTorch 中使用这种方法实现的示例(如果没有也可以)?

这是 Google 的第一个 github 示例。