我正在观察我的word2vec模型,学习上下文中最相似的单词,而不是类似上下文中的单词。我不明白为什么它(通常是word2vec,特别是我的模型)能够这样做,并想知道原因。
我在keras中实现了最初的word2vec。我选择了带有点积层的变体,而不是层次化的softmax,并在维基百科转储中训练了模型,我把它分成5克。对于每个单词,我用一个二进制目标标签构造8对作为训练项。我使用带有标签True的4个上下文单词,并选择4个不属于标签0的上下文单词的随机单词。
从直觉上看,该模型应该学习相似上下文中的词的相似表示,因为它以类似的方式修改了这些词的表示,因为它用相似的上下文词独立地对它们进行了优化。因此,这些相似的词并不是直接相似的,而是间接的,因为它们因其相似的语境而受到类似的刺激。
其模式是:
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'])然而,我通过训练这个模型所观察到的是,当我给某个词排序最相似的单词时,我得到的单词出现在这个单词的上下文中,而不是出现在类似上下文中的单词,作为最相似的单词。
例如:
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在我看来,这看起来更像植物背景下出现的单词,而不是出现在与植物相似的上下文中的单词。
计算这些值的函数是:
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)有什么简单的理由吗?
我还有以下其他参数:
word vector size: 300
batch size: 128
vocabulary size: 169161 (distinct lemmas)
training sample count: 27793586 (5-grams, overlapping within sentences)我训练了一个时期的模型,只观察到边际进一步收敛到第二个时期。
发布于 2018-12-14 11:29:03
在Keras中使用嵌入式的一个很好的例子。
如果我正确地解释它,您的实现和“原始word2vec”之间有很大的区别。原始框架不像在您的情况下那样使用一个‘嵌入’vector_size x vector_dim权重矩阵,而是使用两个矩阵(或层):“投影层”将输入映射到维vector_dim的向量,以及“隐藏层”将该向量映射为所有词汇表单词的概率。
隐藏层,或预测层,通常在训练后被丢弃,尽管它可能是有用的。
如果您的代码确实强制这些层共享权重,那么我们也会得到一些有趣的东西,但不同的是,嵌入反映了协同效应--参见这个问题,它专门问如果这两个层是共享的,会发生什么?。
无论哪种方式,对于余弦相似,“植物”应该与“植物”最相似--或者有一些向量完全相同(归一化)。
根据原有的word2vec文件,采用层次化的软件来加快训练速度。因此,如果您不使用它,并有两个重量层,您的版本可能会变得太慢。例如,我可以推荐gensim库,它实现了软-max,并且应该在可管理的时间内在现代笔记本上运行。
发布于 2018-12-07 20:46:51
神经网络不同于其他机器学习技术,因为它们必须通过重复学习。在神经网络中,重复被称为一个时代。在一个时代,每一个实例,在你的情况下,每一个字,是评估和错误是通过层向后应用,并调整权重。权值的变化可以或多或少地基于超参数来进行,但它们一次只移动一点点。
你已经训练了两个时代的word2vec模型。我不知道如何初始化模型的权重,但通常是将它们设置为随机值或设置为零。考虑到你的结果看起来有点随机,我相信这是因为模型还没有开始学习。
为了获得经过良好训练的单词嵌入模型或任何其他神经网络,您可能需要对数百、数千甚至数百万个时代进行训练。这就是为什么预先训练过的单词嵌入模型是如此宝贵,即使它们是免费的。如果你只是想要一个训练有素的嵌入模型,下载它。如果您需要合并某些特定域的用法,您可以进一步培训下载的嵌入。
HTH
https://datascience.stackexchange.com/questions/42287
复制相似问题