Yapay zeka devriminin tam ortasındayız. Bu devrim, pek çok sektörü kökten değiştiriyor ve büyük inovasyonlar sunuyor. Ancak beraberinde yeni zorluklar getiriyor. Özellikle büyük dil modelleri, üretken yapay zeka ve anlamsal arama içeren uygulamalar için etkili veri işleme giderek daha kritik bir hal alıyor.

Bu yeni uygulamaların tümü, semantik bilgiler taşıyan bir veri temsil türü olan vektör gömme (embedding) tekniklerine dayanmaktadır. Bu teknikler, yapay zekânın anlayış kazanması ve karmaşık görevleri gerçekleştirirken çekebileceği uzun vadeli belleği koruması için kritik olan anlam bilgilerini içerir.

Vektör Embedding nedir peki

Henüz farkında olmayabilirsiniz, ama vektör gömmeler her yerde. Arama motorlarından yapay zeka asistanlarına kadar birçok uygulamanın kullandığı pek çok makine öğrenme ve derin öğrenme algoritmasının temelini oluşturuyorlar. Eğer bu alandaki kendi uygulamanızı oluşturmayı düşünüyorsanız, muhtemelen bir noktada vektör gömmelere rastlayacaksınız.

Vektör Embedding ile hangi problemi çözmeye çalışıyoruz?

Geleneksel bir uygulama oluşturduğunuzda, veri yapılarınız muhtemelen bir veritabanından gelen nesneler şeklinde temsil edilir. Bu nesneler, oluşturduğunuz uygulama için ilgili özelliklere (veya veritabanındaki sütunlara) sahiptir.

Zamanla, bu nesnelerin özellikleri artar ve belirli bir görevi tamamlamak için hangi özelliklere odaklanmanız gerektiğine daha fazla dikkat etmeniz gerekebilir. Belki de bu "fat" nesneleri işlememenin yükünü taşımadan belirli görevleri çözmek için bu nesnelerin özel temsillerini oluşturmaya kadar gidebilirsiniz. Bu süreç, özellik mühendisliği olarak bilinir; uygulamanızı, elinizdeki göreve uygun temel özellikleri seçerek optimize edersiniz.

Yapısal olmayan (unstructured) verilerle uğraştığınızda, yine bu aynı özellik mühendisliği sürecinden geçmeniz gerekecek. Ancak, yapısal olmayan verilerin muhtemelen daha fazla ilgili özelliği olacak ve manuel özellik mühendisliği yapmak mümkün olmayacaktır.

Bu durumlarda, vektör gömmelerini otomatik özellik mühendisliği türünde bir çözüm olarak kullanabiliriz. Verilerimizden gerekli özellikleri manuel olarak seçmek yerine, bu verinin anlamlı yönlerini koruyarak daha kompakt bir temsilini üretecek şekilde önceden eğitilmiş bir makine öğrenme modeli uygularız.

Vektör gömmelerinin ne olduğuna başlamadan önce, vektörlerden bahsedelim. Bir vektör, bir boyuta ve bir yöne sahip matematiksel bir yapıdır. Örneğin, vektörü bir uzaydaki bir nokta olarak düşünebiliriz ve "yön", bu vektör uzayındaki (0,0,0) noktasından bu vektörün bulunduğu noktaya doğru olan bir ok olarak tanımlanır.

Vektör uzayındaki bir vektör

Geliştiriciler olarak bir vektörü sayısal değerler içeren bir dizi olarak düşünmek daha kolay olabilir. Örneğin:

vector = [0,-2,...4]

Bir uzayda bir dizi vektöre baktığımızda, bazılarının birbirine daha yakın olduğunu söyleyebiliriz, diğerleri ise daha uzakta. Bazı vektörler bir araya toplanmış gibi görünebilirken, diğerleri uzayda seyrek bir şekilde dağılmış olabilir.

Vektörler arasındaki ilişkilerin nasıl faydalı olabileceğini birazdan keşfedeceğiz.

Vektörler, makine öğrenme algoritmaları için ideal bir veri yapısıdır. Modern CPU'lar ve GPU'lar, bunları işlemek için gerekli matematiksel işlemleri gerçekleştirmek üzere optimize edilmiştir. Ancak, verilerimiz nadiren vektörler olarak temsil edilir. İşte vektör gömmenin devreye girdiği yer burasıdır. Bu, neredeyse herhangi bir veri türünü alıp vektörler olarak temsil etmemizi sağlayan bir tekniktir.

Ancak, Vektör Embedding verileri sadece vektörlere dönüştürmek kadar basit değil. Bu dönüştürülmüş veriler üzerinde görevler gerçekleştirebilmek ve verinin orijinal anlamını kaybetmeden kullanabilmek istiyoruz. Örneğin, iki cümleyi karşılaştırmak istiyorsak, sadece içerdikleri kelimeleri değil, asıl olarak aynı şeyi ifade edip etmediklerini karşılaştırmak istiyoruz. Verinin anlamını korumak için, vektörler arasındaki ilişkilerin anlamlı olduğu bir yapıda vektörler üretmeyi anlamamız gerekiyor.

Bunu yapabilmek için, gömme modeli (Embedding Model) olarak bilinen bir şeye ihtiyacımız var. Birçok modern gömme modeli, büyük miktarda etiketli veriyi bir sinir ağına ileterek oluşturulur. Sinir ağlarını daha önceden duymuş olabilirsiniz. Çeşitli karmaşık problemleri çözmek için kullanılan popüler araçlardır. Çok basit bir ifadeyle, sinir ağları, işlevlerle birbirine bağlanmış düğümlerin katmanlarından oluşur. Bu sinir ağlarını çeşitli görevleri gerçekleştirmek üzere eğitiriz.

Sinir ağlarını eğitirken denetimli öğrenme uygularız - ağa, girişlerin ve etiketlenmiş çıkışların çiftlerinden oluşan büyük bir eğitim veri kümesi veririz. Alternatif olarak, etiketlenmiş çıkışlara ihtiyaç duymayan öz denetimli veya denetimsiz öğrenmeyi uygulayabiliriz. Bu değerler, ağ aktivasyonlarının ve işlemlerinin her katmanında dönüştürülür. Eğitimin her iterasyonunda sinir ağı, her katmandaki aktivasyonları değiştirir. Sonunda, belirli bir giriş için çıkış etiketinin ne olması gerektiğini, hatta daha önce bu belirli girişi görmemişse dahi tahmin edebilir.

Gömme modeli, temelde bu son katmanı çıkartılmış sinir ağıdır. Bir giriş için belirli bir etiketlenmiş değeri almak yerine, bir vektör gömme elde ederiz.

Bir gömme modelinin harika bir örneği, yaygın bir şekilde metin tabanlı görevler için kullanılan popüler "word2vec"dir. Gömme (embedding) görselleştirmelerini kolayca görmek için kullanılan TensorFlow'un "projector" aracı tarafından üretilen bir görselleştirmeye bir göz atalım.

Bu görselleştirme sadece gömme (embedding) yapısının üç boyutunu temsil etse de, gömme modelinin nasıl çalıştığını anlamamıza yardımcı olabilir. Görselleştirmede vurgulanan birçok veri noktası bulunmakta; her biri bir kelimenin vektör gömme temsilini temsil etmektedir. İsminden de anlaşılacağı gibi, word2vec kelimeleri gömüyor. Birbirine yakın görünen kelimeler, anlamsal olarak benzerken, birbirinden uzak kelimeler farklı anlamsal anlamlara sahiptir.

Eğitildikten sonra, bir gömme modeli ham verilerimizi vektör gömmelere dönüştürebilir. Bu, yeni veri noktalarını vektör uzayında nereye yerleştireceğini bilir demektir.

Word2vec örneğinde gördüğümüz gibi, model bağlamında birbirine yakın vektörler bağlamsal benzerliğe sahipken, birbirinden uzak vektörler birbirinden farklıdır. Bu, vektörümüze anlam veren şeydir — vektörün vektör uzayındaki diğer vektörlerle ilişkisi, gömme modelinin eğitildiği alanı "anlamasına" bağlıdır.

Vektör gömmeleri ile neler yapabiliriz?

Vektör gömmeleri son derece esnek bir araçtır ve birçok alanda uygulanabilir. Genel olarak bir uygulama, sorgu olarak bir vektör gömme kullanır ve bu vektörle benzerlik taşıyan diğer vektör gömmelerini üretir, her birinin ilgili değerleriyle birlikte. Her alanın uygulamalarındaki fark, bu benzerliğin anlamı üzerindeki etkisindedir.

İşte bazı örnekler:

  • Anlamsal Arama - Geleneksel arama motorları genellikle anahtar kelimelerin örtüşmelerini arayarak çalışır. Vektör gömmelerini kullanarak anlamsal arama, sorgunun anlamına dayalı sonuçlar sunarak anahtar kelime eşleştirmesinin ötesine geçebilir.
  • Soru-Cevap Uygulamaları - Soru ve karşılık gelen cevapların çiftleriyle bir gömme modelini eğiterek, daha önce görülmemiş soruları yanıtlayan bir uygulama oluşturabiliriz.
  • Görüntü Arama - Vektör gömmeleri, görüntü alma görevleri için temel olarak hizmet eder. CLIP, ResNet gibi hazır modeller gibi birden çok hazır model bulunmaktadır. Farklı modeller, görüntü benzerliği, nesne tespiti ve daha birçok farklı görevi işler.
  • Ses Arama - Sesleri bir dizi aktivasyona (örneğin, bir ses spektrogramı) dönüştürerek, ses benzerlik araması için kullanılabilecek vektör gömmeleri üretiriz.
  • Tavsiye Sistemleri - Ürünler, makaleler vb. gibi farklı varlıklara karşılık gelen yapılandırılmış verilerden gömme oluşturabiliriz. Genellikle kendi gömme modelinizi oluşturmanız gerekir, çünkü bu özellikle sizin belirli uygulamanıza özgü olacaktır. Bazen bu, görseller veya metin açıklamaları bulunduğunda yapılandırılmamış gömme yöntemleri ile birleştirilebilir.
  • Anomalı Tespiti - Anormallik durumlarını tanımlayan etiketli büyük veri kümeleri kullanarak anormallik tespiti için gömme oluşturabiliriz.

Vektörel Databaselere başlayalım

Vektörel Gömmeler, büyük dil modelleri gibi yapay zeka modelleri tarafından oluşturulur ve temsil etmeleri zor olan büyük bir sayıda özellik veya özelliğe sahiptir. Yapay zeka ve makine öğrenme bağlamında bu özellikler, desenleri, ilişkileri ve temel yapıları anlamanın temel unsurlarını temsil eder.

Bu nedenle, bu tür verilerle başa çıkmak için özel olarak tasarlanmış bir veritabanına ihtiyacımız var. Vektör veritabanları, gömme verilerini optimize edilmiş depolama ve sorgulama yetenekleri sunarak işleme imkanı tanır. Vektör veritabanları, tek başına vektör indekslerinde bulunmayan geleneksel bir veritabanının yeteneklerine sahip olmanın yanı sıra, vektör gömmeleri ile ilgilenme konusunda uzmanlaşmış ve geleneksel skaler tabanlı veritabanlarının eksik olduğu özelliklere sahiptir.

Vektör gömmeleriyle çalışmanın avantajı, geleneksel skaler tabanlı veritabanlarının bu tür verilerin karmaşıklığı ve ölçeğiyle başa çıkamamasıdır, bu da içgörüler çıkarmayı ve gerçek zamanlı analiz yapmayı zorlaştırır. İşte vektör veritabanlarının devreye girdiği nokta - bu tür verileri işlemek için özellikle tasarlanmış olup, verilerinizden en iyi şekilde yararlanmak için ihtiyacınız olan performansı, ölçeklenebilirliği ve esnekliği sunarlar.

Vektör veritabanı ile yapay zekâmıza semantik bilgi çıkarma, uzun vadeli bellek gibi gelişmiş özellikler ekleyebiliriz. Aşağıdaki diyagram, bu tür uygulamalarda vektör veritabanlarının rolünü daha iyi anlamamıza yardımcı olur:

Hadi bunu detaylandıralım:

  1. İlk olarak, içeriği dizinlemek istediğimiz vektör gömme modelini kullanarak vektör gömmeleri oluşturuyoruz.
  2. Vektör gömme, oluşturulduğu orijinal içeriğe referansla birlikte vektör veritabanına eklenir.
  3. Uygulama bir sorgu gönderdiğinde, aynı gömme modelini kullanarak sorgu için gömme oluşturuyoruz ve bu gömmeleri kullanarak veritabanını benzer vektör gömlemler için sorguluyoruz. Ve yine daha önce belirtildiği gibi, bu benzer gömmeler, onları oluşturmak için kullanılan orijinal içerikle ilişkilendirilir.

Bir vektör indeksi ve bir vektör veritabanı arasındaki fark nedir?

FAISS (Facebook Yapay Zeka Benzerlik Araması) gibi bağımsız vektör endeksleri, vektör yerleştirmelerin aranmasını ve alınmasını önemli ölçüde iyileştirebilir, ancak herhangi bir veritabanında bulunan yeteneklerden yoksundurlar. Öte yandan vektör veritabanları, vektör yerleştirmelerini yönetmek için özel olarak oluşturulmuştur ve bağımsız vektör endekslerinin kullanılmasına göre çeşitli avantajlar sağlar:

  1. Veri yönetimi: Vektör veritabanları, veri ekleme, silme ve güncelleme gibi veri depolama için iyi bilinen ve kullanımı kolay özellikler sunar. Bu, vektör verilerinin yönetimini ve bakımını, bir depolama çözümüyle entegre etmek için ek çalışma gerektiren FAISS gibi bağımsız bir vektör indeksi kullanmaktan daha kolay hale getirir.
  2. Meta veri depolama ve filtreleme: Vektör veritabanları, her vektör girişiyle ilişkili meta verileri depolayabilir. Kullanıcılar daha sonra daha ayrıntılı sorgular için ek meta veri filtreleri kullanarak veritabanını sorgulayabilir.
  3. Ölçeklenebilirlik: Vektör veritabanları, artan veri hacimlerine ve kullanıcı taleplerine göre ölçeklenecek şekilde tasarlanmış olup, dağıtılmış ve paralel işleme için daha iyi destek sağlar. Bağımsız vektör endeksleri, benzer ölçeklenebilirlik düzeylerine ulaşmak için özel çözümler gerektirebilir (bunları Kubernetes kümelerinde veya diğer benzer sistemlerde dağıtmak ve yönetmek gibi).
  4. Gerçek zamanlı güncellemeler: Vektör veritabanları genellikle gerçek zamanlı veri güncellemelerini destekleyerek verilerde dinamik değişikliklere izin verir; oysa bağımsız vektör indeksleri, yeni verileri dahil etmek için tam bir yeniden indeksleme işlemi gerektirebilir; bu, zaman alıcı ve hesaplama açısından pahalı olabilir.
  5. Yedeklemeler ve koleksiyonlar: Vektör veritabanları, veritabanında saklanan tüm verilerin yedeklenmesine ilişkin rutin işlemi gerçekleştirir. Çam kozalağı ayrıca kullanıcıların, verileri daha sonra kullanmak üzere bu dizinde saklayan "koleksiyonlar" biçiminde yedeklenebilecek belirli dizinleri seçmelerine de olanak tanır.
  6. Ekosistem entegrasyonu: Vektör veritabanları, ETL işlem hatları (Spark gibi), analiz araçları (Tableau ve Segment gibi) ve görselleştirme platformları (Grafana gibi) gibi bir veri işleme ekosisteminin diğer bileşenleriyle daha kolay entegre olabilir; bu da veri yönetimi iş akışını kolaylaştırır. Ayrıca LangChain, LlamaIndex ve ChatGPT Eklentileri gibi yapay zeka ile ilgili diğer araçlarla kolay entegrasyon sağlar.
  7. Veri güvenliği ve erişim kontrolü: Vektör veritabanları genellikle hassas bilgileri korumak için yerleşik veri güvenliği özellikleri ve erişim kontrol mekanizmaları sunar; bunlar, bağımsız vektör indeks çözümlerinde mevcut olmayabilir.

Kısacası, bir vektör veritabanı, ölçeklenebilirlik zorlukları, hantal entegrasyon süreçleri ve gerçek zamanlı güncellemelerin ve yerleşik güvenlik önlemlerinin bulunmaması gibi bağımsız vektör endekslerinin sınırlamalarını ele alarak, vektör yerleştirmeleri işlemek için üstün bir çözüm sağlar ve ekili ve kolaylaştırılmış veri yönetimi deneyimi gibi daha fazlasını sağlar.

Bir vektör veritabanı nasıl çalışır?

Hepimiz geleneksel veritabanlarının (aşağı yukarı) nasıl çalıştığını biliyoruz; dizeleri, sayıları ve diğer türdeki skaler verileri satırlar ve sütunlar halinde depolarlar. Öte yandan, bir vektör veritabanı vektörler üzerinde çalıştığından optimize edilme ve sorgulanma şekli oldukça farklıdır.

Geleneksel veritabanlarında, genellikle veritabanındaki değerin sorgumuzla tam olarak eşleştiği satırları sorgularız. Vektör veritabanlarında sorgumuza en çok benzeyen vektörü bulmak için benzerlik metriği uygularız.

Bir vektör veritabanı, tümü Yaklaşık En Yakın Komşu (ANN) aramasına katılan farklı algoritmaların bir kombinasyonunu kullanır. Bu algoritmalar aramayı karma, niceleme veya grafik tabanlı arama yoluyla optimize eder.

Bu algoritmalar, sorgulanan bir vektörün komşularının hızlı ve doğru bir şekilde alınmasını sağlayan bir boru hattında birleştirilir. Vektör veritabanı yaklaşık sonuçlar sağladığından, dikkate aldığımız ana ödünler doğruluk ve hız arasındadır. Sonuç ne kadar doğru olursa sorgu o kadar yavaş olur. Ancak iyi bir sistem, mükemmele yakın doğrulukla ultra hızlı arama sağlayabilir.

İşte bir vektör veritabanı için ortak bir işlem hattı:

  1. İndeksleme: Vektör veritabanı, PQ, LSH veya HNSW gibi bir algoritma kullanarak vektörleri indeksler (bunlar hakkında daha fazlası aşağıdadır). Bu adım, vektörleri daha hızlı aramayı sağlayacak bir veri yapısıyla eşleştirir.
  2. Sorgulama: Vektör veritabanı, en yakın komşuları bulmak için indekslenmiş sorgu vektörünü veri kümesindeki indekslenmiş vektörlerle karşılaştırır (bu indeks tarafından kullanılan bir benzerlik ölçüsünü uygulayarak)
  3. İşlem Sonrası: Bazı durumlarda, vektör veritabanı, veri kümesinden en yakın son komşuları alır ve nihai sonuçları döndürmek için bunları sonradan işler. Bu adım, farklı bir benzerlik ölçüsü kullanarak en yakın komşuların yeniden sıralanmasını içerebilir.

Aşağıdaki bölümlerde bu algoritmaların her birini daha ayrıntılı olarak tartışacağız ve bunların bir vektör veritabanının genel performansına nasıl katkıda bulunduğunu açıklayacağım.

Algoritmalar

Çeşitli algoritmalar bir vektör indeksinin oluşturulmasını kolaylaştırabilir. Ortak hedefleri hızlı bir şekilde geçilebilen bir veri yapısı oluşturarak hızlı sorgulamaya olanak sağlamaktır. Sorgu sürecini optimize etmek için genellikle orijinal vektörün temsilini sıkıştırılmış bir forma dönüştürürler.

Aşağıdaki bölümlerde çeşitli algoritmalar ve bunların vektör yerleştirmelerini işlemeye yönelik benzersiz yaklaşımları inceleyeceğiz.

Rastgele Projeksiyon

Rastgele projeksiyonun (Random Projection) arkasındaki temel fikir, rastgele bir projeksiyon matrisi kullanarak yüksek boyutlu vektörleri daha düşük boyutlu bir uzaya yansıtmaktır. Rastgele sayılardan oluşan bir matris oluşturuyoruz. Matrisin boyutu istediğimiz hedef düşük boyut değeri olacaktır. Daha sonra girdi vektörleri ile matrisin nokta çarpımını hesaplarız; bu, orijinal vektörlerimizden daha az boyuta sahip ancak yine de benzerliklerini koruyan öngörülen bir matrisle sonuçlanır.

Sorguladığımızda sorgu vektörünü daha düşük boyutlu uzaya yansıtmak için aynı projeksiyon matrisini kullanırız. Daha sonra, en yakın komşuları bulmak için öngörülen sorgu vektörünü veritabanındaki öngörülen vektörlerle karşılaştırırız. Verilerin boyutu azaltıldığı için arama süreci, yüksek boyutlu uzayın tamamının aranmasından önemli ölçüde daha hızlıdır.

Rastgele projeksiyonun yaklaşık bir yöntem olduğunu ve projeksiyon kalitesinin projeksiyon matrisinin özelliklerine bağlı olduğunu unutmayın. Genel olarak projeksiyon matrisi ne kadar rastgele olursa projeksiyonun kalitesi de o kadar iyi olur. Ancak gerçekten rastgele bir projeksiyon matrisi oluşturmak, özellikle büyük veri kümeleri için hesaplama açısından pahalı olabilir.

Ürün Niceleme (Product Quantization)

Dizin oluşturmanın başka bir yolu da, yüksek boyutlu vektörler (vektör yerleştirmeleri gibi) için kayıplı bir sıkıştırma tekniği olan ürün nicelemesidir (PQ). Orijinal vektörü alır, onu daha küçük parçalara ayırır, her parça için temsili bir "kod" oluşturarak her parçanın temsilini basitleştirir ve ardından benzerlik işlemleri için hayati önem taşıyan bilgileri kaybetmeden tüm parçaları tekrar bir araya getirir. PQ süreci dört adıma ayrılabilir: bölme, eğitim, kodlama ve sorgulama.

  1. Bölme -Vektörler segmentlere ayrılır.
  2. Eğitim - her segment için bir "kod kitabı" oluştururuz. Basitçe söylemek gerekirse, algoritma, bir vektöre atanabilecek potansiyel "kodlardan" oluşan bir havuz oluşturur. Uygulamada bu "kod kitabı", vektörün her bir parçası üzerinde k-ortalamalı kümeleme gerçekleştirilerek oluşturulan kümelerin merkez noktalarından oluşur. Segment kod kitabında k-ortalama kümelemesi için kullandığımız değerle aynı sayıda değere sahip oluruz.
  3. Kodlama - Algoritma her segmente belirli bir kod atar. Uygulamada, eğitim tamamlandıktan sonra kod kitabında her vektör segmentine en yakın değeri buluyoruz. Segmente ilişkin PQ kodumuz, kod kitabında karşılık gelen değerin tanımlayıcısı olacaktır. İstediğimiz kadar PQ kodu kullanabiliriz; bu, her segmenti temsil etmek için kod kitabından birden fazla değer seçebileceğimiz anlamına gelir.
  4. Sorgulama - Sorguladığımızda, algoritma vektörleri alt vektörlere ayırır ve aynı kod kitabını kullanarak bunları niceler. Daha sonra sorgu vektörüne en yakın vektörleri bulmak için indekslenmiş kodları kullanır.

Kod kitabındaki temsili vektörlerin sayısı, gösterimin doğruluğu ile kod kitabını aramanın hesaplama maliyeti arasındaki bir dengedir. Kod kitabındaki temsili vektörler ne kadar fazlaysa, altuzaydaki vektörlerin temsili de o kadar doğru olur, ancak kod kitabını aramanın hesaplama maliyeti de o kadar yüksek olur. Buna karşılık, kod kitabındaki temsili vektörler ne kadar az olursa temsilin doğruluğu da o kadar az olur, ancak hesaplama maliyeti de o kadar düşük olur.

Locality-sensitive hashing

Locality-sensitive hashing (LSH), yaklaşık en yakın komşu araması bağlamında indekslemeye yönelik bir tekniktir. Yaklaşık, kapsamlı olmayan bir sonuç sunarken hız için optimize edilmiştir. LSH, aşağıda görüldüğü gibi bir dizi karma işlevi kullanarak benzer vektörleri "buckets" (paketler) ile eşler:

Belirli bir sorgu vektörü için en yakın komşuları bulmak amacıyla, benzer vektörleri karma tablolarına "paketlemek" için kullanılan aynı karma işlevlerini kullanırız. Sorgu vektörü belirli bir tabloya hashlenir ve daha sonra en yakın eşleşmeleri bulmak için aynı tablodaki diğer vektörlerle karşılaştırılır. Bu yöntem, tüm veri kümesinde arama yapmaktan çok daha hızlıdır çünkü her karma tablosunda tüm uzaydakinden çok daha az vektör vardır.

LSH'nin yaklaşık bir yöntem olduğunu ve yaklaşımın kalitesinin hash fonksiyonlarının özelliklerine bağlı olduğunu hatırlamak önemlidir. Genel olarak, ne kadar çok karma fonksiyonu kullanılırsa, yaklaşım kalitesi o kadar iyi olur. Ancak çok sayıda karma fonksiyonunun kullanılması hesaplama açısından pahalı olabilir ve büyük veri kümeleri için uygun olmayabilir.