Capsule Networks (CapsNet)
胶囊网络(CapsNets)将每个部分编码为一个向量,向量长度表示其概率,方向表示其姿态,并通过动态路由连接各部分。
胶囊网络(CapsNets)是由胶囊构成的神经网络;胶囊是由一小组神经元组成的单元,其输出是一个向量,而非单个数值。胶囊向量的长度表示某个实体(例如数字、眼睛或车轮)存在的概率,其方向则编码该实体的实例化参数:位置、大小、方向、笔画粗细,以及姿态和形变的其他属性。Geoffrey Hinton、Alex Krizhevsky 和 Sida Wang 在 2011 年一篇关于变换自编码器的论文中提出了胶囊;随后,Sara Sabour、Nicholas Frosst 和 Hinton 在 胶囊间的动态路由中将胶囊实现为一个可用的分类器。该论文发表于 NIPS 2017,提出使用名为“一致性路由”的迭代算法连接相邻层中的胶囊。
胶囊为何取代最大池化#
卷积神经网络(CNN)使用标量激活检测特征,并经常通过最大池化缩小特征图:保留每个窗口中的最强响应,却丢弃该响应在窗口中的位置。这样做能让检测对小幅位移不敏感,但只检查部件是否存在的网络可能会接受嘴巴长在眼睛上方的人脸,这就是所谓的毕加索问题。Hinton 主张使用等变性而非不变性:物体移动或旋转时,胶囊的向量也应随之旋转,而其长度(物体存在的概率)则保持不变。以这种方式学习视角的胶囊无需像 CNN 那样依赖大量数据增强,也能识别来自新角度的物体。
Ultralytics YOLO26无需胶囊也能保留物体位置:五个步幅为 2 的卷积层会将输入分辨率降至 1/32;其唯一的最大池化模块 SPPF 使用步幅 1 和 5 x 5 窗口连续池化三次,从而扩大感受野,同时不缩小检测头进行预测的网格。
动态路由的工作原理#
较低层中的每个胶囊都会将自己的输出乘以一个学习得到的权重矩阵,从而预测上一层每个胶囊的输出。路由过程随后决定每个子胶囊的输出有多少传递给各个父胶囊。对初始值为零的路由 logits 进行 softmax 运算,就能得到耦合系数,将每个子胶囊的输出分配到各个父胶囊。每个父胶囊会将预测值按这些系数加权求和,再应用 squash 函数;该函数保留向量方向,并将向量长度映射到 0 到 1 之间。每个预测值与父胶囊新输出的点积会加到 logit 上,因此子胶囊会将更多输出发送给其状态与预测相符的父胶囊:
import torch
torch.manual_seed(0)
# 6 个子胶囊各自为 2 个父胶囊预测一个 8D 姿态
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) # 一致性会提高 logit
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])。经过三次迭代后,四个意见一致的子胶囊会将 97% 的输出发送给父胶囊 0;另外两个子胶囊仍接近平均分配。父胶囊 0 的向量长度达到 0.98,而只收到零散投票的父胶囊 1 则保持在 0.15。路由机制与Transformer中的注意力机制类似,但方向相反:softmax 在子胶囊可连接的父胶囊之间运算,因此父胶囊会竞争每个子胶囊的输出。
2017 年的 CapsNet 及其结果#
原始网络较浅:一个包含 256 个 9 x 9 卷积核的卷积层连接到 PrimaryCaps;这是一个卷积胶囊层,会将 28 x 28 的数字图像转换成 32 x 6 x 6 = 1,152 个八维胶囊;随后,路由将这些胶囊连接到 DigitCaps,其中每个类别对应一个 16 维胶囊。训练时,模型会结合基于胶囊长度的间隔损失函数:存在的数字对应的长度需超过 0.9,其余数字需低于 0.1;同时,解码器会根据正确数字的胶囊重建图像,并加入一个缩小至 0.0005 倍的正则化项,类似自编码器。扰动 16 个维度中的一个并解码结果,就能改变缩放、笔画粗细、倾斜或宽度等单一属性,因此与 CNN 激活相比,胶囊输出更容易检查;这一目标也与可解释 AI相同。
CapsNet 有 820 万个参数,基线 CNN 有 3,540 万个参数;前者在 MNIST 上的测试误差率为 0.25%,基线模型为 0.39%;在 MultiMNIST 上分别为 5.2% 和 8.1%。MultiMNIST 中的数字对平均有 80% 的边界框重叠。模型仅使用位移最多 2 像素的 MNIST 数字进行训练,在 affNIST(同一组数字经过随机仿射变换)上得分为 79%;参数量相近的 CNN 得分为 66%。在 CIFAR-10 上,七个 CapsNet 组成的集成误差率为 10.6%,与 CNN 首次应用于该数据集时的表现大致相当;作者将差距归因于胶囊试图处理杂乱的背景。
局限性与后续胶囊模型#
路由会针对每一对子胶囊和父胶囊进行多次迭代,因此计算量和内存占用会随图像尺寸和类别数量迅速增长;胶囊网络在 ImageNet 等大型图像分类基准上的表现始终未能赶上 CNN 或视觉 Transformer。研究人员也将胶囊网络应用于医学图像分析,例如根据 MRI 扫描对脑肿瘤类型进行分类;这类任务的训练集规模较小。
Hinton、Sabour 和 Frosst 在 ICLR 2018 发表的使用 EM 路由的矩阵胶囊,用 4 x 4 姿态矩阵取代姿态向量,并通过期望最大化进行路由;在 smallNORB 基准上,该模型针对从多个视角拍摄的玩具物体进行分类,相比之前的最先进方法将测试错误降低了 45%,并且比基线 CNN 更能抵御白盒对抗攻击。2019 年,研究人员进一步提出堆叠式胶囊自编码器,无需标签即可学习胶囊。Hinton 于 2021 年提出的 GLOM 方案,则将相同的部分—整体层级结构表示为彼此一致的嵌入向量岛,完全不使用动态路由。










