Bagaimana memahami Hashing Sensitifitas Lokalitas?


156

Saya perhatikan bahwa LSH tampaknya cara yang baik untuk menemukan barang serupa dengan properti berdimensi tinggi.

Setelah membaca makalah http://www.slaney.org/malcolm/yahoo/Slaney2008-LSHTutorial.pdf , saya masih bingung dengan rumus-rumus itu.

Adakah yang tahu blog atau artikel yang menjelaskan cara mudah itu?


3
Baca Ullman Bab 3 - "MENEMUKAN BARANG SIMILAR
achini

Jawaban:


250

Tutorial terbaik yang saya lihat untuk LSH ada di buku: Mining of Massive Datasets. Periksa Bab 3 - Menemukan Barang Sejenis http://infolab.stanford.edu/~ullman/mmds/ch3a.pdf

Saya juga merekomendasikan slide di bawah ini: http://www.cs.jhu.edu/%7Evandurme/papers/VanDurmeLallACL10-slides.pdf . Contoh dalam slide ini banyak membantu saya dalam memahami hashing untuk persamaan cosinus.

Saya meminjam dua slide dari Benjamin Van Durme & Ashwin Lall, ACL2010 dan mencoba menjelaskan intuisi Keluarga LSH untuk Cosine Distance sedikit. masukkan deskripsi gambar di sini

  • Pada gambar, ada dua lingkaran dengan warna merah dan kuning , mewakili dua titik data dua dimensi. Kami mencoba untuk menemukan kesamaan cosinus mereka menggunakan LSH.
  • Garis abu-abu adalah beberapa pesawat yang dipilih secara acak.
  • Bergantung pada apakah titik data terletak di atas atau di bawah garis abu-abu, kami menandai hubungan ini sebagai 0/1.
  • Di sudut kiri atas, ada dua baris kotak putih / hitam, masing-masing mewakili tanda tangan dari dua titik data. Setiap kotak sesuai dengan bit 0 (putih) atau 1 (hitam).
  • Jadi, sekali Anda memiliki kumpulan pesawat, Anda dapat menyandikan titik data dengan lokasi masing-masing ke pesawat. Bayangkan bahwa ketika kita memiliki lebih banyak pesawat di kolam, perbedaan sudut yang dikodekan dalam tanda tangan lebih dekat dengan perbedaan yang sebenarnya. Karena hanya pesawat yang berada di antara dua titik yang akan memberikan dua data nilai bit yang berbeda.

masukkan deskripsi gambar di sini

  • Sekarang kita melihat tanda tangan dari dua titik data. Seperti dalam contoh, kami hanya menggunakan 6 bit (kotak) untuk mewakili setiap data. Ini adalah hash LSH untuk data asli yang kami miliki.
  • Jarak hamming antara kedua nilai hash adalah 1, karena tanda tangan mereka hanya berbeda dengan 1 bit.
  • Mempertimbangkan panjang tanda tangan, kita dapat menghitung kesamaan sudutnya seperti yang ditunjukkan pada grafik.

Saya punya beberapa kode sampel (hanya 50 baris) dengan python di sini yang menggunakan cosine similarity. https://gist.github.com/94a3d425009be0f94751


mengapa ini disebut lokalitas sensitif? karena penugasan setiap bit tergantung pada lokalitas titik data terhadap setiap rencana?
nawara

21
locality sensitive - titik data yang terletak berdekatan satu sama lain dipetakan ke hash yang serupa (dalam ember yang sama dengan probabilitas tinggi).
greeness

2
Maaf saya terlambat dalam topik ini tapi saya punya pertanyaan tentang cosinus. Presentasi mengatakan bahwa nilai bit adalah satu jika produk titik antara vektor aktual dan vektor bidang> = 0 atau yang lain adalah 0. Apa arah vektor bidang karena sudut antara 90 derajat dan 180 derajat juga akan memberikan cosinus yang negatif. Saya kira setiap bidang terdiri dari dua vektor dan kami mengambil sudut yang lebih kecil yang dibuat dengan vektor aktual.
vkaul11

Terima kasih. Jadi, apakah benar mengatakan bahwa h mengkodekan perbedaan sudut, dan b "presisi"? Seperti ini saya mengerti h * PI adalah theta dalam pancaran, dan b ketepatan sudut.
user305883

1
Slide yang Anda berikan sangat rapi: cs.jhu.edu/~vandurme/papers/VanDurmeLallACL10-slides.pdf - dapatkah Anda juga menjelaskan logika matematika dari "pooling trick" - atau konsep aljabar linear yang harus saya perhatikan? di untuk memahaminya?
user305883


21

Inilah presentasi dari Stanford yang menjelaskannya. Itu membuat perbedaan besar bagi saya. Bagian dua lebih banyak tentang LSH, tetapi bagian satu juga membahasnya.

Gambar ikhtisar (Ada lebih banyak di slide):

masukkan deskripsi gambar di sini

Pencarian Tetangga Tetangga dalam Data Dimensi Tinggi - Bagian1: http://www.stanford.edu/class/cs345a/slides/04-highdim.pdf

Pencarian Tetangga Dekat dalam Data Dimensi Tinggi - Bagian2: http://www.stanford.edu/class/cs345a/slides/05-LSH.pdf


Mengapa tidak menggunakan minhash secara langsung sebagai fungsi LSH Anda?
Thomas Ahle

1
Saya percaya karena jumlah non-duplikat per ember tetap cukup tinggi, sedangkan jika kita menggunakan fungsi hash independen seperti itu, kemungkinan pemetaan duplikat non-dekat ke ember yang sama berkurang secara drastis.
Shatu

7
  • LSH adalah prosedur yang mengambil sebagai input sekumpulan dokumen / gambar / objek dan menghasilkan semacam Tabel Hash.
  • Indeks tabel ini berisi dokumen-dokumen sedemikian rupa sehingga dokumen-dokumen yang berada pada indeks yang sama dianggap serupa dan indeks-indeks yang berbeda " berbeda ".
  • Mana yang serupa tergantung pada sistem metrik dan juga pada kemiripan ambang s yang bertindak seperti parameter global LSH.
  • Terserah Anda untuk menentukan apa ambang batas yang memadai s adalah untuk masalah Anda.

masukkan deskripsi gambar di sini

Penting untuk digarisbawahi bahwa langkah-langkah kesamaan yang berbeda memiliki implementasi LSH yang berbeda.

Di blog saya, saya mencoba menjelaskan secara menyeluruh LSH untuk kasus-kasus minHashing (ukuran kesamaan jaccard) dan simHashing (ukuran jarak cosinus). Saya harap Anda menemukannya bermanfaat: https://aerodatablog.wordpress.com/2017/11/29/locality-sensitive-hashing-lsh/


2

Saya orang yang visual. Inilah yang bekerja untuk saya sebagai intuisi.

Katakanlah setiap hal yang ingin Anda cari kira-kira adalah benda-benda fisik seperti apel, kubus, kursi.

Intuisi saya untuk sebuah LSH adalah bahwa ia mirip dengan mengambil bayangan dari objek-objek ini. Seperti jika Anda mengambil bayangan kubus 3D, Anda mendapatkan 2D persegi seperti pada selembar kertas, atau bola 3D akan memberi Anda bayangan seperti lingkaran di selembar kertas.

Akhirnya, ada lebih dari tiga dimensi dalam masalah pencarian (di mana setiap kata dalam sebuah teks bisa menjadi satu dimensi) tetapi analogi bayangan masih sangat berguna bagi saya.

Sekarang kita dapat secara efisien membandingkan rangkaian bit dalam perangkat lunak. String bit panjang tetap agak, lebih atau kurang, seperti garis dalam dimensi tunggal.

Jadi dengan LSH, saya memproyeksikan bayangan objek pada akhirnya sebagai titik (0 atau 1) pada string garis / bit panjang tetap tunggal.

Trik keseluruhannya adalah untuk mengambil bayangan sehingga mereka masih masuk akal di dimensi yang lebih rendah misalnya mereka menyerupai objek asli dengan cara yang cukup baik yang dapat dikenali.

Gambar 2D kubus dalam perspektif memberitahu saya ini adalah kubus. Tapi saya tidak dapat dengan mudah membedakan kotak 2D dari bayangan kubus 3D tanpa perspektif: keduanya terlihat seperti kotak bagi saya.

Bagaimana saya mempresentasikan objek saya ke cahaya akan menentukan apakah saya mendapatkan bayangan yang dapat dikenali dengan baik atau tidak. Jadi saya menganggap LSH "baik" sebagai yang akan mengubah objek saya di depan cahaya sehingga bayangan mereka paling mudah dikenali sebagai mewakili objek saya.

Jadi untuk rekap: Saya memikirkan hal-hal untuk diindeks dengan LSH sebagai objek fisik seperti kubus, meja, atau kursi, dan saya memproyeksikan bayangan mereka dalam 2D ​​dan akhirnya sepanjang garis (sedikit string). Dan fungsi "baik" LSH "" adalah bagaimana saya menyajikan objek saya di depan cahaya untuk mendapatkan bentuk yang kira-kira dapat dibedakan di tanah datar 2D dan kemudian bit string saya.

Akhirnya ketika saya ingin mencari apakah suatu objek yang saya miliki mirip dengan beberapa objek yang saya indeks, saya mengambil bayangan dari objek "permintaan" ini menggunakan cara yang sama untuk menyajikan objek saya di depan cahaya (akhirnya berakhir dengan sedikit string juga). Dan sekarang saya dapat membandingkan seberapa mirip string bit itu dengan semua string bit lainnya yang diindeks yang merupakan proxy untuk mencari seluruh objek saya jika saya menemukan cara yang baik dan dapat dikenali untuk menyajikan objek saya ke cahaya saya.


0

Sebagai jawaban singkat, tldr :

Contoh hashing sensitif lokalitas bisa dengan pertama-tama mengatur pesawat secara acak (dengan rotasi dan offset) di ruang input Anda untuk hash, dan kemudian untuk menjatuhkan poin Anda ke hash di ruang tersebut, dan untuk setiap pesawat Anda mengukur jika titik tersebut adalah di atas atau di bawahnya (mis: 0 atau 1), dan jawabannya adalah hash. Jadi titik-titik yang serupa di ruang angkasa akan memiliki hash yang serupa jika diukur dengan jarak cosinus sebelum atau sesudah.

Anda dapat membaca contoh ini menggunakan scikit-learn: https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.