Какие методы получения эмбеддингов (векторных представлений) вы знаете?

«Какие методы получения эмбеддингов (векторных представлений) вы знаете?» — вопрос из категории NLP и трансформеры, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Работая с NLP, я использовал различные методы получения эмбеддингов в зависимости от задачи и доступных данных.

Для слов и токенов (статические и контекстные)

1. Статические эмбеддинги (Word Embeddings) Одно фиксированное векторное представление для каждого слова вне зависимости от контекста.

  • Word2Vec (Skip-gram, CBOW): Обучается на локальном контексте слов. Я применял для задач семантического сходства, когда не было больших размеченных датасетов.
    from gensim.models import Word2Vec
    model = Word2Vec(sentences, vector_size=300, window=5, min_count=5, workers=4)
    vector = model.wv['computer'] # Получение вектора слова
  • GloVe: Обучается на глобальной статистике совместной встречаемости слов из всего корпуса. Часто давал лучшие результаты на синтаксических задачах.
  • FastText: Учитывает морфологию через n-граммы символов. Был незаменим для текстов с опечатками или для языков со сложной морфологией, так как может строить вектор для OOV (out-of-vocabulary) слов.

2. Контекстные эмбеддинги (Contextual Embeddings) Представление слова зависит от окружающего его предложения. Это современный стандарт.

  • BERT и другие трансформеры: Получаю эмбеддинги как выход последнего (или предпоследнего) скрытого слоя. Для извлечения контекстного эмбеддинга предложения часто использую [CLS] токен или усреднение токенов.
    from transformers import AutoTokenizer, AutoModel
    import torch
    tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
    model = AutoModel.from_pretrained('bert-base-uncased')
    inputs = tokenizer("Hello, world!", return_tensors="pt")
    with torch.no_grad():
    outputs = model(**inputs)
    last_hidden_states = outputs.last_hidden_state # [batch, seq_len, hidden_dim]
    cls_embedding = last_hidden_states[:, 0, :] # Вектор [CLS]

Для других типов данных

  • Для категориальных признаков в табличных данных: Обучал слой torch.nn.Embedding как часть нейросетевой модели. Это так называемые entity embeddings, которые часто превосходят one-hot encoding.
  • Для изображений: Использовал выходы предобученных CNN (например, из torchvision.models.resnet50) перед финальным классификационным слоем в качестве эмбеддингов для задач поиска похожих изображений.
  • Для графов: Применял алгоритмы вроде Node2Vec или использовал выходы графовых нейронных сетей (GNN).

Выбор метода всегда определяется задачей: FastText для noisy-текста, BERT для сложных семантических задач, а статические эмбеддинги — для быстрого прототипирования или как features для "легких" моделей.