🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
  • Home
  • Blog
  • Как получить правильные векторные вкрапления

Как получить правильные векторные вкрапления

  • Engineering
December 08, 2023
Yujian Tang

Эта статья была первоначально опубликована в The New Stack и перепощена здесь с разрешения.

Исчерпывающее введение в векторные вкрапления и способы их генерации с помощью популярных моделей с открытым исходным кодом.

Image by Денис Марчук from Pixabay Изображение Денис Марчук с Pixabay

Векторные вкрапления очень важны при работе с семантическим сходством. Однако вектор - это просто ряд чисел, а векторное вкрапление - это ряд чисел, представляющих входные данные. Используя векторные вкрапления, мы можем структурировать неструктурированные данные или работать с любым типом данных, преобразуя их в ряд чисел. Такой подход позволяет нам выполнять математические операции над входными данными, а не полагаться на качественные сравнения.

Векторные вкрапления важны для многих задач, в частности для семантического поиска. Однако перед их использованием крайне важно получить соответствующие векторные вкрапления. Например, если вы используете модель изображения для векторизации текста или наоборот, вы, скорее всего, получите плохие результаты.

В этом посте мы узнаем, что означают векторные вкрапления, как генерировать правильные векторные вкрапления для ваших приложений с помощью различных моделей и как наилучшим образом использовать векторные вкрапления с помощью векторных баз данных, таких как Milvus и Zilliz Cloud.

Как создаются векторные вкрапления?

Теперь, когда мы понимаем важность векторных вкраплений, давайте узнаем, как они работают. Векторное вкрапление - это внутреннее представление входных данных в модели глубокого обучения, также известной как вкрапление моделей или глубокая нейронная сеть. Как же извлечь эту информацию?

Мы получаем векторы, удаляя последний слой и беря выход предпоследнего слоя. Последний слой нейронной сети обычно выдает предсказание модели, поэтому мы берем выход предпоследнего слоя. Векторное вложение - это данные, подаваемые на предсказательный слой нейронной сети.

Размерность векторного вложения эквивалентна размеру предпоследнего слоя в модели и, таким образом, взаимозаменяема с размером или длиной вектора. Обычная размерность вектора - 384 (генерируется Sentence Transformers Mini-LM), 768 (Sentence Transformers MPNet), 1 536 (OpenAI) и 2 048 (ResNet-50).

Что означает векторное вложение?

Кто-то однажды спросил меня о значении каждого измерения в векторном вкраплении. Короткий ответ - ничего. Отдельное измерение в векторном вкраплении ничего не значит, поскольку оно слишком абстрактно, чтобы определить его значение. Однако, если взять все измерения вместе, они обеспечивают семантическое значение входных данных.

Размеры вектора - это высокоуровневые, абстрактные представления различных атрибутов. Представленные атрибуты зависят от обучающих данных и самой модели. Модели текста и изображений генерируют разные вложения, потому что они обучаются на принципиально разных типах данных. Даже разные текстовые модели генерируют разные вложения. Иногда они отличаются по размеру, иногда - по атрибутам, которые они представляют. Например, модель, обученная на юридических данных, будет учиться совсем не так, как модель, обученная на данных о здравоохранении. Эту тему я раскрыл в статье Сравнение векторных вложений.

Генерация правильных векторных вкраплений

Как получить правильные векторные вкрапления? Все начинается с определения типа данных, которые вы хотите внедрить. В этом разделе мы рассмотрим встраивание пяти различных типов данных: изображений, текста, аудио, видео и мультимодальных данных. Все модели, которые мы здесь представляем, имеют открытый исходный код и взяты из Hugging Face или PyTorch.

Встраивание изображений

Распознавание изображений стало популярным в 2012 году после появления AlexNet. С тех пор в области компьютерного зрения произошло множество достижений. Последняя заметная модель распознавания изображений - ResNet-50, 50-слойная глубокая остаточная сеть, основанная на прежней архитектуре ResNet-34.

Остаточные нейронные сети (ResNet) решают проблему исчезающего градиента в глубоких конволюционных нейронных сетях с помощью коротких связей. Эти соединения позволяют выходу с более ранних слоев поступать на более поздние слои напрямую, минуя все промежуточные слои, что позволяет избежать проблемы исчезающего градиента. Такая конструкция делает ResNet менее сложной, чем VGGNet (Visual Geometry Group), конволюционная нейронная сеть с высочайшей производительностью.

В качестве примера я рекомендую две реализации ResNet-50: ResNet 50 на Hugging Face и ResNet 50 на PyTorch Hub. Хотя сети одинаковы, процесс получения вкраплений различается.

Приведенный ниже пример кода демонстрирует, как использовать PyTorch для получения векторных вкраплений. Сначала мы загружаем модель из PyTorch Hub. Затем мы удаляем последний слой и вызываем .eval(), чтобы проинструктировать модель вести себя так, как будто она запущена на вывод. Затем функция embed генерирует векторное вложение.

# Load the embedding model with the last layer removed
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True) model = torch.nn.Sequential(*(list(model.children())[:-1]))
model.eval()


def embed(data):
with torch.no_grad():
output = model(torch.stack(data[0])).squeeze()
return output

В HuggingFace используется немного другая настройка. Приведенный ниже код демонстрирует, как получить векторное вкрапление из Hugging Face. Сначала нам понадобится экстрактор признаков и модель из библиотеки transformers. Мы будем использовать экстрактор признаков для получения входных данных для модели и использовать модель для получения выходных данных и извлечения последнего скрытого состояния.

# Load model directly
from transformers import AutoFeatureExtractor, AutoModelForImageClassification


extractor = AutoFeatureExtractor.from_pretrained("microsoft/resnet-50")
model = AutoModelForImageClassification.from_pretrained("microsoft/resnet-50")


from PIL import Image


image = Image.open("<image path>")
# image = Resize(size=(256, 256))(image)


inputs = extractor(images=image, return_tensors="pt")
# print(inputs)


outputs = model(**inputs)
vector_embeddings = outputs[1][-1].squeeze()

Встраивание текста

Инженеры и исследователи экспериментируют с естественным языком и искусственным интеллектом с момента его изобретения. К числу самых ранних экспериментов относятся:

  • ELIZA, первый чатбот с ИИ-терапевтом.
  • Китайская комната" Джона Серла - мысленный эксперимент, в котором изучается, требует ли способность переводить с китайского на английский понимание языка.
  • Перевод с английского на русский на основе правил.

Работа ИИ с естественным языком значительно эволюционировала по сравнению с его вложениями, основанными на правилах. Начав с первичных нейронных сетей, мы добавили рекуррентные отношения через RNN, чтобы отслеживать шаги во времени. Затем мы использовали трансформаторы для решения проблемы трансдукции последовательности.

Трансформаторы состоят из кодера, который кодирует входной сигнал в матрицу, представляющую состояние, матрицу внимания и декодер. Декодер декодирует состояние и матрицу внимания, чтобы предсказать правильный следующий токен для завершения выходной последовательности. GPT-3, самая популярная на сегодняшний день языковая модель, состоит из строгих декодеров. Они кодируют входные данные и предсказывают правильную следующую лексему (лексемы).

Вот две модели из библиотеки sentence-transformers от Hugging Face, которые вы можете использовать в дополнение к вкраплениям OpenAI:

Вы можете получить доступ к вкраплениям из обеих моделей одинаковым образом.

from sentence_transformers import SentenceTransformer


model = SentenceTransformer("<model-name>")
vector_embeddings = model.encode(“<input>”)

Мультимодальные вкрапления

Мультимодальные модели менее развиты, чем модели изображений и текстов. Они часто связывают изображения с текстом.

Наиболее полезным примером с открытым исходным кодом является CLIP VIT, модель преобразования изображения в текст. Вы можете получить доступ к вкраплениям CLIP VIT так же, как и к модели изображений, как показано в коде ниже.

# Load model directly
from transformers import AutoProcessor, AutoModelForZeroShotImageClassification


processor = AutoProcessor.from_pretrained("openai/clip-vit-large-patch14")
model = AutoModelForZeroShotImageClassification.from_pretrained("openai/clip-vit-large-patch14")
from PIL import Image


image = Image.open("<image path>")
# image = Resize(size=(256, 256))(image)


inputs = extractor(images=image, return_tensors="pt")
# print(inputs)


outputs = model(**inputs)
vector_embeddings = outputs[1][-1].squeeze()

Вкрапления для аудио

ИИ для аудио уделяется меньше внимания, чем ИИ для текста или изображений. Наиболее распространенным вариантом использования аудио является преобразование речи в текст для таких отраслей, как колл-центры, медицинские технологии и доступность. Одной из популярных моделей с открытым исходным кодом для преобразования речи в текст является Whisper от OpenAI. В приведенном ниже коде показано, как получить векторные вкрапления из модели преобразования речи в текст.

import torch
from transformers import AutoFeatureExtractor, WhisperModel
from datasets import load_dataset


model = WhisperModel.from_pretrained("openai/whisper-base")
feature_extractor = AutoFeatureExtractor.from_pretrained("openai/whisper-base")
ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
inputs = feature_extractor(ds[0]["audio"]["array"], return_tensors="pt")
input_features = inputs.input_features
decoder_input_ids = torch.tensor([[1, 1]]) * model.config.decoder_start_token_id
vector_embedding = model(input_features, decoder_input_ids=decoder_input_ids).last_hidden_state

Встраивания в видео

Встраивание видео является более сложной задачей, чем встраивание аудио или изображений. При работе с видео необходим мультимодальный подход, поскольку они включают в себя синхронизированные аудио и изображения. Одной из популярных видеомоделей является мультимодальный восприниматель от DeepMind. В этом руководстве для ноутбука показано, как использовать эту модель для классификации видео.

Чтобы получить вкрапления входных данных, используйте outputs[1][-1].squeeze() из кода, показанного в блокноте, вместо удаления выходных данных. Я выделяю этот фрагмент кода в функции autoencode.

def autoencode_video(images, audio):
     # only create entire video once as inputs
     inputs = {'image': torch.from_numpy(np.moveaxis(images, -1, 2)).float().to(device),
               'audio': torch.from_numpy(audio).to(device),
               'label': torch.zeros((images.shape[0], 700)).to(device)}
     nchunks = 128
     reconstruction = {}
     for chunk_idx in tqdm(range(nchunks)):
          image_chunk_size = np.prod(images.shape[1:-1]) // nchunks
          audio_chunk_size = audio.shape[1] // SAMPLES_PER_PATCH // nchunks
          subsampling = {
               'image': torch.arange(
                    image_chunk_size * chunk_idx, image_chunk_size * (chunk_idx + 1)),
               'audio': torch.arange(
                    audio_chunk_size * chunk_idx, audio_chunk_size * (chunk_idx + 1)),
               'label': None,
          }
     # forward pass
          with torch.no_grad():
               outputs = model(inputs=inputs, subsampled_output_points=subsampling)


          output = {k:v.cpu() for k,v in outputs.logits.items()}
          reconstruction['label'] = output['label']
          if 'image' not in reconstruction:
               reconstruction['image'] = output['image']
               reconstruction['audio'] = output['audio']
          else:
               reconstruction['image'] = torch.cat(
                    [reconstruction['image'], output['image']], dim=1)
               reconstruction['audio'] = torch.cat(
                    [reconstruction['audio'], output['audio']], dim=1)
          vector_embeddings = outputs[1][-1].squeeze()
# finally, reshape image and audio modalities back to original shape
     reconstruction['image'] = torch.reshape(reconstruction['image'], images.shape)
     reconstruction['audio'] = torch.reshape(reconstruction['audio'], audio.shape)
     return reconstruction


     return None

Хранение, индексация и поиск векторных вкраплений с помощью векторных баз данных

Теперь, когда мы поняли, что такое векторные вкрапления и как их генерировать с помощью различных мощных моделей вкраплений, следующий вопрос - как их хранить и использовать в своих интересах. Векторные базы данных - вот ответ.

Векторные базы данных, такие как Milvus и Zilliz Cloud, специально созданы для хранения, индексации и поиска в огромных массивах неструктурированных данных с помощью векторных вкраплений. Они также являются одной из наиболее важных инфраструктур для различных стеков ИИ.

Векторные базы данных обычно используют алгоритм приближенного ближайшего соседа (ANN) для расчета пространственного расстояния между вектором запроса и векторами, хранящимися в базе данных. Чем ближе расположены два вектора, тем более релевантными они являются. Затем алгоритм находит k ближайших соседей и предоставляет их пользователю.

Векторные базы данных популярны в таких областях применения, как расширенный поиск LLM (RAG), системы вопросов и ответов, рекомендательные системы, семантический поиск, поиск по сходству изображений, видео и аудио.

Чтобы узнать больше о векторных вкраплениях, неструктурированных данных и векторных базах данных, начните с серии " Векторная база данных 101".

Резюме

Векторы - мощный инструмент для работы с неструктурированными данными. Используя векторы, мы можем математически сравнивать различные фрагменты неструктурированных данных на основе семантического сходства. Выбор правильной модели векторного вложения очень важен для создания векторной поисковой системы для любого приложения.

В этом посте мы узнали, что векторные вкрапления - это внутреннее представление входных данных в нейронной сети. В результате они сильно зависят от архитектуры сети и данных, используемых для обучения модели. Для разных типов данных (например, изображений, текста и аудио) требуются особые модели. К счастью, многие предварительно обученные модели с открытым исходным кодом доступны для использования. В этом посте мы рассмотрели модели для пяти наиболее распространенных типов данных: изображений, текста, мультимодальных данных, аудио и видео. Кроме того, если вы хотите максимально эффективно использовать векторные вкрапления, наиболее популярным инструментом являются векторные базы данных.

Like the article? Spread the word

Продолжить чтение