Word2vec CBOW模型实现,与原始算法的偏差

时间:2019-04-23 22:49:09

标签: pytorch word2vec

我正在尝试通过pytorch实现CBOW模型。 我从explanation of word2vec中了解到,word2vec有2层(因此有2个矩阵),第一个矩阵包含低维单词向量,它实际上是一个查找表,并将该单词的向量表示投影到投影层上(没有非线性,因此不是隐藏层)。然后将字向量乘以第二个矩阵,然后通过softmax函数将其输出。训练后,第一个矩阵可用作单词嵌入。

我看到许多实现使用3层(1个嵌入层再加上2层。),这与我上面的理解是矛盾的。一些示例实现hereherehere。 以下三行代码通常用作实现3层的模型:

self.embeddings = nn.Embedding(vocab_size, embedding_dim)
self.linear1 = nn.Linear(context_size * embedding_dim, 128)
self.linear2 = nn.Linear(128, vocab_size)

我的问题是,如果我的理解还不错,那么为什么要使用3层?有什么好处吗?

我认为一个明显的缺点是,它将在计算上昂贵。

Word2vec类似于自动编码器(也具有两层)的思想,偏离这种经过验证的思想可能会损害嵌入质量。我对吗?

另一个重要的事情是,根据我上面提到的论文,对于多个上下文词,矢量的平均值将投影在保护层上。但是,它们不是平均,而是连接向量。这是为什么?有什么好处吗?

此外,他们在隐藏层使用非线性,我认为这将在训练大量数据时造成严重的性能问题。对吧?

0 个答案:

没有答案