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

Компилятор будет генерировать код для каждого экземпляра шаблона при использовании шаблона во время этапа компиляции. В процессе компиляции и компоновки файлы .cpp преобразуются в чистый объектный или машинный код, который в них содержит ссылки или неопределенные символы, поскольку файлы .h, которые включены в ваш main.cpp, не имеют реализации YET. Они готовы быть связаны с другим объектным файлом, который определяет реализацию для вашего шаблона, и, следовательно, у вас есть полный исполняемый файл a.out. Однако, поскольку шаблоны необходимо обрабатывать на этапе компиляции, чтобы сгенерировать код для каждого экземпляра шаблона, который вы делаете в своей основной программе, ссылка не поможет, поскольку компиляция main.cpp в main.o, а затем компиляция вашего шаблона .cpp в template.o, а затем ссылка не будет достигать цели шаблонов, потому что я связываю различные экземпляры шаблонов с одной и той же реализацией шаблона! И шаблоны должны делать обратное, т. Е. Иметь одну реализацию, но допускать много доступных экземпляров посредством использования одного класса.

Значение typename T get заменяется во время этапа компиляции, а не на этапе связывания, поэтому, если я попытаюсь для компиляции шаблона без замены T в качестве конкретного типа значения, чтобы он не работал, потому что это определение шаблонов - это процесс времени компиляции, а мета-программирование btw - все об использовании этого определения.

1
задан Masum Hasan 13 July 2018 в 17:35
поделиться

1 ответ

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

В gensim есть класс, называемый TranslationMatrix, который реализует метод learn-a-projection-between-two-spaces, используемый для машинного перевода между естественными языками в одной из ранних статей word2vec. Для этого требуется, чтобы некоторые слова, которые вы указываете, должны иметь эквивалентные векторы - набор привязки / набора ссылок, а затем другие слова найдут свои позиции по отношению к ним. Существует демо-версия его использования в ноутбуках документации gensim:

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

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

  • transform & amp; вместо этого объединяют учебные корпуса, чтобы сохранить некоторые слова, которые одинаковы во всех корпусах (например, очень частые слова), но делают разные интересные слова для каждого сегмента. Например, вы можете оставлять слова «горячие» и «холодные» неизменными, но вместо слов «тамале» или «кататься на лыжах» следует использовать такие версии подкорпуса, как «tamale (A)», «tamale (B)», катание на лыжах (A) "," катание на лыжах (B) ". Перемешайте все данные вместе для обучения в один сеанс, затем проверьте расстояния / направления между «tamale (A)» и «tamale (B)», поскольку каждый из них обучается только их соответствующим подмножествам данных. (По-прежнему важно иметь много «якорных» слов, разделяемых между разными наборами, чтобы заставить корреляцию этих слов и, следовательно, общее влияние / значение для переменных слов.)
  • создать модель для все данные, с одним вектором на слово. Сохраните эту модель в стороне. Затем перезагрузите его и попробуйте переучивать его только подмножествами всех данных. Проверьте, сколько слов движется, когда тренируется только по сегментам. (Это может снова помочь сопоставимости держать определенные заметные якорные слова постоянными. В model.trainables есть экспериментальное свойство с окончанием имени _lockf, которое позволяет масштабировать обновления для каждого слова. Если вы установите его значения равным 0.0, вместо определенных по умолчанию 1.0 для определенных слотов слов эти слова не могут быть дополнительно обновлены. Поэтому после повторной загрузки модели вы можете «заморозить» ваши опорные слова, установив их значения _lockf равными 0.0, чтобы только другие слова обновляются по второстепенному обучению, и , они все еще связаны с координатами, которые имеют смысл в отношении неподвижных якорных слов. Читайте исходный код , чтобы лучше понять как работает _lockf.)
0
ответ дан gojomo 17 August 2018 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: