Ответ
Работая с 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 для "легких" моделей.