Почему Doc2vec дает 2 разных вектора для одного и того же текста - PullRequest
0 голосов
/ 16 мая 2018

Я использую Doc2vec, чтобы получить векторы из слов.Пожалуйста, смотрите мой код ниже:

from gensim.models.doc2vec import TaggedDocument
f = open('test.txt','r')

trainings = [TaggedDocument(words = data.strip().split(","),tags = [i]) for i,data in enumerate(f)


model = Doc2Vec(vector_size=5,  epochs=55, seed = 1, dm_concat=1)

model.build_vocab(trainings)
model.train(trainings, total_examples=model.corpus_count, epochs=model.epochs)

model.save("doc2vec.model")

model = Doc2Vec.load('doc2vec.model')
for i in range(len(model.docvecs)):
    print(i,model.docvecs[i])

У меня есть файл test.txt, в котором его содержимое состоит из 2 строк, и содержимое этих 2 строк такое же (они "a"), которое я обучил с помощью doc2vec и получилмодель, но проблема в том, что содержимое двух строк одинаково, doc2vec дал мне 2 разных вектора.

0 [ 0.02730868  0.00393569 -0.08150548 -0.04009786 -0.01400406]
1 [ 0.03916578 -0.06423566 -0.05350181 -0.00726833 -0.08292392]

Я не знаю, почему это произошло.Я думал, что эти векторы будут одинаковыми.Вы можете это объяснить?И если я хочу сделать одинаковые векторы для одних и тех же слов, что мне делать в этом случае?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

@ Максим дает правильный ответ о присущей ему случайности, используемой алгоритмом, но у вас есть дополнительные проблемы с этим примером:

  • Doc2Vec не дает значимых результатов на крошечных,примеры размером с игрушку.Векторы приобретают хорошие относительные значения, только когда они являются результатом большого, разнообразного набора контрастных обучающих контекстов.Ваш двухстрочный набор данных, проходящий через 55 учебных циклов, на самом деле просто предоставляет модели 1 уникальный текст, 110 раз.

  • Даже если вы разумно уменьшили размер вектора до крошечного числа (5), чтобы отразить крошечные данные, это все еще слишком большая модель для всего 2 примеров, склонная кполное «переоснащение».Модель может случайным образом назначить строке № 1 вектор [1,0, 0,0, 0,0, 0,0, 0,0] и строку № 2 [0,0, 1,0, 0,0, 0,0, 0,0].И затем, через все его обучение, только обновляют свои внутренние веса (никогда не сами векторы документов), но все же достигают внутренних предсказаний слов так же хорошо или лучше, чем в реальном сценарии, где все постепенно обновляется, потому что есть достаточно свободногоукажите в модели, что никогда не будет существенной конкуренции / сжатия / компромисса, заставляющей два предложения сходиться там, где они похожи.(Существует много решений, и большинство из них не требуют какого-либо полезного обобщенного «обучения». Только обучение создает большие объемы данных, которые вынуждают модель перетягивать канат между моделированием нескольких примеров, а также возможными компромиссами.)

  • dm_concat=1 - это экспериментальный режим не по умолчанию, который требует еще больше данных для обучения и приводит к более крупным / более медленным моделям.Избегайте его использования, если вы не уверены - и можете доказать с помощью результатов - что это поможет вам.

Даже когда они исправлены, полный детерминизм не является автоматическим в Doc2Vec- и вы не должны пытаться устранить это.(Небольшое дрожание между прогонами является полезным сигналом / напоминанием о существенных отклонениях в этом алгоритме - и если ваша тренировка / оценка остается стабильной при таких малых отклонениях, это дополнительный показатель его функциональности.)

0 голосов
/ 16 мая 2018

В алгоритме Doc2Vec (и Word2Vec) заложена случайность, например, начальные векторы уже случайны и различаются даже для одинаковых предложений.Вы можете прокомментировать вызов model.train и убедиться в этом сами.

Подробности, если вас интересует: векторы инициализируются сразу после построения вокаба: в вашем случае это вызов model.build_vocab(...), который вturn вызывает model.reset_doc_weights() метод (см. исходный код на gensim/models/doc2vec.py), который инициализирует все векторы случайным образом, независимо от того, какие это предложения.Если в этот момент вы сбрасываете инициализацию и назначаете равные векторы, они больше не должны расходиться.

Теоретически, если вы тренируете одинаковые предложения достаточно долго , алгоритм должен сходиться кодин и тот же вектор даже с разной инициализацией.Но практически этого не произойдет, и я не думаю, что вы должны беспокоиться об этом.

...