Wie man die richtigen Vektoreinbettungen erhält
Dieser Artikel wurde ursprünglich in The New Stack veröffentlicht und wird hier mit Genehmigung wiederveröffentlicht.
Eine umfassende Einführung in Vektoreinbettungen und wie man sie mit gängigen Open-Source-Modellen erzeugt.
Bild von Денис Марчук von Pixabay
Vektoreinbettungen sind bei der Arbeit mit semantischer Ähnlichkeit von entscheidender Bedeutung. Ein Vektor ist jedoch einfach eine Reihe von Zahlen; eine Vektoreinbettung ist eine Reihe von Zahlen, die Eingabedaten darstellen. Mit Hilfe von Vektoreinbettungen können wir unstrukturierte Daten strukturieren oder mit jeder Art von Daten arbeiten, indem wir sie in eine Reihe von Zahlen umwandeln. Dieser Ansatz ermöglicht es uns, mathematische Operationen mit den Eingabedaten durchzuführen, anstatt uns auf qualitative Vergleiche zu verlassen.
Vektoreinbettungen sind für viele Aufgaben von Bedeutung, insbesondere für die semantische Suche. Es ist jedoch von entscheidender Bedeutung, dass man die geeigneten Vektoreinbettungen erhält, bevor man sie verwendet. Wenn Sie zum Beispiel ein Bildmodell verwenden, um Text zu vektorisieren, oder umgekehrt, werden Sie wahrscheinlich schlechte Ergebnisse erzielen.
In diesem Beitrag erfahren Sie, was Vektoreinbettungen bedeuten, wie Sie mit verschiedenen Modellen die richtigen Vektoreinbettungen für Ihre Anwendungen erzeugen und wie Sie Vektoreinbettungen mit Vektordatenbanken wie Milvus und Zilliz Cloud optimal nutzen können.
Wie werden Vektoreinbettungen erstellt?
Nachdem wir nun die Bedeutung von Vektoreinbettungen verstanden haben, wollen wir lernen, wie sie funktionieren. Eine Vektoreinbettung ist die interne Repräsentation von Eingabedaten in einem Deep-Learning-Modell, auch bekannt als Einbettungsmodelle oder ein tiefes neuronales Netzwerk. Wie extrahieren wir also diese Informationen?
Wir erhalten Vektoren, indem wir die letzte Schicht entfernen und die Ausgabe der vorletzten Schicht nehmen. Die letzte Schicht eines neuronalen Netzes gibt in der Regel die Vorhersage des Modells aus, daher nehmen wir die Ausgabe der vorletzten Schicht. Die Vektoreinbettung sind die Daten, die der Vorhersageschicht eines neuronalen Netzes zugeführt werden.
Die Dimensionalität einer Vektoreinbettung entspricht der Größe der vorletzten Schicht des Modells und ist somit austauschbar mit der Größe oder Länge des Vektors. Übliche Vektordimensionen sind 384 (generiert von Sentence Transformers Mini-LM), 768 (von Sentence Transformers MPNet), 1.536 (von OpenAI) und 2.048 (von ResNet-50).
Was bedeutet eine Vektoreinbettung?
Jemand fragte mich einmal nach der Bedeutung der einzelnen Dimensionen in einer Vektoreinbettung. Die kurze Antwort lautet: nichts. Eine einzelne Dimension in einer Vektoreinbettung hat keine Bedeutung, da sie zu abstrakt ist, um ihre Bedeutung zu bestimmen. Nimmt man jedoch alle Dimensionen zusammen, ergeben sie die semantische Bedeutung der Eingabedaten.
Die Dimensionen des Vektors sind hochrangige, abstrakte Repräsentationen verschiedener Attribute. Welche Attribute dargestellt werden, hängt von den Trainingsdaten und dem Modell selbst ab. Text- und Bildmodelle erzeugen unterschiedliche Einbettungen, da sie für grundlegend unterschiedliche Datentypen trainiert wurden. Selbst unterschiedliche Textmodelle erzeugen unterschiedliche Einbettungen. Manchmal unterscheiden sie sich in der Größe, ein anderes Mal in den Attributen, die sie darstellen. Ein Modell, das für juristische Daten trainiert wurde, lernt beispielsweise andere Dinge als eines, das für Daten aus dem Gesundheitswesen trainiert wurde. Ich habe dieses Thema in meinem Beitrag Vergleich von Vektoreinbettungen untersucht.
Erzeugen der richtigen Vektoreinbettungen
Wie erhält man die richtigen Vektoreinbettungen? Alles beginnt damit, die Art der Daten zu bestimmen, die Sie einbetten möchten. Dieser Abschnitt behandelt die Einbettung von fünf verschiedenen Datentypen: Bilder, Text, Audio, Videos und multimodale Daten. Alle Modelle, die wir hier vorstellen, sind quelloffen und stammen von Hugging Face oder PyTorch.
Bildeinbettungen
Die Bilderkennung erlebte 2012 mit dem Erscheinen von AlexNet einen wahren Höhenflug. Seitdem hat es im Bereich der Computer Vision zahlreiche Fortschritte gegeben. Das neueste bemerkenswerte Bilderkennungsmodell ist ResNet-50, ein tiefes Residualnetz mit 50 Schichten, das auf der früheren ResNet-34-Architektur basiert.
Residuale neuronale Netze (ResNet) lösen das Problem des verschwindenden Gradienten in tiefen neuronalen Faltungsnetzen mit Hilfe von Shortcut-Verbindungen. Diese Verbindungen ermöglichen es, dass die Ausgabe von früheren Schichten direkt an spätere Schichten weitergeleitet wird, ohne alle Zwischenschichten zu durchlaufen, wodurch das Problem des verschwindenden Gradienten vermieden wird. Durch dieses Design ist ResNet weniger komplex als VGGNet (Visual Geometry Group), ein früheres, sehr leistungsfähiges neuronales Faltungsnetz.
Ich empfehle zwei ResNet-50-Implementierungen als Beispiele: ResNet 50 auf Hugging Face und ResNet 50 auf PyTorch Hub. Während die Netze gleich sind, unterscheidet sich das Verfahren zur Gewinnung von Einbettungen.
Das folgende Codebeispiel zeigt, wie PyTorch verwendet wird, um Vektoreinbettungen zu erhalten. Zunächst laden wir das Modell aus PyTorch Hub. Als nächstes entfernen wir die letzte Schicht und rufen .eval()
auf, um das Modell anzuweisen, sich so zu verhalten, als würde es für die Inferenz laufen. Dann erzeugt die Funktion embed
die Vektoreinbettung.
# 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 verwendet einen etwas anderen Aufbau. Der folgende Code zeigt, wie man eine Vektoreinbettung von Hugging Face erhält. Zunächst benötigen wir einen Merkmalsextraktor und ein Modell aus der Bibliothek transformers
. Wir werden den Feature Extractor verwenden, um Eingaben für das Modell zu erhalten, und das Modell verwenden, um Ausgaben zu erhalten und den letzten versteckten Zustand zu extrahieren.
# 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()
Texteinbettungen
Ingenieure und Forscher haben seit der Erfindung der KI mit natürlicher Sprache und KI experimentiert. Zu den frühesten Experimenten gehören:
- ELIZA, der erste Chatbot für KI-Therapeuten.
- John Searles Chinese Room, ein Gedankenexperiment, in dem untersucht wird, ob die Fähigkeit, zwischen Chinesisch und Englisch zu übersetzen, ein Verständnis der Sprache voraussetzt.
- Regelbasierte Übersetzungen zwischen Englisch und Russisch.
Der Umgang der KI mit natürlicher Sprache hat sich gegenüber ihrer regelbasierten Einbettung erheblich weiterentwickelt. Ausgehend von primären neuronalen Netzen fügten wir über RNNs Rekursionsbeziehungen hinzu, um zeitliche Schritte verfolgen zu können. Danach haben wir Transformatoren verwendet, um das Problem der Sequenztransduktion zu lösen.
Transformatoren bestehen aus einem Encoder, der eine Eingabe in eine Matrix kodiert, die den Zustand darstellt, einer Aufmerksamkeitsmatrix und einem Decoder. Der Dekodierer dekodiert den Zustand und die Aufmerksamkeitsmatrix, um das korrekte nächste Token zum Abschluss der Ausgabesequenz vorherzusagen. GPT-3, das bisher populärste Sprachmodell, besteht aus strengen Decodern. Sie kodieren die Eingabe und sagen das/die richtige(n) nächste(n) Token voraus.
Hier sind zwei Modelle aus der sentence-transformers
Bibliothek von Hugging Face, die Sie zusätzlich zu OpenAIs Einbettungen verwenden können:
- MiniLM-L6-v2: ein 384-dimensionales Modell
- MPNet-Base-V2: ein 768-dimensionales Modell
Sie können auf die Einbettungen beider Modelle auf die gleiche Weise zugreifen.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("<model-name>")
vector_embeddings = model.encode(“<input>”)
Multimodale Einbettungen
Multimodale Modelle sind weniger gut entwickelt als Bild- oder Textmodelle. Sie verknüpfen oft Bilder mit Text.
Das nützlichste Open-Source-Beispiel ist CLIP VIT, ein Bild-Text-Modell. Sie können auf die Einbettungen von CLIP VIT auf die gleiche Weise zugreifen wie auf ein Bildmodell, wie im unten stehenden Code gezeigt.
# 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()
Audio-Einbettungen
Der künstlichen Intelligenz für Audio wurde bisher weniger Aufmerksamkeit geschenkt als der künstlichen Intelligenz für Text oder Bilder. Der häufigste Anwendungsfall für Audio ist Sprache-zu-Text für Branchen wie Callcenter, Medizintechnik und Barrierefreiheit. Ein beliebtes Open-Source-Modell für Sprache-zu-Text ist Whisper von OpenAI. Der folgende Code zeigt, wie man Vektoreinbettungen aus dem Sprache-zu-Text-Modell erhält.
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
Video-Einbettungen
Videoeinbettungen sind komplexer als Audio- oder Bildeinbettungen. Bei der Arbeit mit Videos ist ein multimodaler Ansatz erforderlich, da sie synchronisierte Töne und Bilder enthalten. Ein beliebtes Videomodell ist der multimodale Perceiver von DeepMind. Dieses Notebook-Tutorial zeigt, wie man das Modell zur Klassifizierung eines Videos verwendet.
Um die Einbettungen der Eingaben zu erhalten, verwenden Sie outputs[1][-1].squeeze()
aus dem im Notizbuch gezeigten Code, anstatt die Ausgaben zu löschen. Ich hebe diesen Codeschnipsel in der Funktion autoencode
hervor.
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
Speichern, Indizieren und Suchen von Vektoreinbettungen mit Vektordatenbanken
Da wir nun wissen, was Vektoreinbettungen sind und wie man sie mit verschiedenen leistungsstarken Einbettungsmodellen erzeugt, stellt sich die nächste Frage, wie man sie speichern und nutzen kann. Vektordatenbanken sind die Antwort.
Vektordatenbanken wie Milvus und Zilliz Cloud wurden speziell für die Speicherung, Indizierung und Suche in riesigen Datensätzen mit unstrukturierten Daten durch Vektoreinbettungen entwickelt. Sie sind auch eine der wichtigsten Infrastrukturen für verschiedene KI-Stacks.
Vektordatenbanken verwenden in der Regel den Algorithmus "Approximate Nearest Neighbor" (ANN), um den räumlichen Abstand zwischen dem Abfragevektor und den in der Datenbank gespeicherten Vektoren zu berechnen. Je näher die beiden Vektoren beieinander liegen, desto relevanter sind sie. Dann findet der Algorithmus die besten k nächsten Nachbarn und liefert sie dem Nutzer.
Vektordatenbanken sind in Anwendungsfällen wie LLM Retrieval Augmented Generation (RAG), Frage- und Antwortsystemen, Empfehlungssystemen, semantischen Suchen und Bild-, Video- und Audio-Ähnlichkeitssuchen beliebt.
Wenn Sie mehr über Vektoreinbettungen, unstrukturierte Daten und Vektordatenbanken erfahren möchten, sollten Sie mit der Serie Vector Database 101 beginnen.
Zusammenfassung
Vektoren sind ein leistungsstarkes Werkzeug für die Arbeit mit unstrukturierten Daten. Mithilfe von Vektoren können wir verschiedene Teile von unstrukturierten Daten auf der Grundlage semantischer Ähnlichkeit mathematisch vergleichen. Die Wahl des richtigen Vektoreinbettungsmodells ist entscheidend für den Aufbau einer Vektorsuchmaschine für jede Anwendung.
In diesem Beitrag haben wir gelernt, dass Vektoreinbettungen die interne Repräsentation von Eingabedaten in einem neuronalen Netzwerk sind. Daher hängen sie in hohem Maße von der Netzwerkarchitektur und den zum Trainieren des Modells verwendeten Daten ab. Verschiedene Datentypen (z. B. Bilder, Text und Audio) erfordern spezifische Modelle. Glücklicherweise gibt es viele vortrainierte Open-Source-Modelle, die verwendet werden können. In diesem Beitrag haben wir Modelle für die fünf häufigsten Datentypen behandelt: Bilder, Text, multimodale Daten, Audio und Video. Wenn Sie die Vektoreinbettungen optimal nutzen möchten, sind Vektordatenbanken das beliebteste Werkzeug.
- Wie werden Vektoreinbettungen erstellt?
- Was bedeutet eine Vektoreinbettung?
- Erzeugen der richtigen Vektoreinbettungen
- Speichern, Indizieren und Suchen von Vektoreinbettungen mit Vektordatenbanken
- Zusammenfassung
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word