Çok Vektörlü Modelleri Eğitme ve İnce Ayar Yapma: ColBERT Tarzı Yaklaşım
Çok vektörlü (multi-vector) modeller, metinleri tek bir vektöre sıkıştırmak yerine her token için ayrı vektör tutarak daha hassas bir arama sunar. Bu makalede, Sentence Transformers kütüphanesiyle bu modellerin nasıl eğitileceğini ve kendi verinize nasıl ince ayar yapılacağını adım adım öğrenin.
Çok Vektörlü Modeller Nedir?
Dense (yoğun) bir model, tüm metni tek bir vektöre sıkıştırır ve benzerlik iki özet vektör arasındaki tek bir iç çarpımla hesaplanır. Çok vektörlü (multi-vector) modeller ise bu sıkıştırmayı atlar; her token için küçük bir vektör tutar ve bir sorguyu belgeyle MaxSim operatörüyle puanlar. Bu operatörde her sorgu token'ı, belgedeki en iyi eşleşen token'ı bulur ve puanlar toplanır. Token düzeyindeki eşleştirme, tek bir vektörün ortalamak zorunda olduğu ince ayrıntıları korur; bu da genellikle daha güçlü bir arama demektir, ancak daha büyük bir indeks maliyetiyle birlikte gelir.
Bu yaklaşımın en bilinen örneği ColBERT mimarisidir. ColBERT tarzı modeller, sorgu ve belgeleri token bazında eşleştirerek özellikle uzun belgelerde ve alan adına özgü verilerde büyük başarı gösterir. Bu blog yazısında, Sentence Transformers kütüphanesindeki `MultiVectorEncoder` sınıfını kullanarak bu modelleri nasıl eğitebileceğinizi ve kendi verinize nasıl ince ayar yapabileceğinizi anlatacağım.
Neden İnce Ayar Yapmalı?
Çok vektörlü modeller, belirli bir alan adında (domain) arama performansını önemli ölçüde artırır. Web araması, hukuk, kod arama veya bilimsel literatür taraması gibi farklı alanlarda kelime dağarcığı, sorgu stili ve ilgililik kavramı farklılık gösterir. Token bazında eşleştirme sayesinde çok vektörlü modeller, tek vektörlü modellerin ortalamak zorunda kaldığı ince alan sinyallerini yakalar ve az miktarda alan içi eğitim verisiyle bile çok iyi sonuç verir.
Ayrıca, piyasada bulunan çoğu hazır arama modeli kısa pasajlar için yapılandırılmıştır. Klasik ColBERT modelleri belgeleri 180 veya 300 token ile sınırlar; birçok popüler dense model ise 256 veya 512 token kullanır. Eğer belgeleriniz uzunsa, bu modeller belgeyi puanlamadan önce büyük bir kısmını sessizce atar. Örneğin, ortalama 941 token içeren tıbbi pasajlarla yaptığım değerlendirmede, bu kırpmanın NDCG@10 skorunu 0.24'e kadar düşürdüğünü ölçtüm. Kendi modelinizi eğitirken, verinizin ihtiyaç duyduğu belge uzunluğunu siz belirlersiniz.
Eğitim Bileşenleri
Çok vektörlü model eğitimi şu bileşenleri içerir: model, veri seti, kayıp fonksiyonu, eğitim argümanları, değerlendirici ve eğitici sınıfı. Her birine yakından bakalım.
Model Seçimi
Eğitime başlarken mevcut bir çok vektörlü modeli ince ayar yapabilir veya sıfırdan yeni bir model oluşturabilirsiniz. İnce ayar için `MultiVectorEncoder` sınıfını kullanarak mevcut bir kontrol noktasını yükleyebilirsiniz:
```python from sentence_transformers import MultiVectorEncoder
model = MultiVectorEncoder( "lightonai/mLateOn-unsupervised", model_kwargs={"torch_dtype": "float32"}, processor_kwargs={"model_max_length": 8192}, ) ```
Bu kontrol noktası, kendi sorgu ve belge işaretçi token'larını, projeksiyon başını ve puanlama skiplist'ini getirir. İnce ayar sırasında genellikle bunların hepsini korumak ve yalnızca verinizin gerektirdiği değişiklikleri yapmak istersiniz. Örneğin, belge uzunluğu sınırlarını kaldırmak veya noktalama işaretlerini puanlama dışı bırakmak gibi.
Ayrıca, herhangi bir temel transformer modeline rastgele başlatılmış bir token düzeyinde projeksiyon ekleyerek sıfırdan bir model de oluşturabilirsiniz:
```python model = MultiVectorEncoder("answerdotai/ModernBERT-base") ```
Bu, klasik ColBERT hattını oluşturur: Transformer, token başına 128 boyutlu vektörler üreten bir Dense katmanı, hangi token'ların puanlamaya dahil edileceğine karar veren MultiVectorMask ve normalizasyon. Projeksiyon rastgele başladığı için modelin kullanılabilir olması için eğitim şarttır.
Veri Seti
Eğitim ve değerlendirme için `datasets.Dataset` veya `datasets.DatasetDict` örnekleri kullanılır. Hugging Face Datasets Hub'dan veri yükleyebilir veya CSV, JSON, Parquet gibi yerel dosyaları kullanabilirsiniz. Önemli olan, veri formatınızın kayıp fonksiyonunuzla uyumlu olmasıdır. Örneğin, soru-cevap çiftleri için en yaygın format (sorgu, ilgili pasaj) şeklindedir.
```python from datasets import load_dataset
train_dataset = load_dataset("tomaarsen/miriad-4.4M-split", split="train") ```
Bu örnekte, 4.4 milyon tıbbi soru-cevap çifti kullanılıyor. Her çift, cevabı içeren kaynak pasajla eşleştirilmiş bir sorudan oluşuyor. Bu tür basit (sorgu, ilgili belge) çiftleri, kendi alanınız için toplaması en kolay eğitim verisidir.
Kayıp Fonksiyonu
Kayıp fonksiyonu, modelin performansını ölçer ve optimizasyonu yönlendirir. Çok vektörlü modeller için en yaygın kayıp, in-batch negatiflerle çalışan `MultiVectorMultipleNegativesRankingLoss`'dur. Bu yöntemde, her sorgu için batch içindeki diğer tüm belgeler negatif örnek olarak kullanılır. Daha büyük batch'ler daha fazla negatif ve daha güçlü eğitim demektir; bu yüzden GradCache varyantı `CachedMultiVectorMultipleNegativesRankingLoss` önerilir:
```python from sentence_transformers.multi_vector_encoder.losses import CachedMultiVectorMultipleNegativesRankingLoss
loss = CachedMultiVectorMultipleNegativesRankingLoss(model=model, mini_batch_size=16) ```
`mini_batch_size` parametresi, belgeleri parçalar halinde kodlayarak belleği sınırlar; etkili kontrastif batch boyutu ise serbestçe seçilebilir. Ayrıca, `scale` parametresinin varsayılan değeri 1.0'dır; dense modellerdeki 20.0 değerini kopyalamayın, çünkü MaxSim skorları zaten geniş bir aralığa yayılır ve 20.0 softmax'ı doyurur.
Eğitim Argümanları
`MultiVectorEncoderTrainingArguments` sınıfı, eğitim hızını ve takibini etkileyen parametreleri ayarlamanızı sağlar. Örnek bir yapılandırma:
```python args = MultiVectorEncoderTrainingArguments( output_dir="models/mLateOn-medical", num_train_epochs=1, per_device_train_batch_size=128, learning_rate=1e-4, warmup_steps=0.05, prompts={"question": "[Q] ", "passage_text": "[D] "}, bf16=True, batch_sampler=BatchSamplers.NO_DUPLICATES, eval_strategy="steps", eval_steps=0.1, save_strategy="steps", save_steps=0.05, logging_steps=0.01, run_name="mLateOn-medical", ) ```
`prompts` parametresi, modelde saklanan işaretçileri eğitim sütunlarına eşler. `max_length` parametresini bilinçli olarak ayarlamadım; çünkü eğitim sırasında tokenizasyonu sınırlar ve bu, kaliteden ödün verebilir. Deneylerimde, 512 token ile eğitim, NDCG@10'da yaklaşık 0.015 kayba yol açtı; bu kayıp daha fazla veriyle telafi edilmedi.
Değerlendirici
Eğitim sırasında modelin performansını izlemek için `MultiVectorInformationRetrievalEvaluator` kullanabilirsiniz. Bu değerlendirici, kendi tuttuğunuz verilerle oluşturulur ve NDCG@10 gibi metrikleri hesaplar. Önemli bir ipucu: korpus, modellerin ayırt edilebileceği kadar zor olmalıdır. Eğer değerlendirme doygunluğa ulaşırsa (örneğin tüm modeller 0.97'nin üzerinde puan alıyorsa), dikkat dağıtıcı pasajlar ekleyerek zorluk seviyesini artırın.
Eğitici Sınıfı
Tüm bileşenleri bir araya getiren `MultiVectorEncoderTrainer` sınıfı, eğitimi başlatır. Aşağıda, tıbbi alanda ince ayar yapılmış bir modeli eğiten tam bir örnek verilmiştir:
```python trainer = MultiVectorEncoderTrainer( model=model, args=args, train_dataset=train_dataset, loss=loss, evaluator=dev_evaluator, ) trainer.train() ```
Bu eğitim, tek bir RTX 3090 GPU'sunda 14.5 saat sürdü ve 17.5 GB VRAM kullandı. 100k çiftle yapılan kısa bir eğitim (75 dakika) bile tam milyon çiftli eğitime çok yakın sonuç verdi (0.012 NDCG@10 fark).
Neden Önemli?
Bu blog yazısı, çok vektörlü modellerin eğitimi ve ince ayarı için kapsamlı bir rehber sunuyor. Türkiye'deki yapay zeka ve arama teknolojileriyle ilgilenenler için bu yaklaşım, kendi alanlarına özel güçlü arama modelleri geliştirmenin kapısını aralıyor. Özellikle tıp, hukuk veya finans gibi uzmanlık gerektiren alanlarda, genel amaçlı modellerin yetersiz kaldığı durumlarda, bu yöntemle saatler içinde üstün performanslı bir model elde etmek mümkün. Ayrıca, tek bir tüketici GPU'suyla çalışabilmesi, bu teknolojiyi daha erişilebilir kılıyor. Sonuç olarak, çok vektörlü modeller, uzun belgeler ve alan adına özgü arama gereksinimleri için güçlü bir çözüm sunuyor ve bu rehber, bu modelleri kendi verinize uyarlamak için pratik bir yol gösteriyor.