непостоянное сходство между предполагаемыми и обученными векторами в doc2vec

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

>>> x=m.docvecs[18638]
>>> g=m.infer_vector("The seven OxyR target sequences analyzed previously and two new sites grxA at position 207 in GenBank entry M13449 and a second Mu phage mom site at position 59 in GenBank entry V01463 were used to generate an individual information weight matrix".split())

Когда я вычислил сходство косинусов, оно было очень низким (ожидалось обратное).

>>> 1 - spatial.distance.cosine(g, x)
0.20437437837633066

Может кто-нибудь сказать мне, если я делаю что-то не так, пожалуйста?

Спасибо


person Nacho    schedule 10.05.2017    source источник


Ответы (2)


Некоторые мысли:

Если ваше начальное обучение выполняло какую-либо дополнительную предварительную обработку текстовых примеров — например, выравнивание регистра — вы также должны сделать это с токенами, переданными в infer_vector().

Значения gensim по умолчанию для необязательных параметров infer_vector(), включая steps=5 и alpha=0.1, являются дикими догадками, которых может быть недостаточно для многих моделей/режимов обучения. Многие сообщают о лучших результатах с гораздо более высоким steps (до сотни) или более низким начальным alpha (больше похоже на тренировочный показатель по умолчанию 0.025).

Когда сама модель возвращает most_similar() результатов, она выполняет все свои вычисления косинусного сходства с нормализованными doc-векторами единичной длины. – то есть те, которые находятся в сгенерированном по мере необходимости массиве model.docvecs.doctag_syn0norm. Однако вектор, возвращаемый infer_vector(), будет просто необработанным, ненормализованным предполагаемым вектором — аналогично необработанным векторам в массиве model.docvecs.doctag_syn0. При вычислении собственных косинусных подобий обязательно учитывайте это. (Я думаю, что spatial.distance.cosine() объясняет это.)

В общем, повторный вывод вектора для того же текста, который был обучен вектору документа во время массового обучения, должен привести к очень похожему (но не идентичному) вектору. Так что, если на самом деле m.docvecs[18638] был для того же самого текста, который вы здесь повторно выводите, расстояние должно быть довольно маленьким. (Это может быть хорошей «проверкой работоспособности» того, имеет ли процесс обучения, а затем последующие выводы, желаемый эффект.) Если это ожидаемое сходство не достигается, вы должны повторно проверить, была ли правильная предварительная обработка во время обучения, что параметры модели вызывают реальное обучение, что вы ссылаетесь на правильный обученный вектор (18638) без каких-либо ошибок, связанных с ошибками, и т.д., и так далее.

person gojomo    schedule 15.05.2017

Вектор абзаца, хранившийся внутри модели (m.docvecs[18638]), был создан на этапе обучения, а затем модель могла измениться, поскольку для обучения использовались другие абзацы. С infer_vector() вы используете конечное состояние модели. Вы можете попытаться свести к минимуму эту разницу, добавив больше эпох в фазу обучения.

Однако я бы порекомендовал вам всегда использовать infer_vector(), чтобы вы могли быть уверены, что все ваши векторы абзацев были созданы с использованием одной и той же версии модели.

person Lenka Vraná    schedule 11.05.2017