Как doc2vec.infer_vector сочетается между словами?

Я обучил модель doc2vec, используя train (..) с настройками по умолчанию. Это сработало, но теперь мне интересно, как infer_vector объединяет входные слова, это просто среднее значение отдельных векторов слов?

model.random.seed(0)
model.infer_vector(['cat', 'hat'])
model.random.seed(0)
model.infer_vector(['cat'])
model.infer_vector(['hat']) #doesn't average up to the ['cat', 'hat'] vector
model.random.seed(0)
model.infer_vector(['hat'])
model.infer_vector(['cat']) #doesn't average up to the ['cat', 'hat'] vector

Они не складываются, поэтому мне интересно, что я неправильно понимаю.

1 ответ

Решение

infer_vector() не объединяет векторы для заданных токенов, а в некоторых режимах вообще не учитывает векторы этих токенов.

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

Используя обучающий процесс, он пытается найти хороший вектор для X. То есть он начинается со случайного вектора (как это было для всех тегов в исходном обучении), а затем видит, насколько хорошо этот вектор при вводе модели предсказывает слова текста (проверяя предсказания нейронной сети модели для ввода X). Затем с помощью инкрементного градиентного спуска это делает вектор-кандидат для X лучше и лучше при предсказании слов текста.

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

Обратите внимание, что:

  • крошечные примеры (например, одно или несколько слов) вряд ли дадут очень значимые результаты - это угловые случаи с острыми краями, и существенная ценность этих видов плотных вложенных представлений обычно возникает из-за предельного баланса многих словесных влияний
  • это, вероятно, поможет сделать гораздо больше циклов обучения-вывода, чем infer_vector() дефолт steps=5 - некоторые сообщили о десятках или сотнях steps работать лучше для них, и это может быть особенно ценно использовать больше steps с короткими текстами
  • это также может помочь использовать стартовый alpha для вывода больше похоже на то, что используется в массовом обучении (alpha=0.025), а не infer_vector() дефолт (alpha=0.1)
Другие вопросы по тегам