Come capire l'hashing sensibile alla località?


156

Ho notato che LSH sembra un buon modo per trovare oggetti simili con proprietà di dimensioni elevate.

Dopo aver letto l'articolo http://www.slaney.org/malcolm/yahoo/Slaney2008-LSHTutorial.pdf , sono ancora confuso con quelle formule.

Qualcuno conosce un blog o un articolo che lo spiega in modo semplice?


3
Leggi Ullman Capitolo 3 - "TROVARE GLI ARTICOLI SIMILI" infolab.stanford.edu/~ullman/mmds.html
achini

Risposte:


250

Il miglior tutorial che ho visto per LSH è nel libro: Mining of Massive Dataset. Controlla il capitolo 3 - Trovare elementi simili http://infolab.stanford.edu/~ullman/mmds/ch3a.pdf

Inoltre raccomando la seguente diapositiva: http://www.cs.jhu.edu/%7Evandurme/papers/VanDurmeLallACL10-slides.pdf . L'esempio nella diapositiva mi aiuta molto a comprendere l'hash per la somiglianza del coseno.

Prendo in prestito due diapositive da Benjamin Van Durme e Ashwin Lall, ACL2010 e provo a spiegare un po 'le intuizioni di LSH Families for Cosine Distance. inserisci qui la descrizione dell'immagine

  • Nella figura sono presenti due cerchi con colore rosso e giallo , che rappresentano due punti dati bidimensionali. Stiamo cercando di trovare la loro somiglianza del coseno usando LSH.
  • Le linee grigie sono alcuni piani scelti casualmente in modo uniforme.
  • A seconda che il punto dati si trovi sopra o sotto una linea grigia, contrassegniamo questa relazione come 0/1.
  • Nell'angolo in alto a sinistra, ci sono due file di quadrati bianchi / neri, che rappresentano rispettivamente la firma dei due punti dati. Ogni quadrato corrisponde a un bit 0 (bianco) o 1 (nero).
  • Quindi, una volta che hai un pool di piani, puoi codificare i punti dati con la loro posizione relativa ai piani. Immagina che quando abbiamo più piani nella piscina, la differenza angolare codificata nella firma è più vicina alla differenza reale. Perché solo i piani che si trovano tra i due punti daranno ai due dati un valore di bit diverso.

inserisci qui la descrizione dell'immagine

  • Ora guardiamo la firma dei due punti dati. Come nell'esempio, utilizziamo solo 6 bit (quadrati) per rappresentare ciascun dato. Questo è l'hash LSH per i dati originali che abbiamo.
  • La distanza di percussione tra i due valori di hash è 1, poiché le loro firme differiscono solo di 1 bit.
  • Considerando la lunghezza della firma, possiamo calcolare la loro somiglianza angolare come mostrato nel grafico.

Ho un po 'di codice di esempio (solo 50 righe) in Python qui che sta usando la somiglianza del coseno. https://gist.github.com/94a3d425009be0f94751


perché si chiama sensibile alla località? perché l'assegnazione di ciascun bit dipende dalla località del punto dati verso ciascun piano?
nawara,

21
sensibile alla località - i punti dati che si trovano vicini l'uno all'altro sono mappati su hash simili (nello stesso bucket con alta probabilità).
greeness,

2
Mi dispiace, sono in ritardo su questo argomento, ma avevo una domanda sul coseno. La presentazione afferma che il valore del bit è uno se il prodotto punto tra il vettore reale e il vettore del piano> = 0 oppure è 0. Qual è la direzione del vettore del piano perché anche gli angoli tra 90 gradi e 180 gradi daranno un coseno che è negativo. Suppongo che ogni piano sia composto da due vettori e prendiamo l'angolo più piccolo che è realizzato con il vettore reale.
vkaul11,

Grazie. Quindi, è corretto dire che h codifica la differenza angolare eb la "precisione"? In questo modo capisco che h * PI è theta in radiante eb la precisione dell'angolo.
user305883

1
La diapositiva che hai fornito è molto accurata: cs.jhu.edu/~vandurme/papers/VanDurmeLallACL10-slides.pdf - potresti per favore spiegare anche la logica matematica del "trucco di raggruppamento" - o i concetti di algebra lineare che dovrei guardare a capirlo?
user305883


21

Ecco una presentazione di Stanford che lo spiega. Per me ha fatto una grande differenza. La seconda parte riguarda di più l'LSH, ma anche la prima parte lo copre.

Un'immagine della panoramica (ce ne sono molti altri nelle diapositive):

inserisci qui la descrizione dell'immagine

Ricerca del vicino vicino in dati ad alta dimensione - Parte 1: http://www.stanford.edu/class/cs345a/slides/04-highdim.pdf

Ricerca del vicino vicino in dati ad alta dimensione - Parte 2: http://www.stanford.edu/class/cs345a/slides/05-LSH.pdf


Perché non usare minhash direttamente come funzione LSH?
Thomas Ahle,

1
Credo che il numero di non duplicati per bucket rimanga abbastanza elevato, mentre se utilizziamo funzioni di hash così indipendenti, la probabilità di mappatura di duplicati non vicini allo stesso bucket si riduce drasticamente.
Shatu,

7
  • LSH è una procedura che accetta come input una serie di documenti / immagini / oggetti e genera una specie di Hash Table.
  • Gli indici di questa tabella contengono i documenti in modo tale che i documenti che si trovano sullo stesso indice sono considerati simili e quelli su indici diversi sono " diversi ".
  • Laddove simile dipende dal sistema metrico e anche da una soglia di somiglianza s che agisce come un parametro globale di LSH.
  • Spetta a voi per definire ciò che la soglia di un adeguato s è per il vostro problema.

inserisci qui la descrizione dell'immagine

È importante sottolineare che misure di somiglianza diverse hanno implementazioni diverse di LSH.

Nel mio blog, ho cercato di spiegare a fondo LSH per i casi di minHashing (misura della somiglianza jaccard) e simHashing (misura della distanza del coseno). Spero che lo trovi utile: https://aerodatablog.wordpress.com/2017/11/29/locality-sensitive-hashing-lsh/


2

Sono una persona visiva. Ecco cosa funziona per me come intuizione.

Di 'che ognuna delle cose che vuoi cercare approssimativamente sono oggetti fisici come una mela, un cubo, una sedia.

La mia intuizione per un LSH è che è simile a prendere le ombre di questi oggetti. Come se prendessi l'ombra di un cubo 3D ottieni un quadrato 2D come su un pezzo di carta, o una sfera 3D ti darà un'ombra simile a un cerchio su un pezzo di carta.

Alla fine, ci sono molte più di tre dimensioni in un problema di ricerca (in cui ogni parola in un testo potrebbe essere una dimensione) ma l' analogia dell'ombra è ancora molto utile per me.

Ora possiamo confrontare in modo efficiente stringhe di bit nel software. Una stringa di bit di lunghezza fissa è più o meno, come una linea in una singola dimensione.

Quindi, con un LSH, proietto le ombre degli oggetti alla fine come punti (0 o 1) su una singola linea fissa / stringa di bit.

Il trucco è prendere le ombre in modo che abbiano ancora un senso nella dimensione inferiore, ad esempio assomigliano all'oggetto originale in un modo abbastanza buono che possa essere riconosciuto.

Un disegno 2D di un cubo in prospettiva mi dice che questo è un cubo. Ma non riesco a distinguere facilmente un quadrato 2D dall'ombra di un cubo 3D senza prospettiva: entrambi mi sembrano un quadrato.

Il modo in cui presento il mio oggetto alla luce determinerà se ottengo una buona ombra riconoscibile o meno. Quindi penso a un "buon" LSH come quello che trasformerà i miei oggetti davanti a una luce in modo tale che la loro ombra sia meglio riconoscibile come rappresentante del mio oggetto.

Quindi, per ricapitolare: penso alle cose da indicizzare con un LSH come oggetti fisici come un cubo, un tavolo o una sedia, e proietto le loro ombre in 2D e infine lungo una linea (una stringa di bit). E una "buona" funzione "LSH" è il modo in cui presento i miei oggetti davanti a una luce per ottenere una forma approssimativamente distinguibile nella pianura 2D e successivamente nella mia stringa di bit.

Alla fine, quando voglio cercare se un oggetto che ho è simile ad alcuni oggetti che ho indicizzato, prendo le ombre di questo oggetto "query" usando lo stesso modo per presentare il mio oggetto davanti alla luce (alla fine finendo con un po ' anche stringa). E ora posso confrontare quanto è simile quella stringa di bit con tutte le mie altre stringhe di bit indicizzate che è un proxy per la ricerca di tutti i miei oggetti se trovassi un modo valido e riconoscibile per presentare i miei oggetti alla mia luce.


0

Come una risposta molto breve, tldr :

Un esempio di hash sensibile alla località potrebbe essere prima di impostare i piani in modo casuale (con rotazione e offset) nel tuo spazio di input per l'hash, quindi di rilasciare i punti in hash nello spazio e per ogni piano misurato se il punto è sopra o sotto di esso (es. 0 o 1) e la risposta è l'hash. Quindi punti simili nello spazio avranno un hash simile se misurati con la distanza del coseno prima o dopo.

Puoi leggere questo esempio usando scikit-learn: https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.