Kimlik-Farkında Negatif Örnekleme Neden Önemli
20 Haz 2026 · 3 dk okuma
Contrastive öğrenmede bir modelin ne kadar iyi temsil çıkardığı, ona "neyi neyden ayırması gerektiğini" gösteren negatif örneklerin niteliğine bağlıdır. Multimodal deepfake (sahtelik) tespitinde iş daha da zorlaşır: bir kişinin gerçek videosunu, aynı kişinin manipüle edilmiş videosundan ayırmak, rastgele iki kişiyi ayırmaktan çok daha güçtür; öğretici değeri de bu yüzden yüksektir. Burada, masum görünen bir tasarım tercihinin, yani batch'lerin nasıl oluşturulduğunun, modelin gördüğü negatiflerin kalitesini nasıl sessizce belirlediğini anlatacağım; bunu fark edip düzelttiğimizde ne kazandığımızı da göreceğiz.
Sorunu kuran denklem
Kullandığımız contrastive loss'taki (Denklem 5) kimlik-farkında negatif terimin anlamlı olabilmesi için tek bir koşul gerekir: aynı kimliğe ait gerçek ve sahte örnekler aynı batch içinde bir arada bulunmalıdır. Oysa bir batch'i tümüyle rastgele doldurduğunuzda, bu eşleşmenin gerçekleşme olasılığı sandığınızdan epey düşüktür. Kimlik sayısı , batch büyüklüğü ise, belirli bir kimliğin karşıt örneğinin batch'e en az bir kez girme olasılığı kabaca şudur:
Tipik bir kurulumda ( yüzlerce, ) bu olasılık beklenmedik ölçüde küçük çıkar. Pratikteki karşılığı şuydu: ilgili negatif, örneklerin yaklaşık %73'ünde batch'te hiç yoktu. Yani loss'un en öğretici terimi, çoğu durumda devreye bile girmeden, hiçbir uyarı vermeden sessizce atlanıyordu. Model "kimlik-farkında" bir kayıpla eğitildiğini sanıyordu; oysa o terim adımların çoğunda boştaydı.
Çözüm: örnekleme katmanına müdahale
Sorun loss'un kendisinde değil, ona veri taşıyan örnekleme katmanındaydı; o yüzden çözüm de oraya yapılmalıydı. Standart rastgele sampler yerine, batch'leri kimliklere göre gruplayan özel bir sampler yazdık. Bu sampler her batch'i, seçtiği kimliklerin hem gerçek hem sahte örneklerini birlikte içerecek şekilde dolduruyor:
class IdentityGroupedBatchSampler(Sampler):
"""Aynı kimliğin gerçek + sahte örneklerini aynı batch'e koyar."""
def __init__(self, identities, batch_size, group_size=2):
self.groups = defaultdict(list)
for idx, ident in enumerate(identities):
self.groups[ident].append(idx)
self.batch_size = batch_size
self.group_size = group_size
def __iter__(self):
# her batch'i kimlik başına group_size örnek çekerek doldur
...Bu değişiklikle eşleşme oranı frac → 1.0'a çıktı; yani kimlik-farkında negatif
terim artık neredeyse her adımda gerçekten devreye giriyordu. İşin can alıcı yanı
şu: modelin mimarisine, loss fonksiyonuna ya da hiperparametrelere dokunmadık.
Değiştirdiğimiz tek şey, batch'lerin nasıl kurulduğuydu.
Sonuçların okunuşu
| Sampler | Eşleşme oranı | Δ Doğruluk |
|---|---|---|
| Rastgele (b=24) | ~0.27 | taban |
| Identity-grouped | ~1.00 | +X.XX |
Tablonun asıl dersi, tek bir doğruluk sayısının ötesinde. Bir loss terimini "eklemek" ile o terimin "gerçekten çalışması" arasında çoğu zaman gözden kaçan bir uçurum vardır ve bu uçurum genellikle veri örnekleme katmanında gizlenir. Bir kaybı koda eklemiş olmanız, onun her adımda gradyana gerçekten katkı verdiği anlamına gelmez; arada, batch kompozisyonu gibi sessiz ama belirleyici bir aracı durur. Bu yüzden bir bileşenin "açık" olduğunu varsaymadan önce gerçekte ne sıklıkla devreye girdiğini ölçmek, contrastive kurulumlarda neredeyse her zaman işe yarar.
Devamı
Sıradaki yazıda, yine kolayca gözden kaçan bir başka tutarsızlığı ele alacağım: eğitim ile değerlendirme aşamalarındaki referans dağılımı uyuşmazlığını. Orada da kök neden modelin kendisinde değil, onu besleyen veri akışında çıkıyor.
Yeni makale yayınlandığında haberiniz olsun ister misiniz?
Yeni bir yazı yayınlandığında size e-posta gelsin. Dilediğiniz an iptal edebilirsiniz.
Yorumlar
Benzer makaleler
BPE(Byte Pair Encoding) nedir ve LLM'ler için neden önemli
1 Tem 2026 · 8 dk okuma
GPT'yi Sıfırdan Yazalım: nano-gpt
27 Haz 2026 · 13 dk okuma
Attention'ı Sıfırdan Anlamak
23 Haz 2026 · 3 dk okuma
Gradient Descent Gerçekte Nasıl Çalışır
22 Haz 2026 · 4 dk okuma
Claude Code ile Verimli Çalışmak — Bölüm 2: Ajanlar, Alt Ajanlar ve Çoklu Ajan Kurulumları
15 Tem 2026 · 10 dk okuma
Claude Code ile Verimli Çalışmak — Bölüm 1: Bağlam (Context), Beceriler ve Prompt Yazımı
1 Tem 2026 · 6 dk okuma
Bu Blog Ne Hakkında?
26 Haz 2026 · 2 dk okuma
Tensor Nedir? Derin Öğrenme için Lineer Cebir
24 Haz 2026 · 4 dk okuma