Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#924

Как обучается Word2Vec? Объясните Negative Sampling и иерархический softmax.

Краткий тезис

Word2Vec — это семейство моделей для обучения векторных представлений слов (эмбеддингов) на основе локального контекста. Основные архитектуры: CBOW (предсказание слова по контексту) и Skip-gram (предсказание контекста по слову). Для ускорения обучения используются два ключевых трюка: Negative Sampling (бинарная классификация с шумовыми словами) и Hierarchical Softmax (бинарное дерево классов). Без них полный softmax по всему словарю (сотни тысяч слов) делает обучение непрактичным.

2. Negative Sampling: бинарная классификация (реальное слово vs шум)

Negative Sampling (Mikolov et al., 2013) заменяет полный softmax на задачу бинарной классификации. Вместо предсказания вероятности слова из словаря, модель учится отличать реальные пары (слово, контекст) от шумовых.

Как это работает:

  1. Для каждого обучающего примера (целевое слово ( w ), контекстное слово ( c )) создаём положительный пример: пара ( (w, c) ) с меткой 1.
  2. Генерируем ( k ) отрицательных примеров: пара ( (w, c') ), где ( c' ) — случайное слово из словаря, с меткой 0.
  3. Модель минимизирует логистическую потерю: [ \mathcal{L} = -\log \sigma(v'c^\top v_w) - \sum{i=1}^k \log \sigma(-v'_{c_i}^\top v_w) ] где ( \sigma(x) = 1/(1+e^{-x}) ) — сигмоида.

Выбор шумовых слов:

Слова для отрицательных примеров выбираются из распределения ( P_n(w) \propto U(w)^{3/4} ), где ( U(w) ) — униграммная частота слова. Степень ( 3/4 ) эмпирически подобрана для сглаживания: редкие слова получают больше шансов быть выбранными, чем при равномерном распределении.

Параметр ( k ):

  • Для маленьких датасетов: ( k = 5-20 ).
  • Для больших датасетов: ( k = 2-5 ).
  • Слишком большое ( k ) ведёт к переобучению на шум.

Преимущества:

  • Сложность ( O(k \cdot d) ) вместо ( O(V \cdot d) ), где ( d ) — размерность эмбеддинга.
  • Простота реализации.
  • Хорошо работает для редких слов.

3. Иерархический softmax: бинарное дерево классов

Hierarchical Softmax (Morin & Bengio, 2005) использует бинарное дерево для представления всех слов словаря. Каждое слово — это путь от корня до листа.

Структура:

  • Строится дерево Хаффмана на основе частот слов: частые слова имеют короткие пути, редкие — длинные.
  • Каждый внутренний узел дерева имеет вектор ( v_n ).
  • Вероятность слова ( w ) вычисляется как произведение вероятностей на пути: [ P(w | w_I) = \prod_{j=1}^{L(w)-1} \sigma(n(w, j+1) = [text{left}] \cdot v_{n(w,j)}^\top v_{w_I}) ] где ( L(w) ) — длина пути, ( n(w,j) ) — j-й узел на пути, ( [\cdot] ) — индикатор (1 если левый дочерний, -1 если правый).

Обучение:

  • Градиент обновляет только векторы узлов на пути к целевому слову.
  • Сложность: ( O(\log V \cdot d) ) вместо ( O(V \cdot d) ).

Преимущества:

  • Детерминированное ускорение (не зависит от случайной выборки).
  • Не требует подбора параметра ( k ).
  • Лучше для частых слов (короткие пути).

Недостатки:

  • Сложнее реализовать (построение дерева, обход).
  • Для редких слов путь длинный, что может быть медленнее, чем Negative Sampling.

4. Сравнение скорости и качества

КритерийNegative SamplingHierarchical Softmax
Сложность на шаг( O(k \cdot d) )( O(\log V \cdot d) )
Типичный ( k )5-20—
Качество для редких словЛучше (чаще видят шум)Хуже (длинные пути)
Качество для частых словХуже (много шума)Лучше (короткие пути)
РеализацияПростаяСложная (дерево)
СлучайностьЕсть (выборка шума)Нет (детерминировано)
ПопулярностьСтандарт в gensim, fastTextИспользуется реже

Практические рекомендации:

  • Negative Sampling — выбор по умолчанию для большинства задач (простота, хорошее качество для редких слов).
  • Hierarchical Softmax — когда словарь очень большой (миллионы слов) и важна скорость без подбора гиперпараметров.
  • В оригинальной статье Mikolov et al. (2013) для Skip-gram рекомендуется Negative Sampling, для CBOW — Hierarchical Softmax.

5. Пет-проект для закрепления

Задача: Реализовать Word2Vec с Negative Sampling с нуля на Python (без готовых библиотек) и обучить на корпусе текстов (например, новости или википедия).

Инструменты:

  • Python 3.8+
  • NumPy для матричных операций
  • NLTK или pymorphy2 для токенизации
  • Matplotlib для визуализации эмбеддингов (t-SNE)

Шаги:

  1. Подготовка данных: загрузить корпус (например, 100k предложений из русской википедии), токенизировать, построить словарь (удалить слова с частотой < 5).
  2. Инициализация: создать матрицы ( W ) (входные эмбеддинги) и ( W' ) (выходные эмбеддинги) размером ( V \times d ) (например, ( d=100 )), инициализировать случайно.
  3. Генерация контекстов: для каждого слова в предложении собрать окно ( m=5 ) (слева и справа).
  4. Negative Sampling: для каждой пары (целевое слово, контекст) сгенерировать ( k=5 ) шумовых слов из распределения ( P_n(w) \propto U(w)^{3/4} ).
  5. Обучение: для каждого батча (batch_size=128) вычислить градиенты и обновить ( W ) и ( W' ) через SGD с learning_rate=0.025.
  6. Валидация: проверить, что эмбеддинги слов "король" - "мужчина" + "женщина" ≈ "королева" (аналогии).
  7. Визуализация: применить t-SNE к 1000 наиболее частых слов и раскрасить по частям речи.

Ожидаемый результат:

  • Работающая модель Word2Vec, которая даёт осмысленные эмбеддинги (близкие слова имеют похожие векторы).
  • Понимание, как Negative Sampling ускоряет обучение (сравнить время с полным softmax на маленьком словаре).
  • Визуализация кластеров слов (существительные, глаголы, прилагательные).

Связь с другими вопросами

ВопросТема
911Как устроены эмбеддинги слов? GloVe, FastText, BERT

Навигация

  • Предыдущий: 923
  • Следующий: 925
  • Индекс: 00. Индекс разборов