Doc2vec Gensim: вложения слов не обновляются каждую эпоху

Я использую модель Gensim Doc2vec для обучения векторов документов. Я распечатал изображения для слова «хорошо», но я нашел каждую эпоху, я обнаружил, что не обновляется! Пока я распечатывал изображения для документа с идентификатором «3», каждая эпоха разная!

Мои коды ниже, не знаю, что происходит.

model = gensim.models.Doc2Vec(dm = 0, alpha=0.1, size= 20, min_alpha=0.025)

model.build_vocab(documents)

print ('Building model....',(time4-time3))
for epoch in range(10):
    model.train(documents)

    print('Now training epoch %s' % epoch)
    print(model['good'])
    print(model.docvecs[str(3)])

person Irene Li    schedule 04.08.2016    source источник


Ответы (3)


Чистая модель PV-DBOW (dm=0) вообще не предполагает использования или обучения векторов слов. (Это просто артефакт общего кода с Word2Vec, который они вообще выделяются и инициализируются случайным образом.)

Если вы хотите, чтобы слова-векторы обучались чередующимся образом, вы должны использовать нестандартный параметр dbow_words=1. (Или переключитесь в режим PV-DM, dm=1, где по сути задействованы векторы-слова.)

person gojomo    schedule 27.09.2016

Это неправильный способ проверять представления после каждого обновления. Gensim doc2vec использует параметр iter для определения количества эпох (см. документы) , значение default которого равно 5.

По сути, что происходит в следующем цикле:

for epoch in range(10):
    model.train(documents)

вы тренируете свою модель 10 раз с нуля до 5 эпох.

Я не думаю, что Gensim в настоящее время позволяет проверять представления после каждой эпохи. Один грубый способ сделать это:

model.train(documents, iter=1)
print('Now training epoch %s' % epoch)
print(model['good'])
print(model.docvecs[str(3)])

model.train(documents, iter=2)
print('Now training epoch %s' % epoch)
print(model['good'])
print(model.docvecs[str(3)])
person kampta    schedule 11.08.2016

в каждую эпоху gensim сначала использует случайное значение для вектора слова, а затем начинает обучать модель. в doc2vec (или word2vec) не должны все конечные векторы слова для слова (выражение «хорошо») быть одинаковыми, но похожие слова являются аналогичными векторами слов. например в одну эпоху:

model['good'] = [0.22 0.52 0.36]
model['better'] = [0.24 0.50 0.39]

и в другую эпоху:

model['good'] = [0.58 0.96 0.24]
model['better'] = [0.59 0.90 0.21]
person Majid    schedule 15.08.2016
comment
Я не понял, что вы намекаете. (1) В каждую эпоху векторы слов начинаются не случайно, а с предыдущего значения вектора слов. Только в первую эпоху векторы слов начинаются случайным образом. - person kampta; 15.08.2016
comment
каждый раз, когда вы вызываете функцию поезда, вектор слов получает случайное значение для векторов слов. в другом случае функция word train запускает обучающую модель с самого начала, а вектор слова получает случайное значение. - person Majid; 16.08.2016
comment
Это правильно. train запускает тренировочную модель с самого начала. Поскольку значение по умолчанию для параметра seed функции train установлено равным 0, каждый раз, когда вы начинаете обучение, векторы слов будут инициализироваться одинаковыми случайными значениями, а после n epochs вы получите те же векторы (по сути, эксперименты воспроизводимы) - person kampta; 16.08.2016
comment
Векторы слов инициализируются случайным образом только во время build_vocab(), а именно finalize_vocab() и reset_weights(). Дальнейшие вызовы train() не сбрасывают и не повторно инициализируют векторы. (Хотя вы можете вызывать train() несколько раз, обычно это ошибка - лучше просто использовать iter и позволить классу обрабатывать несколько проходов и собственно альфа-распад.) - person gojomo; 19.01.2017