Hypernetworks
ハイパーネットワークは、タスク埋め込みなどの入力から別のネットワークの重みを出力するニューラルネットワークです。用途とPyTorchの例について解説します。
ハイパーネットワークとは、出力として別のネットワーク(ターゲットネットワークまたはメインネットワークと呼ばれます)の重みを生成するニューラルネットワークです。固定されたモデルの重みを1組学習するのではなく、ターゲットネットワークは、タスクID、ユーザープロファイル、テキストの説明、サンプル画像などの条件入力からハイパーネットワークが計算した重みを受け取ります。そのため、学習済みのハイパーネットワーク1つで、1回のフォワードパスにより、入力ごとに異なる特化モデルを生成できます。Google Brainが2016年に発表したHyperNetworks論文で、David Ha、Andrew Dai、Quoc Leは、小規模なハイパーネットワークを使って深層畳み込みネットワークとリカレントネットワークの重みを生成しました。この考え方は現在、継続学習、拡散モデルのモデルパーソナライゼーション、ニューラルアーキテクチャ探索に応用されています。
ハイパーネットワークの仕組み#
学習中に学習されるのは、ハイパーネットワーク自体のパラメーターだけです。多くの場合、タスクやレイヤーごとに学習済みの埋め込みを使います。条件入力はハイパーネットワークを通過してターゲットネットワークの重みを生成し、ターゲットネットワークはその重みで実データを処理します。誤差逆伝播によって、生成された重みを通る損失勾配がハイパーネットワークに戻されます。
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のターゲットネットワークは一度も学習されていません。その重みはハイパーネットワークを1回呼び出して生成されたものであり、ハイパーネットワークはタスク群全体で適切な重みがどのように変わるかを学習しています。
用途#
- 継続学習:タスク条件付きハイパーネットワークは、タスクごとに小さな埋め込みを保存し、必要に応じてそのタスクの重みを再生成します。新しいタスクの学習には、以前のタスクの埋め込みに対するハイパーネットワークの出力を変えないようにするペナルティが含まれ、破滅的忘却を抑制します。
- 生成モデルのパーソナライゼーション:HyperDreamBoothは、顔写真1枚からテキスト画像拡散モデル用の小さなパーソナライズ済み重みを予測し、短時間で微調整します。モデルを約20秒でパーソナライズでき、DreamBoothより25倍高速で、パーソナライズ済みの重みはDreamBoothモデルより10,000倍小さくなります。
- ニューラルアーキテクチャ探索:グラフハイパーネットワークは候補アーキテクチャをグラフとして読み込み、その重みを予測します。候補を1つずつ学習させる代わりに、予測された重みを使って検証精度で順位付けできます。
- ゼロショット分類:CLIPの著者らは、テキストエンコーダーを、クラス名から線形分類器の重みを生成するハイパーネットワークとして説明しています。これによりCLIPは、学習ラベルとして一度も見ていないカテゴリに画像を分類できます。
オープンボキャブラリー検出器も同じ考え方を検出に応用します。YOLO26をベースに構築されたUltralytics YOLOE-26は、set_classes()に渡された各クラス名を、コンパクトなCLIP風テキストエンコーダーであるMobileCLIP2で一度エンコードし、得られた埋め込みを、各候補領域と各クラスのスコア算出に使う重みとして利用します。エクスポート時には、埋め込みが通常の1x1畳み込みとして検出ヘッドに組み込まれます。
ハイパーネットワークと関連用語#
- ファインチューニング:タスクのデータに対する勾配更新を通じて、固定された重み一式を新しいタスクに適応させます。学習済みハイパーネットワークは、タスクの条件入力だけを受け取り、1回のフォワードパスで新しいタスク用の重みを生成します。
- メタ学習:新しいタスクに素早く適応する方法を学習する、より広い目的を指します。ハイパーネットワークは、タスクの説明や少数のサンプルを直接重みに変換する実装方法の1つです。
- 専門家混合モデル(MoE):多数の固定された専門家サブネットワークのうち、少数を各入力に割り当てます。ハイパーネットワークは保存済みの重みから選ぶのではなく、入力やタスクごとに新しい重みを計算します。
- 高速重みプログラマー:系列の処理中に、別のネットワークの短期的な重みを書き換えるネットワークです。この考え方は1990年代初頭に提案されました。トランスフォーマーにおける線形化された自己アテンションは、形式上、このような高速重みプログラマーと等価です。










