Embeddings на собеседовании Data Scientist

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Что такое embeddings

Embedding — вектор фиксированной длины, представляющий слово/предложение/изображение в осмысленном пространстве. Семантически похожие объекты — близкие векторы.

king   → [0.21, -0.45, 0.78, ..., 0.13]   (размерность 300)
queen  → [0.19, -0.40, 0.81, ..., 0.15]
apple  → [-0.32, 0.67, 0.12, ..., -0.81]

Косинусное расстояние между king и queen маленькое, между king и apple — большое.

Зачем нужны: числовое представление текста для ML-моделей, поиск похожих, кластеризация, retrieval (RAG).

На собесе DS спрашивают: «как из текста сделать вектор», «чем word2vec отличается от BERT-embeddings», «как выбрать sentence-encoder». Это базовый NLP-уровень.

word2vec

word2vec (Mikolov et al., 2013) — первый mainstream способ получать embeddings слов.

Идея: слова в похожих контекстах имеют похожие embeddings.

Две архитектуры:

  • CBOW (Continuous Bag of Words) — предсказать слово по контексту. Контекст = сумма embeddings соседних слов.
  • Skip-gram — предсказать контекст по слову. Дороже на тренировку, лучше на редких словах.

Тренируется на большом корпусе через простую neural net с одним hidden слоем = размерность embeddings (typically 100–300).

Negative sampling: вместо softmax по всему словарю — бинарная классификация «это пара (word, context) или случайная пара?». Делает обучение масштабируемым на миллионы слов.

Свойства:

  • Семантическая близость через косинус
  • Векторная арифметика: vec(king) - vec(man) + vec(woman) ≈ vec(queen) (на хорошо обученных моделях)
  • Один embedding на слово — проблема с полисемией («банк» = финансовый/река)

GloVe и FastText

GloVe (Global Vectors) — Stanford. Использует глобальную статистику co-occurrence (а не local context window как word2vec). Часто похожее качество, но проще обоснование математически.

FastText (Facebook) — расширение word2vec на subword (n-gramы букв). Решает две проблемы:

  • OOV (out-of-vocabulary) — слова, которых не было в тренировке, получают embedding из subword
  • Морфология — «running», «ran», «runs» получают похожие vectors через общие subwords

Для русского языка с богатой морфологией FastText часто лучше word2vec.

В прод сегодня все три уступают contextual embeddings (BERT). Но используются как baseline и в low-resource сценариях.

Contextual: BERT

BERT-embeddings контекстно-зависимы. Один и тот же токен «банк» в разных предложениях получает разные embeddings.

[CLS] я пришёл в банк за кредитом [SEP]
                        ↓
                    BERT
                        ↓
[CLS_emb, я_emb, пришёл_emb, в_emb, банк_emb_финансовый, ...]

[CLS] на берегу банка реки [SEP]
                        ↓
                    BERT
                        ↓
[..., банк_emb_река, ...]

Как использовать:

  • Для classifier — взять [CLS]-embedding, прогнать через linear + softmax
  • Для NER — embedding каждого токена → классификатор
  • Для embedding документа — average всех токенов или [CLS] (но обычно sentence-encoders лучше)

Размерность BERT-base: 768. BERT-large: 1024. На современных моделях (E5, BGE) — 384–1024.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Sentence embeddings

Чистый BERT не даёт хороший sentence-level embedding (показано в Sentence-BERT paper). Для предложения нужны специальные модели.

Sentence-BERT (SBERT): дотренированная BERT с siamese-network на парах предложений. На выходе один вектор на предложение.

Современные стандарты (2025–2026):

  • OpenAI text-embedding-3-large/small — закрытые, через API
  • E5 / E5-mistral — open-source, конкурентные
  • BGE (BAAI) — open, особенно сильны на multilingual
  • mxbai-embed-large — open, неплохие на retrieval

Выбор зависит от языка (есть ли поддержка русского), domain (биомед, финансы), бюджета (API vs self-host) и размера контекста.

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('intfloat/multilingual-e5-large')
embs = model.encode(['предложение один', 'предложение два'])
# embs.shape = (2, 1024)

После embed — нужно найти ближайшие. Для маленьких коллекций (тысячи документов) — numpy cosine similarity достаточно.

Для больших (миллионы) — vector databases:

  • FAISS (Facebook) — open-source, сильное по speed
  • Chroma — простой Python-first vector DB
  • Qdrant — Rust-based, рост популярности
  • Pinecone — managed
  • Milvus — масштабируется на миллиарды

ANN (Approximate Nearest Neighbors): на миллионах векторов exact search дорогой. ANN-индексы (HNSW, IVF) дают приближённые результаты за миллисекунды. Recall 90–99% обычно ОК.

Hybrid search: комбинировать dense (vector) и sparse (BM25/TF-IDF). Обычно даёт лучший результат, чем только vectors. RRF (Reciprocal Rank Fusion) — простой способ объединять.

Reranking: топ-K кандидатов от vector search прогнать через cross-encoder (более точный, но дороже). Стандарт в production RAG.

Частые ошибки

Использовать word2vec в 2026 для serious NLP. Contextual embeddings (BERT-family) сильно лучше для большинства задач.

Считать [CLS] BERT хорошим sentence embedding. Без fine-tuning или sentence-specific модели [CLS] плохо работает на retrieval. Использовать SBERT/E5/BGE.

Не нормализовать embeddings перед косинусом. Если модель не выдаёт unit vectors — нормализовать v / ||v|| перед cosine similarity.

Embedding на разных моделях смешивать. Embeddings от модели A не сопоставимы с embeddings от B. Один store — одна модель.

Игнорировать domain. Generic embeddings посредственны на specialized domain (медицина, право). Fine-tune на domain-данных или брать domain-specific модели.

Обновить модель → не пересчитать индекс. Если embedding model меняется — все векторы в БД устарели. Версионировать embeddings.

Сравнивать embeddings от разных версий одной модели. Даже patch-версия может изменить distribution. Зафиксировать version.

Связанные темы

FAQ

Какой размер embedding выбирать?

Дефолты — 384 (small), 768 (base), 1024 (large), 1536 (OpenAI). Большая размерность — выше качество, дороже хранение и поиск. Для retrieval часто 768 — баланс.

Можно ли уменьшить размерность embedding?

Да — Matryoshka embeddings (truncate первые N измерений), PCA, distillation в меньшую модель. Matryoshka стандарт в новых моделях OpenAI и Mistral.

Embeddings или TF-IDF для retrieval?

Hybrid лучше всего. Pure embeddings плохо работают на keyword-точные совпадения (термины, числа). TF-IDF/BM25 — наоборот плохо на семантику. Комбинация даёт лучше каждого по отдельности.

Что такое contrastive learning?

Тренировка embedding-моделей через положительные/отрицательные пары: похожие → ближе, разные → дальше. Стандарт в SBERT, SimCSE, E5.

Multilingual или English-only embedding?

Для русского — multilingual (multilingual-e5, bge-m3). English-only модели на русском работают, но хуже. Тестировать на свой domain.

Это официальная информация?

Нет. Статья основана на оригинальных работах (Mikolov 2013 для word2vec, Pennington 2014 для GloVe, Bojanowski 2016 для FastText, Devlin 2019 для BERT, Reimers 2019 для SBERT) и документации sentence-transformers.


Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.