Как повернуть word2vec на другое word2vec?

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

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

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

Заранее спасибо.

1 ответ

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

Есть класс под названием TranslationMatrix в gensim, который реализует метод обучения-проекции-между-двумя пространствами, который использовался для машинного перевода между естественными языками в одной из ранних статей word2vec. Это требует, чтобы у вас было несколько слов, которые вы укажете, должны иметь эквивалентные векторы - якорь / набор ссылок - и тогда другие слова смогут найти свои позиции относительно них. Демонстрация его использования в блокнотах документации gensim:

https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/translation_matrix.ipynb

Но есть и другие методы, которые вы также можете рассмотреть:

  • вместо этого преобразуйте и объедините учебные корпуса, чтобы оба слова оставались одинаковыми во всех корпусах (например, очень часто встречающиеся слова), но отличали другие интересующие слова в каждом сегменте. Например, вы можете оставить слова типа "горячий" и "холодный" без изменений, но заменить слова, такие как "тамале" или "лыжи", версиями, специфичными для подкорпуса, такими как "тамале (A)", "тамале (B)", " лыжи (А) "," лыжи (Б) ". Перемешайте все данные вместе для обучения в одном сеансе, затем проверьте расстояния / направления между "тамале (A)" и "тамале (B)" - так как каждый из них был обучен только их соответствующими подмножествами данных. (По-прежнему важно иметь много "якорных" слов, разделенных между различными наборами, чтобы обеспечить корреляцию между этими словами и, таким образом, общее влияние / значение для меняющихся слов.)

  • создать модель для всех данных, с одним вектором на слово. Сохранить эту модель в сторону. Затем перезагрузите его и попробуйте заново обучить его, используя только подмножества целых данных. Проверьте, сколько слов движется, когда тренируется только на сегментах. (Это может снова помочь сравнимости удерживать некоторые выдающиеся ключевые слова постоянными. В экспериментальном свойстве model.trainablesс окончанием имени _lockf, что позволяет масштабировать обновления для каждого слова. Если вы установите его значение 0.0 вместо значения по умолчанию 1.0 для определенных слотов слов, эти слова не могут быть обновлены в дальнейшем. Поэтому после повторной загрузки модели вы можете "заморозить" свои ссылочные слова, установив их _lockf значения до 0.0, так что только вторичное обучение обновляет только другие слова, и они по-прежнему должны иметь координаты, которые имеют смысл в отношении неподвижных ключевых слов. Прочитайте исходный код, чтобы лучше понять, как _lockf работает.)

Другие вопросы по тегам