Angesichts der wachsenden Zahl verfügbarer Einbettungsmodelle kann die Auswahl des richtigen Modells für Ihre Machine-Studying-Anwendungen eine Herausforderung sein. Zum Glück ist das MTBB-Rangliste bietet eine umfassende Auswahl an Rating-Metriken für verschiedene Aufgaben der Verarbeitung natürlicher Sprache.
Wenn Sie die Web site besuchen, werden Sie feststellen, dass die fünf wichtigsten Einbettungsmodelle Generative Pre-trained Transformers (GPTs) sind. Dies könnte Sie zu der Annahme verleiten, dass GPT-Modelle am besten für Einbettungen geeignet sind. Aber ist das wirklich wahr? Lassen Sie uns ein Experiment durchführen, um das herauszufinden.
Einbettungen sind Tensordarstellungen von Texten, die Textual content-Token-IDs konvertieren und in einen Tensorraum projizieren.
Durch die Eingabe von Textual content in ein neuronales Netzwerkmodell und die Durchführung eines Vorwärtsdurchlaufs können Sie Einbettungsvektoren erhalten. Der eigentliche Prozess ist jedoch etwas komplexer. Lassen Sie es uns Schritt für Schritt aufschlüsseln:
- Wandeln Sie den Textual content in Token-IDs um
- Übergeben Sie die Token-IDs an ein neuronales Netzwerk
- Gibt die Ausgaben des neuronalen Netzwerks zurück
Im ersten Schritt werde ich dazu einen Tokenizer verwenden. model_inputs
ist die Tensordarstellung des Textinhalts, "some questions."
.
from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.1")
messages = (
{
"position": "person",
"content material": "some questions.",
},
)
encodeds = tokenizer.apply_chat_template(messages, return_tensors="pt")
model_inputs = encodeds.to("cuda")
Der zweite Schritt ist unkompliziert, die Vorwärtsübergabe model_inputs
in ein neuronales Netzwerk. Auf die Protokolle der generierten Token kann über zugegriffen werden .logits
. torch.no_grad()
bedeutet, dass ich nicht möchte, dass die Modellgewichte aktualisiert werden, da sich das Modell im Inferenzmodus befindet.
import torchwith torch.no_grad():
return mannequin(model_inputs).logits
Der dritte Schritt ist etwas knifflig. GPT-Modelle sind nur Decoder-Modelle und ihre Token-Generierung ist autoregressiv. Einfach ausgedrückt: Der letzte Token eines abgeschlossenen Satzes hat alle vorhergehenden Token im Satz gesehen. Daher enthält die Ausgabe des letzten Tokens alle Affinitätswerte (Aufmerksamkeiten) der vorhergehenden Token.
Bingo! Aufgrund des Aufmerksamkeitsmechanismus in den Transformatoren interessiert Sie am meisten das letzte Token.
Die Ausgabedimension der in Hugging Face implementierten GPTs ist (Stapelgröße, Eingabetokengröße, Anzahl des Vokabulars). Um die letzte Token-Ausgabe aller Stapel zu erhalten, kann ich einen Tensor-Slice durchführen.
import torch
with torch.no_grad():
return mannequin(model_inputs).logits(:, -1, :)
Um die Qualität dieser GPT-Einbettungen zu messen, können Sie Folgendes verwenden: Kosinusähnlichkeit. Je höher die Kosinusähnlichkeit, desto ähnlicher ist die semantische Bedeutung der Sätze.
import torch
def compute_cosine_similarity(vec1, vec2):
cos = torch.nn.CosineSimilarity(dim=1, eps=1e-6)
return cos(vec1, vec2)
Lassen Sie uns einige Hilfsfunktionen erstellen, die es uns ermöglichen, die Liste der Frage- und Antwortpaare zu durchlaufen und das Ergebnis anzuzeigen. Mistral 7b v0.1 anweisen Für dieses Experiment wird eines der großartigsten Open-Supply-Modelle verwendet.
import torch
from termcolor import coloured
from transformers import AutoModelForCausalLM, AutoTokenizermannequin = AutoModelForCausalLM.from_pretrained(
"mistralai/Mistral-7B-Instruct-v0.1"
)
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.1")
def generate_last_token_embeddings(query, max_new_tokens=30):
messages = (
{
"position": "person",
"content material": query,
},
)
encodeds = tokenizer.apply_chat_template(messages, return_tensors="pt")
model_inputs = encodeds.to("cuda")
with torch.no_grad():
return mannequin(model_inputs).logits(:, -1, :)
def get_similarities(questions, solutions):
for query in questions:
for reply in solutions:
q_embedding, a_embedding = (
generate_last_token_embeddings(query),
generate_last_token_embeddings(reply),
)
similarity = compute_cosine_similarity(q_embedding, a_embedding)
print(coloured(f"query: {query} and ans: {reply}", "inexperienced"))
print(coloured(f"end result: {similarity}", "blue"))
questions = ("The place is the headquarter of OpenAI?", "What's GPU?")
solutions = (
"OpenAI is predicated at San Francisco.",
"A graphics processing unit (GPU) is an digital circuit that may carry out mathematical calculations rapidly",
)
Für das erste Frage-Antwort-Paar:
- Frage: „Was ist der Hauptsitz von OpenAI?“
- Antwort: „OpenAI hat seinen Sitz in San Francisco.“
- Kosinusähnlichkeit: 0,96
Zum zweiten Frage-Antwort-Paar:
- Frage: „Was ist GPU?“
- Antwort: „Eine Grafikverarbeitungseinheit (GPU) ist eine elektronische Schaltung, die mathematische Berechnungen schnell durchführen kann.“
- Kosinusähnlichkeit: 0,94
Für ein irrelevantes Paar:
- Frage: „Wo ist der Hauptsitz von OpenAI?“
- Antwort: „Eine Grafikverarbeitungseinheit (GPU) ist eine elektronische Schaltung, die mathematische Berechnungen schnell durchführen kann.“
- Kosinusähnlichkeit: 0,90
Für das schlechteste Paar:
- Frage: „Was ist GPU?“
- Antwort: „OpenAI hat seinen Sitz in San Francisco.“
- Kosinusähnlichkeit: 0,93
Diese Ergebnisse deuten darauf hin, dass die Verwendung von GPT-Modellen, in diesem Fall Mistral 7b Instruct v0.1, als Einbettungsmodelle möglicherweise keine guten Ergebnisse bei der Unterscheidung zwischen relevanten und irrelevanten Paaren liefert. Aber warum gehören GPT-Modelle immer noch zu den Prime 5 Einbettungsmodellen?
tokenizer = AutoTokenizer.from_pretrained("intfloat/e5-mistral-7b-instruct")
mannequin = AutoModelForCausalLM.from_pretrained(
"intfloat/e5-mistral-7b-instruct"
)
Wiederholen des gleichen Bewertungsverfahrens mit einem anderen Modell, e5-mistral-7b-instruct
, einem der besten Open-Supply-Modelle aus der MTEB-Bestenliste, das anhand von Mistral 7b Instruct verfeinert wurde, entdecke ich, dass die Kosinusähnlichkeit für die relevanten Fragen und Paare 0,88 bzw. 0,84 für OpenAI- und GPU-Fragen beträgt. Für die irrelevanten Frage-Antwort-Paare sinkt die Ähnlichkeit auf 0,56 und 0,67. Dieser Befund legt nahe e5-mistral-7b-instruct
ist ein stark verbessertes Modell für Einbettungen. Was macht eine solche Verbesserung aus?
Eintauchen in die Papier hinter e5-mistral-7b-instruct
der Schlüssel ist die Verwendung von Kontrastverlust um das Mistral-Modell weiter zu verfeinern.
Im Gegensatz zu GPTs, die mithilfe trainiert oder weiter verfeinert werden Kreuzentropieverlust Bei vorhergesagten und markierten Token zielt der Kontrastverlust darauf ab, den Abstand zwischen negativen Paaren zu maximieren und den Abstand zwischen den positiven Paaren zu minimieren.
Das Blogeintrag behandelt dieses Konzept ausführlicher. Der sim
Die Funktion berechnet den Kosinusabstand zwischen zwei Vektoren. Beim Kontrastverlust stellen die Nenner den Kosinusabstand zwischen positiven Beispielen und negativen Beispielen dar. Der Grundgedanke hinter dem kontrastiven Verlust besteht darin, dass wir möchten, dass ähnliche Vektoren so nahe wie möglich an 1 liegen, da log(1) = 0 den optimalen Verlust darstellt.
In diesem Beitrag habe ich auf eine häufige Gefahr bei der Verwendung von GPTs als Einbettungsmodelle ohne Feinabstimmung hingewiesen. Meine Bewertung legt nahe, dass die Einbettungen durch die Feinabstimmung von GPTs mit Kontrastverlust aussagekräftiger und differenzierter sein können. Indem Sie die Stärken und Grenzen von GPT-Modellen verstehen und benutzerdefinierte Verluste wie Kontrastverluste nutzen, können Sie fundiertere Entscheidungen bei der Auswahl und Verwendung von Einbettungsmodellen für Ihre maschinellen Lernprojekte treffen. Ich hoffe, dieser Beitrag hilft Ihnen bei der sinnvollen Auswahl von GPT-Modellen für Ihre Anwendungen und freue mich auf Ihr Suggestions! 🙂 🙂