1 puan yazan GN⁺ 2024-09-16 | 1 yorum | WhatsApp'ta paylaş
  • WordLlama, LLM'lerin token gömmelerini yeniden kullanarak bulanık tekrar temizleme, benzerlik hesaplama, sıralama, kümeleme ve anlamsal metin bölme yapan hızlı ve hafif bir NLP araç takımıdır
  • Çıkarım, ağırlıklı olarak token arama ve ortalama havuzlama ile çalışır; yalnızca NumPy ile çalışabilen hafif bir pipeline ve CPU optimizasyonu sunar
  • Varsayılan model 256 boyutlu 16MB'dır; Matryoshka temsiliyle boyut azaltılabilir ve ikili gömmeler, Hamming benzerliğiyle daha hızlı hesaplamayı destekler
  • MTEB tablosunda WL64~WL1024, birçok metrikte GloVe 300d ve Komninos'tan daha yüksek puan alırken all-MiniLM-L6-v2'den genel olarak daha düşük puan alır
  • pip install wordllama sonrasında WordLlama.load() ile kullanılabilir; .key(query), sorted, min, max gibi standart kütüphane fonksiyonlarına verilebilecek callable bir fonksiyon döndürür

WordLlama ne yapar?

  • WordLlama, bulanık tekrar temizleme, benzerlik hesaplama, sıralama, kümeleme ve anlamsal metin bölme gibi NLP yardımcı işleri için hafif bir araç takımıdır
  • LLaMA 2, LLaMA 3 70B gibi modern LLM'lerden token gömme codebook'larını çıkararak GloVe·Word2Vec·FastText'e benzer, kompakt kelime temsilleri oluşturur
  • Çıkarım sırasında az bağımlılığa ihtiyaç duyar ve CPU donanımı için optimize edilmiştir; bu nedenle kaynak kısıtlı ortamlarda dağıtım için uygundur
  • Hızlı ve küçük yapısı sayesinde keşif amaçlı analiz, LLM çıktı değerlendiricileri ve multi-hop ya da agentic workflow'ların hazırlık işleri gibi yardımcı kullanım senaryolarına uygundur

Kurulum ve temel kullanım

  • Kurulum pip ile yapılır
pip install wordllama
  • Varsayılan 256 boyutlu model, WordLlama.load() ile yüklenir
from wordllama import WordLlama

wl = WordLlama.load()
  • .key(query), Callable[[str], float] döndürür; böylece aday dizgileri sorguyla benzerliklerine göre sıralayabilir veya en yüksek olanı seçebilirsiniz
query = "Machine learning methods"
candidates = [
    "Foundations of neural science",
    "Introduction to neural networks",
    "Cooking delicious pasta at home",
    "Introduction to philosophy: logic",
]

sim_key = wl.key(query)

sorted_candidates = sorted(candidates, key=sim_key, reverse=True)
best_candidate = max(candidates, key=sim_key)
  • Örnek sonuçta "Introduction to neural networks", 0.3414 puanla en yüksek skoru alan aday olur

Başlıca özellikler

  • Gömme üretimi: Basit token arama ve ortalama havuzlama ile metin gömmelerini hızlıca üretir
  • Benzerlik hesaplama: İki metin arasındaki cosine similarity'yi hesaplar
  • Belge sıralama: Sorgu ile aday belgeler arasındaki benzerliğe göre sıralama yapar
  • Bulanık tekrar temizleme: Benzerlik eşiğine göre yinelenen metinleri kaldırır
  • Kümeleme: Belgeleri KMeans ile gruplar
  • Filtreleme: Yalnızca sorguyla benzerliği belirli bir eşik üstünde olan belgeleri bırakır
  • Top-K arama: Sorguya en benzer K belgeyi döndürür
  • Anlamsal metin bölme: Metni anlamsal olarak tutarlı parçalara ayırır
  • İkili gömmeler: Hamming benzerliğiyle daha hızlı hesaplamayı destekler
  • Matryoshka temsili: Gerektiğinde gömme boyutunu keserek model boyutu ve performansı ayarlar

Model yapısı ve performans

  • WordLlama, genel amaçlı bir gömme çerçevesi içinde context-less küçük modeller eğitir
  • Varsayılan model 256 boyutlu 16MB boyutundadır
  • README'deki MTEB tablosu, WL64, WL128, WL256, WL512, WL1024 modellerini GloVe 300d, Komninos ve all-MiniLM-L6-v2 ile karşılaştırır
    • WL256; Clustering 33.25, Reranking 52.03, Classification 58.21, Pair Classification 78.22, STS 67.91, CQA DupStack 24.12, SummEval 30.99 değerlerini elde eder
    • GloVe 300d aynı başlıklarda sırasıyla 27.73, 43.29, 57.29, 70.92, 61.85, 15.47, 28.87 değerlerini alır
    • all-MiniLM-L6-v2; Clustering 42.35, Reranking 58.04, Classification 63.05, Pair Classification 82.37, STS 78.90, CQA DupStack 41.32, SummEval 30.81 değerlerini alır
  • l2_supercat, LLaMA 2 vocabulary modelidir
    • LLaMA 2 70B ve phi 3 medium gibi çeşitli modellerin codebook'larından ek special token'ları kaldırdıktan sonra birleştirerek eğitilmiştir
    • LLaMA 2 tokenizer kullanan çeşitli modellerin codebook'ları birlikte birleştirilerek eğitilebilir
    • LLaMA 3 70B codebook eğitimiyle benzer performans gösterirken vocabulary boyutu 128k yerine 32k olduğu için 4 kat daha küçüktür
  • LLaMA 3 tabanlı model olarak l3_supercat sunulmaktadır
  • Ek sonuçlar Results sayfasında yer alır

Anlamsal metin bölme

  • .split(), uzun bir metni anlamsal parçalara böler
long_text = "Your very long text goes here... " * 100
chunks = wl.split(long_text, target_size=1536)

print(list(map(len, chunks)))

# Output: [1055, 1055, 1187]
  • target_size, hem hedef boyut hem de azami boyuttur
  • Bölme süreci, metin sırasını, cümle yapısını ve mümkün olduğunda paragraf yapısını korumaya çalışır
  • Daha doğal bölme indeksleri bulmak için WordLlama gömmeleri kullanılır
  • Çıktı parçalarının boyutu target_size altındaki aralıkta değişebilir
  • Önerilen target size 512~2048 karakter aralığındadır ve varsayılan değer 1536'dır
  • Daha büyük parçalar gerekiyorsa, bölme sonrasında birden fazla semantic chunk'ı batch halinde birleştirme yaklaşımı önerilir
  • Ayrıntılar technical overview içinde bulunabilir

Model2Vec ve doğrudan çıkarım

  • 2025-01-04 güncellemesiyle Model2Vec static embeddings desteği eklendi
  • WordLlama.load_m2v() ile Model2Vec modeli yüklenebilir
wl = WordLlama.list_configs()

wl = WordLlama.load_m2v("potion_base_8m")  # 256-dim model
wl = WordLlama.load_m2v("m2v_multilingual")  # multilingual model
  • Model2Vec, PCA kullanarak static embedding üretmenin farklı bir yoludur
  • Model2Vec tarafında multilingual model ve glove tabanlı modeller üretildiği, ayrıca word similarity görevlerinde iyi puanlar aldığı belirtiliyor
  • Hugging Face üzerindeki minishlab sayfasından incelenebilir
  • WordLlamaInference, loader yerine (n_vocab, dim) biçimindeki static embedding dizisini ve tokenizer'ı doğrudan vererek kullanılabilir
from wordllama import WordLlamaInference
from tokenizers import Tokenizer

tokenizer = Tokenizer.from_pretrained(...)
wl = WordLlamaInference(np_embeddings_ar, tokenizer)

Eğitim ve gömme çıkarma

  • İkili gömme modeli, yüksek boyutlarda daha belirgin iyileşme gösterdi; ikili gömmeler için 512 veya 1024 boyut önerilir
  • L2 Supercat modeli, tek bir A100 GPU üzerinde batch size 512 ile 12 saat eğitildi
  • LLaMA modellerinden token gömmeleri çıkarmak için kullanıcı sözleşmesini kabul etmeniz ve Hugging Face CLI ile giriş yapmanız gerekir
from wordllama.extract.extract_safetensors import extract_safetensors

extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")
  • Gömmeler genellikle ilk safetensors dosyasında bulunur, ancak her zaman böyle olmayabilir
    • Bir manifest olabilir
    • Dosyaları kendiniz inceleyip bulmanız gerekebilir
  • Eğitim için depodaki script'ler kullanılır; mevcut bir ayarı kopyalayarak veya değiştirerek yeni bir configuration file eklemeniz gerekir
pip install wordllama[train]
python train.py train --config your_new_config
python train.py save --config your_new_config --checkpoint ... --outdir /path/to/weights/
  • Kaydetme adımı, her Matryoshka boyutu için modeli ayrı ayrı kaydeder

Güncellemeler, yol haritası, lisans

  • 2025-02-01 güncellemesiyle sorted, min, max gibi standart kütüphane fonksiyonlarında kullanılabilecek callable desteği eklendi
  • 2024-10-04 güncellemesiyle semantic splitting inference algorithm eklendi
  • Yol haritasında DSPy evaluator ve Retrieval-Augmented Generation, yani RAG pipeline örnek notebook'larının eklenmesi yer alıyor
  • Topluluk projeleri arasında Gradio Demo HF Space ve CPU-ish RAG bulunuyor
  • Projenin lisansı MIT License'dır

1 yorum

 
GN⁺ 2024-09-16
Hacker News yorumları
  • Küçük boyutu gerçekten hoşuma gitti. Şimdiden SBERT’in en küçük modeline göre bile avantajları var.
    Ancak teknik olarak oldukça eski bir yaklaşım gibi görünüyor ve bunun performansla bir ödünleşim olduğunu anlıyorum. Yine de anlamsal benzerlik, doğal dil çıkarımı (NLI), isim soyutlama gibi benzerlik türleri arasında geçiş sunup sunamayacağını merak ediyorum.
    Örneğin gazete haberlerini “aşırı çevresel olay” gibi kategoriler altında gruplarken “Freezing” ile “Burning”in birbirine çok benzer çıkmasını isterim. Bu, MTEB/Sentence-Similarity ya da klasik Word2Vec/GloVe gibi çalıştığı durum. Ama bir kimya yazısı söz konusuysa bu ikisi neredeyse zıt çıkmalı; doğal dil çıkarımı gömmeleriyle iki nesne arasındaki nedensel ilişkiyi görmek istediğim durumlar da oluyor.
    Son iki gömme türü 2019 sonrası görece yeni yöntemler olduğu için teknik fırsatın daha büyük olduğunu düşünüyorum. Eski MTEB/anlamsal benzerlik hattı 2014’ten beri pek çok kullanım için yeterliydi ve 2019’da mini-lm-v2 gibi modellerle ciddi biçimde iyileşti.
    Yukarıdaki üç gömme türü SBERT ile de mümkün, ama boyutları ve modelleri büyük; tür başına birden fazla model yükleyince kaynak yükü artıyor. Üretken gömme modelleri ya da E5, doğal dil çıkarımı modelleri büyük olduğundan çoğu zaman yaklaşık 6 GB gerekiyor.

    • İyi fikir. Birkaç deney yapıp uygulanabilirliğini kontrol edeceğim.
      Tek bir benzerlik türüyle eğitildiğinde performansın nasıl olduğunu görmek isterim. Bağlam hesabı olmadan bunu ele almanın başka bir yolu olup olmadığından emin değilim. Model değiştirmek gerekebilir, ama bu başlı başına büyük bir sorun değil.
    • Bu 17 MB’lık bir model ve benchmark’larda MiniLM v2’den, yani SBERT’ten doğal olarak düşük çıkıyor. Ben 23 MB’lık modelle V3’ü ONNX üzerinde neredeyse tüm platformlarda çalıştırıyorum.
      Küçümsemek istemiyorum; böyle işleri bağlamı içinde anlamak önemli. Buradaki bağlam şu: LLM’leri derinlemesine anlamaya başlayınca LLM’lerde de gömmeler olduğunu keşfediyorsunuz; o bakış açısından, tüm gömme alanının mevcut durumunu yeniden taramak yerine o gömmelerle oynayıp bir adım ilerlemek daha doğal geliyor.
    • “ChatGPT gömmesi” ile OpenAI gömme modeli kastediliyorsa, “burning” ve “freezing” hiç de zıt değil. text-embedding-large-3’ün 1024 boyutuyla çalıştırınca kosinüs benzerliği yaklaşık 0,46 çıkıyor. Tamamen zıt gömmeler olsaydı benzerliğin -1 olması gerekirdi.
      Zıt anlamlı kelimelerin zıt gömmelere sahip olduğunu düşünmek yaygın bir yanılgı. Gerçekte zıt anlamlı kelimelerin de pek çok ortak noktası var. “burning” ve “freezing” ikisi de sıcaklık ve fizik ile ilgili; İngilizce kelimeler; fiil, isim ve sıfat olarak kullanılabiliyorlar; yazımları da doğru. Tüm bu özellikler gömmelere giriyor.
  • Gömmeler, eğitim verisine ve amaç fonksiyonuna bağlı olarak çok fazla anlamsal bilgi içerir ve birçok yararlı görevde bağımsız olarak kullanılabilir.
    Daha önce CLIP modelinin metin kodlayıcı gömmelerini kullanarak, prompt’ların karşılık gelen görüntülerle daha iyi eşleşmesini sağlamıştım. Örneğin prompt’ta “building” varsa, gömme matrisinde “concrete”, “underground” gibi en yakın komşuları bulup ilgili kelimenin arkasına değiştirerek ya da ekleyerek koyuyordum. Sınırlı deneylerde, sorguların çoğunda geri çağırma arttı.

    • Doğru. Bu tür alan içi bağlamsal ilişkiler gömme modeline öğretilebilir.
      https://www.marqo.ai/blog/generalized-contrastive-learning-f...
    • Gerçekten harika bir fikir. Bu uygulamada da mümkün görünüyor; biraz daha düşüneceğim.
      wordllama’da token gömmelerinin boyutuna bakınca, zenginleştirilecek önemli token’ları belirlemeye de yardımcı olabileceğini düşünüyorum. Ancak bu işe uygun olarak seçilmiş verilerle eğitilirse çok daha iyi çalışabilir.
  • İngilizce dışındaki diller için de plan olup olmadığını merak ediyorum. Fransızca için mükemmel bir araç olur gibi.

    • Gayet mümkün. Eğitim için bir derlem oluşturmak gerekiyor; Fransızca için hangi kaynaklar var pek bilmiyorum.
      Mistral ailesi modellerle biraz eğitim denemiştim, bu yüzden Fransızca derlemde önce o tarafı denemem muhtemel.
      Bir issue açarsanız zaman bulduğumda üzerinde çalışırım.
  • Büyük bir derlemde, örneğin 10.000’den fazla cümlede her cümleyi bir belge olarak görmek gibi bir kullanımda, TF-IDF seyrek matris vektörlerini k-means ile kümeleyerek de benzer sonuçlar elde edebilirsiniz.
    Yine de bu araçta ikilileştirme gibi yöntemlerle k-means kısmını hızlandıran epey yardımcı işlev var gibi. Önümüzdeki birkaç hafta içinde benchmark yapmayı düşünüyorum.

  • Birkaç yıl önce benzer fonksiyonları kullanan bir dil oyunları koleksiyonu yapmıştım: https://github.com/Hellisotherpeople/Language-games

  • Gömmelerle Little Alchemy çözmeyi düşünen oldu mu merak ediyorum. #sample-use

  • Güzel görünüyor. mini-lm modeline göre avantajı olup olmadığını merak ediyorum. Çoğu MTEB görevinde mini-lm daha iyi görünüyor; çıkarım hızı gibi konularda daha iyi olduğu yönler var mı merak ediyorum.

    • Mini-lm daha iyi bir gömme modeli. Bu model attention hesabı yapmıyor ve eğitimden sonra derin öğrenme framework’ü de kullanmıyor. Bu yüzden Transformer modellerinin bağlamsal avantajlarını elde edemiyorsunuz.
      Hedefi de en güncel, en yüksek performanslı model olmak değil. Bağımlılıkları, boyutu ve donanım gereksinimlerini azaltıp hızı artırmak için oldukça sınırlı koşullar koyulmuş bir model.
      Kelime gömme modeli olarak bakıldığında da oldukça hafif sayılır. Genelde bu tür modeller çok daha büyük sözlükler kullanır ve birkaç GB boyutunda olur.
    • Modelin kendi boyut farkı gibi görünüyor. Daha hafif ve hızlı. mini-lm 80 MB, buradaki en küçük model ise 16 MB.
  • Oyun geliştirme için çok yararlı görünüyor.

  • Token’ların kendi içinde ne kadar çok anlamsal içerik taşıdığını iyi gösteriyor.

  • PostgreSQL eklentisi olarak yapılabilir mi?