Ähnlichkeitssuche, Teil 1: kNN und invertierter Dateiindex

0
27


Einführung in die Ähnlichkeitssuche mit kNN und ihre Beschleunigung mit invertierter Datei.

Ähnlichkeitssuche ist ein Drawback, bei dem das Ziel einer Abfrage darin besteht, unter allen Datenbankdokumenten die Dokumente zu finden, die ihr am ähnlichsten sind.

Einführung

In der Datenwissenschaft kommt die Ähnlichkeitssuche häufig im NLP-Bereich, in Suchmaschinen oder Empfehlungssystemen vor, wo die relevantesten Dokumente oder Elemente für eine Abfrage abgerufen werden müssen. Normalerweise werden Dokumente oder Gegenstände in Kind von Texten oder Bildern dargestellt. Algorithmen des maschinellen Lernens können jedoch nicht direkt mit Rohtexten oder Bildern arbeiten, weshalb Dokumente und Elemente normalerweise vorverarbeitet und als gespeichert werden Vektoren von Zahlen.

Manchmal kann jede Komponente eines Vektors eine semantische Bedeutung speichern. In diesem Fall werden diese Darstellungen auch aufgerufen Einbettungen. Solche Einbettungen können Hunderte von Dimensionen haben und ihre Menge kann bis zu Millionen erreichen! Aufgrund dieser großen Anzahl muss jedes Informationsabfragesystem in der Lage sein, relevante Dokumente schnell zu erkennen.

Beim maschinellen Lernen wird ein Vektor auch als an bezeichnet Objekt oder Punkt.

Index

Um die Suchleistung zu beschleunigen, wird auf der Grundlage der Datensatzeinbettungen eine spezielle Datenstruktur aufgebaut. Eine solche Datenstruktur heißt Index. Auf diesem Gebiet wurde viel geforscht und viele Arten von Indizes entwickelt. Bevor Sie einen Index für eine bestimmte Aufgabe auswählen, müssen Sie verstehen, wie er unter der Haube funktioniert, da jeder Index einem anderen Zweck dient und seine eigenen Vor- und Nachteile mit sich bringt.

In diesem Artikel werfen wir einen Blick auf den naivsten Ansatz – kNN. Basierend auf kNN wechseln wir zu invertierte Datei — ein Index für eine skalierbarere Suche, der den Suchvorgang um ein Vielfaches beschleunigen kann.

kNN

kNN ist der einfachste und naivste Algorithmus für die Ähnlichkeitssuche. Betrachten Sie einen Datensatz mit Vektoren und einen neuen Abfragevektor Q. Wir möchten die Spitze finden ok Datensatzvektoren, die am ähnlichsten sind Q. Der erste Aspekt, über den man nachdenken muss, ist, wie man eine Ähnlichkeit (Abstand) zwischen zwei Vektoren misst. Tatsächlich gibt es dafür mehrere Ähnlichkeitsmetriken. Einige davon sind in der folgenden Abbildung dargestellt.

1*VYBziJJO
Ähnlichkeitsmetriken

Ausbildung

kNN ist einer der wenigen Algorithmen im maschinellen Lernen, der keine Trainingsphase erfordert. Nachdem wir eine geeignete Metrik ausgewählt haben, können wir direkt Vorhersagen treffen.

Inferenz

Für ein neues Objekt berechnet der Algorithmus vollständig die Entfernungen zu allen anderen Objekten. Danach wird es gefunden ok Objekte mit den kleinsten Abständen und gibt sie als Antwort zurück.

kNN-Workflow

Durch die Überprüfung der Abstände zu allen Datensatzvektoren garantiert kNN natürlich 100 % genaue Ergebnisse. Allerdings ist ein solcher Brute-Drive-Ansatz im Hinblick auf die Zeitleistung sehr ineffizient. Wenn ein Datensatz besteht aus N Vektoren mit M Dimensionen, dann für jede von N Vektoren O(m) Es wird Zeit benötigt, die Entfernung dazu anhand einer Abfrage zu berechnen Q was dazu führt O(mn) Gesamtzeitkomplexität. Wie wir später sehen werden, gibt es effizientere Methoden.

Darüber hinaus gibt es keinen Komprimierungsmechanismus für die Originalvektoren. Stellen Sie sich einen Datensatz mit Milliarden von Objekten vor. Es wäre wahrscheinlich unmöglich, sie alle im RAM zu speichern!

1*7e8z4CysR5sDmVpm81RQ8g
kNN-Leistung. Eine 100-prozentige Genauigkeit und keine Trainingsphase führen zu einer umfassenden Suche während der Inferenz und einer speicherfreien Komprimierung von Vektoren. Hinweis: Diese Artwork von Diagramm zeigt den relativen Vergleich verschiedener Algorithmen. Abhängig von der State of affairs und den gewählten Hyperparametern kann die Leistung variieren.

Anwendung

kNN hat einen begrenzten Anwendungsbereich und sollte nur in einem der folgenden Szenarien verwendet werden:

  • Die Größe des Datensatzes bzw. die Einbettungsdimensionalität ist relativ gering. Dieser Aspekt stellt sicher, dass der Algorithmus weiterhin schnell arbeitet.
  • Die erforderliche Genauigkeit des Algorithmus muss 100 % betragen. In Bezug auf die Genauigkeit gibt es keinen anderen Algorithmus für die nächsten Nachbarn, der kNN übertreffen kann.

Die Erkennung einer Particular person anhand ihrer Fingerabdrücke ist ein Beispiel für ein Drawback, bei dem 100-prozentige Genauigkeit erforderlich ist. Wenn die Particular person eine Straftat begangen und ihre Fingerabdrücke hinterlassen hat, ist es wichtig, nur die richtigen Ergebnisse abzurufen. Andernfalls, wenn das System nicht 100 % zuverlässig ist, kann eine andere Particular person einer Straftat für schuldig befunden werden, was einen sehr schwerwiegenden Fehler darstellt.

Grundsätzlich gibt es zwei Möglichkeiten, kNN zu verbessern (auf die wir später noch eingehen werden):

  • Reduzieren Sie den Suchumfang.
  • Reduzieren Sie die Dimensionalität der Vektoren.

Wenn Sie einen dieser beiden Ansätze verwenden, werden wir keine erneute umfassende Suche durchführen. Solche Algorithmen werden aufgerufen ungefähre nächste Nachbarn (ANN) denn sie garantieren keine 100 % genauen Ergebnisse.

Invertierter Dateiindex

„Invertierter Index(auch als a bezeichnet Beitragsliste, Buchungsdateioder invertierte Datei ) ist ein Datenbankindex, der eine Zuordnung von Inhalten wie Wörtern oder Zahlen zu seinen Positionen in einer Tabelle oder in einem Dokument oder einer Reihe von Dokumenten speichert“ – Wikipedia

Beim Durchführen einer Abfrage wird die Hash-Funktion der Abfrage berechnet und zugeordnete Werte aus der Hash-Tabelle übernommen. Jeder dieser zugeordneten Werte enthält einen eigenen Satz potenzieller Kandidaten, die dann vollständig auf die Bedingung geprüft werden, dass sie der nächste Nachbar für die Abfrage sind. Dadurch wird der Suchumfang aller Datenbankvektoren reduziert.

1*CSwHz4IlVnqufq1QdmMtVg
Invertierter Dateiindex-Workflow

Abhängig davon, wie Hash-Funktionen berechnet werden, gibt es unterschiedliche Implementierungen dieses Index. Die Implementierung, die wir uns ansehen werden, ist diejenige, die verwendet wird Voronoi-Diagramme(oder Dirichlet-Tessellation ).

Ausbildung

Die Idee des Algorithmus besteht darin, mehrere sich nicht überschneidende Regionen zu erstellen, zu denen jeder Datensatzpunkt gehört. Jede Area hat ihren eigenen Schwerpunkt, der auf das Zentrum dieser Area zeigt.

Manchmal Voronoi-Regionen werden als bezeichnet Zellenoder Partitionen.

1*W7M4FWR9lFw0HVq4Pz81 g
Beispiel eines Voronoi-Diagramms. Weiße Punkte sind Zentren jeweiliger Partitionen, die eine Reihe von Kandidaten enthalten.

Die Haupteigenschaft von Voronoi-Diagrammen besteht darin, dass der Abstand von einem Schwerpunkt zu jedem Punkt seiner Area kleiner ist als der Abstand von diesem Punkt zu einem anderen Schwerpunkt.

Inferenz

Wenn ein neues Objekt angegeben wird, werden die Abstände zu allen Schwerpunkten der Voronoi-Partitionen berechnet. Dann wird der Schwerpunkt mit dem geringsten Abstand ausgewählt und die in dieser Partition enthaltenen Vektoren werden dann als Kandidaten genommen.

1*P Ul4rrSHg6yLlf2YFQr0w
Mit einer bestimmten Abfrage suchen wir nach dem nächstgelegenen Schwerpunkt (in der grünen Zone gelegen).

Letztendlich durch die Berechnung der Abstände zu den Kandidaten und die Auswahl der Spitze ok Wenn der nächstgelegene von ihnen angezeigt wird, wird die endgültige Antwort zurückgegeben.

1*K35 t1s15atuH1xV KSQDQ
Den nächsten Nachbarn in der ausgewählten Area finden

Wie Sie sehen, ist dieser Ansatz viel schneller als der vorherige, da wir nicht alle Datensatzvektoren durchsehen müssen.

Kantenproblem

Mit der Erhöhung der Suchgeschwindigkeit hat die invertierte Datei einen Nachteil: Sie garantiert nicht, dass das gefundene Objekt immer das nächstgelegene ist.

In der Abbildung unten sehen wir ein solches Szenario: Der tatsächlich nächste Nachbar befindet sich im roten Bereich, wir wählen jedoch nur Kandidaten aus dem grünen Bereich aus. Eine solche State of affairs nennt man Kantenproblem .

1*6cuQDNsFChOqvL8Duu6iKg
Kantenproblem

Dieser Fall tritt typischerweise auf, wenn sich das abgefragte Objekt in der Nähe der Grenze zu einer anderen Area befindet. Um die Anzahl der Fehler in solchen Fällen zu reduzieren, können wir den Suchumfang vergrößern und mehrere Regionen auswählen, um anhand der Spitzenposition nach Kandidaten zu suchen M nächstgelegene Schwerpunkte zum Objekt.

Suche nach nächsten Nachbarn innerhalb mehrerer Regionen (m = 3)

Je mehr Regionen erkundet werden, desto genauer sind die Ergebnisse und desto länger dauert ihre Berechnung.

Anwendung

Trotz des Kantenproblems zeigt die invertierte Datei in der Praxis gute Ergebnisse. Es eignet sich perfekt für den Einsatz in Fällen, in denen wir eine geringfügige Verringerung der Genauigkeit in Kauf nehmen möchten, um mehrmals eine Geschwindigkeitssteigerung zu erzielen.

Eines der Anwendungsbeispiele ist ein inhaltsbasiertes Empfehlungssystem. Stellen Sie sich vor, es würde einem Benutzer einen Movie empfehlen, der auf anderen Filmen basiert, die er in der Vergangenheit gesehen hat. Die Datenbank enthält eine Million Filme zur Auswahl.

  • Durch die Verwendung von kNN wählt das System tatsächlich den für einen Benutzer relevantesten Movie aus und empfiehlt ihn. Allerdings dauert die Durchführung der Abfrage sehr lange.
  • Nehmen wir an, dass das System bei invertiertem Dateiindex den fünftrelevantesten Movie empfiehlt, was im wirklichen Leben wahrscheinlich der Fall ist. Die Suchzeit ist 20-mal schneller als bei kNN.

Aufgrund der Benutzererfahrung wird es sehr schwierig sein, zwischen den Qualitätsergebnissen dieser beiden Empfehlungen zu unterscheiden: Das erste und das fünftrelevanteste Ergebnis sind beide gute Empfehlungen aus einer Million möglicher Filme. Der Benutzer wird wahrscheinlich mit jeder dieser Empfehlungen zufrieden sein. Aus zeitlicher Sicht ist die umgekehrte Datei offensichtlich der Gewinner. Aus diesem Grund ist es in dieser State of affairs besser, den letzteren Ansatz zu verwenden.

Invertierte Dateiindexleistung. Hier reduzieren wir die Genauigkeit leicht, um eine höhere Geschwindigkeit während der Inferenz zu erreichen.

Faiss-Implementierung

Faiss (Fb AI Search Similarity) ist eine in C++ geschriebene Python-Bibliothek, die für eine optimierte Ähnlichkeitssuche verwendet wird. Diese Bibliothek stellt verschiedene Arten von Indizes dar, bei denen es sich um Datenstrukturen handelt, die zum effizienten Speichern der Daten und zum Durchführen von Abfragen verwendet werden.

Basierend auf den Informationen der Faiss-Dokumentationwerden wir sehen, wie Indizes erstellt und parametrisiert werden.

kNN

Indizes, die den kNN-Ansatz implementieren, werden als bezeichnet Wohnung in Faiss, weil sie keine Informationen komprimieren. Sie sind die einzigen Indizes, die das korrekte Suchergebnis garantieren. Tatsächlich gibt es in Faiss zwei Arten von flachen Indizes:

  • IndexFlatL2. Die Ähnlichkeit wird als euklidischer Abstand berechnet.
  • IndexFlatIP. Die Ähnlichkeit wird als inneres Produkt berechnet.

Für beide Indizes ist ein einzelner Parameter erforderlichD in ihren Konstruktoren: die Datendimension. Diese Indizes haben keine einstellbaren Parameter.

1*KkVElYecCEBKcRjpXlHcAw
Faiss-Implementierung von IndexFlatL2 und IndexFlatIP

Zum Speichern einer einzelnen Komponente eines Vektors sind 4 Bytes erforderlich. Daher ist es notwendig, einen einzigen Dimensionsvektor zu speichern d, 4 * d Bytes sind erforderlich.

Invertierter Dateiindex

Für die beschriebene invertierte Datei implementiert Faiss die Klasse IndexIVFFlat. Wie im Fall von kNN ist das Wort „Wohnung„zeigt an, dass die Originalvektoren nicht dekomprimiert werden und vollständig gespeichert werden.

Um diesen Index zu erstellen, müssen wir zunächst einen Quantisierer übergeben – ein Objekt, das bestimmt, wie Datenbankvektoren gespeichert und verglichen werden.

IndexIVFFlat hat 2 wichtige Parameter:

  • nlist definiert eine Reihe von Regionen (Voronoi-Zellen), die während des Trainings erstellt werden sollen.
  • nprobelegt fest, wie viele Regionen für die Kandidatensuche herangezogen werden sollen. Das Ändern des nprobe-Parameters erfordert keine erneute Schulung.
1*QHEU6JbaXNT7CUcDZDqsug
Faiss-Implementierung von IndexIVFFlat

Wie im vorherigen Fall brauchen wir 4 * d Bytes zum Speichern eines einzelnen Vektors. Aber jetzt müssen wir auch Informationen über Voronoi-Regionen speichern, zu denen Datensatzvektoren gehören. In der Faiss-Implementierung benötigen diese Informationen 8 Bytes professional Vektor. Daher beträgt der zum Speichern eines einzelnen Vektors erforderliche Speicher:

Abschluss

Wir haben bei der Ähnlichkeitssuche zwei Basisalgorithmen durchlaufen. Effektiv naives kNN sollte aufgrund seiner schlechten Skalierbarkeit außer in bestimmten Fällen quick nie für Anwendungen des maschinellen Lernens verwendet werden. Andererseits bietet die invertierte Datei gute Heuristiken für eine beschleunigte Suche, deren Qualität durch Optimierung ihrer Hyperparameter verbessert werden kann. Die Suchleistung kann aus verschiedenen Perspektiven noch verbessert werden. Im nächsten Teil dieser Artikelserie werden wir uns eine dieser Methoden zur Komprimierung von Datensatzvektoren ansehen.

Ähnlichkeitssuche, Teil 2: Produktquantisierung

Ressourcen

Sofern nicht anders angegeben, stammen alle Bilder vom Autor.

stat?event=post


Ähnlichkeitssuche, Teil 1: kNN und invertierter Dateiindex wurde ursprünglich veröffentlicht in Auf dem Weg zur Datenwissenschaft auf Medium, wo die Leute das Gespräch fortsetzen, indem sie diese Geschichte hervorheben und darauf reagieren.



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here