Можем ли мы сравнить векторы слов из разных моделей, используя трансферное обучение?

Я хочу обучить две модели word2vec/GLoVe на разных корпусах, а затем сравнить векторы одного слова. Я знаю, что это не имеет смысла, так как разные модели начинаются с разных случайных состояний, но что, если мы используем предварительно обученные векторы слов в качестве отправной точки. Можем ли мы предположить, что две модели будут продолжать строиться на предварительно обученных векторах, включая соответствующие предметно-ориентированные знания, и не перейдут в совершенно разные состояния?

Пытался найти некоторые исследовательские работы, в которых обсуждается эта проблема, но не смог найти.


person Vaibhav Jain    schedule 12.08.2019    source источник


Ответы (1)


Простой запуск ваших моделей с предварительно обученными бекторами устранит некоторую случайность, но с каждой эпохой обучения на ваших новых корпусах:

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

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

Особенно, если слова, которые вам нужно сравнить, являются небольшим подмножеством общего словарного запаса, вы можете рассмотреть пару вещей:

  • объедините корпуса в один учебный корпус, перетасуйте вместе, но для тех слов, которые вам нужно сравнить, замените их токенами, специфичными для корпусов. Например, замените 'sugar' на 'sugar_c1' и 'sugar_c2', оставив подавляющее большинство окружающих слов одними и теми же токенами (и, таким образом, изучите единый вектор по всему корпусу). Затем два варианта токена для «одного и того же слова» будут изучать разные векторы в зависимости от их различных контекстов, которые по-прежнему имеют много одинаковых токенов.

  • используя некоторый «якорный набор» слов, которые, как вы знаете (или уверенно предполагаете), либо означают одно и то же в обоих контекстах, либо должны означать одно и то же, обучите две модели, но изучите преобразование между двумя пространственными на эти направляющие слова. Затем, когда вы примените это преобразование к другим словам, которые не использовались для изучения преобразования, они окажутся на противоположных позициях в пространствах друг друга, возможно достигнув нужного вам сравнения. Это метод, который использовался для перевода с одного языка на другой, и существует вспомогательный класс и пример блокнота, включенный в Библиотека Python gensim.

Могут быть и другие лучшие подходы, это всего лишь две быстрые идеи, которые могут работать без особых изменений в существующих библиотеках. Такой проект, как «HistWords», в котором использовалось обучение словесному вектору, чтобы попытаться отследить меняющиеся изменения. в значении слов с течением времени, могут также появиться идеи о полезных методах.

person gojomo    schedule 13.08.2019