Что такое 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 для каждого контекстного слова. Пример: слово “ловит” → {кошка, мышь}.
- Преимущества: лучше работает с редкими словами, даёт более качественные векторы для небольших корпусов; учитывает семантические и синтаксические отношения.
- Недостатки: медленнее обучение, чувствителен к гиперпараметрам (размер окна, частота отсечения).
| Свойство | CBOW | Skip-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["котёнок"] # не ломается
| Характеристика | Word2Vec | FastText |
|---|---|---|
| Единица представления | слово | слово + символьные n-граммы |
| OOV | ❌ нет вектора | ✅ вычисляется |
| Память | меньше | больше |
| Языковая поддержка | плохо для аналитических | хорошо для флективных |
4. Сравнение с BERT: статичные vs контекстуальные
BERT — языковая модель на базе Transformer, обученная с MLM и NSP. Эмбеддинги каждого слова зависят от всего окружающего текста (контекстуальные). Одно слово может иметь разные векторы в разных предложениях (например, “ключ” — музыкальный, гаечный, от замка). В отличие от статичных методов (Word2Vec, fastText, GloVe), BERT не выдаёт фиксированный вектор для слова, а порождает представление токена в конкретном предложении.
| Параметр | Word2Vec / fastText | BERT |
|---|---|---|
| Тип эмбеддинга | статичный, один вектор на слово | контекстуальный, разный на каждое употребление |
| Зависимость от контекста | только фиксированное окно | полный двунаправленный контекст |
| Архитектура | простая нейросеть (один скрытый слой) | глубокий Transformer (12-24 слоя) |
| Размерность | 100–300 | 768–1024 (base/large) |
| Обучение | на задачах предсказания соседей | MLM + NSP на огромных корпусах |
| Применимость | быстрые эмбеддинги, baseline | fine-tuning для downstream-задач |
5. Пет-проект для закрепления
Задача: Сравнить качество статичных эмбеддингов (Word2Vec Skip-gram) и контекстуальных (BERT) на задаче определения семантической близости пар русскоязычных предложений из датасета RuParus (русский парафразовый корпус).
Инструменты:
- Python 3.9+, Gensim, Transformers, PyTorch
- Датасет: RuParus (можно с Hugging Face:
ru_parus). - Векторизация: для Word2Vec — средний вектор слов предложения; для BERT — средний по токенам последнего слоя (пайплайн SentenceTransformers).
Шаги:
- Загрузить RuParus: пары предложений с меткой
is_paraphrase. - Обучить свой Word2Vec на русском корпусе НКРЯ (или взять предобученный RusVectores).
- Для каждого предложения вычислить эмбеддинг:
- Посчитать косинусное сходство между эмбеддингами предложений.
- Оценить качество по ROC-AUC или accuracy на бинарной задаче определения парафраза (порог — поиск оптимального).
- Вывод: насколько контекстуальные эмбеддинги превосходят статичные на русском языке для semantической близости.
Ожидаемый результат:
- Таблица метрик (AUC, F1) для обеих моделей.
- Понимание, что BERT даёт прирост 10–20% по сравнению с Word2Vec благодаря контексту.
- Зафиксировать случаи, где статичный эмбеддинг ошибается (омонимы, перестановка слов), а BERT — нет.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 15: Что такое эмбеддинги слов и зачем они нужны? | Основы эмбеддингов, их применение |
| 51: Как работают Transformer-модели? | Архитектура Transformer, BERT как частный случай |
Навигация
- Предыдущий: 910
- Следующий: 912
- Индекс: 00. Индекс разборов