Inside AI Models
← Tüm makaleler
Derin ÖğrenmeAraştırma

Kimlik-Farkında Negatif Örnekleme Neden Önemli

20 Haz 2026 · 3 dk okuma

Paylaş

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ı NidN_{\text{id}}, batch büyüklüğü BB ise, belirli bir kimliğin karşıt örneğinin batch'e en az bir kez girme olasılığı kabaca şudur:

P(es¸les¸me)1(11Nid)B1P(\text{eşleşme}) \approx 1 - \left(1 - \frac{1}{N_{\text{id}}}\right)^{B-1}

Tipik bir kurulumda (NidN_{\text{id}} yüzlerce, B=24B = 24) 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

SamplerEşleşme oranıΔ Doğruluk
Rastgele (b=24)~0.27taban
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.

okunma

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