Hypernetworks
Hiper ağ, görev gömmesi gibi bir girdiden başka bir ağın ağırlıklarını üreten bir sinir ağıdır. Kullanım alanları ve PyTorch örneği ele alınır.
Hiper ağ, çıktısı hedef veya ana ağ olarak adlandırılan başka bir ağın ağırlıkları olan bir nöral ağdır. Tek ve sabit bir model ağırlıkları kümesini öğrenmek yerine hedef ağa, hiper ağın bir koşullandırma girdisinden hesapladığı ağırlıklar verilir. Bu girdi; görev tanımlayıcısı, kullanıcı profili, metin açıklaması veya örnek bir görüntü olabilir. Böylece eğitilmiş tek bir hiper ağ, tek bir ileri geçişte her girdi için farklı, özelleşmiş bir model üretebilir. Google Brain'de 2016'da yayımlanan HyperNetworks makalesinde David Ha, Andrew Dai ve Quoc Le, derin evrişimli ve tekrarlayan ağların ağırlıklarını üretmek için küçük hiper ağlar kullandı. Bu fikir günümüzde sürekli öğrenmede, difüzyon modellerinin kişiselleştirilmesinde ve nöral mimari aramada da kullanılıyor.
Hiper Ağlar Nasıl Çalışır#
Eğitim sırasında yalnızca hiper ağın kendi parametreleri öğrenilir. Genellikle görev veya katman başına öğrenilmiş bir gömme olan koşullandırma girdisi, hedef ağın ağırlıklarını üretmek üzere hiper ağdan geçirilir. Hedef ağ daha sonra bu ağırlıkları kullanarak gerçek verileri işler ve geri yayılım, kayıp gradyanını üretilen ağırlıklardan geriye doğru hiper ağa taşır:
Ha ve çalışma arkadaşları, her katmanın ağırlıklarını bir katman gömmesinden bir kez üreten statik hiper ağlarla, HyperLSTM'nin bir dizinin her adımında yaptığı gibi her girdi veya zaman adımı için ağırlıkları yeniden hesaplayan dinamik hiper ağları birbirinden ayırdı. Çalışma zamanında üretilen ağırlıklar sıradan tensörlerdir; bu nedenle hedef ağ, Transformer katmanı gibi herhangi bir mimariye sahip olabilir ve bu katmanın dikkat izdüşümleri hiper ağdan gelebilir. Başlıca mühendislik sorunu çıktı boyutudur: Milyonlarca ağırlığı olan bir katman için katman başına milyonlarca çıktı üreten bir hiper ağ gerekir. Uygulanabilir tasarımlarda ağırlıklar, her biri kendi parça gömmesinden üretilen parçalar hâlinde oluşturulur; her ağırlık güncellemesinin yalnızca küçük, düşük ranklı çarpanları üretilir ya da özellik bazında doğrusal modülasyonda (FiLM) olduğu gibi yalnızca kanal başına ölçek ve kaydırma değerleri üretilir.
PyTorch'ta Hiper Ağ Örneği#
Bu PyTorch örneği, farklı genlik ve fazlara sahip sinüs dalgalarından oluşan bir görev ailesi üzerinde hiper ağ eğitir. Her görev için küçük bir hedef ağın 97 ağırlığının tamamını üretir ve yalnızca hiper ağ eğitilir:
import math
import torch
from torch import nn
torch.manual_seed(0)
x = torch.linspace(-math.pi, math.pi, 64)
# Hypernetwork: maps a task (amplitude, phase) to all 97 weights of a 1-32-1 target network
hyper = nn.Sequential(nn.Linear(2, 128), nn.ReLU(), nn.Linear(128, 97))
optimizer = torch.optim.Adam(hyper.parameters(), lr=1e-3)
def target(x, w):
"""Run the target network with weights w produced by the hypernetwork."""
return torch.relu(x[:, None] * w[:32] + w[32:64]) @ w[64:96] + w[96]
# Train only the hypernetwork, on a new random sine task at every step
for step in range(5000):
task = torch.rand(2) * torch.tensor([2.0, math.pi])
loss = ((target(x, hyper(task)) - task[0] * torch.sin(x + task[1])) ** 2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Unseen task: one forward pass of the hypernetwork produces the target network's weights
y = 1.5 * torch.sin(x + 1.0)
with torch.no_grad():
mse = ((target(x, hyper(torch.tensor([1.5, 1.0]))) - y) ** 2).mean()
print(f"Unseen task MSE: {mse:.3f} with generated weights, {(y**2).mean():.3f} predicting zero")Çıktı Unseen task MSE: 0.010 with generated weights, 1.132 predicting zero olur. Genliği 1.5 ve fazı 1.0 olan görev için hedef ağ hiç eğitilmemiştir; ağırlıkları, görev ailesinin tamamında doğru ağırlıkların nasıl değiştiğini öğrenen hiper ağın tek bir çağrısıyla elde edilmiştir.
Uygulamalar#
- Sürekli öğrenme: Görev koşullu bir hiper ağ, her görev için küçük bir gömme saklar ve gerektiğinde o görevin ağırlıklarını yeniden üretir. Yeni bir görev üzerinde eğitim, önceki görev gömmeleri için hiper ağın çıktılarının değişmemesini sağlayan bir ceza içerir; böylece yıkıcı unutma önlenir.
- Üretken modellerin kişiselleştirilmesi: HyperDreamBooth, tek bir yüz fotoğrafından metinden görüntü üreten bir difüzyon modeli için küçük bir kişiselleştirilmiş ağırlık kümesi tahmin eder ve ardından bu ağırlıkları kısa süreyle iyileştirir. Modeli yaklaşık 20 saniyede kişiselleştirir; bu, DreamBooth'tan 25 kat hızlıdır ve kişiselleştirilmiş ağırlıklar DreamBooth modelinden 10.000 kat daha küçüktür.
- Nöral mimari arama: Grafik hiper ağlar, aday mimariyi bir grafik olarak okur ve ağırlıklarını tahmin eder. Böylece adaylar tek tek eğitilmek yerine tahmin edilen ağırlıklarla doğrulama doğruluklarına göre sıralanabilir.
- Sıfır örnekli sınıflandırma: CLIP'in yazarları, metin kodlayıcısını sınıf adlarından doğrusal bir sınıflandırıcının ağırlıklarını üreten bir hiper ağ olarak tanımlar. Bu sayede CLIP, görüntüleri eğitim etiketi olarak hiç görmediği kategorilere sınıflandırabilir.
Açık kelime dağarcıklı dedektörler de aynı fikri nesne tespitine uygular. YOLO26 üzerine kurulu Ultralytics YOLOE-26, set_classes() öğesine aktarılan her sınıf adını MobileCLIP2 ile bir kez kodlar. MobileCLIP2, kompakt ve CLIP benzeri bir metin kodlayıcısıdır. Elde edilen gömmeler, her aday bölgenin her sınıfa göre puanlanmasında ağırlık olarak kullanılır. Dışa aktarma işlemi, bu gömmeleri tespit başlığındaki sıradan bir 1x1 evrişim katmanına yerleştirir.
Hiper Ağlar ve İlişkili Terimler#
- İnce ayar: Sabit bir ağırlık kümesini, o görevin verileri üzerinde gradyan adımları uygulayarak yeni bir göreve uyarlar. Eğitilmiş bir hiper ağ ise yalnızca görevin koşullandırma girdisini kullanarak yeni bir görev için tek bir ileri geçişte ağırlık üretir.
- Meta öğrenme: Yeni görevlere hızla uyum sağlamayı öğrenmeye yönelik daha geniş kapsamlı hedeftir. Hiper ağlar, görev açıklamasını veya birkaç örneği doğrudan ağırlıklara eşleyerek bunu uygulamanın bir yolunu sunar.
- Uzman karışımı (MoE): Her girdiyi çok sayıdaki sabit uzman alt ağdan birkaçına yönlendirir. Hiper ağ ise kayıtlı ağırlıklar arasından seçim yapmak yerine her girdi veya görev için yeni ağırlıklar hesaplar.
- Hızlı ağırlık programlayıcıları: Bir dizi işlenirken başka bir ağın kısa süreli ağırlıklarını yazan ağlardır; bu fikir 1990'ların başında ortaya çıkmıştır. Transformer'lardaki doğrusallaştırılmış öz dikkat, biçimsel olarak böyle bir hızlı ağırlık programlayıcıya eşdeğerdir.










