Hypernetworks
Una iper-rete è una rete neurale che genera i pesi di un'altra rete a partire da un input, come l'embedding di un'attività. Panoramica sugli usi ed esempio in PyTorch.
Una iper-rete è una rete neurale la cui uscita consiste nei pesi di un'altra rete, detta rete target o principale. Invece di apprendere un unico insieme fisso di pesi del modello, la rete target riceve pesi calcolati dall'iper-rete a partire da un input di condizionamento, come l'identificatore di un compito, il profilo di un utente, una descrizione testuale o un'immagine di esempio. In questo modo, una sola iper-rete addestrata può generare un modello specializzato diverso per ogni input con un unico passaggio in avanti. Nell'articolo HyperNetworks, pubblicato da Google Brain nel 2016, David Ha, Andrew Dai e Quoc Le hanno usato piccole iper-reti per generare i pesi di reti convoluzionali e ricorrenti profonde; oggi questa idea compare nell'apprendimento continuo, nella personalizzazione dei modelli di diffusione e nella ricerca di architetture neurali.
Come funzionano gli iper-network#
Durante l'addestramento si apprendono solo i parametri propri dell'iper-rete. L'input di condizionamento, spesso un embedding appreso per attività o livello, attraversa l'iper-rete per generare i pesi della rete di destinazione; la rete di destinazione elabora i dati effettivi con questi pesi e la retropropagazione propaga il gradiente della funzione di perdita attraverso i pesi generati fino all'iper-rete:
Ha e colleghi hanno distinto le iper-reti statiche, che generano una sola volta i pesi di ogni livello a partire da un embedding del livello, dalle iper-reti dinamiche, che ricalcolano i pesi per ogni input o passo temporale, come faceva la loro HyperLSTM a ogni passo di una sequenza. In fase di esecuzione, i pesi generati sono tensori ordinari; la rete target può quindi avere qualsiasi architettura, compreso un livello Transformer le cui proiezioni di attenzione provengono dall'iper-rete. Il problema ingegneristico principale è la dimensione dell'uscita: un livello con milioni di pesi richiederebbe un'iper-rete con milioni di uscite per livello. Le soluzioni pratiche generano i pesi a blocchi, ciascuno a partire dal proprio embedding, generano solo piccoli fattori a rango ridotto per ogni aggiornamento dei pesi oppure generano solo una scala e uno spostamento per canale, come nella modulazione lineare per feature (FiLM).
Esempio di iper-rete in PyTorch#
Questo esempio PyTorch addestra un'iper-rete su una famiglia di compiti: onde sinusoidali con ampiezze e fasi diverse. Per ogni compito genera tutti i 97 pesi di una piccola rete target e addestra solo l'iper-rete:
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")Stampa Unseen task MSE: 0.010 with generated weights, 1.132 predicting zero. La rete target con ampiezza 1.5 e fase 1.0 non è mai stata addestrata: i suoi pesi provengono da una singola chiamata all'iper-rete, che ha appreso come variano i pesi appropriati nell'intera famiglia di compiti.
Applicazioni#
- Apprendimento continuo: Un'iper-rete condizionata al compito memorizza un piccolo embedding per ogni compito e rigenera i relativi pesi quando serve. L'addestramento su un nuovo compito include una penalità che mantiene invariati gli output dell'iper-rete per gli embedding dei compiti precedenti, contrastando l'oblio catastrofico.
- Personalizzazione dei modelli generativi: HyperDreamBooth prevede un piccolo insieme di pesi personalizzati per un modello di diffusione da testo a immagine partendo da una sola foto di un volto, poi li perfeziona brevemente. Personalizza il modello in circa 20 secondi, 25 volte più velocemente di DreamBooth, con pesi personalizzati 10.000 volte più piccoli di quelli di un modello DreamBooth.
- Ricerca di architetture neurali: Le iper-reti a grafo leggono un'architettura candidata sotto forma di grafo e ne prevedono i pesi, così da poter classificare i candidati in base all'accuratezza di convalida con i pesi previsti, invece di addestrarli uno per uno.
- Classificazione zero-shot: Gli autori di CLIP descrivono il suo codificatore testuale come un'iper-rete che genera i pesi di un classificatore lineare a partire dai nomi delle classi. Questo permette a CLIP di classificare immagini in categorie che non ha mai visto come etichette di addestramento.
I rilevatori a vocabolario aperto applicano la stessa idea al rilevamento. Ultralytics YOLOE-26, basato su YOLO26, codifica una sola volta ciascun nome di classe passato a set_classes() con MobileCLIP2, un codificatore testuale compatto in stile CLIP, e usa gli embedding risultanti come pesi per assegnare un punteggio a ogni regione candidata rispetto a ciascuna classe. L'esportazione incorpora questi embedding in una normale convoluzione 1x1 nella testa di rilevamento.
Iper-reti e termini correlati#
- Perfezionamento: Adatta un unico insieme fisso di pesi a un nuovo compito applicando passi del gradiente sui dati del compito. Un'iper-rete addestrata genera i pesi per un nuovo compito con un singolo passaggio in avanti, usando solo l'input di condizionamento del compito.
- Meta-apprendimento: L'obiettivo più ampio di imparare ad adattarsi rapidamente a nuovi compiti. Le iper-reti sono uno dei modi per realizzarlo: trasformano una descrizione del compito o pochi esempi direttamente in pesi.
- Miscela di esperti (MoE): Indirizza ogni input verso alcuni tra numerosi sotto-modelli esperti con pesi fissi. Invece di selezionare tra pesi già memorizzati, un'iper-rete ne calcola di nuovi per ogni input o compito.
- Programmatori di pesi rapidi: Reti che scrivono i pesi a breve termine di un'altra rete mentre viene elaborata una sequenza, un'idea risalente ai primi anni Novanta. La self-attention linearizzata nei Transformer equivale formalmente a un programmatore di pesi rapidi.










