Few-Shot Learning'de Prototip Ağları: Küçük Veride Büyük Genelleme

Bir sınıfa ait yüzlerce, hatta binlerce etiketli örnek bulmak her zaman mümkün değildir. Tıbbi görüntüler, nadir hata kayıtları veya yeni ürün kategorileri gibi alanlarda modelin sadece birkaç örnekle öğrenmesi gerekir. Few-shot learning, tam olarak bu kısıtta genelleme yapmayı hedefler. Prototip ağları (Prototypical Networks) ise sınıfları karmaşık karar sınırlarıyla ezberlemek yerine, her sınıfı temsil eden bir “merkez” öğrenerek bu işi şaşırtıcı derecede zarif biçimde yapar. ``

Temel fikir, her sınıf için destek kümesindeki (support set) örneklerin gömülü uzaydaki ortalamasını almaktır. Bu ortalama, sınıfın prototipidir. Sorgu kümesindeki (query set) yeni bir örnek, hangi prototipe daha yakınsa o sınıfa atanır. Böylece model, “Bu görüntü daha önce gördüğüm kedilere mi, yoksa köpeklere mi benziyor?” sorusunu ham piksel düzeyinde değil, öğrendiği anlamlı özellik uzayında yanıtlar.

Bir bölümde $N$ sınıf ve sınıf başına $K$ destek örneği olsun. Kodlayıcı ağımız $f_\theta(x)$ ile bir örneği vektöre dönüştürsün. $k$ sınıfının prototipi şu şekilde hesaplanır:

\[\mathbf{c}_k = \frac{1}{\vert S_k\vert }\sum_{(x_i, y_i) \in S_k} f_\theta(x_i)\]

Sorgu örneği $x$ için sınıf olasılığı ise negatif uzaklıkların softmax’ı ile elde edilir:

\[p(y=k \mid x) = \frac{\exp(-d(f_\theta(x), \mathbf{c}_k))}{\sum_j \exp(-d(f_\theta(x), \mathbf{c}_j))}\]

Buradaki kritik karakter benzerlik metriğidir. Kodlayıcı iyi olsa bile seçilen mesafe, küçük veri koşullarında sonucu ciddi biçimde değiştirebilir.

Metrik Formül Güçlü yanı Dikkat edilmesi gereken
Öklidyen $\vert a-b\vert _2^2$ Prototip ağlarının klasik ve kararlı seçeneği Vektör büyüklüğüne duyarlıdır
Kosinüs $1-\frac{a\cdot b}{\vert a\vert \vert b\vert }$ Yön bilgisini öne çıkarır Norm bilgisi kaybolabilir
Mahalanobis $(a-b)^T\Sigma^{-1}(a-b)$ Özelliklerin ölçek ve ilişkilerini hesaba katar Kovaryans tahmini küçük veride kararsız olabilir

Aşağıdaki PyTorch örneği, gömülmüş destek verilerinden prototip üretir ve sorguları kareli Öklidyen uzaklıkla sınıflandırır. Gerçek bir projede encoder, görüntüler için CNN veya metinler için bir Transformer olabilir.

import torch
import torch.nn.functional as F

def prototypical_logits(support_z, support_y, query_z, n_classes):
    # Her sınıfın embedding ortalamasını, yani prototipini oluşturur.
    prototypes = torch.stack([
        support_z[support_y == cls].mean(dim=0)
        for cls in range(n_classes)
    ])

    # [sorgu, sınıf] biçiminde kareli Öklidyen uzaklık matrisi.
    distances = ((query_z[:, None, :] - prototypes[None, :, :]) ** 2).sum(dim=-1)
    return -distances  # Softmax, yakın prototiplere yüksek olasılık verir.

logits = prototypical_logits(support_z, support_y, query_z, n_classes=3)
loss = F.cross_entropy(logits, query_y)

Genelleme yeteneğini gerçekten test etmek için eğitim ve değerlendirme sınıflarını ayırın. Örneğin model eğitimde A, B, C sınıflarını; testte daha önce hiç görmediği D, E, F sınıflarını görmelidir. Her deney bölümü için rastgele $N$-way $K$-shot destek kümesi ve ayrı sorgu kümesi oluşturun. Sonra doğruluğu birçok bölüm üzerinde ortalayın; tek bir bölüm, şanslı veya şanssız örneklerden etkilenebilir.

Deney Ne ölçer? Beklenen yorum
1-shot ve 5-shot karşılaştırması Ek örneğin etkisi 5-shot belirgin iyileşiyorsa prototipler daha güvenilirleşmiştir
Öklidyen ve kosinüs karşılaştırması Geometri etkisi Fark büyükse embedding normları bilgi taşıyor olabilir
Görülmemiş sınıflarda test Gerçek few-shot başarısı Eğitim sınıflarında yüksek skor tek başına yeterli değildir

Son olarak, küçük veri mucize değildir: veri artırma, dengeli bölüm örneklemesi ve güven aralıkları önemlidir. Yine de prototip ağları, az veride ezber yerine ilişki öğrenmeyi teşvik eden net, hızlı ve güçlü bir başlangıç noktasıdır.

few-shot-learningde-89

Yorumlar