w2vxx
w2vxx — набор утилит для построения векторных представлений слов какого-либо естественного языка. Фактически это word2vec, реализованный на C++.
w2vxx создан с целью повысить модульность и упростить код оригинального word2vec. Надеюсь, что w2vxx позволит сэкономить усилия экспериментаторов и разработчиков, желающих усовершенствовать алгоритмы, лежащие в основе word2vec.
Быстрый старт
В репозитории размещены демонстрационные скрипты для Linux и Windows, обеспечивающие:
- сборку утилит из исходных кодов,
- загрузку (англоязычного) обучающего множества,
- построение словаря и векторной модели,
- запуск утилиты, которая для заданного слова отыскивает в модели близкие по значению слова.
Для сборки утилит требуется компилятор с поддержкой C++17. Сборка протестирована под Linux с компилятором gcc v7.4.0 и под Windows с компилятором от Visual Studio 2017 v15.9.14 (cl.exe версии 19.16).
Запуск под Linux | Запуск под Windows |
---|---|
Запустите консоль. Перейдите в директорию, в которой хотите развернуть программное обеспечение. | Запустите «Командную строку разработчика для VS 2017» (это обеспечит настройку окружения для сборки утилит). Перейдите в папку, в которой хотите развернуть программное обеспечение. |
git clone https://github.com/w2vxx/w2vxx.git cd w2vxx |
|
./demo-linux.sh | demo-windows.cmd |
При успешных сборке и обучении работа скрипта завершится вызовом утилиты, отыскивающей слова с близким значением. Чтобы удостовериться в работоспособности утилит, попробуйте ввести распространённые английские слова — phone, car, king. Отмечу, что демонстрационный скрипт порождает неоптимальную векторную модель, чтобы сократить время обучения. |
Утилиты и их параметры
В состав w2vxx входит четыре утилиты: build_dict, cbow, skip-gram и distance. В отличие от word2vec, построение словаря здесь выделено в отдельную подзадачу (build_dict), а различные модели обучения — cbow и skip-gram — реализованы в одноимённых утилитах.
build_dict
Решает задачу построения словаря по обучающему множеству. Параметры утилиты:
-train | имя файла, содержащего обучающее множество; |
-min-count | частотный порог. Слова, частота которых (в обучающем множестве) ниже порога, не попадают в словарь; |
-save-vocab | имя файла, куда будет сохранён словарь. |
cbow
Осуществляет построение векторных представлений слов языка в соответствии с моделью обучения Continuous Bag-of-Words (cbow). Параметры утилиты:
-train | имя файла, содержащего обучающее множество; |
-words-vocab | имя файла, содержащего словарь, построенный утилитой build_dict; |
-output | имя файла, куда будут сохранены векторные представления слов. Файл имеет бинарный формат, полностью совместимый с word2vec; |
-size | размерность результирующих векторов для представления слов (размерность эмбеддинга); |
-window | размер окна, задающего контекст слова; |
-optimization | метод оптимизации вычислений. Значение hs соответствует hierarchical softmax, значение ns соответствует negative sampling. В отличие от оригинального word2vec, можно использовать только один из методов; |
-negative | (для метода negative sampling) количество отрицательных примеров, противопоставляемых каждому положительному примеру. Иными словами, количество слов, выбираемых из noise distribution; |
-iter | количество эпох обучения; |
-sample | коэффициент прореживания. Обеспечивает снижение в обучающем множестве доли частотных слов. По умолчанию 1e-3; |
-alpha | начальное значение скорости обучения; |
-threads | количество потоков управления, параллельно выполняющих обучение модели. |
skip-gram
Осуществляет построение векторных представлений слов языка в соответствии с моделью обучения Skip-gram. Набор параметров утилиты совпадает с параметрами для cbow.
distance
Интерактивная утилита для поиска слов, характеризующихся близостью значений. При построении моделей с малым контекстным окном в первую очередь проявляется категориальная близость (синонимы, антонимы и согипонимы). Если при обучении модели окно было большим, то тематическая и ассоциативная близость также становится значимой.
Для каждого введённого пользователем слова утилита находит в векторной модели близкие по значению слова, а также показывает количественную меру близости (косинусная мера). Параметры утилиты (задаются порядком следования):
имя файла с векторными представлениями слов, построенными утилитами cbow или skip-gram; |
количество выводимых на экран слов с близкими значениями. |
Внутреннее устройство
Код утилит cbow и skip-gram организован следующим образом.
Программная логика, отвечающая за работу со словарём, инкапсулирована в классах OriginalWord2VecVocabulary
и CustomVocabulary
.
Интерфейсом к обучающему множеству служат классы OriginalWord2VecLearningExampleProvider
и CustomLearningExampleProvider
. Их задача — предоставить обучающей логике очередной обучающий пример в виде структуры, содержащей слово и его контекст.
struct LearningExample
{
size_t word; // индекс слова в словаре
std::vector<size_t> context; // индексы слов контекста
};
За создание и обучение нейросети отвечают классы CustomTrainer
, CbowTrainer_Mikolov
и SgTrainer_Mikolov
. Точкой входа для потоков (thread) служит метод CustomTrainer::train_entry_point
. Обработка обучающего примера нейросетью выполняется в методах learning_model
(содержание этого метода зависит от модели обучения: cbow или skip-gram).