Model Soups
Model harmanları, farklı hiperparametrelerle tek bir önceden eğitilmiş model üzerinde ince ayar yapılmış modellerin ağırlıklarının ortalamasını alarak ek çıkarım maliyeti olmadan doğruluğu artırır.
Model çorbası, aynı önceden eğitilmiş modelden farklı hiperparametrelerle ince ayar yapılmış birkaç modelin ağırlıklarının ortalaması alınarak oluşturulan tek bir modeldir. Hiperparametre taramasından sonra genellikle en iyi doğrulama puanına sahip çalışma tutulur, diğerleri silinir. Çorba, silinen bu çalışmalardan yararlanır: Her biri aynı önceden eğitilmiş model ağırlıkları ile başladığından parametreleri hâlâ birbiriyle hizalıdır. Bu parametrelerin ortalaması çoğu zaman hepsinden daha yüksek puan alır ve çalıştırma maliyeti tek bir modelinkiyle aynıdır. Washington Üniversitesi, Google, Meta AI, Tel Aviv Üniversitesi ve Columbia Üniversitesi'nden Mitchell Wortsman ve çalışma arkadaşları yöntemi, ICML 2022'de yayımlanan Model çorbaları: Birden fazla ince ayarlı modelin ağırlıklarını ortalamak, çıkarım süresini artırmadan doğruluğu iyileştirir makalesinde tanıttı. Google'ın JFT-3B veri kümesinde önceden eğitilmiş, ince ayarlı 58 ViT-G/14 modelinden oluşan açgözlü bir çorba ImageNet üzerinde %90,94 ilk-1 doğruluğa ulaştı; bu, o dönemde son teknoloji bir sonuçtu.
Düzgün ve Açgözlü Çorbalar#
İnce ayar, büyük bir önceden eğitilmiş ağı ağırlık uzayında yalnızca kısa bir mesafe taşır. Bu nedenle farklı öğrenme oranları, veri artırma, etiket yumuşatma veya eğitim süreleriyle ince ayar yapılan modeller, düşük kayıp değerine sahip aynı geniş bölgeye yerleşme eğilimindedir. Modellerin ortalaması bu bölgenin ortasına yakın bir noktaya düşer ve bölgenin kenarlarından daha iyi genelleme yapar. Makalede iki temel yöntem tanımlanıyor:
- Düzgün çorba: İnce ayar yapılmış her modelin ortalamasını alır. Tüm bileşenler iyiyse işe yarar; ancak çok yüksek öğrenme oranına sahip bir çalışma ortak bölgenin dışına çıkabilir ve ortalamaya katılması doğruluğu düşürebilir.
- Açgözlü çorba: Modelleri ayrılmış doğrulama verisindeki doğruluklarına göre sıralar, en iyi modelle başlar ve ortalama çorbanın doğrulama doğruluğunu düşürmediği sürece sıradaki her modeli ekler. En iyi modelle başladığından, açgözlü çorba doğrulama kümesinde bu modelden asla daha kötü sonuç vermez.
CLIP ViT-B/32, ImageNet üzerinde 72 rastgele hiperparametre ayarıyla ince ayar yapıldığında en iyi tek model %80,38 puan aldı. Tüm 72 modelden oluşan düzgün çorba %79,97 puan aldı; bunun nedeni bazı çalışmaların ortak düşük-kayıp bölgesinden çıkmış olmasıydı. Açgözlü çorba ise beş modeli tutarak %81,03 puan aldı. ImageNet eskizleri ve yeniden çizimleri gibi beş dağılım kayması test kümesinde açgözlü çorbanın ortalama puanı %50,75, en iyi tek modelinki ise %47,83 oldu. Makale, ALIGN için de kazanımlar; metin sınıflandırmasında BERT ve T5 ince ayarı içinse daha küçük kazanımlar bildiriyor.
Bu PyTorch örneğinde 8x8 el yazısı rakamlar üzerinde küçük bir sınıflandırıcı önceden eğitilir, farklı öğrenme oranları ve giriş gürültüsü artırmasıyla bu sınıflandırıcının dokuz kopyasına ince ayar yapılır ve bu kopyaların düzgün çorbası dokuzunun topluluğuyla karşılaştırılır:
import copy
import torch
from sklearn.datasets import load_digits
from torch import nn
torch.manual_seed(0)
X, y = load_digits(return_X_y=True)
order = torch.randperm(len(X))
X, y = torch.tensor(X / 16, dtype=torch.float32)[order], torch.tensor(y)[order]
def train(model, first, last, lr, noise, seed):
"""Train a copy of the model on random batches from rows first to last, adding input noise."""
model, generator = copy.deepcopy(model), torch.Generator().manual_seed(seed)
optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9)
for _ in range(300):
rows = torch.randint(first, last, (32,), generator=generator)
optimizer.zero_grad()
inputs = X[rows] + noise * torch.randn(32, 64, generator=generator)
nn.functional.cross_entropy(model(inputs), y[rows]).backward()
optimizer.step()
return model
def accuracy(logits):
"""Return the fraction of the 997 test digits classified correctly."""
return (logits.argmax(1) == y[800:]).float().mean().item()
base = train(nn.Sequential(nn.Linear(64, 256), nn.ReLU(), nn.Linear(256, 10)), 0, 300, 0.05, 0, 0) # pretrained
sweep = [(lr, noise) for lr in (0.01, 0.03, 0.1) for noise in (0, 0.2, 0.4)] # 9 hyperparameter settings
ingredients = [train(base, 300, 500, lr, noise, seed) for seed, (lr, noise) in enumerate(sweep)]
# Uniform soup: average every weight tensor of the nine fine-tuned models
soup = copy.deepcopy(base)
soup.load_state_dict({k: sum(m.state_dict()[k] for m in ingredients) / 9 for k in soup.state_dict()})
with torch.no_grad():
singles = [accuracy(m(X[800:])) for m in ingredients]
print(f"Fine-tuned models: {min(singles):.3f} to {max(singles):.3f}, mean {sum(singles) / 9:.3f}")
print(f"Uniform soup: {accuracy(soup(X[800:])):.3f}")
print(f"Ensemble of 9: {accuracy(sum(m(X[800:]).softmax(1) for m in ingredients)):.3f}")Dokuz ince ayarlı model, 997 ayrılmış rakamda 0.881 ile 0.936 arasında puan alır; ortalama puanları 0.917 olur. Düzgün çorbaları 0.934 puanıyla en iyi tek çalışmaya yaklaşır ve görüntü başına dokuz ileri geçiş gerektiren topluluğun 0.930 puanını az farkla geçer; çorba ise tek geçiş gerektirir.
Uygulamada Çorbalar#
Çorbalar, örneğin bir görüntü dönüştürücüyü (ViT) veya başka bir temel modeli yeni bir görüntü sınıflandırma görevine aktarırken olduğu gibi, zaten tarama yapılan durumlarda en kullanışlıdır. Ultralytics YOLO hiperparametre ayarı böyle bir taramadır: model.tune(), değiştirilmiş her hiperparametre kümesi için bir model eğitir ve depolama alanından tasarruf etmek için o anki en iyi model olmayan çalışmaları siler; yalnızca en iyi yinelemenin çalışmasını ve ağırlıklarını tutar. Çorbanın yerini aldığı adım, en iyiyi seçme adımıdır.
Ağırlıkların ortalaması alınırken aynı özellikler farklı gizli birimlerde saklanıp doğruluğu bozacağından, bileşenlerin aynı mimariye ve aynı önceden eğitilmiş başlangıç noktasına sahip olması gerekir. Son ağırlıklar çıkarım sırasında ek maliyet getirmez; bu nedenle çorbanın çıkarım gecikmesi ve bellek kullanımı tek bir modelinkiyle aynıdır.
Model Çorbaları ve İlgili Yöntemler#
- Model topluluğu: Birkaç modelin tahminlerinin ortalamasını alır; dolayısıyla çıkarım maliyeti her bir modelle birlikte artar. CLIP ViT-B/32 taramasında logit topluluğu, ImageNet üzerinde açgözlü çorbanın %81,03 puanını az farkla geçerek %81,19 puan aldı; ancak her görüntü için tüm modelleri çalıştırdı.
- Model birleştirme: Ağırlık birleştirme yöntemlerinin daha geniş ailesidir. Çorbalar, tüm modellerin aynı görevde ince ayarlandığı durumdur; görev aritmetiği ise farklı görevlerde ince ayarlanmış modelleri toplar.
- Tek bir çalışma içinde ağırlık ortalaması: Stokastik ağırlık ortalaması (SWA) ve ağırlıkların üstel hareketli ortalaması (EMA), tek bir eğitim yörüngesi boyunca kontrol noktalarının ortalamasını alır. Çorbalar bağımsız çalışmaları ortalar. Makalede, EMA veya SWA kullanan modelleri çorbalamanın da doğruluğu artırdığı bulundu; dolayısıyla bu iki ortalama türünün kazanımları birikiyor.
- WiSE-FT: Sıfır örnekli model ile ince ayarlı sürümü arasında ara değer alır. İki bileşenli bu çorba, önceden eğitilmiş modelin dağılım kaymasına karşı dayanıklılığının daha fazlasını korur.










