Я использую реализацию, найденную в 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??
Слова взяты из словаря размера 10000 из http://mattmahoney.net/dc/text8.zip (текст на английском языке)
Что я замечаю, так это то, что некоторые слова несколько выучены во времени, например, контекст для чисел и статей легко угадывается, однако потеря довольно сильно застряла примерно на 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))
Я что-то упускаю из сети? То, что не написано, реализовано в точности как ссылка выше