Untersuchen Sie die Effektivität von Vektoreinbettungen bei der Umwandlung unstrukturierter, umfangreicher Textdaten in eine besser handhabbare, niedrigdimensionale Form, die wichtige semantische Beziehungen beibehält.
A QUICK SUMMARY – FOR THE BUSY ONES
Kontext und Problem:
Umsetzung:
Scrollen Sie nach unten, um die Implementierung von Vektoreinbettungen Schritt für Schritt genauer zu untersuchen.
TABLE OF CONTENTS
In dieser Serie untersuchen wir die Implementierung eines Vektorindex, der auf den Inhalten unserer Notion-Seiten unseres Unternehmens basiert und es uns ermöglicht, nicht nur nach relevanten Informationen zu suchen, sondern auch ein Sprachmodell in die Lage zu versetzen, unsere Fragen mit Notion als Wissensbasis direkt zu beantworten. In diesem Artikel werden wir uns auf die Theorie der Vektoreinbettung konzentrieren.
Zahlen, Vektoren und Diagramme sind echte Daten, sofern nicht anders angegeben
Notion ist mit seiner unendlichen Flexibilität perfekt für die Aufbewahrung unstrukturierter Notizen, strukturierter Datenbanken und allem dazwischen. Dank dieser Flexibilität ist das Hinzufügen von Inhalten einfach. Es ist in der Tat so einfach, dass wir etwas hinzufügen und hinzufügen und dann noch mehr hinzufügen, bis wir 5000 Seiten mit Sitzungsnotizen, temporären Notizen und Gott-weiß-was-Notizen haben.
Haben Sie dieses Problem in Ihrem Unternehmen? Zehntausende von Seiten in Notion, erstellt von Dutzenden von Menschen mit unterschiedlichen Ideen zur Benennung und Strukturierung von Daten. Sie fügen regelmäßig neue Seiten hinzu, nur um zu verhindern, dass Dinge verloren gehen, und dann... sind sie verloren. Du versuchst nach etwas zu suchen und du bekommst Seiten, die irgendwie zum Thema passen, aber die Frage nicht beantworten, einige Dinge, die nichts miteinander zu tun haben, eine zufällige Notiz von 2016 und eine leere Seite zur Sicherheit. Notion funktioniert wirklich auf mysteriöse Weise.
Wir können Unternehmen in zwei Gruppen einteilen: diejenigen vor ihrem gescheiterten Notion-Reorganisationsversuch und diejenigen danach. Wir können versuchen, alles zu bereinigen, neu zu organisieren und Tags hinzuzufügen, aber der Versuch, Tausende von Seiten zu bereinigen, wobei täglich neue hinzugefügt werden, ist zum Scheitern verurteilt. Deshalb haben wir beschlossen, dieses Problem mithilfe neuronaler Netze zu lösen. Unser Ziel war es, einen separaten Index zu erstellen, der es uns ermöglicht, alle Seiten in Notion effizient zu durchsuchen und diejenigen zu finden, die für unsere Anfrage tatsächlich relevant sind. Und wir haben es geschafft! (mit einigen Vorbehalten — mehr dazu am Ende der Serie)
Aber bevor wir dort ankommen, wollen wir uns mit den Technologien befassen, die wir benötigen werden.
Betrachten wir ein einfaches neuronales Netzwerk, das Text als Eingabe akzeptiert. Es könnte zum Beispiel ein Klassifikationsnetzwerk sein. Nehmen wir an, Sie möchten das Netzwerk so trainieren, dass es Texte über Füchse erkennt. Wie kann man einen Text so darstellen, dass ein neuronales Netzwerk daran arbeiten kann?
Der schnelle braune Fuchs springt über den faulen Hund
Neuronale Netze verstehen Vektoren und können mit ihnen arbeiten.
Nun, obwohl ein Vektor nur ein eindimensionaler Tensor ist und einfache neuronale Netze Vektoren als Eingabe haben können, funktionieren komplexere Architekturen, einschließlich der meisten Sprachmodelle, mit höherdimensionalen Tensoren. Wir vereinfachen ein bisschen, nur um auf den Punkt zu kommen.
Ein n-dimensionaler Vektor ist nur ein eindimensionales Array mit der Länge n. Der Text über den braunen Fuchs ist definitiv kein Vektor. Lass uns etwas dagegen tun. Eine Möglichkeit, den Text in Zahlen umzuwandeln, besteht darin, ein Wörterbuch zu erstellen und jedem Wort eine eindeutige ID zuzuweisen, etwa so (dies sind tatsächliche IDs aus dem Wörterbuch, das von den GPT-Modellen von OpenAI verwendet wird):
Sie haben vielleicht bemerkt, dass die Wörter 'the' und 'the' (mit Leerzeichen am Anfang) unterschiedliche IDs haben. Warum ist es Ihrer Meinung nach sinnvoll, diese als separate Einträge im Wörterbuch zu haben?
Also haben wir herausgefunden, wie man Text in einen Vektor umwandelt, großartig! Es gibt jedoch Probleme damit. Erstens, obwohl unser Beispiel einfach und klein ist, können echte Texte viel länger sein. Unser Vektor ändert die Dimensionalität basierend auf der Länge des Eingabetextes (was an sich schon ein Problem für einige einfache Architekturen neuronaler Netze sein kann), sodass wir uns bei langen Texten mit riesigen Vektoren auseinandersetzen müssen. Darüber hinaus ist es schwieriger, das neuronale Netzwerk erfolgreich mit Daten zu trainieren, die große Zahlen enthalten (ohne auf Details einzugehen, während neuronale Netze Berechnungen mit großen Zahlen problemlos durchführen, das Problem ist die Skala der Zahlen und das Potenzial für numerische Instabilität beim Training, wenn gradientenbasierte Optimierungsmethoden verwendet werden). Wir könnten versuchen, mit einer One-Hot-Kodierung (indem wir alle Einträge aus einem Wörterbuch nehmen und Einträgen, die nicht in unserem Text vorkommen, 0 zuweisen, und Einsen, die dies tun, 1), um einen Vektor mit konstanter Länge zu erhalten, der nur Einsen und Nullen enthält, aber das hilft uns nicht wirklich. Am Ende haben wir immer noch einen großen Vektor — dieses Mal ist er riesig, unabhängig von der Länge des Eingabetextes, und außerdem verlieren wir die Information über die Wortposition. Und zu guter Letzt: Was ist mit den Wörtern, die wir nicht in unserem Wörterbuch haben? In einigen Texten benötigen wir Silben oder sogar einzelne Buchstaben, um IDs zu erhalten, was den resultierenden Vektor noch länger und unübersichtlicher macht.
Die wörterbuchbasierten Vektoren werden in praktischen NLP-Anwendungen verwendet, z. B. als Eingaben für neuronale Netze. Die One-Hot-Kodierung wird ebenfalls verwendet, jedoch für andere Zwecke (z. B. wenn das Wörterbuch klein ist oder für Kategorisierungsprobleme).
Es gibt eine Sache, die unser Vektor könnte erzähle uns etwas über den Eingangstext, aber nicht - die Bedeutung. Wir könnten entscheiden, ob der Text von Füchsen handelt, indem wir einfach überprüfen, ob darin ein Element 21831 enthalten ist, aber was ist mit den Texten über „alles fressende Säugetiere, die zu mehreren Gattungen der Familie Canidae gehören“ oder über „Vulpes bengalensis“? Bedeutung kann auf viel mehr Arten vermittelt werden, als wir sie in einen einfachen Algorithmus oder eine Whitelist von Wörtern aufnehmen können (ich wette, Sie würden nicht auf die Idee kommen, Ihrem Wörterbuch „Bengalensis“ hinzuzufügen, oder?). Aus diesem Grund müssen wir, um sicherzugehen, den gesamten Text verarbeiten, auch wenn er Tausende von Wörtern lang ist. Die einzige Möglichkeit, zuverlässig zu entscheiden, ob es sich bei dem Text um Füchse handelt, besteht darin, den Vektor an das fortschrittliche und teure Sprachmodell weiterzugeben, um ihn zu verarbeiten und zu verstehen, was diese Wörter und die Beziehungen zwischen ihnen bedeuten. Oder ist es das?
Einbetten... was? Einfach ausgedrückt ist das Einbetten eine Möglichkeit, Daten in einem niederdimensionalen Raum darzustellen und gleichzeitig eine gewisse Beziehung zwischen Datenpunkten beizubehalten. Mit anderen Worten, das Einbetten ist eine kleinere Vektordarstellung eines größeren Vektors (oder allgemeiner: eines Tensors), der immer noch einige wichtige Informationen darüber enthält. Es kann algorithmisch berechnet werden, aber in Fällen wie unserem geschieht dies mit Hilfe neuronaler Netze.
Es gibt viele Möglichkeiten, die Dimensionalität der Daten zu reduzieren, wie Hauptkomponentenanalyse das schnell, deterministisch ist und in der Datenkomprimierung, Rauschreduzierung und vielen anderen Bereichen verwendet wird, oder T-sNE was hauptsächlich in der hochdimensionalen Datenvisualisierung und im nächsten Artikel dieser Serie verwendet wird;)
Das einfachste Beispiel wäre, unseren riesigen Vektor mit potenziell Tausenden von Dimensionen als nur eine Zahl darzustellen, die angibt, wie viel von Füchsen der Text handelt. Für den Satz über den springenden Fuchs würden wir wahrscheinlich so etwas bekommen:
0,89
Nicht sehr aufregend. In Wirklichkeit sind die Einbettungen etwas größer — je nach Anwendungsfall können sie Hunderte oder Tausende von Dimensionen haben.
Sie denken jetzt vielleicht: „Warte einen Moment. Tausende von Dimensionen? Es ist bestimmt nicht weniger als die wenigen Zahlen, die unseren springenden Fuchs repräsentieren, nicht wahr?“ In unserem Fall ja — die Einbettung wird tatsächlich größer als der wörterbuchbasierte Vektor. Aber dieser Vektor ist auch eine Einbettung eines riesigen, praktisch unendlichdimensionalen Vektors im Raum aller möglichen Texte. In diesem Sinne haben wir eine wörterbuchbasierte Einbettung, die für kurze Texte klein sein kann, aber nicht sehr nützlich ist, und eine leistungsstarke Einbettung, die zwar etwas größer ist, uns aber viel leichter extrahierbare Informationen über den Text bietet.
Einbettungen können aus vielen verschiedenen Datentypen berechnet werden: Bildern, Tönen, Texten usw. Jeder von ihnen ist nur ein großer Vektor oder eigentlich ein Tensor. Du kannst dir ein Bild als einen zweidimensionalen Tensor (eine Matrix) von Farbwerten vorstellen, so groß wie viele Pixel es in einem Bild gibt. Eine Sounddatei wird oft als Spektrogramm dargestellt, das auch ein zweidimensionaler Tensor ist.
In jedem Fall kodiert jede Dimension des, oft kleineren, Einbettungsvektors einen anderen Aspekt der Bedeutung des Elements.
Erwähnenswert ist auch, dass zwar im Prinzip jede Dimension der Einbettung einen Aspekt des Originals kodiert, es in den meisten Fällen jedoch nicht möglich ist, zu bestimmen, was genau jede Zahl in der Einbettung bedeutet. Die Idee des „Füchsens“ mag zwar in der Einbettung irgendwie erhalten bleiben, ist aber dem Einbettungsmodell fremd und wird wahrscheinlich nicht in einer einzigen Dimension kodiert, sondern auf eine viel kompliziertere und nuanciertere Art und Weise.
Da Vektoren auch Punkte in n-dimensionalen Räumen sind, können wir uns die relativen Positionen in diesen Räumen als semantische Beziehungen vorstellen. Je näher die Einbettungsvektoren beieinander liegen, desto ähnlicher sind sich die Datenpunkte. Bei Bildeinbettungen wären Bilder von Hunden sehr nah beieinander, ziemlich nah an Bildern von Füchsen, aber weit weg von Bildern von Raumschiffen. Das Gleiche gilt für Texteinbettungen.
Mit „näher“ meinen wir nicht unbedingt den niedrigsten euklidischen Abstand, sondern den engsten Winkel, gemessen an der Kosinusähnlichkeit. Der Grund dafür ist, dass im hochdimensionalen Raum die Entfernungen oder die Größen von Vektoren viel weniger aussagekräftig werden. Die tatsächlichen semantischen Unterschiede sind in den Winkeln oder Richtungen der Vektoren kodiert. Die Größen können auch nützliche Informationen wie den Schwerpunkt oder die Frequenz enthalten, aber sie sind aus folgenden Gründen schwieriger zu verwenden „Der Fluch der Dimensionalität“ - eine Reihe von Phänomenen, die sich aus der Erhöhung der Anzahl von Dimensionen ergeben, wie z. B. die schnelle Zunahme des Raumvolumens.
All dies gilt zwar für die Arten von Einbettungen, über die wir in dieser Serie sprechen (und die uns wichtig sind), aber in Wirklichkeit kodieren nicht alle Einbettungsmethoden semantische Informationen über das Original. Was in den Einbettungswerten kodiert ist und welche Beziehungen zwischen Datenpunkten bestehen, hängt vom spezifischen Trainingsprozess des Einbettungsmodells und seinem Zweck ab. Sie können sich leicht eine Einbettung vorstellen, die aus einem Bild berechnet wird, das einige Aspekte der Farbpalette erfasst, oder eine Audioeinbettung, die die Atmosphäre statt semantischer Inhalte usw. kodiert.
Wie bereits erwähnt, berechnen wir solche Einbettungen mit Hilfe eines neuronalen Netzwerks. Es gibt viele Modelle, die das von einfache und kleine Modelle Sie können auf Ihrem Computer große, mehrsprachige, im Handel erhältliche Modelle ausführen wie Die ADA von OpenAI. In unserem Fall haben wir uns aus Gründen der Benutzerfreundlichkeit und um die bestmögliche Leistung zu erzielen, für Letzteres entschieden. Unten sehen Sie ein Fragment der Texteinbettung unseres Fox-Textes, das mit dem ADA-Einbettungsmodell von OpenAI berechnet wurde. Die spezielle Version des ADA-Modells, die wir verwendet haben, erzeugt 1,500 lange Vektoren:
0,0035436812, 0,0083188545, -0,014174725,..., -0,031340215, 0,018409548, -0,041342948
Ein langer Vektor wie dieser ist für uns an sich nicht besonders nützlich. Wir können weder wirklich interessante Informationen daraus „lesen“, noch können wir anhand eines bloßen Anschauens feststellen, ob es sich um Füchse handelt. Wir können jedoch die Beziehungen zwischen Einbettungen verschiedener Texte zu unserem Vorteil nutzen, um beispielsweise Füchse zu finden oder eine effiziente semantische Suche zu implementieren. Aber das ist ein Thema für den nächsten Artikel.
Our promise
Every year, Brainhub helps 750,000+ founders, leaders and software engineers make smart tech decisions. We earn that trust by openly sharing our insights based on practical software engineering experience.
Authors
Read next
Popular this month