
Обучение векторных представлений слов: Word Embedding
Что такое word embedding, как работают Word2Vec, GloVe и FastText — подробный разбор с примерами кода и практическими советами.
Обучение векторных представлений слов: Word Embedding
Представьте, что вы хотите объяснить компьютеру разницу между словами «кот» и «котёнок». Для человека это очевидно — оба существа пушистые, оба мяукают, один просто моложе. Но машина видит лишь строки символов. Как научить её понимать смысл?
Ответ — векторные представления слов (word embeddings). Это одна из ключевых идей современного NLP, которая лежит в основе переводчиков, чат-ботов, поисковых систем и языковых моделей. В этой статье разберём, как устроено обучение word embeddings, какие модели существуют и как применять их на практике.
Почему one-hot encoding не работает
Чтобы модель машинного обучения могла понимать и обрабатывать естественный язык, необходимо преобразовать слова в числовые значения. Один из простейших подходов — one-hot encoding, при котором каждое отдельное слово соответствует одному измерению результирующего вектора, а бинарное значение указывает на присутствие (1) или отсутствие (0) этого слова.
Проблема очевидна: one-hot encoding вычислительно непрактичен при работе со всем словарём, поскольку представление требует сотен тысяч измерений.
Но есть и более глубокий изъян. Одно из преимуществ word embeddings перед one-hot encoding — способность к обобщению: семантически похожие слова имеют схожее векторное представление и, следовательно, находятся близко друг к другу в векторном пространстве. One-hot вектора этого не обеспечивают: «кот» и «котёнок» там так же далеки друг от друга, как «кот» и «автомобиль».
Word embedding представляет слова и фразы в виде векторов нечисловых (небинарных) значений с гораздо меньшей и, следовательно, более плотной размерностью. Интуитивное предположение о хорошем word embedding состоит в том, что они могут аппроксимировать сходство между словами (то есть «cat» и «kitten» — похожие слова, и ожидается, что они будут близки в сниженном векторном пространстве).
Word2Vec: нейросеть, которая «читает» контекст
Word2Vec — популярная техника обучения word embeddings с использованием двухслойной нейронной сети, представленная командой исследователей Google под руководством Томаса Миколова.
Word2Vec, по сути, описывает две модели для обучения векторов слов: непрерывный мешок слов (CBOW) и модель skip-gram. Они очень похожи: CBOW принимает контекстные слова как вход и предсказывает целевое слово, тогда как skip-gram принимает целевое слово как вход и предсказывает контекстное слово.
graph LR
A[Входные слова контекста] --> B[Скрытый слой — матрица весов]
B --> C[Предсказание целевого слова]
C --> D[Обновление весов — backprop]
D --> B
style B fill:#4F86C6,color:#fff
style C fill:#50C878,color:#fff
Обе модели являются однослойными нейронными сетями, которые принимают one-hot закодированные векторы как вход. Мы обучаем веса скрытого слоя, и каждая строка этой матрицы весов становится вектором слова.
Пример: CBOW в действии
В предложении «The dog is barking», если модели дать слова [“The”, “is”, “barking”], она предскажет «dog» как пропущенное слово.
from gensim.models import Word2Vec
# Обучающий корпус
sentences = [
["кот", "сидит", "на", "крыше"],
["собака", "лежит", "во", "дворе"],
["кот", "и", "котёнок", "похожи"],
]
# Обучение модели Word2Vec (skip-gram, sg=1)
model = Word2Vec(
sentences,
vector_size=100, # размерность вектора
window=5, # размер контекстного окна
min_count=1,
sg=1 # 1 = skip-gram, 0 = CBOW
)
# Получить вектор слова
vector = model.wv["кот"]
print(vector.shape) # (100,)
# Найти похожие слова
similar = model.wv.most_similar("кот", topn=3)
print(similar)
Векторные представления слов фиксируют семантические отношения между словами, что делает их полезными для различных задач NLP, таких как анализ тональности, машинный перевод и рекомендательные системы.
GloVe: глобальная статистика вместо локального окна
Word2Vec смотрит на «соседей» слова в узком окне. GloVe идёт дальше.
GloVe создаёт явную матрицу совместной встречаемости слово–контекст, используя статистику по всему текстовому корпусу, а не только по локальному окну, как в Word2Vec.
Авторы метода обнаружили, что вместо обучения на необработанных вероятностях совместного появления полезнее обучаться на их соотношениях. Эмбеддинги оптимизируются так, чтобы скалярное произведение двух векторов равнялось логарифму числа совместных появлений этих двух слов.
GloVe отличается от Word2Vec тем, что использует глобальную статистику совместной встречаемости слово–слово, предлагая уникальный подход к встраиванию слов на основе их совокупного контекста в корпусе.
«GloVe объединяет преимущества матричного разложения (как в LSA) и методов на основе локального контекста (как в Word2Vec), получая более устойчивые и информативные представления.»
Ограничения GloVe
GloVe присваивает единственный вектор каждому слову, что означает, что слова с несколькими значениями (например, «bank» как «riverbank» или «bank» как «финансовое учреждение») не обрабатываются корректно.
Поскольку GloVe использует матрицу совместной встречаемости, он требует больше памяти, чем Word2Vec, при работе с большими наборами данных.
FastText: вглубь слова до уровня n-грамм
FastText — модель векторного представления слов, разработанная Facebook AI Research (FAIR), которая улучшает Word2Vec, учитывая информацию о подсловах (subword).
Word2Vec обучает уникальный вектор для каждого слова, игнорируя важную морфологическую структуру и делая невозможным предсказание для слов, не вошедших в словарь. FastText решает эту проблему, рассматривая каждое слово как сумму его подслов. Эти подслова можно определять по-разному, но простейшая форма — символьные n-граммы. Векторное представление ассоциируется с каждой n-граммой, а затем вектор слова — это просто сумма его n-грамм.
Пример: слово «orange» разбивается на n-граммы:
<or, ora, ran, ran, ang, nge, ge>, <orange>
В отличие от Word2Vec, FastText не только рассматривает целые слова, но и включает информацию о подсловах — части слов, такие как n-граммы. Этот подход позволяет обрабатывать морфологически богатые языки и более эффективно фиксировать информацию о структуре слова.
from gensim.models import FastText
model_ft = FastText(
sentences,
vector_size=100,
window=5,
min_count=1,
epochs=10
)
# FastText умеет строить вектор для НЕЗНАКОМЫХ слов
vector_unknown = model_ft.wv["котёночек"] # нет в корпусе, но работает!
print(vector_unknown.shape) # (100,)
Сравнение моделей: что выбрать
| Критерий | Word2Vec | GloVe | FastText |
|---|---|---|---|
| Автор | Google (Mikolov, 2013) | Stanford (Pennington, 2014) | Meta FAIR (Bojanowski, 2016) |
| Подход | Локальное контекстное окно | Глобальная матрица совместной встречаемости | Подсловные n-граммы |
| Слова вне словаря (OOV) | ❌ Не работает | ❌ Не работает | ✅ Работает |
| Морфологически богатые языки | Слабо | Слабо | ✅ Отлично |
| Потребление памяти | Среднее | Высокое | Среднее |
| Скорость обучения | Быстрая | Средняя | Средняя |
| Готовые предобученные модели | ✅ Много | ✅ Много | ✅ Есть |
Выбор модели целиком зависит от вашего варианта использования, доступных данных и вычислительных ресурсов. Вы можете обучить эмбеддинги самостоятельно или использовать уже готовую предобученную модель.
От статичных эмбеддингов к контекстным: что дальше
Word2Vec, GloVe и FastText имеют общую слабость: каждое слово получает один фиксированный вектор, независимо от контекста.
Эмбеддинги в ранних подходах не являются контекстно-зависимыми — они обучаются на основе совместной встречаемости, но не последовательного контекста. Так, в предложениях «I am eating an apple» и «I have an Apple phone» оба слова «apple» будут иметь одинаковый вектор, хотя имеют разное значение.
Современные трансформерные модели, такие как BERT, обеспечивают контекстные эмбеддинги, в которых одно и то же слово может иметь разные значения в разных контекстах.
Путь развития векторных представлений
timeline
title Эволюция векторных представлений слов
2013 : Word2Vec (Google)
: CBOW и Skip-gram
2014 : GloVe (Stanford)
: Глобальная матрица совстречаемости
2016 : FastText (Meta FAIR)
: Subword n-граммы
2018 : ELMo и BERT
: Контекстные эмбеддинги
2020+ : GPT-3, T5, LLaMA
: Мощные языковые модели
Заключение
Векторные представления слов — это фундамент современного NLP. Использование word и phrase embeddings в качестве входного представления улучшает производительность во многих NLP-задачах.
Ключевые выводы:
- Word2Vec — отличный выбор для старта: быстрый, хорошо изученный, есть масса готовых моделей.
- GloVe — когда важна глобальная статистика корпуса и нужна стабильность.
- FastText — лучший вариант для языков с богатой морфологией (русский, немецкий, финский) и для работы с редкими словами.
- BERT и трансформеры — когда нужно учитывать контекст и бюджет позволяет.
«Хорошие векторные представления — это не просто числа. Это сжатые знания о языке, которые модель извлекла из миллиардов слов.»
Понимание word embeddings — не историческая справка, а живой инструмент. Даже в эпоху GPT-4 и Claude лёгкие модели на FastText или GloVe работают в тысячах продуктов — там, где важны скорость и интерпретируемость.