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

Что такое Word2Vec (CBOW и Skip-gram) и fastText? Чем отличаются от контекстуальных эмбеддингов типа BERT?

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

Word2Vec и fastText — классические методы получения статичных (контекстно-независимых) эмбеддингов слов, основанные на дистрибутивной гипотезе. Word2Vec реализует две архитектуры: CBOW (предсказание слова по контексту) и Skip-gram (предсказание контекста по слову). FastText расширяет Word2Vec, используя внутреннюю структуру слова (n-граммы символов), что позволяет обрабатывать неизвестные слова (OOV). В отличие от них, BERT генерирует контекстуальные эмбеддинги, зависящие от окружения слова, за счёт глубокого двунаправленного Transformer-кодировщика. Это принципиальное различие: статичные эмбеддинги дают одно векторное представление на слово, а контекстуальные — разное для каждого употребления.

2. Word2Vec Skip-gram: слово → контекст

Skip-gram — обратная задача: по одному слову предсказать его контекстные слова (обычно каждое контекстное слово предсказывается независимо, с negative sampling для ускорения). Входом служит вектор целевого слова, через скрытый слой и softmax для каждого контекстного слова. Пример: слово “ловит” → {кошка, мышь}.

  • Преимущества: лучше работает с редкими словами, даёт более качественные векторы для небольших корпусов; учитывает семантические и синтаксические отношения.
  • Недостатки: медленнее обучение, чувствителен к гиперпараметрам (размер окна, частота отсечения).
СвойствоCBOWSkip-gram
Задачаконтекст → словослово → контекст
Скорость обучениябыстреемедленнее
Редкие словахужелучше
Пример синонимовсреднее качествовысокое качество

Типичная реализация на Python с Gensim:

from gensim.models import Word2Vec
sentences = [["кот", "ловит", "мышь"], ["собака", "гоняет", "кошку"]]
model = Word2Vec(sentences, vector_size=100, window=5, sg=0)  # sg=0 — CBOW, sg=1 — Skip-gram

3. FastText: n-gram символы → работа с OOV

FastText (Facebook Research) — модификация Word2Vec, в которой каждое слово представляется суммой эмбеддингов его символьных n-грамм (обычно n=3…6). Например, для слова “кошка”: #ко, кош, ошк, шка, ка#. Это позволяет создавать векторы для любых последовательностей символов, в том числе не встречавшихся в обучении.

  • OOV-решение: слово разбивается на n-граммы, и его эмбеддинг вычисляется на лету из обученных n-граммных векторов.
  • Морфология: FastText лучше улавливает морфологические признаки (суффиксы, приставки), что критично для флективных языков, в т.ч. русского.
  • Архитектура: точно такие же CBOW или Skip-gram, но вход — эмбеддинги n-грамм, суммированные с корневым эмбеддингом слова (если он есть).

Пример использования (упрощённо):

from gensim.models.fasttext import FastText
model = FastText(sentences, vector_size=100, window=5, min_n=3, max_n=6)
# эмбеддинг незнакомого "котёнок" будет вычислен
vector = model.wv["котёнок"]  # не ломается
ХарактеристикаWord2VecFastText
Единица представлениясловослово + символьные n-граммы
OOV❌ нет вектора✅ вычисляется
Памятьменьшебольше
Языковая поддержкаплохо для аналитическиххорошо для флективных

4. Сравнение с BERT: статичные vs контекстуальные

BERT — языковая модель на базе Transformer, обученная с MLM и NSP. Эмбеддинги каждого слова зависят от всего окружающего текста (контекстуальные). Одно слово может иметь разные векторы в разных предложениях (например, “ключ” — музыкальный, гаечный, от замка). В отличие от статичных методов (Word2Vec, fastText, GloVe), BERT не выдаёт фиксированный вектор для слова, а порождает представление токена в конкретном предложении.

ПараметрWord2Vec / fastTextBERT
Тип эмбеддингастатичный, один вектор на словоконтекстуальный, разный на каждое употребление
Зависимость от контекстатолько фиксированное окнополный двунаправленный контекст
Архитектурапростая нейросеть (один скрытый слой)глубокий Transformer (12-24 слоя)
Размерность100–300768–1024 (base/large)
Обучениена задачах предсказания соседейMLM + NSP на огромных корпусах
Применимостьбыстрые эмбеддинги, baselinefine-tuning для downstream-задач

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

Задача: Сравнить качество статичных эмбеддингов (Word2Vec Skip-gram) и контекстуальных (BERT) на задаче определения семантической близости пар русскоязычных предложений из датасета RuParus (русский парафразовый корпус).

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

  • Python 3.9+, Gensim, Transformers, PyTorch
  • Датасет: RuParus (можно с Hugging Face: ru_parus).
  • Векторизация: для Word2Vec — средний вектор слов предложения; для BERT — средний по токенам последнего слоя (пайплайн SentenceTransformers).

Шаги:

  1. Загрузить RuParus: пары предложений с меткой is_paraphrase.
  2. Обучить свой Word2Vec на русском корпусе НКРЯ (или взять предобученный RusVectores).
  3. Для каждого предложения вычислить эмбеддинг:
    • Word2Vec: усреднение векторов слов (токенизация через NLTK/Spacy).
    • BERT: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 (готовый для русских предложений).
  4. Посчитать косинусное сходство между эмбеддингами предложений.
  5. Оценить качество по ROC-AUC или accuracy на бинарной задаче определения парафраза (порог — поиск оптимального).
  6. Вывод: насколько контекстуальные эмбеддинги превосходят статичные на русском языке для semantической близости.

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

  • Таблица метрик (AUC, F1) для обеих моделей.
  • Понимание, что BERT даёт прирост 10–20% по сравнению с Word2Vec благодаря контексту.
  • Зафиксировать случаи, где статичный эмбеддинг ошибается (омонимы, перестановка слов), а BERT — нет.

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

ВопросТема
15: Что такое эмбеддинги слов и зачем они нужны?Основы эмбеддингов, их применение
51: Как работают Transformer-модели?Архитектура Transformer, BERT как частный случай

Навигация

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