Что такое word embeddings?
Word embeddings (векторные представления слов) — это способ представления слов в виде плотных числовых векторов фиксированной размерности, отражающих семантическое и синтаксическое сходство между словами. В отличие от one-hot encoding, где каждое слово — это разреженный и ортогональный вектор, word embeddings позволяют моделям "понимать" смысл и контекст слов, так как семантически близкие слова имеют похожие векторы.
Основная идея
Каждое слово представляется вектором из n измерений (обычно от 50 до 300), и расположение этих векторов в пространстве отражает лексическое и контекстное сходство:
-
Вектора слов «король» и «королева» будут близки.
-
Разница между «мужчина» и «женщина» будет аналогична разнице между «король» и «королева».
-
Геометрические операции с векторами отражают логические связи:
python vec("король")−vec("мужчина")+vec("женщина")≈vec("королева")\\text{vec}("король") - \\text{vec}("мужчина") + \\text{vec}("женщина") ≈ \\text{vec}("королева")
Зачем нужны word embeddings
-
Снижение размерности
Вместо тысячи нулей (как в one-hot), каждое слово кодируется компактно: 100–300 значений с информацией о смысле. -
Семантическое сходство
Модель может "понимать", что слова «автомобиль» и «машина» близки по значению. -
Контекстное использование
Современные embeddings (например, BERT) учитывают контекст слова в предложении. -
Передача знаний
Предобученные embeddings можно использовать повторно в разных NLP-задачах.
Как получаются эмбеддинги
Существует два класса методов:
1. Count-based (на частотах)
-
Строится матрица co-occurrence (совместных появлений слов), затем применяется SVD (разложение).
-
Пример: GloVe
2. Predictive (на предсказаниях)
-
Используются нейросети, обученные предсказывать слово по контексту или контекст по слову.
-
Примеры: Word2Vec, FastText, ELMo, BERT
Популярные модели embeddings
Word2Vec (Google, 2013)
-
Обучается предсказывать слово по контексту (CBOW) или контекст по слову (Skip-gram).
-
Вектора плотные, фиксированной длины (обычно 100–300).
-
Плюсы: быстрое обучение, хорошие результаты.
-
Минусы: не учитывает многозначность слов, каждое слово — один вектор.
GloVe (Stanford, 2014)
-
Использует глобальную статистику появления слов (матрица co-occurrence).
-
Слово представляется как вектор, отражающий статистические связи с другими словами.
-
Минусы: как и Word2Vec, GloVe не учитывает контекст.
FastText (Facebook, 2016)
-
Каждое слово представляется как сумма эмбеддингов символов (n-грамм).
-
Позволяет получать векторы для несуществующих в словаре слов (например, опечаток, новых слов).
-
Особенно полезен для морфологически богатых языков (в т.ч. русского).
ELMo, BERT, GPT — контекстные эмбеддинги
-
Учитывают положение слова в предложении.
-
Одно и то же слово («банк») будет иметь разные вектора в зависимости от контекста.
-
Построены на основе трансформеров.
-
Обычно не обучаются "с нуля", а используются как предобученные модели (Transfer Learning).
Формальное описание
Допустим, у нас есть словарь из VV слов, и мы хотим получить для каждого слова вектор размерности dd:
E∈RV×dE \in \mathbb{R}^{V \times d}
-
Каждое слово wiw_i имеет вектор-эмбеддинг ei⃗∈Rd\vec{e_i} \in \mathbb{R}^d
-
Матрица EE обучается либо отдельно, либо как часть нейросети.
Использование эмбеддингов
1. Обучение с нуля
from keras.models import Sequential
from keras.layers import Embedding
model = Sequential()
model.add(Embedding(input_dim=10000, output_dim=100, input_length=50)) # 10k слов, 100-мерные вектора
2. Использование предобученных embeddings
import gensim.downloader as api
model = api.load("word2vec-google-news-300")
vector = model\["king"\] # вектор слова
similar_words = model.most_similar("king", topn=5)
3. Встроенные эмбеддинги в трансформерах (BERT и др.)
from transformers import AutoTokenizer, AutoModel
import torch
tokenizer = AutoTokenizer.from_pretrained("bert-base-multilingual-cased")
model = AutoModel.from_pretrained("bert-base-multilingual-cased")
inputs = tokenizer("Пример текста", return_tensors="pt")
outputs = model(\*\*inputs)
embeddings = outputs.last_hidden_state # \[batch, seq_len, hidden_size\]
Методы сравнения слов
- Косинусное расстояние — основная метрика близости векторов:
cos(θ)=A⃗⋅B⃗∣∣A⃗∣∣⋅∣∣B⃗∣∣\\cos(\\theta) = \\frac{\\vec{A} \\cdot \\vec{B}}{||\\vec{A}|| \\cdot ||\\vec{B}||}
- Евклидово расстояние — менее популярно из-за зависимости от масштаба.
Примеры аналогий
Word embeddings позволяют находить аналогии между словами:
model.most_similar(positive=\['королева', 'мужчина'\], negative=\['женщина'\])
\# Вывод: "король"
Визуализация
Для интерпретации можно уменьшить размерность (PCA, t-SNE) и построить 2D/3D карту слов:
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
words = \["король", "королева", "мужчина", "женщина"\]
vectors = \[model\[w\] for w in words\]
pca = PCA(n_components=2)
result = pca.fit_transform(vectors)
plt.scatter(result\[:, 0\], result\[:, 1\])
for i, word in enumerate(words):
plt.annotate(word, xy=(result\[i, 0\], result\[i, 1\]))
plt.show()
Преимущества word embeddings
-
Семантическое моделирование: близкие по смыслу слова имеют схожие представления.
-
Обучаемость: можно дообучать на своей предметной области.
-
Переносимость: один и тот же эмбеддинг может использоваться в разных задачах.
-
Контекстуальность (в современных моделях): один и тот же токен в разных предложениях может иметь разный вектор.
Ограничения классических эмбеддингов
-
Не учитывают контекст (Word2Vec, GloVe)
-
Один вектор на слово (вне зависимости от значения)
-
Уязвимы к OOV (неизвестным словам), за исключением FastText
-
Зависимость от корпуса: на специализированных тематиках могут плохо работать
Word embeddings представляют собой мощный инструмент в NLP, позволяющий переходить от простого индексирования слов к более "понимающим" машинам, способным оперировать смыслами, аналогиями и связями между словами. С развитием трансформеров понятие embeddings расширилось до контекстных и даже мультиязычных представлений.