Capsule Networks (CapsNet)
カプセルネットワーク(CapsNets)は、各部位をベクトルで表現します。ベクトルの長さはその部位の確率、方向は姿勢を示し、動的ルーティングで関連付けます。
カプセルネットワーク(CapsNets)は、カプセルと呼ばれる小さなニューロン群から構成されるニューラルネットワークです。カプセルの出力は単一の数値ではなくベクトルです。カプセルベクトルの長さは、数字、目、車輪などの実体が存在する確率を示し、ベクトルの方向は、その実体の位置、サイズ、向き、線の太さなど、姿勢や変形に関する特性を符号化します。Geoffrey Hinton氏、Alex Krizhevsky氏、Sida Wang氏は、オートエンコーダーの変換に関する2011年の論文でカプセルを紹介しました。その後、Sara Sabour氏、Nicholas Frosst氏、Hinton氏が、NIPS 2017で発表したDynamic Routing Between Capsulesでカプセルを実用的な分類器へと発展させました。この手法では、合意に基づくルーティングと呼ばれる反復アルゴリズムで、連続する層のカプセルを接続します。
カプセルが最大プーリングに取って代わる理由#
畳み込みニューラルネットワーク(CNN)は、スカラー値の活性化で特徴を検出し、最大プーリングで特徴マップを縮小することがよくあります。最大プーリングでは各ウィンドウ内の最も強い応答を残し、それがウィンドウ内のどこで発生したかという情報は捨てられます。これによって小さな位置のずれに対する検出の頑健性が高まりますが、部品の有無だけを確認するネットワークでは、口が目より上にある顔も受け入れてしまうことがあります。これは、いわゆるピカソ問題です。Hinton氏は不変性よりも同変性を重視しました。物体が移動または回転するとき、カプセルのベクトルもそれに応じて回転しつつ、物体の存在確率を示す長さは変わらないべきだとしました。このように視点を学習するカプセルでは、CNNが新しい角度から物体を認識するために使うデータ拡張への依存を減らせます。
Ultralytics YOLO26はカプセルを使わずに物体の位置を保持します。ストライド2の畳み込みを5回適用して入力を1/32の解像度に縮小します。唯一の最大プーリングブロックであるSPPFは、ストライド1、5 x 5のウィンドウで3回連続してプーリングを行い、検出ヘッドが予測に使うグリッドを縮小せずに受容野を広げます。
ダイナミックルーティングの仕組み#
下位層の各カプセルは、出力に学習済みの重み行列を掛け、上位層の各カプセルの出力を予測します。次にルーティングによって、各子カプセルの出力を各親カプセルにどの程度送るかを決定します。0から始まるルーティングロジットに対してソフトマックスを適用すると、各子カプセルの出力を親カプセル間で分配する結合係数が得られます。各親カプセルは、それらの係数で重み付けされた予測を合計し、ベクトルの方向を維持しながら長さを0から1の範囲に収めるsquash関数を適用します。各予測と親カプセルの新しい出力との内積がロジットに加算されるため、子カプセルは自身の状態を予測できた親カプセルへ、より多くの出力を送るようになります。
import torch
torch.manual_seed(0)
# # 6個の子カプセルが、それぞれ2個の親カプセルの8次元ポーズを予測します
predictions = 0.2 * torch.randn(6, 2, 8)
pose = 0.5 * torch.randn(8)
predictions[:4, 0] = pose + 0.05 * torch.randn(4, 8) # # 子カプセル0~3は親カプセル0に一致します
logits = torch.zeros(6, 2)
for _ in range(3): # # 論文にあるように、合意に基づくルーティングを3回反復します
coupling = logits.softmax(dim=1) # # 各子カプセルは親カプセル間で票を分配します
s = (coupling.unsqueeze(-1) * predictions).sum(dim=0)
squared = s.square().sum(dim=-1, keepdim=True)
parents = squared / (1 + squared) * s / squared.sqrt() # # squash:長さは[0, 1)の範囲です
logits = logits + (predictions * parents).sum(dim=-1) # # 合意によってロジットが上昇します
print(coupling[:, 0].round(decimals=2))
print(parents.norm(dim=-1).round(decimals=2))tensor([0.9700, 0.9700, 0.9700, 0.9700, 0.5700, 0.4700])とtensor([0.9800, 0.1500])が出力されます。3回反復すると、合意した4個の子カプセルは出力の97%を親カプセル0に送ります。残りの2個はほぼ均等に分配し、散発的な票しか受け取らなかった親カプセル1のベクトル長が0.15にとどまる一方、親カプセル0のベクトル長は0.98になります。ルーティングはTransformerのアテンション機構を逆方向に適用したものに似ています。ソフトマックスは、子カプセルが出力を送ることのできる親カプセル間で計算されるため、親カプセルが各子カプセルの出力を取り合います。
2017年のCapsNetとその成果#
元のネットワークは浅い構造です。サイズ9 x 9のカーネルを256個持つ畳み込み層から、畳み込みカプセル層のPrimaryCapsへと接続します。PrimaryCapsは28 x 28の数字画像を、32 x 6 x 6 = 1,152個の8次元カプセルに変換します。ルーティングによって、これらのカプセルは、各クラスに対して1つの16次元カプセルを持つDigitCapsに接続されます。訓練では、カプセルの長さに対するマージン損失関数を使い、存在する数字の長さを0.9より大きく、それ以外の長さを0.1より小さくします。また、正しい数字のカプセルから画像を再構成するデコーダーを組み合わせます。このデコーダーは、0.0005倍に縮小したオートエンコーダー形式の正則化項です。16次元のうち1つの次元を変化させて結果をデコードすると、スケール、線の太さ、傾き、幅など、1つの特性が変化します。そのため、カプセルの出力はCNNの活性化よりも解釈しやすく、説明可能なAIと共通する目標を持っています。
ベースラインCNNの3,540万に対してパラメーター数820万のCapsNetは、MNISTでテスト誤差0.25%を達成し、ベースラインの0.39%を上回りました。また、平均80%重複する数字のバウンディングボックスを持つ数字ペアのデータセットMultiMNISTでは、5.2%に対して8.1%でした。最大2ピクセルずらしたMNISTの数字だけで訓練した場合、ランダムなアフィン変換を施した同じ数字のデータセットaffNISTで79%のスコアを記録しました。一方、パラメーター数が同程度のCNNは66%でした。CIFAR-10では、7つのCapsNetを組み合わせたアンサンブルが誤差10.6%を達成しました。これは、このデータセットにCNNが初めて適用された頃の性能に相当し、著者らはその性能差を、カプセルが背景の雑然とした画像に対応しようとすることに起因すると説明しました。
カプセルモデルの限界とその後の発展#
ルーティングは子カプセルと親カプセルのすべての組み合わせに対して複数回の反復を行うため、画像サイズやクラス数が増えると、計算量とメモリ使用量が急増します。カプセルネットワークは、ImageNetなどの大規模な画像分類ベンチマークで、CNNやビジョントランスフォーマーの性能に追いつくことはありませんでした。研究者らは医用画像解析に応用しており、たとえば訓練データセットが小規模な場合に、MRIスキャンから脳腫瘍の種類を分類しています。
Hinton氏、Sabour氏、Frosst氏によるEMルーティングを用いたマトリックスカプセルは、ICLR 2018で発表され、ポーズベクトルを4 x 4のポーズ行列に置き換え、期待値最大化法でルーティングを行いました。さまざまな視点から撮影したおもちゃの物体を使うsmallNORBベンチマークでは、それまでの最先端手法に比べてテスト誤差を45%削減し、ベースラインCNNよりもホワイトボックス型の敵対的攻撃に強い性能を示しました。2019年には、ラベルなしでカプセルを学習する積層カプセルオートエンコーダーが登場しました。Hinton氏が2021年に提案したGLOMでは、同じ部分と全体の階層構造を、互いに合意する埋め込みベクトルの集まりとして表現し、ダイナミックルーティングをまったく使いません。










