Привет, Хабр!
В широком смысле, эмбеддинг - это процесс преобразования каких-либо данных (чаще всего текста, но могут быть и изображения, звуки и т.д.) в набор чисел, векторы, которые машина может не только хранить, но и с которыми она может работать. Звучит очень интересно. Казалось бы, наша речь - это так просто, все связано и понятно. Но как это объяснить машине?
В этой статье мы рассмотрим, что такое эмбеддинги и какие они бывают.
Проще говоря эмбеддинг - это способ преобразования чего-то абстрактного, например слов или изображений в набор чисел и векторов. Эти числа не случайны; они стараются отражают суть или семантику нашего исходного объекта.
В NLP, например, эмбеддинги слов используются для того, чтобы компьютер мог понять, что слова «кошка» и «котенок» связаны между собой ближе, чем, скажем, «кошка» и «окошко». Это достигается путем присвоения словам векторов, которые отражают их значение и контекстное использование в языке.
Эмбеддинги не ограничиваются только словами. В компьютерном зрении, например, можно использовать их для преобразования изображений в вектора, чтобы машина могла понять и различать изображения.
Немного математической базы
Векторные пространства — это математические структуры, состоящие из векторов. Векторы можно понимать как точки в некотором пространстве, которые обладают направлением и величиной. В эмбеддингах, каждый вектор представляет собой уникальное представление объекта, преобразованное в числовую форму.
Размерность вектора определяет, сколько координат используется для описания каждого вектора в пространстве. В эмбеддингах высокая размерность может означать более детализированное представление данных. Векторное пространство для текстовых эмбеддингов может иметь тысячи измерений.
Расстояние между векторами в эмбеддингах измеряется с помощью метрик, таких как Евклидово расстояние или косинусное сходство. Метрики позволяют оценить, насколько близко или далеко друг от друга находятся различные объекты в векторном пространстве, что является основой для многих алгоритмов машинного обучения, таких как классификация
Самый интуитивно понятный способ измерения расстояния - это Евклидово расстояние. В эмбеддингах расстояние вычисляется как квадратный корень из суммы квадратов разностей соответствующих компонентов двух векторов. Для двух векторов a и b, евклидово расстояние d определяется как:
Евклидово расстояние подходит для измерения абсолютных различий, но может быть менее эффективным в высокоразмерных пространствах из-за проклятия размерности.
Манхэттенское расстояние иногда более подходящее для определенных типов данных, это расстояние измеряется как сумма абсолютных разностей их компонентов. Оно определяется как:
Сходство между векторами измеряет степень "похожести" между двумя векторами. В эмбеддингах это используется для определения степени семантической или контекстной близости между элементами.
Одна из наиболее популярных метрик в текстовых эмбеддингах это косинусное сходство. Косинусное сходство измеряет косинус угла между двумя векторами. Если угол между векторами мал, косинус приближается к 1, что указывает на высокое сходство. Математически оно выражается как:
где ⋅ обозначает скалярное произведение векторов, а ∥a∥ и ∥b∥ — их нормы.
Многомерные эмбеддинги могут быть сокращены до более низких размерностей с помощью техник PCA или t-SNE.
В общем виде, эмбеддинги делятся на:
Категория |
тип |
описание |
---|---|---|
Текстовые эмбеддинги |
Word Embeddings |
Эти эмбеддинги преобразуют слова в векторы, так что слова с похожим значением имеют похожие векторные представления. Они впервые позволили машинам понять семантику человеческих слов. |
Текстовые эмбеддинги |
Sentence Embeddings |
Здесь уже идет дело о целых предложениях. Подобные модели создают векторные представления для целых предложений или даже абзацев, улавливая гораздо более тонкие нюансы языка. |
Эмбеддинги изображений |
CNN |
CNN позволяет преобразовать изображения в векторы, которые затем используются для различных задач, например, классификации изображений или даже генерации новых изображений. |
Эмбеддинги изображений |
Autoencoders |
Автоэнкодеры могут сжимать изображения в более мелкие, плотные векторные представления, которые затем могут быть использованы для различных целей, включая декомпрессию или даже обнаружение аномалий. |
Эмбеддинги для других типов данных |
Graph Embeddings |
Применяются для работы с графовыми структурами (к примеру рекомендательные системы). Это способ представить узлы и связи графа в виде векторов. |
Эмбеддинги для других типов данных |
Sequence Embeddings |
Используются для анализа последовательностей, например, во временных рядах или в музыке. |
Основные алгоритмы
Word2Vec
Word2Vec использует нейронные сети для обучения векторных представлений слов из больших наборов текстовых данных. Существуют две основные архитектуры Word2Vec:
CBOW: предсказывает текущее слово на основе контекста (окружающих слов). Например, в предложении "Собака лает на ___", CBOW попытается угадать недостающее слово (например, "почтальона") на основе окружающих слов.
Skip-gram: работает наоборот по сравнению с CBOW. Использует текущее слово для предсказания окружающих его слов в предложении. Например, если взять слово "кошка", модель попытается предсказать слова, которые часто встречаются в окружении слова "кошка", такие как "мышь", "мяукает" и т.д.
Эти модели хороши в выявлении семантических отношений между словами.
Для примера работы с Word2Vec можно использовать библиотеку gensim
!pip install gensim
from gensim.models import Word2Vec
# список предложений, где каждое предложение - список слов
sentences = [
["кошка", "ловит", "мышь"],
["собака", "гоняется", "за", "кошкой"],
["кошка", "бежит", "от", "собаки"]
]
# Создание модели Word2Vec
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
Word2Vec обучается на ваших текстовых данных
model.train(sentences, total_examples=model.corpus_count, epochs=10)
После обучения модели мы можем использовать полученные векторы слов или проводить различные виды семантических операций.
# Получение вектора слова
vector = model.wv['кошка']
# Поиск похожих слов
similar_words = model.wv.most_similar('кошка')
GloVe
GloVe создает векторы слов, анализируя, как часто пары слов встречаются вместе в большом текстовом корпусе. Идея заключается в том, что смысловые отношения между словами можно выразить в виде векторных различий. Например, векторы для "король" - "мужчина" + "женщина" должны быть близки к вектору для "королева".
GloVe стремится минимизировать разницу между произведением векторов слов и логарифмом их совместной встречаемости, позволяя модели улавливать различные типы отношений между словами, такие как синонимы, антонимы, контекстные отношения и т.д
Для примера работы GloVe, можно использовать предварительно обученные векторы или обучить свою модель на выбранном корпусе:
from gensim.scripts.glove2word2vec import glove2word2vec
from gensim.models import KeyedVectors
# Путь к файлу GloVe
glove_file = 'glove.6B.100d.txt' # пример файла
word2vec_output_file = 'glove.6B.100d.word2vec'
# конвертация файла GloVe в формат, совместимый с gensim
glove2word2vec(glove_file, word2vec_output_file)
# Загрузка модели
model = KeyedVectors.load_word2vec_format(word2vec_output_file, binary=False)
После загрузки модели можно использовать векторы слов для различных задач.
# Получение вектора слова
vector = model['компьютер']
# Поиск похожих слов
similar_words = model.most_similar('компьютер')
Для работы с русскоязычными текстами понадобится найти или обучить GloVe-модель на русскоязычном корпусе, так как большинство предварительно обученных моделей GloVe предназначены для английского языка. Одна из таких - navec.
Эмбеддинги позволяют преобразовывать текстовую или категориальную информацию в числовой формат, делая её доступной для машины.
Больше практической информации вы можете получить в рамках онлайн-курсов. У моих коллег из OTUS, например, скоро пройдет бесплатный урок, на котором вы сможете изучить основные алгоритмы, основанные на матричных разложениях для рекомендательных систем. Изучите алгоритм SVD и ALS, а также примените их на практике. Регистрация доступна по ссылке.