Hypernetworks
Гиперсеть — это нейронная сеть, которая по входным данным, например эмбеддингу задачи, выдаёт веса другой сети. Рассматриваются области применения и пример на PyTorch.
Гиперсеть — это нейронная сеть, на выходе которой находятся веса другой сети, называемой целевой или основной сетью. Вместо обучения одного фиксированного набора весов модели целевая сеть получает веса, которые гиперсеть вычисляет по условному входу, например идентификатору задачи, профилю пользователя, текстовому описанию или изображению-примеру. Поэтому одна обученная гиперсеть может за один прямой проход создавать разные специализированные модели для разных входных данных. В статье HyperNetworks, опубликованной Google Brain в 2016 году, Дэвид Ха, Эндрю Дай и Куок Ле использовали небольшие гиперсети для генерации весов глубоких свёрточных и рекуррентных сетей. Сегодня эта идея применяется в непрерывном обучении, персонализации диффузионных моделей и поиске нейронных архитектур.
Принцип работы гиперсетей#
Во время обучения обновляются только параметры самой гиперсети. Условный вход, часто представляющий собой обучаемый эмбеддинг для каждой задачи или слоя, проходит через гиперсеть и формирует веса целевой сети. Целевая сеть обрабатывает реальные данные с этими весами, а обратное распространение ошибки передаёт градиент функции потерь через сгенерированные веса обратно в гиперсеть:
Ха и его коллеги различали статические гиперсети, которые один раз генерируют веса каждого слоя по эмбеддингу слоя, и динамические гиперсети, которые пересчитывают веса для каждого входного элемента или временного шага, как это делает 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 секунд — это в 25 раз быстрее DreamBooth, а персонализированные веса в 10 000 раз меньше модели DreamBooth.
- Поиск нейронных архитектур: Графовые гиперсети считывают граф-кандидат архитектуры и предсказывают её веса, поэтому кандидатов можно ранжировать по точности на проверочных данных с предсказанными весами, не обучая их по одному.
- Классификация без примеров: Авторы CLIP описывают текстовый энкодер модели как гиперсеть, которая генерирует веса линейного классификатора по названиям классов. Благодаря этому CLIP может классифицировать изображения по категориям, которых не было среди обучающих меток.
Детекторы с открытым словарём используют ту же идею для обнаружения объектов. Ultralytics YOLOE-26, созданная на основе YOLO26, один раз кодирует каждое имя класса, переданное в set_classes(), с помощью MobileCLIP2 — компактного текстового энкодера в стиле CLIP. Полученные эмбеддинги используются как веса для оценки каждой предполагаемой области относительно каждого класса. При экспорте эти эмбеддинги сворачиваются в обычную свёртку 1x1 в голове обнаружения.
Гиперсети и смежные термины#
- Дообучение: Адаптирует один фиксированный набор весов к новой задаче с помощью градиентных шагов на её данных. Обученная гиперсеть генерирует веса для новой задачи за один прямой проход, получив только условный вход задачи.
- Метаобучение: Более общая цель — научиться быстро адаптироваться к новым задачам. Гиперсети позволяют реализовать этот подход, напрямую преобразуя описание задачи или несколько примеров в веса.
- Смесь экспертов (MoE): Направляет каждый вход к нескольким из множества фиксированных подсетей-экспертов. Вместо выбора из уже сохранённых вариантов гиперсеть вычисляет новые веса для каждого входа или задачи.
- Сети с быстрыми весами: Сети, которые записывают кратковременные веса другой сети по мере обработки последовательности. Эта идея появилась в начале 1990-х годов. Линеаризованный механизм self-attention в трансформерах формально эквивалентен такой сети с быстрыми весами.










