Hypernetworks
하이퍼네트워크는 태스크 임베딩과 같은 입력으로부터 다른 네트워크의 가중치를 출력하는 신경망입니다. 활용 사례와 PyTorch 예제를 다룹니다.
하이퍼네트워크는 출력으로 다른 네트워크의 가중치를 생성하는 신경망이며, 이 다른 네트워크를 타깃 네트워크 또는 메인 네트워크라고 합니다. 하나의 고정된 모델 가중치 집합을 학습하는 대신, 타깃 네트워크는 태스크 식별자, 사용자 프로필, 텍스트 설명, 예시 이미지 등의 조건 입력을 바탕으로 하이퍼네트워크가 계산한 가중치를 받습니다. 따라서 학습된 하이퍼네트워크 하나가 순전파 한 번으로 입력마다 서로 다른 특화 모델을 생성할 수 있습니다. Google Brain의 David Ha, Andrew Dai, Quoc Le는 2016년 HyperNetworks 논문에서 소형 하이퍼네트워크를 사용해 깊은 합성곱 및 순환 네트워크의 가중치를 생성했습니다. 현재 이 아이디어는 지속 학습, 확산 모델의 개인화, 신경망 아키텍처 탐색에 활용됩니다.
하이퍼네트워크의 작동 방식#
학습 중에는 하이퍼네트워크 자체의 파라미터만 학습합니다. 태스크나 레이어마다 학습된 임베딩 등의 조건 입력이 하이퍼네트워크를 통과해 타깃 네트워크의 가중치를 생성합니다. 타깃 네트워크는 해당 가중치로 실제 데이터를 처리하며, 역전파를 통해 손실 기울기가 생성된 가중치를 거쳐 하이퍼네트워크로 전달됩니다:
Ha 등은 레이어 임베딩으로 각 레이어의 가중치를 한 번 생성하는 정적 하이퍼네트워크와, HyperLSTM이 시퀀스의 각 단계에서 수행하듯 입력이나 시간 단계마다 가중치를 다시 계산하는 동적 하이퍼네트워크를 구분했습니다. 생성된 가중치는 실행 시점에 일반 텐서이므로 타깃 네트워크는 어떤 아키텍처든 사용할 수 있습니다. 여기에는 트랜스포머 레이어도 포함되며, 이 레이어의 어텐션 투영을 하이퍼네트워크에서 가져올 수 있습니다. 가장 큰 엔지니어링 과제는 출력 크기입니다. 가중치가 수백만 개인 레이어의 경우 레이어마다 수백만 개의 출력을 생성하는 하이퍼네트워크가 필요합니다. 실용적인 설계에서는 각 청크별 임베딩으로 가중치를 청크 단위로 생성하거나, 가중치 업데이트의 저랭크 인자만 생성하거나, 특징별 선형 변조(FiLM)처럼 채널별 스케일과 시프트만 생성합니다.
PyTorch 하이퍼네트워크 예제#
이 PyTorch 예제는 진폭과 위상이 서로 다른 사인파 태스크 모음으로 하이퍼네트워크를 학습합니다. 각 태스크에서 소형 타깃 네트워크의 가중치 97개를 모두 생성하며, 학습되는 것은 하이퍼네트워크뿐입니다:
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")출력은 Unseen task MSE: 0.010 with generated weights, 1.132 predicting zero입니다. 진폭 1.5, 위상 1.0에 해당하는 타깃 네트워크는 학습에 사용된 적이 없습니다. 가중치는 태스크 모음 전반에서 적절한 가중치의 변화 방식을 학습한 하이퍼네트워크를 한 번 호출해 생성했습니다.
응용 분야#
- 지속 학습: 태스크 조건부 하이퍼네트워크는 태스크마다 작은 임베딩 하나를 저장하고 필요할 때 해당 태스크의 가중치를 다시 생성합니다. 새 태스크를 학습할 때는 이전 태스크 임베딩에 대한 하이퍼네트워크 출력이 그대로 유지되도록 페널티를 적용하여 치명적 망각을 억제합니다.
- 생성 모델 개인화: HyperDreamBooth는 얼굴 사진 한 장을 입력받아 텍스트-이미지 확산 모델용 개인화 가중치 일부를 예측한 뒤 짧게 보정합니다. 이 방식은 약 20초 만에 모델을 개인화하며, DreamBooth보다 25배 빠르고 개인화 가중치는 DreamBooth 모델보다 10,000배 작습니다.
- 신경망 아키텍처 탐색: 그래프 하이퍼네트워크는 후보 아키텍처를 그래프로 입력받아 가중치를 예측합니다. 따라서 후보를 하나씩 학습하지 않고도 예측된 가중치로 검증 정확도를 평가해 순위를 매길 수 있습니다.
- 제로샷 분류: CLIP의 저자들은 CLIP의 텍스트 인코더를 클래스 이름으로부터 선형 분류기 가중치를 생성하는 하이퍼네트워크로 설명합니다. 이 덕분에 CLIP은 학습 레이블에 없던 범주로 이미지를 분류할 수 있습니다.
오픈 보캐뷸러리 탐지기는 동일한 아이디어를 탐지에 적용합니다. YOLO26을 기반으로 한 Ultralytics YOLOE-26은 set_classes()에 전달된 각 클래스 이름을 소형 CLIP 스타일 텍스트 인코더인 MobileCLIP2로 한 번 인코딩하고, 결과 임베딩을 각 후보 영역과 각 클래스의 점수를 계산하는 가중치로 사용합니다. 내보내기 과정에서는 해당 임베딩을 일반 1x1 합성곱으로 통합합니다(탐지 헤드).
하이퍼네트워크와 관련 용어#
- 미세 조정: 태스크 데이터에 대한 경사 업데이트를 통해 고정된 가중치 집합 하나를 새 태스크에 맞게 조정합니다. 학습된 하이퍼네트워크는 태스크의 조건 입력만으로 순전파 한 번에 새 태스크의 가중치를 생성합니다.
- 메타 학습: 새 태스크에 빠르게 적응하는 방법을 학습하는 더 넓은 목표입니다. 하이퍼네트워크는 태스크 설명이나 몇 가지 예시를 가중치에 직접 매핑하는 방식으로 이를 구현할 수 있습니다.
- 전문가 혼합(MoE): 각 입력을 고정된 여러 전문가 서브네트워크 중 일부로 전달합니다. 하이퍼네트워크는 저장된 가중치 중 하나를 선택하는 대신 입력이나 태스크마다 새로운 가중치를 계산합니다.
- 패스트 웨이트 프로그래머: 시퀀스를 처리하는 동안 다른 네트워크의 단기 가중치를 작성하는 네트워크로, 1990년대 초에 제안된 아이디어입니다. 트랜스포머의 선형화된 셀프 어텐션은 형식적으로 이러한 패스트 웨이트 프로그래머와 동등합니다.










