Hypernetworks
Ein Hypernetz ist ein neuronales Netz, das aus einer Eingabe wie einem Aufgaben-Embedding die Gewichte eines anderen Netzes erzeugt. Behandelt werden Anwendungen und ein PyTorch-Beispiel.
Ein Hypernetzwerk ist ein neuronales Netzwerk, dessen Ausgabe aus den Gewichten eines anderen Netzwerks besteht, das Zielnetzwerk oder Hauptnetzwerk genannt wird. Statt einen einzigen festen Satz Modellgewichte zu lernen, erhält das Zielnetzwerk Gewichte, die das Hypernetzwerk anhand einer Eingabe berechnet. Diese Eingabe kann beispielsweise eine Aufgabenkennung, ein Benutzerprofil, eine Textbeschreibung oder ein Beispielbild sein. So kann ein einziges trainiertes Hypernetzwerk in einem Vorwärtsdurchlauf für jede Eingabe ein anderes spezialisiertes Modell erzeugen. In der Arbeit HyperNetworks von Google Brain aus dem Jahr 2016 verwendeten David Ha, Andrew Dai und Quoc Le kleine Hypernetzwerke, um die Gewichte tiefer konvolutionaler und rekurrenter Netzwerke zu erzeugen. Heute findet sich die Idee beim kontinuierlichen Lernen, bei der Personalisierung von Diffusionsmodellen und bei der Suche nach neuronalen Architekturen.
So funktionieren Hypernetzwerke#
Während des Trainings werden nur die eigenen Parameter des Hypernetzwerks gelernt. Die Bedingungseingabe, häufig ein erlerntes Embedding pro Aufgabe oder Schicht, wird durch das Hypernetzwerk geleitet, um die Gewichte des Zielnetzwerks zu erzeugen. Das Zielnetzwerk verarbeitet mit diesen Gewichten die eigentlichen Daten, und die Rückpropagierung leitet den Gradienten des Verlusts durch die erzeugten Gewichte zurück zum Hypernetzwerk:
Ha und Kollegen unterschieden statische Hypernetzwerke, die die Gewichte jeder Schicht einmalig aus einem Schicht-Embedding erzeugen, von dynamischen Hypernetzwerken, die die Gewichte für jede Eingabe oder jeden Zeitschritt neu berechnen, wie es ihr HyperLSTM bei jedem Schritt einer Sequenz tat. Zur Laufzeit sind die erzeugten Gewichte gewöhnliche Tensoren. Das Zielnetzwerk kann daher jede Architektur haben, auch eine Transformer-Schicht, deren Attention-Projektionen vom Hypernetzwerk stammen. Die größte technische Herausforderung ist die Ausgabegröße: Für eine Schicht mit Millionen Gewichten müsste das Hypernetzwerk pro Schicht Millionen Ausgaben erzeugen. Praktische Ansätze erzeugen die Gewichte in Abschnitten, jeweils aus einem eigenen Abschnitts-Embedding, generieren nur kleine Faktoren niedrigen Rangs für jede Gewichtsaktualisierung oder berechnen nur eine Skalierung und Verschiebung pro Kanal, wie bei der merkmalsweisen linearen Modulation (FiLM).
Hypernetzwerk-Beispiel in PyTorch#
Dieses PyTorch-Beispiel trainiert ein Hypernetzwerk mit einer Aufgabenfamilie: Sinuswellen mit unterschiedlichen Amplituden und Phasen. Für jede Aufgabe erzeugt es alle 97 Gewichte eines kleinen Zielnetzwerks; trainiert wird nur das Hypernetzwerk:
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")Es gibt Unseen task MSE: 0.010 with generated weights, 1.132 predicting zero aus. Das Zielnetzwerk für die Amplitude 1.5 und die Phase 1.0 wurde nie trainiert. Seine Gewichte stammten aus einem einzigen Aufruf des Hypernetzwerks, das gelernt hatte, wie sich die passenden Gewichte über die gesamte Aufgabenfamilie hinweg ändern.
Anwendungen#
- Kontinuierliches Lernen: Ein aufgabenabhängiges Hypernetzwerk speichert ein kleines Embedding pro Aufgabe und erzeugt deren Gewichte bei Bedarf neu. Beim Training für eine neue Aufgabe wird eine Strafkomponente verwendet, die dafür sorgt, dass die Ausgaben des Hypernetzwerks für frühere Aufgaben-Embeddings unverändert bleiben. Das wirkt dem katastrophalen Vergessen entgegen.
- Personalisierung generativer Modelle: HyperDreamBooth sagt anhand eines einzigen Gesichtsfotos eine kleine Gruppe personalisierter Gewichte für ein Diffusionsmodell zur Bildgenerierung aus Text voraus und verfeinert sie anschließend kurz. So wird das Modell in etwa 20 Sekunden personalisiert – 25-mal schneller als DreamBooth. Die personalisierten Gewichte sind 10.000-mal kleiner als ein DreamBooth-Modell.
- Suche nach neuronalen Architekturen: Graph-Hypernetzwerke lesen eine mögliche Architektur als Graph und sagen deren Gewichte voraus. So lassen sich Kandidaten anhand ihrer Validierungsgenauigkeit mit vorhergesagten Gewichten bewerten, statt jeden einzeln zu trainieren.
- Klassifizierung ohne Beispiele: Die CLIP-Autoren beschreiben den Text-Encoder als Hypernetzwerk, das aus den Klassennamen die Gewichte eines linearen Klassifikators erzeugt. Dadurch kann CLIP Bilder Kategorien zuordnen, die es nicht als Trainingslabels gesehen hat.
Detektoren mit offenem Vokabular nutzen dieselbe Idee für die Objekterkennung. Ultralytics YOLOE-26 basiert auf YOLO26. Das Modell kodiert jeden an set_classes() übergebenen Klassennamen einmal mit MobileCLIP2, einem kompakten Tex-Encoder nach Art von CLIP, und nutzt die resultierenden Embeddings als Gewichte, um jeden Kandidatenbereich mit jeder Klasse abzugleichen. Beim Export werden diese Embeddings in eine gewöhnliche 1x1-Faltung im Detektionskopf integriert.
Hypernetzwerke und verwandte Begriffe#
- Feinabstimmung: Passt einen festen Gewichtssatz mithilfe von Gradientenaktualisierungen auf den Daten einer neuen Aufgabe an. Ein trainiertes Hypernetzwerk erzeugt Gewichte für eine neue Aufgabe in einem einzigen Vorwärtsdurchlauf und benötigt dafür nur die Bedingungseingabe der Aufgabe.
- Metalernen: Das übergeordnete Ziel, die schnelle Anpassung an neue Aufgaben zu erlernen. Hypernetzwerke sind eine Möglichkeit, dies umzusetzen: Sie bilden eine Aufgabenbeschreibung oder einige Beispiele direkt auf Gewichte ab.
- Expertenmischung (MoE): Leitet jede Eingabe an einige wenige von vielen festgelegten Experten-Teilnetzwerken weiter. Ein Hypernetzwerk berechnet neue Gewichte für jede Eingabe oder Aufgabe, anstatt aus gespeicherten Gewichten auszuwählen.
- Schnelle Gewichtsprogrammierer: Netzwerke, die während der Verarbeitung einer Sequenz die kurzfristigen Gewichte eines anderen Netzwerks festlegen – eine Idee aus den frühen 1990er-Jahren. Die linearisierte Self-Attention in Transformern ist formal gleichbedeutend mit einem solchen schnellen Gewichtsprogrammierer.










