Янник Кильхер разобрал классическую статью Google об алгоритме Word2Vec

Yannic Kilcher 25,6 тыс. 31 мин 8 мин 16.07.2020
Главное

В данном материале рассматривается классическая научная работа 2013 года «Distributed Representations of Words and Phrases and their Compositionality», заложившая основу знаменитого алгоритма Word2Vec. Известный ИИ-исследователь и блогер Янник Кильхер (Yannic Kilcher) подробно разбирает текст статьи, анализирует архитектуру Skip-Gram и объясняет инженерные решения, которые произвели революцию в обработке естественного языка (NLP). Автор предлагает взглянуть на этот исторический труд сквозь призму современных достижений в области глубокого обучения.

📜 Исторический контекст и революция Word2Vec 0:00

Статья, авторами которой выступили Томаш Миколов, Илья Суцкевер, Кай Чен, Грег Коррадо и Джеффри Дин, является центральной в серии из трех работ, заложивших фундамент архитектуры Word2Vec. Выпущенное в 2013 году исследование оказало колоссальное влияние на индустрию и оставалось доминирующим подходом в NLP вплоть до появления контекстуализированных языковых моделей, таких как Elmo и BERT. По мнению Янника Кильхера, несмотря на то, что сегодня Word2Vec частично вышел из исследовательской моды, он остается крайне актуальным фундаментом для понимания базовых принципов дистрибутивной семантики.

До появления Word2Vec в обработке текста доминировали n-грамные модели и методы «мешка слов» (Bag-of-Words). В рамках этих подходов предложения разбивались на перекрывающиеся фрагменты, а слова индексировались в гигантских таблицах, где каждому элементу присваивался уникальный идентификатор (например, слово «hello» получало ID 1, а фраза «hello there» — ID 2). Подобные методы страдали от проблемы высокой размерности и не могли эффективно улавливать скрытые семантические связи между понятиями. Переход к распределенным векторным представлениям (distributed representations) стал настоящим прорывом, так как новые векторы на практике уверенно превзошли старые n-грамные подходы.

🧩 Архитектура непрерывного Skip-Gram 1:31

Основой исследования является модель непрерывного Skip-Gram (Continuous Skip-gram), первоначально представленная Миколовым в работе, вышедшей всего за пару месяцев до текущей. Суть распределенного представления слов заключается в отображении каждого слова языка в непрерывный вектор фиксированной размерности. Например, в зависимости от контекста, слово «me» может быть спроецировано в точку с координатами $(0.1, 0.9, 0.3)$, а слово «learn» — в вектор $(-0.5, \dots)$ в том же многомерном пространстве.

📐 Семантика векторного пространства и критика «математики слов»

Главное открытие разработчиков заключалось в том, что при правильном обучении векторы приобретают удивительные свойства. Визуализация первых двух главных компонент (PCA) 1000-мерных векторов Skip-Gram наглядно демонстрирует, что в векторном пространстве формируется четкое направление, характеризующее отношение между страной и ее столицей.

Тем не менее Янник Кильхер обращает внимание на то, что некоторые ранние восторги по поводу «векторной арифметики» впоследствии были пересмотрены и подверглись серьезной аналитической критике. Классический пример гласит:

$$King - Man + Woman = Queen$$

По словам Кильхера, исследователи быстро обнаружили методологический нюанс: при поиске ближайшего соседа для результирующей точки алгоритм обязан исключать исходное слово «King». Если этого не сделать, математические вычисления почти всегда возвращают пользователя к исходной точке, а слово «Queen» оказывается близким лишь потому, что оно в принципе семантически связано с монархией, независимо от точности выполненного вычитания. Тем не менее, вопреки этой критике, векторы Word2Vec доказали свою огромную полезность во множестве прикладных задач.

🔮 Постановка задачи предсказания

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

На примере фразы из текста:

Таким образом конструируются отдельные обучающие примеры, где для одного $X$ формируется сразу несколько пар классификации.

Это превращает обучение в масштабную многоклассовую классификацию. В отличие от известного датасета ImageNet, где классов всего около тысячи, в NLP-задачах количество классов сопоставимо с объемом словаря — от 100 000 слов и выше. Авторы статьи снижают эту нагрузку, отбрасывая все слова, которые встречаются в корпусе менее 5 раз, однако задача все равно остается вычислительно тяжелой.

Формальная целевая функция Skip-Gram направлена на максимизацию средней логарифмической вероятности контекстных слов в пределах окна размера $C$ для каждого слова $t$:

$$\frac{1}{T} \sum_{t=1}^{T} \sum_{-C \le j \le C, j \neq 0} \log P(W_{t+j} | W_t)$$

Для реализации этого принципа вычисляется скалярное произведение вектора целевого слова и параметров классификационного слоя, после чего применяется операция Softmax. Главным бутылочным горлышком этой формулы является константа нормализации, которая требует итерации по всему словарю $W$. При объеме словаря от $10^5$ до $10^7$ элементов расчет градиента становится практически невозможным на стандартном оборудовании.

🌳 Иерархический Softmax как альтернативное решение 11:16

Для обхода вычислительного тупика авторы сначала рассматривают архитектуру иерархического Softmax (Hierarchical Softmax). Вместо оценки миллионов классов за один шаг, все слова распределяются по листьям двоичного дерева. В результате многоклассовая задача преобразуется в последовательность бинарных выборов: для словаря объемом $W$ модели требуется пройти всего около $\log_2(W)$ уровней (например, около 10 уровней для 1000 слов).

На каждом узле дерева модель предсказывает бинарную вероятность движения влево или вправо. Происходит обучение развилок, что существенно снижает нагрузку. Однако Янник Кильхер называет этот подход «отвлекающим маневром» создателей статьи. Иерархический Softmax накладывает жесткое априорное ограничение на распределение классов: предсказания слов в одном поддереве становятся зависимыми и скоррелированными, так как они делят общий путь. Хотя этому методу посвящено много исследований, в финальной версии Word2Vec авторы отдали предпочтение другому подходу.

🎯 Негативное сэмплирование (Negative Sampling) 14:56

В качестве более эффективной альтернативы разработчики предлагают метод негативного сэмплирования (Negative Sampling). Этот алгоритм стал не просто частью Word2Vec, но и краеугольным камнем для современного self-supervised обучения и контрастивного оценивания (contrastive estimation) во множестве других областей искусственного интеллекта.

В основе идеи лежит концепция Noise Contrastive Estimation (NCE), которая утверждает, что хорошая модель должна уметь отличать реальные данные от случайного шума с помощью логистической регрессии. Поскольку модель Skip-Gram сфокусирована исключительно на качестве векторных представлений, авторы упростили строгий математический аппарат NCE до прагматичного негативного сэмплирования. Целевая функция меняется: вместо вычисления Softmax по всему словарю, модель максимизирует скалярное произведение для истинного контекстного слова и минимизирует его для $K$ случайно выбранных «шумовых» слов (негативных примеров).

Янник Кильхер приводит наглядную аналогию: если у нас есть центральное слово «negative» и контекстное «sampling», модель стремится расположить их векторы как можно ближе друг к другу в пространстве. Одновременно из словаря случайно выбирается стороннее слово, например «cake». Задача алгоритма — сделать так, чтобы «cake» оказалось как можно дальше от «negative». Вероятность того, что случайно выбранное слово случайно окажется в реальном контекстном окне, при огромном словаре ничтожно мала. Вместо миллионной классификации задача сводится к простому выбору из $K+1$ вариантов.

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

В self-supervised обучении берется одна картинка, аугментируется двумя разными способами (добавляются шумы), пропускается через пайплайн, и в конце модель заставляют сближать эти представления, одновременно отдаляя их от представлений других картинок. Это абсолютно та же идея, что и в Word2Vec.

🧪 Магические трюки оптимизации: Степень 3/4 и субсэмплирование 22:40

Успех Negative Sampling во многом зависит от двух эвристических приемов, описанных в статье, природа которых, по мнению Кильхера, до сих пор остается не до конца разгаданной тайной для сообщества.

🔮 Загадочная степень 3/4 при выборе шума

Первый вопрос — как именно выбирать шумовые слова для негативных примеров? Существует два экстремума:

Если использовать строго частотное распределение, то слова, которые встречаются в 50 раз чаще других, будут сэмплироваться в 50 раз чаще в качестве негативных примеров. Однако авторы экспериментально обнаружили, что наилучшие результаты на всех задачах (включая языковое моделирование) дает компромиссный вариант — частотное распределение, возведенное в степень $3/4$.

Янник Кильхер называет этот экспоненциальный коэффициент «мистическим». Математически распределение слов подчиняется степенному закону с очень длинным хвостом из редких слов. Если сэмплировать только популярные слова, модель никогда не научится обрабатывать редкие понятия, и ее качество пострадает. Степень $3/4$ искусственно «прижимает» частоту сверхпопулярных слов и слегка приподнимает шансы редких терминов, обеспечивая идеальный баланс.

📉 Субсэмплирование частых слов

Второй трюк касается фильтрации самого обучающего текста. Сверхчастые слова (например, артикли или предлоги) встречаются сотни миллионов раз, но несут минимальную семантическую ценность. Кильхер приводит пример: модели полезно наблюдать совместное появление слов «France» и «Paris», но совместное появление «France» и предлога «the» не дает никаких уникальных знаний, так как «the» соседствует практически с каждым существительным.

Для решения этой проблемы авторы применили формулу субсэмплирования, где вероятность исключения слова из обучающего набора зависит от его частоты $f(W)$ и заданного порога «температуры» $T$:

$$P(W_i) = 1 - \sqrt{\frac{T}{f(W_i)}}$$

Чем чаще слово встречается в корпусе, тем выше вероятность, что оно будет отброшено при формировании обучающей пары. Несмотря на то, что формула была подобрана чисто эвристически, она показала великолепные результаты на практике: процесс обучения кратно ускорился, а точность векторных представлений для редких слов существенно возросла.

📊 Эмпирические результаты и наследие демократизации ИИ 28:15

В разделе практических испытаний модифицированный подход с негативным сэмплированием продемонстрировал значительное превосходство над иерархическим Softmax и NCE в задачах семантического и синтаксического анализа. При этом метод оказался невероятно эффективным с точки зрения затрат процессорного времени. На огромном текстовом корпусе обучение заняло всего 36 минут. В статью также было включено обучение векторов для целых фраз (например, «New York Times»), хотя Кильхер отмечает, что эта часть осталась скорее второстепенным, побочным продуктом исследования.

Подводя итог, Янник Кильхер указывает на специфический характер статьи: она представляет собой наполовину академический, наполовину чисто инженерный документ. Текст местами сложен для восприятия, логика изложения может показаться странной, а мотивы выбора конкретных формул часто не объясняются авторами напрямую. Тем не менее влияние этой работы на индустрию невозможно переоценить.

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

💬 Цитаты

«В self-supervised обучении берется одна картинка, аугментируется двумя разными способами, пропускается через пайплайн, и в конце модель заставляют сближать эти представления, одновременно отдаляя их от представлений других картинок. Это абсолютно та же идея, что и в Word2Vec.»

Янник Кильхер 20:19

«Будучи Google, они могли бы просто выпустить код, работающий в распределенном дата-центре, но они этого не сделали... это действительно был шаг к своего рода демократизации ИИ.»

Янник Кильхер 30:35
👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
Skip-Gram
Архитектура нейросети, которая предсказывает контекстные (окружающие) слова на основе одного центрального слова.
Распределенное представление (Distributed Representation)
Способ кодирования слов в виде непрерывных векторов фиксированной размерности, отражающих семантические свойства.
Негативное сэмплирование (Negative Sampling)
Метод оптимизации, заменяющий полный расчет Softmax по всему словарю на оценку истинного слова против нескольких случайных шумовых примеров.
Субсэмплирование (Subsampling)
Эвристический метод исключения слишком частых слов (например, артиклей или предлогов) из обучающей выборки для повышения точности и скорости.
Иерархический Softmax (Hierarchical Softmax)
Вычислительный прием, преобразующий многоклассовую классификацию в дерево бинарных решений для ускорения расчетов.
📊 Цифры
🗓 Хронология
  1. 2013 год Томаш Миколов и соавторы публикуют серию работ по Word2Vec и открывают исходный код алгоритма.
  2. 2013-2018 гг. Word2Vec доминирует в сфере обработки естественного языка (NLP) в качестве основного метода векторных представлений.
  3. 2018 год и далее На смену статической дистрибутивной семантике Word2Vec приходят контекстуализированные языковые модели вроде Elmo и BERT.
⚖️ Другая сторона
Искусственный интеллект Word2Vec Янник Кильхер Skip-Gram Negative Sampling NLP