首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >word2vec学习上下文词的可能原因是最相似的词而不是相似的上下文中的单词

word2vec学习上下文词的可能原因是最相似的词而不是相似的上下文中的单词
EN

Data Science用户
提问于 2018-12-07 13:46:42
回答 2查看 773关注 0票数 1

我正在观察我的word2vec模型,学习上下文中最相似的单词,而不是类似上下文中的单词。我不明白为什么它(通常是word2vec,特别是我的模型)能够这样做,并想知道原因。

我在keras中实现了最初的word2vec。我选择了带有点积层的变体,而不是层次化的softmax,并在维基百科转储中训练了模型,我把它分成5克。对于每个单词,我用一个二进制目标标签构造8对作为训练项。我使用带有标签True的4个上下文单词,并选择4个不属于标签0的上下文单词的随机单词。

从直觉上看,该模型应该学习相似上下文中的词的相似表示,因为它以类似的方式修改了这些词的表示,因为它用相似的上下文词独立地对它们进行了优化。因此,这些相似的词并不是直接相似的,而是间接的,因为它们因其相似的语境而受到类似的刺激。

其模式是:

代码语言:javascript
复制
input_target = Input((1,))
input_context = Input((1,))

embedding = Embedding(vocab_size, vector_dim, input_length=1, name='embedding')

target = embedding(input_target)
target = Reshape((vector_dim, 1))(target)
context = embedding(input_context)
context = Reshape((vector_dim, 1))(context)

dot_product = Dot(axes=1)([target, context])
dot_product = Reshape((1,))(dot_product)

output = Dense(1, activation='sigmoid')(dot_product)

model = Model(inputs=[input_target, input_context], outputs=output)
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

然而,我通过训练这个模型所观察到的是,当我给某个词排序最相似的单词时,我得到的单词出现在这个单词的上下文中,而不是出现在类似上下文中的单词,作为最相似的单词。

例如:

代码语言:javascript
复制
words most similar to "plant":

rank |   word

0    |   amount
1    |   surface
2    |   electron
3    |   mass
4    |   plant # also: Why is plant not most similar to plant? How can that happen?
5    |   fluid
6    |   air
7    |   metal
8    |   molecule
9    |   cell
10   |   electric
11   |   per
12   |   oxygen
13   |   demonstrate
14   |   smooth

在我看来,这看起来更像植物背景下出现的单词,而不是出现在与植物相似的上下文中的单词。

计算这些值的函数是:

代码语言:javascript
复制
def get_most_similar(word_vector, embeddings, n=15):
    """
    find the `n` words that are most similar to `word_vector` in `embeddings`
    measured by their cosine similarity
    """ 
    v = word_vector
    m = embeddings
    cosines = (np.dot(v, m.T))/(np.linalg.norm(m.T, axis=0)*np.linalg.norm(v))
    ranked_by_similarity = np.argpartition(cosines, -n)[-n:]
    return reversed(ranked_by_similarity)

有什么简单的理由吗?

我还有以下其他参数:

代码语言:javascript
复制
word vector size: 300
batch size: 128
vocabulary size: 169161 (distinct lemmas)
training sample count: 27793586 (5-grams, overlapping within sentences)

我训练了一个时期的模型,只观察到边际进一步收敛到第二个时期。

EN

回答 2

Data Science用户

回答已采纳

发布于 2018-12-14 11:29:03

在Keras中使用嵌入式的一个很好的例子。

如果我正确地解释它,您的实现和“原始word2vec”之间有很大的区别。原始框架不像在您的情况下那样使用一个‘嵌入’vector_size x vector_dim权重矩阵,而是使用两个矩阵(或层):“投影层”将输入映射到维vector_dim的向量,以及“隐藏层”将该向量映射为所有词汇表单词的概率。

隐藏层,或预测层,通常在训练后被丢弃,尽管它可能是有用的。

如果您的代码确实强制这些层共享权重,那么我们也会得到一些有趣的东西,但不同的是,嵌入反映了协同效应--参见这个问题,它专门问如果这两个层是共享的,会发生什么?

无论哪种方式,对于余弦相似,“植物”应该与“植物”最相似--或者有一些向量完全相同(归一化)。

根据原有的word2vec文件,采用层次化的软件来加快训练速度。因此,如果您不使用它,并有两个重量层,您的版本可能会变得太慢。例如,我可以推荐gensim库,它实现了软-max,并且应该在可管理的时间内在现代笔记本上运行。

票数 1
EN

Data Science用户

发布于 2018-12-07 20:46:51

神经网络不同于其他机器学习技术,因为它们必须通过重复学习。在神经网络中,重复被称为一个时代。在一个时代,每一个实例,在你的情况下,每一个字,是评估和错误是通过层向后应用,并调整权重。权值的变化可以或多或少地基于超参数来进行,但它们一次只移动一点点。

你已经训练了两个时代的word2vec模型。我不知道如何初始化模型的权重,但通常是将它们设置为随机值或设置为零。考虑到你的结果看起来有点随机,我相信这是因为模型还没有开始学习。

为了获得经过良好训练的单词嵌入模型或任何其他神经网络,您可能需要对数百、数千甚至数百万个时代进行训练。这就是为什么预先训练过的单词嵌入模型是如此宝贵,即使它们是免费的。如果你只是想要一个训练有素的嵌入模型,下载它。如果您需要合并某些特定域的用法,您可以进一步培训下载的嵌入。

HTH

票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/42287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档