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

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

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

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

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


person Masum Hasan    schedule 13.07.2018    source источник


Ответы (1)


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

В gensim есть класс TranslationMatrix, который реализует метод изучения-проекции-между-двумя-пробелами, который использовался для машинного перевода между естественными языками в одной из первых статей по 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 работает.)

person gojomo    schedule 13.07.2018