1 puan yazan GN⁺ 2024-07-06 | 1 yorum | WhatsApp'ta paylaş
  • Büyük ölçekli belge koleksiyonlarında, web taraması sırasında aynı sayfa birden çok kez alınabilir veya küçük revizyonlar araya karışabilir; bu yüzden Jaccard benzerliği ve MinHash, “neredeyse aynı” belgeleri bulmak için pratik bir yöntem hâline gelir
  • Jaccard benzerliği, belgeyi bir özellik kümesine dönüştürdükten sonra kesişim boyutu / birleşim boyutu değerini hesaplar; eşiğin üzerindeki çiftleri benzer yinelenenler olarak görür, ancak bu ilişki genel olarak geçişli değildir
  • Tüm belge çiftlerini karşılaştırmak, derlem büyüklüğüne göre O(n²) maliyet doğurduğundan MinHash, her belgeyi sabit boyutlu bir imzayla özetleyerek benzerliği olasılıksal olarak yaklaşıklar
  • k adet hash fonksiyonu kullanıldığında, iki belge imzasında aynı konumdaki değerlerin eşleşme oranıyla benzerlik tahmin edilebilir; hash fonksiyonu seçiminde min-wise independence gibi koşullar önemlidir
  • İmzanın tamamını veya bir kısmını grup anahtarı olarak kullanmak, benzer belgelerin aynı bucket’a girme olasılığını ayarlamayı sağlar; n-gram ve tokenizasyon yöntemi tespit duyarlılığını ve maliyeti belirler

Benzer yinelenenleri tespit etmenin zorluğu

  • Amaç, büyük bir belge kümesinde tam olarak aynı olmayan ama neredeyse aynı belgeleri bulmaktır
    • Web’i belirli bir süre taradığınızda aynı sayfayı birden çok kez alabilirsiniz, ancak metadata biraz farklı olabilir
    • Bir sayfanın küçük revizyonlarından birden fazla sürüm de bulunabilir
  • Temel yaklaşım, iki belge arasında bir benzerlik fonksiyonu S(A, B) tanımlamak ve değeri Scrit eşiğinin üzerinde olan çiftleri benzer yinelenenler olarak kabul etmektir
  • “Neredeyse aynı olma” genellikle geçişli bir ilişki değildir
    • A ile B, B ile C eşiğin üzerinde benzer olabilir
    • Aynı anda A ile C eşikten düşük olabilir
    • Bu yüzden büyük ölçekte benzer yinelenen tespiti, tam yinelenen tespitinden daha zor ele alınır

Jaccard benzerliğinin tanımı

  • Jaccard index, iki sonlu kümenin benzerliğini kesişim boyutu / birleşim boyutu olarak ifade eder

    [ J(A, B) = \frac{|A \cap B|}{|A \cup B|} ]

  • İki küme benzerse çoğunlukla aynı öğelere sahip olurlar; bu nedenle birleşim yalnızca biraz büyür, kesişim ise yalnızca biraz küçülür

  • İki küme tamamen ayrıysa kesişim boyutu 0 olduğundan Jaccard benzerliği 0’dır

  • İki küme aynıysa kesişim ve birleşim aynı küme olduğundan Jaccard benzerliği 1 olur

  • Gerçek belgeler Unicode dizgeleri gibi biçimlerde olduğundan, önce belgeyi bir özellik kümesine dönüştürmek gerekir

Tüm çiftleri karşılaştırmanın ölçeklenebilirlik sorunu

  • Belgeleri özellik kümelerine dönüştürdükten sonra Jaccard benzerliği yüksek çiftleri bulma tanımı kendi başına basittir
  • Ancak tüm belge çiftlerini karşılaştırmak, maliyeti derlem büyüklüğüne göre O(n²) artırır
  • Tam yinelenen tespitinde belge hash’lenir ve aynı hash bucket’ındakiler gruplanarak bu maliyetten kaçınılır
  • Benzer yinelenen tespitinde de benzer bir kestirme gerekir; bu alanda buna yerellik duyarlı hash (locality-sensitive hash) denir
  • Jaccard benzerliği için bu amaca uygun bir teknik vardır; bunun özü MinHash’tir

MinHash ile Jaccard benzerliğini yaklaşık hesaplama

  • MinHash, tüm kümeyi her seferinde karşılaştırmadan, her belge için önceden hesaplanmış küçük bir imza (signature) ile Jaccard benzerliğini yaklaşıklar

  • Temel fikir, birleşimden düzgün dağılımlı rastgele bir öğe seçmek ve bu öğenin kesişimde de yer alıp almadığına bakmaya dayalı örneklemedir

  • Pratikte rastgele permütasyon yerine iyi bir hash fonksiyonu H(x) kullanılır ve her kümede hash değeri en küçük olan özellik saklanır

    [ a_{min} \leftarrow \min_{x \in A} H(x) ]

    [ b_{min} \leftarrow \min_{x \in B} H(x) ]

  • min işlemi birleşme özelliğine sahip olduğundan, her belgenin minimum hash değeri bağımsız olarak ön işlenebilir

  • İki kümenin minimum hash değerlerinin aynı olma olasılığı, iki kümenin Jaccard benzerliğine eşittir

Birden fazla hash fonksiyonu ve imza vektörü

  • Yalnızca tek bir hash fonksiyonu kullanılırsa, iki belge için sadece “aynı/farklı” biçiminde Boolean bir tahmin yapılabilir

  • k adet farklı hash fonksiyonu kullanıldığında, her belge k adet MinHash değerinden oluşan bir vektörle özetlenebilir

    [ A_{sig} = (\min_{x \in A} H_1(x), \min_{x \in A} H_2(x), \dots, \min_{x \in A} H_k(x)) ]

  • İki imzada aynı konumdaki değerlerin eşleşme oranıyla Jaccard benzerliği yaklaşık hesaplanır

    [ J(A, B) \approx \frac{1}{k} \sum_{i=1}^{k} (A_{sig}[i] = B_{sig}[i]) ]

  • Hash fonksiyonu ailesi seçimi hassas bir konudur

    • Amaç, tüm özellik uzayındaki rastgele permütasyonu yaklaşık olarak temsil etmektir
    • Gerçek hash fonksiyonu aileleri, olası tüm permütasyonların yalnızca çok küçük bir bölümünü ifade eder
    • Uygunsuz korelasyonlardan kaçınmak gerekir; ilgili özellik min-wise independence olarak adlandırılır
    • Bu problem nispeten iyi çalışılmıştır ve literatürde verimli çözümleri vardır

Tüm derlemde aday çiftleri bulma

  • Her belge k adet hash değeri parmak izine indirildiğinde Jaccard benzerliği verimli biçimde yaklaşık hesaplanabilir
  • Geriye kalan sorun, tüm belge çiftlerine bakmadan derlemin tamamında yüksek benzerlikli belgeleri bulmaktır
  • Strateji, belgeleri bir anahtara göre gruplamak ve yalnızca aynı grup içindekileri karşılaştırmaktır
  • Grup anahtarı, benzer belgelerin yüksek olasılıkla birlikte gruplanmasını ve benzer olmayan belgelerin mümkün olduğunca birlikte gruplanmamasını sağlamalıdır
  • MinHash imzasının tamamını anahtar olarak kullanma

    • En basit yöntem, k adet MinHash değerinin tümünü tek bir grup anahtarı olarak kullanmaktır
    • İki belge yalnızca tüm MinHash değerleri eşleştiğinde benzer yinelenen olarak kabul edilir
    • GPT-3 makalesi, veri kümesi hazırlama pipeline’ında benzer yinelenen temizleme kullandı; alıntılanan ifadeden Spark’ın MinHashLSH implementasyonunu ve 10 hash’i kullandığı şeklinde yorumlanabilir
    • Bu yöntemin avantajı basitlik ve verimliliktir
    • Yüksek kardinaliteli tek bir byte dizgesine göre gruplama yapmak yatay ölçeklendirmesi kolay bir iştir
    • MapReduce’ta map ile reduce arasındaki “shuffle” gibi, veri işleme araçlarının temel primitive’lerinden biridir
    • İki belgenin Jaccard benzerliği J(A, B) ise ve k değerin hepsinin eşleşmesi gerekiyorsa, tek bir çift için çakışma olasılığı J(A, B)^k olur
    • k = 10 olduğunda benzerliği yaklaşık 0.6 veya altında olan belgeler neredeyse hiç çakışmaz
    • Eşleşme olasılığı, benzerlik yaklaşık 0.95 civarına geldiğinde artar
    • Amaç birbirine çok yakın belge kardeşlerini bulmaksa bu yeterli olabilir
    • Bu J^k hesabı tek bir belge çifti içindir
    • Birbirine çok benzeyen çok sayıda belge varsa çift bazlı olasılıklar bağımsız değildir
    • Pratikte birbirine çok benzeyen belgeler genellikle en fazla iki üç bucket’a girer ve yinelenenlerin neredeyse tamamı bulunabilir

Daha gevşek yinelenen tespiti

  • Yalnızca benzerliği 1’e yakın belgeleri değil, 0.8 veya 0.7 üzerindeki belgeleri de bulmak istiyorsanız, tüm imzayı anahtar olarak kullanma yöntemi fazla katı olabilir

  • k MinHash değerinden yalnızca bir kısmını grup anahtarı olarak kullanmak, daha düşük benzerliklerde de çakışma olasılığını artırır

    • Örneğin ilk 4 MinHash değeriyle grupladıktan sonra, aynı bucket içinde tüm MinHash değerleri kullanılarak gerçek benzerlik tahmin edilebilir
  • Hash sayısını azaltmanın sınırları vardır

    • J^r her zaman J değerinden küçüktür
    • r çok küçülürse hatalı çakışmalar çok fazla olabilir
  • Bunun yerine her belge için birden fazla anahtar oluşturup birden çok bucket’a koyabilirsiniz

    • Örneğin k = 20 hash hesaplanıp b = 4 bucket’a konabilir; her anahtar r = 5 hash’ten oluşabilir
  • İki belgenin en az bir bucket’ta çakışma olasılığı şöyledir

    [ p = 1 - (1 - J^r)^b ]

  • 4 grup ve grup başına 5 hash kullanılan örnekte, çakışma olasılığının %50 olduğu nokta yaklaşık J = 0.7 civarına kayar

  • r ve b değerlerinin ikisi de 1’den büyükse sonuç eğrisi genel olarak S biçimini alır ve duyarlılık, recall ve performans maliyeti arasında ayar alanı sunar

HyperLogLog ile ilişkisi

  • MinHash’in temel numarası, HyperLogLog gibi sketch algoritmalarına benzer yönler taşır
  • HyperLogLog, stream’deki her öğeyi hash’ler ve hash değerinde baştaki 0 sayısının çalışan maksimumunu saklar
  • İki teknik de bir hash fonksiyonuyla girdi öğelerini düzgün dağılıma eşler, ardından çalışan uç değerleri hesaplayarak yalnızca sabit boyutlu özet ile dağılımsal özellikleri tahmin eder
  • HyperLogLog, bit sırası ters çevrilerek düşünüldüğünde log2(H(x)) değerinin çalışan minimumunu hesaplama biçimi olarak görülebilir; MinHash ise H(x) değerinin kendisinin minimumunu kullanır
  • İki yapı bir anlamda dualdir
    • İki HyperLogLog yapısı birleştirilirse iki kümenin birleşim boyutu tahmin edilebilir
    • İki MinHash yapısı karşılaştırılırsa iki kümenin kesişiminin göreli boyutu tahmin edilebilir
  • İki yapıyı birleştirerek keyfi kümelerin kesişim ve birleşimine ilişkin soruları ele alabilecek bir sketch oluşturulabilir

Belgeleri küme olarak temsil etme yöntemi

  • Jaccard ve MinHash kullanmak için önce dizge belgelerini özellik kümelerine dönüştürmek gerekir
  • Hangi yöntem kullanılırsa kullanılsın, ön işleme sırasında belge normalize edilebilir
    • Standart Unicode normalization form biçimine dönüştürme
    • Büyük/küçük harf katlama
    • Ardışık boşlukları sıkıştırma
    • Buna benzer dönüşümler
  • n-gram veya shingle

    • Bir belge, içinde geçen tüm n-gram’ların kümesi olarak temsil edilebilir
    • Büyük ölçekli metin işleme literatüründe “shingle” terimi de kullanılır; burada n-gram ile aynı rolü oynar
    • n değerinin seçiminde bir denge vardır
    • Küçük değerler belgeleri daha kaba karşılaştırır
    • Örneğin çoğu İngilizce metin bigram açısından oldukça benzer görünebilir
    • Büyük değerler daha ayırt edici özellikler ve daha büyük kümeler üretir
    • Çok büyürse duyarlılık düşebilir, ancak muhtemelen bundan önce performans sorunları ortaya çıkar
    • Mining of Massive Datasets §3.2.2’ye göre çeşitli uygulamalarda n = 5 ile 9 arasındaki değerler yaygın seçimler gibi görünür
  • Sözcük veya token ayırma

    • Girdi “sözcüklere” veya “token”lara bölündükten sonra bunlar özellik olarak kullanılabilir
    • GPT-3 makalesinden yapılan alıntı, Spark’ın standart tokenizer’ından söz eder; bu da girdiyi küçük harfe çevirip boşluklara göre bölen pyspark.ml.feature.Tokenizer anlamına geliyor gibi görünür
    • Daha gelişmiş bir NLTK tokenizer da kullanılabilir
    • Tokenize ettikten sonra token n-gram’larını kullanan hibrit bir yöntem de mümkündür
    • Tek tek token’lar byte veya karakterlerden daha yüksek entropiye sahip olduğundan, bu durumda daha küçük n değerleri kullanılır

1 yorum

 
GN⁺ 2024-07-06
Hacker News yorumları
  • Jaccard benzerliği (Tanimoto katsayısı) ya da F1 skoru (Dice katsayısı) gibi küme tabanlı metriklerin bulanık kümelere de aynı şekilde uygulanabileceği çoğu zaman gözden kaçırılıyor
    Ancak bulanık kümelerde kesişim ve birleşim kavramlarını ifade edecek uygun bir T-Norm / T-Conorm çifti seçmek gerekiyor; bunların da sonsuz sayıda çeşidi var
    Hatta istenen semantiğe uygun çifti seçebilmek bu açıdan bir avantaj
    Tıbbi görüntü segmentasyonu doğrulamasında, segmentasyon sonucu ve gerçek değer ikili maske değil de olasılıksal/bulanık biçimde olduğunda bu konuyu ele almıştık: https://link.springer.com/chapter/10.1007/978-3-319-46723-8_..., https://ora.ox.ac.uk/objects/uuid:dc352697-c804-4257-8aec-08...
    Genelde 0,5 eşiği uygulanıp ikili küme oluşturuluyor ve ardından Jaccard/Dice’ın ikili varyantları kullanılıyor; bu da doğrulama operatörünün hassasiyetini yaklaşık iki basamak düşürüyor gibi
    Algoritmanın en güncel yöntemden 0,001 daha iyi olduğu duyurulurken, doğrulama operatörünün hata payının aslında 0,1 olduğu gerçeği göz ardı edilmiş oluyor

  • Fransız hükümetinin büyük bir veritabanındaki vatandaş kayıtlarında tekilleştirme yapmak için bir müşteri bu tekniğin kendi Python uygulamasını yazmıştı ve iyi çalışmıştı
    Bugün olsa muhtemelen datasketch kullanmalarını söylerdim: https://pypi.org/project/datasketch/
    Bakınca bu konuda yeni araçların da çıkmaya devam ettiğini gördüm. Örneğin https://pypi.org/project/rensa/ datasketch’in MinHash’ine göre daha özelleşmiş ve hızlı bir sürüm; Rust ile yazılmış, üstüne biraz Python eklenmiş

    • Kişi tekilleştirmede Fellegi-Sunter modeli de güçlü bir yaklaşım. Splink, büyük veri kümeleri için bunu uygulayan ücretsiz bir Python kütüphanesi; iki yaklaşımın bazı kısımlarını birleştirmek de mümkün olabilir
      Ana yazar olduğumu belirteyim
      Nasıl çalıştığını anlatan etkileşimli bir eğitim de hazırladım: https://github.com/moj-analytical-services/splink, https://www.robinlinacre.com/intro_to_probabilistic_linkage/
    • gaoya da var. Benim yaptığım, Rust ile yazılmış ve Python bağlamaları da sunuyor
      datasketch harika, ama benim kullanım senaryom için performansı yeterli değildi; gaoya büyük ölçekli kümeleme işletim sistemlerinde kullanılıyor: https://github.com/serega/gaoya
  • Tesadüfe bak. Az önce birilerinin ilgisini çekebilecek bir MinHash sistemi uyguladım
    Problem, büyük bir kare matriste uygun birkaç alt matrisin sözde tersini bulmak
    Woodbury, Banachiewicz gibi matris özdeşlikleri kullanılarak “yakın” bir alt matrisin tersi güncellenip yeni ters ucuza hesaplanabiliyor
    Önceden hesaplanmış tersleri satır/sütun indekslerini anahtar olarak saklamak ve her yeni alt matris için güncelleme başlangıç noktası olarak kullanılacak yakın bir mevcut ters bulmak yeterli
    Bu problemi MinHash ile çözdüm; indeksleri minimum değer hash’inden geçirerek yakın matrislerin aynı hash’e sahip olma olasılığını yükselttim
    Uygulamamda, önceden hesaplanmış terslerin sayısı arttıkça arama seçiciliğini ayarlayabilmek için çok çözünürlüklü hash kullandım

  • Bu yazıda eksik kalan arka plana biraz ekleme yaparsam, bu tekniğin Google’ın ilk dönemlerinde tarama kümesinin tekilleştirilmesi için geliştirildiğini sanıyordum
    LLM oluşturma işiyle sıradan web metni dizini oluşturma işinin şaşırtıcı derecede benzer olması da ilginç
    Jeffrey Ullman’ın ücretsiz “Mining Massive Datasets” kitabında ayrıntılı olarak okunabilir; o dönemde tüm internetin dizinini oluşturmak için kullanılan havalı ve etkileyici birçok teknik anlatılıyor
    İlgili materyale “chapter 3 pdf mmds ullman” diye aratarak ücretsiz ulaşılabilir
    Düzenleme: Meğer yanılmışım; Wikipedia’ya göre DEC tarafından AltaVista için icat edilmiş: https://en.wikipedia.org/wiki/MinHash
    Her hâlükârda Ullman kitabında iyi bir açıklama var ve Google’da nasıl kullanıldığını da ele alıyor

  • MinHash ve varyantlarını anlamaya çalışırken kafama tam oturmadı, bu yüzden çevrimiçi bir görselleştirme aracı yapıyorum: https://websla.sh/tools/minhash
    Henüz tamamlanmış değil; Jaccard benzerliği hesaplaması gibi şeyleri de göstermek istiyorum, ama şu anda da birden fazla dize girip “minhash”in gerçekte ne olduğunu doğrudan görebilirsiniz

  • Hashing ya da küçük sinir ağlarını vektör arama motorları ve Tanimoto/Jaccard ile birlikte kullanmak, büyük ölçekli veri kümelerinde tekilleştirme için çok yaygın bir strateji
    Doğrusal karmaşıklığa sahip MapReduce işleri kullanmaktan daha akıllıca olabilir
    Google’ın iyi bir projesinde 500 bin parametreli RETSim modeli ve USearch motoru kullanılıyor: https://github.com/google/unisim

  • Şu anda PostgreSQL’de benzer bir sorun var. 600.000 adet feed_items var ve şema (feed_item_id uuid, author varchar, content text, guid varchar, link varchar, title varchar, summary text, feed_id integer)
    Özellikle bazı haber öğelerinin content ve summary sütunları birbirine çok benziyor ama aynı değil
    Böyle iki haber öğesi verildiğinde bunları bire indirmek istiyorum; iyi bir yöntem var mı?

    • BigQuery’de MinHash’e benzer bir sistem uyguladım ve tüm Stack Overflow öğeleri arasındaki kosinüs benzerliğini makul bir süre içinde hesaplayabildim
      Kabaca süreç şöyleydi
      1. Tüm metin alanlarını birleştirip n-gram dizilerine böldüm; örneğin 2~n karakterlik birimler
      2. Uzunluğu n olan global A ve B dizileri tanımlayıp bunları 32~64 bit rastgele tamsayılarla doldurdum
      3. Her n-gramı 32~64 bit bir tamsayıya hash’ledikten sonra, bu hash’i A dizisindeki her rastgele değerle çarpıp sonucu B dizisindeki her rastgele değere göre mod aldım ve minimum değeri seçtim
        Amaç, her satır için 2. adımdaki dizilerle aynı uzunlukta “minhash’lenmiş” bir tamsayı dizisi elde etmekti. Global dizi uzunluğunu 64 tanımlarsanız her satırın MinHash dizisi de 64 uzunluğunda olur
      4. Bir pencere fonksiyonuyla ardışık N MinHash değerini toplayarak hash dizisini bucket’lara ayırdım. Örneğin ardışık 4 satırı toplamak gibi
        İyi çalıştıysa bu diziyi açıp “kaynak satır” olarak tutarak, her bucket’lanmış MinHash değeri üzerinden veri kümesini kendisiyle join edince “hedef satır” sütunu eklenir
        Kaynak/hedef sütunlarına göre gruplayıp oluşum sayısını sayarsanız iki satırın ne kadar benzer olduğunu tahmin edebilirsiniz
        Özünde, iki öğe ne kadar çok benzer bucket’a hash’lenirse o kadar benzerdir; hangi noktadan sonra gerçek ikili Jaccard ya da kosinüs benzerliğini hesaplayacağınıza siz karar verirsiniz
    • Burada metin embedding’leri ve kosinüs benzerliği kullanmak işe yarayabilir: https://simonwillison.net/2023/Oct/23/embeddings/
    • MinHash kullanırsanız tam O(N^2) mesafe matrisinden kaçınabilirsiniz; ama yalnızca 600.000 öğe varsa, basitlik için tüm matrisi kaba kuvvetle hesaplamak da mümkün olabilir
      Mesele zaman bütçenizin ne kadar olduğu
    • İki öğenin çok benzer anahtar kelimeleri ele aldığını düşünüyorsanız Jaccard mesafesi iyi uyacaktır
      İki öğenin çok benzer metinleri paylaştığını düşünüyorsanız Levenshtein mesafesini denemeye değer
    • LLM’e öğeler için bir ters indeks oluşturtup kardinaliteyi düşük tutmaya zorlayabilirsiniz
      Böylece Jaccard benzerliğini kullanabilirsiniz
  • Yazıyı beğendim. NVIDIA’da ekibimiz yakın zamanda açıklanan bulanık tekilleştirme algoritmasının GPU hızlandırmalı bir sürümünü yayımladı; bu topluluğun da ilgisini çekebilir
    Depo burada: https://github.com/NVIDIA/NeMo-Curator/
    Bulanık tekilleştirme betiğinin dokümantasyonu burada: https://docs.nvidia.com/nemo-framework/user-guide/latest/dat...
    Python örneği de var: https://github.com/NVIDIA/NeMo-Curator/blob/main/examples/fu...
    Geri bildirim duymak isterim

  • Bu tür teknikler yazı olarak okunduğunda anlaşılmıyor; ama çalışan bir kod örneğine kendi verinizi birkaç kez koyup iç işleyişine bakınca hemen özümsenen türden
    Bu tekniği ilk Douglas Eck’ten öğrenmiştim: https://research.google/people/douglas-eck/
    Google’da şarkı kümeleme için kullanmıştı; hash’leme ve rastgele vektörlerden söz ettiğini hatırlıyorum
    O zamanlar daha az rastgelelik içeren optimizasyonların daha iyi olacağını düşündüğüm için kafam karışmıştı

    • Temel sezgi, en azından benim için, nesneleri çok küçük parçalardan oluşan yığınlara bölüp bu yığınları sıralamanın n farklı yolunu oluşturduğunuzda, benzer nesnelerde birden çok sıralamada aynı parçanın en üste çıkmasıdır
      Buna banding ve basit olasılık eklenince, çok büyük veri kümelerinde Jaccard benzerliğini ucuz ve çok kolay paralelleştirilebilir bir şekilde yaklaşık hesaplayabilirsiniz
  • Belge kümeleme ya da veri kümesi tekilleştirme tekniği olarak bakıldığında, bundan daha basit ayrık algoritma yaklaşımlarına kıyasla “probleme makine öğrenmesi atmak” kalite ve performans açısından nasıl olur?
    Örneğin önceden eğitilmiş bir LLM encoder’ıyla belge vektör embedding’leri üretip bu vektörleri bir vektör DB’ye koymak, ardından k-means ile kümelemek gibi

    • LLM, embedding üretmenin birçok yönteminden yalnızca biri
      k-means yapacaksanız yine Jaccard gibi bir mesafe fonksiyonu seçmeniz gerekir ve k-means yakın kopyalar için muhtemelen ideal değildir
      MinHash’i k-means için ön işleme olarak kullanıp hızı artırabilirsiniz
      Vektör DB’nin çok büyük katkı sağlayacağını sanmıyorum
      Yüz milyonlarca belgeniz varsa MinHash sketch sorgularını hızlandırmak için kullanılabilir; ama genelde aşırı bir seçim olma olasılığı yüksek
    • Böyle bir yaklaşımın LSH’den daha iyi çalıştığını gördüm
      Her belgeyi embed ederken eklemeden önce yaklaşık en yakın komşu araması yaptığınız için MinHash gibi O(N) olur
      HNSW ve PQ gibi vektör indeksleri, kosinüs mesafesi için MinHash karşılığı olan SimHash LSH’ye kıyasla daha iyi bir performans/kalite dengesi sunar
      Kalite, yakın kopyayı nasıl tanımladığınıza ve hangi embedding modelini kullandığınıza bağlıdır
      Güncel modeller iyi çalışır; etiketli veriniz varsa ince ayarla daha da iyi hale getirilebilir
      Başlıca dezavantaj, tüm belgeleri embed etmenin ek maliyetidir; özellikle uzun belgelerde bu yük büyüktür
      Ancak küçük modeller, daha iyi optimizasyonlar ve daha hızlı donanım sayesinde bu maliyet çok hızlı düştü