Task Arithmetic
Görev aritmetiği, görev vektörlerini ekleyerek, çıkararak veya birleştirerek önceden eğitilmiş bir modeli düzenler; eğitim yapmadan becerileri birleştirir veya davranışları kaldırır.
Görev aritmetiği, önceden eğitilmiş bir modeli; her görevde ince ayarın oluşturduğu ağırlık değişiklikleri olan görev vektörlerini toplayıp çıkararak düzenleme yöntemidir. Birden fazla görevin görev vektörünü önceden eğitilmiş model ağırlıklarına eklemek, hepsini yerine getiren tek bir model oluşturur; bir görev vektörünü çıkarmak, diğer görevleri büyük ölçüde etkilemeden modelin o görevdeki başarısını düşürür; vektörleri bir benzetmede birleştirmek ise etiketli veri bulunmayan bir ortama beceri aktarır. Her düzenleme, ağırlıklara eleman bazında toplama uygular; dolayısıyla özgün ince ayarların dışında eğitim verisi veya gradyan adımı gerektirmez. Washington Üniversitesi, Microsoft Research ve Allen Institute for AI'dan Gabriel Ilharco ve çalışma arkadaşları bu yaklaşımı, ICLR 2023'te yayımlanan Editing Models with Task Arithmetic makalesinde tanıttı.
Üç İşlem#
Üç işlem de θ_new = θ_pretrained + λτ_new biçiminde yeni ağırlıklar üretir; λ ölçekleme katsayısı, eğitim dışında tutulan doğrulama verileriyle seçilir. Ilharco ve çalışma arkadaşları işlemleri, trafik işaretleri ve uydu görüntüleri gibi sekiz görüntü sınıflandırma görevinde ince ayarı yapılmış CLIP modellerinde ve GPT-2 ile T5 dil modellerinde test etti.
Olumsuzlama, bir modelin görevi unutmasını sağlamak için τ_new = −τ kullanır. Sekiz CLIP görev vektörünü olumsuzlamak, ViT-L/14 modelinin bu görevlerdeki ortalama doğruluğunu 45,8 yüzde puan düşürürken ImageNet doğruluğunun en az %95'ini korudu. Toksik yorumlarla ince ayarı yapılmış bir vektörü çıkarmak, GPT-2 Large'ın toksik üretim oranını %4,8'den %0,8'e düşürdü; sıradan metinlerdeki şaşkınlık değeri ise özgün modelden 0,5 puandan az farklıydı.
Toplama, çok görevli modeller oluşturmak için τ_new = τ_1 + τ_2 + … kullanır. İki CLIP görevinin vektörlerini toplamak, iki uzmanlaşmış modelin ortalama doğruluğunun %98,9'una sahip tek bir model verdi; sekiz vektörün tamamını toplamak bu oranı %91,2'ye çıkardı.
Benzetmeler, görevler “A'nın B ile ilişkisi, C'nin D ile ilişkisi gibidir” şeklinde bağlantılı olduğunda τ_D ≈ τ_C + (τ_B − τ_A) bağıntısını kullanır. Ilharco ve çalışma arkadaşları, Amazon ve Yelp metinlerinde eğitilmiş dil modelleme vektörleri arasındaki farka Amazon yorumlarının duygu analizine ait bir vektör ekleyerek, etiketli Yelp verisi olmadan Yelp yorumları için bir duygu analizi modeli oluşturdu.
Bu işlemler işe yarar; çünkü farklı görevlerin görev vektörleri, sıfıra yakın kosinüs benzerlikleri ile neredeyse dik yönlere işaret eder; dolayısıyla birini eklemek diğerinin kodladığı bilgiyi pek değiştirmez. Yine de görev sayısı arttıkça girişim büyür; model birleştirme yöntemlerinden TIES-Merging, her vektördeki en küçük değişiklikleri budayıp işaretleri uyuşmayan parametreleri toplama öncesinde uzlaştırarak bu girişimi azaltır.
Kodda Becerileri Ekleme ve Olumsuzlama#
Bu PyTorch örneği, önce 8x8 el yazısı rakamlarıyla küçük bir sınıflandırıcıyı kısa süre önceden eğitir, ardından ilk katmanını iki görev için ince ayardan geçirir: A görevi 0-4 rakamlarını, B görevi ise 5-9 rakamlarını sınıflandırır ve her biri kendi beş dondurulmuş çıktı logitini kullanır; makaledeki her CLIP görevinin kendi dondurulmuş sınıflandırma başlığını kullanması da buna benzer. Ardından önceden eğitilmiş ağırlıkları, iki görev vektörünün farklı birleşimleriyle değerlendirir:
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)
X, y = torch.tensor(X / 16, dtype=torch.float32), torch.tensor(y)
tasks = {"A": (0, 5), "B": (5, 10)} # task A classifies digits 0-4, task B digits 5-9, each with its own 5 logits
train, test = torch.arange(len(X)) < 1000, torch.arange(len(X)) >= 1000
def task_loss(model, task, rows):
"""Cross-entropy and accuracy of one task's 5-way classifier on the given rows."""
lo, hi = tasks[task]
keep = rows & (y >= lo) & (y < hi)
logits, labels = model(X[keep])[:, lo:hi], y[keep] - lo
return nn.functional.cross_entropy(logits, labels), (logits.argmax(1) == labels).float().mean().item()
def fit(model, params, steps, loss_fn):
"""Run full-batch SGD on the given parameters."""
optimizer = torch.optim.SGD(params, lr=0.05, momentum=0.9)
for _ in range(steps):
optimizer.zero_grad()
loss_fn().backward()
optimizer.step()
return model
# Pretrained model: a few steps on 200 images of all ten digits
base = nn.Sequential(nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, 10))
fit(base, base.parameters(), 50, lambda: nn.functional.cross_entropy(base(X[:200]), y[:200]))
# Fine-tune the first layer for each task (heads stay frozen) and keep the task vectors
vectors = {}
for task in tasks:
tuned = copy.deepcopy(base)
fit(tuned, tuned[0].parameters(), 100, lambda: task_loss(tuned, task, train)[0])
vectors[task] = {k: v - base.state_dict()[k] for k, v in tuned.state_dict().items()}
edits = {"Pretrained": {}, "+A": {"A": 1}, "+B": {"B": 1}, "+A +B": {"A": 1, "B": 1}, "-A": {"A": -1}}
for name, coefs in edits.items():
# Pretrained weights plus a weighted sum of task vectors
model = copy.deepcopy(base)
weights = {k: v + sum(c * vectors[t][k] for t, c in coefs.items()) for k, v in base.state_dict().items()}
model.load_state_dict(weights)
with torch.no_grad():
print(f"{name}: task A {task_loss(model, 'A', test)[1]:.3f}, task B {task_loss(model, 'B', test)[1]:.3f}")797 test rakamında, önceden eğitilmiş model A görevinde 0.802, B görevinde 0.897 puanını alır. Yalnızca A görevinin vektörünü eklemek A görevini 0.925 düzeyine çıkarır, B görevini ise 0.850 düzeyine düşürür; bu, sıradan ince ayarda görülen felaket düzeyinde unutmadır. Yalnızca B görevinin vektörünü eklemek tersini yapar. Her iki vektörü eklemek, kendi görevlerinde her uzmanlaşmış modele yaklaşan 0.922 ve 0.940 puanlarına sahip tek bir model oluşturur. A görevinin vektörünü çıkarmak A görevini 0.616 düzeyine düşürürken B görevi yalnızca 0.897 düzeyinden 0.887 düzeyine geçer.
Gereksinimler ve Sınırlar#
Görev aritmetiği, her ince ayarın aynı mimarideki aynı önceden eğitilmiş ağırlıklarla başlamasını gerektirir. Ultralytics YOLO26 yeni bir veri kümesinde eğitim yaptığında, yolo26n.pt konumundan başlayarak şekli uyan tüm önceden eğitilmiş tensörleri kopyalar, sınıflandırma başlığı satırlarını sınıf adlarıyla eşleştirir ve sayıyı “Önceden eğitilmiş ağırlıklardan N/M öğe aktarıldı” şeklinde kaydeder. Sınıf sayıları farklı olan veri kümeleri, son sınıflandırma evrişimlerinin farklı şekillerde olmasına yol açar; dolayısıyla bu çalıştırmalardaki görev vektörleri yalnızca ortak katmanlarda toplanabilir.
Vektörler çakıştığında veya çok fazla ölçeklendiğinde aritmetik de bozulur; çünkü büyük λ değerleri ağırlıkları, ince ayarı yapılmış modellerin iyi performans gösterdiği bölgenin dışına iter. Olumsuzlama, ince ayar verilerinin kapsadığı her alandaki performansı düşürerek makineyi hafifçe unutma biçimine dönüşür. Guillermo Ortiz-Jimenez, Alessandro Favero ve Pascal Frossard'ın Teğet Uzayında Görev Aritmetiği çalışması, başarılı aritmetiğin; ağırlık uzayındaki ayrı yönlerin, girdi uzayının örtüşmeyen ayrı bölgelerinde model çıktılarını değiştirdiği ağırlık ayrışmasından kaynaklandığını gösterdi ve modelin doğrusallaştırılmış bir sürümüne ince ayar yapmanın bu durumu güçlendirdiğini ortaya koydu.
Görev Aritmetiği ve İlgili Kavramlar#
- Görev vektörleri: Görev aritmetiğinin işlediği ağırlık farklarıdır. Görev aritmetiği; toplama, olumsuzlama ve benzetmeler işlemlerinin bütünüdür.
- Model çorbaları: Bir görevin performansını artırmak için aynı göreve ait birkaç ince ayarlı modeli ortalar. Görev aritmetiği farklı görevlerin ince ayarlı modellerini toplar; iki görev vektörünü λ = 0.5 ile toplamak, ince ayarı yapılmış iki modeli ortalamaya eşittir.
- Model düzenleme: Hedefe yönelik, çoğu zaman kapalı biçimli bir ağırlık güncellemesiyle tek bir olguyu veya dar kapsamlı bir davranışı değiştirir. Görev aritmetiği ise tüm görevleri bir kerede düzenler.
- Çok görevli eğitim: Tüm görevlerin verileriyle tek bir modeli birlikte eğitir; böylece etkileşim önlenir, ancak tüm veri kümelerinin aynı anda hazır olması gerekir. Görev aritmetiği, verileri artık erişilebilir olmayabilecek modelleri birleştirir ve görevleri art arda ince ayarlamaktan kaynaklanan unutmayı önler.










