Keras Word2Vec实现

时间:2018-06-26 09:47:00

标签: python keras word2vec

我正在使用http://adventuresinmachinelearning.com/word2vec-keras-tutorial/中的实现来学习有关word2Vec的知识。我不明白的是为什么损失函数没有减少?

Iteration 119200, loss=0.7305528521537781
Iteration 119300, loss=0.6254740953445435
Iteration 119400, loss=0.8255964517593384
Iteration 119500, loss=0.7267132997512817
Iteration 119600, loss=0.7213149666786194
Iteration 119700, loss=0.6156617999076843
Iteration 119800, loss=0.11473365128040314
Iteration 119900, loss=0.6617216467857361

据我所知,网络是用于此任务的标准网络:

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') #adam??

单词来自http://mattmahoney.net/dc/text8.zip(英语)中大小为10000的词汇

我注意到的是,有些单词在时间上有所了解,例如数字和文章的上下文很容易猜到,但是损失从一开始就一直停留在0.7左右,并且随着迭代的进行,它只会随机波动。

训练部分是这样制作的(由于缺少标准的拟合方法,我感到很奇怪)

arr_1 = np.zeros((1,))
arr_2 = np.zeros((1,))
arr_3 = np.zeros((1,))
for cnt in range(epochs):
    idx = np.random.randint(0, len(labels)-1)
    arr_1[0,] = word_target[idx]
    arr_2[0,] = word_context[idx]
    arr_3[0,] = labels[idx]
    loss = model.train_on_batch([arr_1, arr_2], arr_3)
    if cnt % 100 == 0:
        print("Iteration {}, loss={}".format(cnt, loss))

我是否缺少有关此类网络的重要信息?未写的内容的实现与上面的链接完全相同

1 个答案:

答案 0 :(得分:3)

我遵循相同的教程,算法再次经过样本后,损失下降。注意,仅针对当前目标词和上下文词对计算损失函数。在本教程的代码示例中,一个时期只是一个示例,因此,要达到损失减少的程度,您将需要比目标词和上下文词更多的数目。

我用以下代码实现了培训部分

model.fit([word_target, word_context], labels, epochs=5)

请注意,这可能需要很长时间,具体取决于语料库的大小。 train_on_batch功能使您可以更好地控制培训,并且可以更改批次大小或选择在培训的每个步骤中选择的样品。