本文档提供了基于Hinton等人论文《Dynamic Routing Between Capsules》的胶囊网络(CapsNet)的注释实现。胶囊网络是一种深度学习的架构方法,旨在解决卷积神经网络的一些基本局限性,特别是在保持空间层级和视点不变表示方面。
该实现包括了CapsNet的核心组件、动态路由算法,以及用于MNIST数字分类的实际应用。有关此存储库中其他视觉模型实现的更多信息,请参阅SketchRNN。
传统神经网络使用来自神经元的标量输出,而胶囊网络使用向量。每个胶囊输出一个向量,其中
这种方法使胶囊网络能够比传统CNN更好地保留特征之间的空间关系,并实现更鲁棒的视点不变性。
来源:labml_nn/capsule_networks/__init__.py10-26 labml_nn/capsule_networks/mnist.py7-13
胶囊网络的实现由三个主要组件组成:Squash激活函数、动态路由算法和Margin损失函数。
来源:labml_nn/capsule_networks/__init__.py10-26 labml_nn/capsule_networks/mnist.py29-97
Squash函数是一种专为胶囊网络设计的非线性激活函数。它将向量归一化,使其长度介于0到1之间,同时保留其方向。
$$\mathbf{v}_j = \frac{{\lVert \mathbf{s}_j \rVert}^2}{1 + {\lVert \mathbf{s}_j \rVert}^2} \frac{\mathbf{s}_j}{\lVert \mathbf{s}_j \rVert}$$
在计算向量范数时,实现通过添加一个小的epsilon来处理数值稳定性。
来源:labml_nn/capsule_networks/__init__.py39-70
路由算法是胶囊网络的一项核心创新,它决定了信息如何在胶囊层之间传递。它实现了一种迭代的、基于协议的路由机制。
路由器使用权重矩阵和动态调整的耦合系数,将一个层的胶囊映射到下一层。
u_i)通过权重矩阵(W_ij)进行变换,以生成预测(û_j|i)。b_ij)被设置为零。c_ij)通过在逻辑上应用softmax来计算。来源:labml_nn/capsule_networks/__init__.py73-133
胶囊网络使用一种特殊的损失函数,该函数强制规定输出胶囊长度之间的间隔。
$$\mathcal{L}_k = T_k \max(0, m^{+} - \lVert\mathbf{v}_k\rVert)^2 + \lambda (1 - T_k) \max(0, \lVert\mathbf{v}_k\rVert - m^{-})^2$$
其中
T_k 如果类别k存在则为1,否则为0。m+ 是正间隔(通常为0.9)。m- 是负间隔(通常为0.1)。λ 是一个向下加权的因子(通常为0.5),以防止胶囊的长度在训练早期收缩。第一项对正确类别的胶囊长度小于m+的情况进行惩罚,而第二项对错误类别的胶囊长度大于m-的情况进行惩罚。
来源:labml_nn/capsule_networks/__init__.py136-186
该存储库在MNISTCapsuleNetworkModel中包含了一个用于MNIST数字分类的胶囊网络的具体实现。
MNIST CapsNet模型遵循以下结构:
| 层 | 输出形状 | 参数 |
|---|---|---|
| 输入 | [batch_size, 1, 28, 28] | - |
| Conv1 | [batch_size, 256, 20, 20] | 9x9 核,256 通道 |
| Conv2 | [batch_size, 256, 6, 6] | 9x9 核,步长为 2 |
| PrimaryCaps | [batch_size, 32x6x6, 8] | 重塑和置换 |
| DigitCaps | [batch_size, 10, 16] | 动态路由 |
| 解码器 | [batch_size, 784] | 全连接层 |
| 输出 | [batch_size, 28, 28] | 重塑为图像 |
来源:labml_nn/capsule_networks/mnist.py29-97
在MNIST实现中,路由发生在主要胶囊和数字胶囊之间。
路由算法将1152个(32x6x6)主要胶囊连接到10个数字胶囊,每个主要胶囊有8个维度,每个数字胶囊有16个维度。
来源:labml_nn/capsule_networks/mnist.py46-50
MNIST CapsNet实现包含一个解码器网络,该网络从数字胶囊中重构输入图像。这充当了一种正则化形式。
来源:labml_nn/capsule_networks/mnist.py84-95
MNIST胶囊网络的训练过程包括:
前向传播:
损失计算:
预测:
该实现使用Adam优化器,学习率为1e-3。
来源:labml_nn/capsule_networks/mnist.py118-153
来源:labml_nn/capsule_networks/__init__.py10-26
要运行MNIST胶囊网络示例,请执行以下操作:
来源:labml_nn/capsule_networks/mnist.py162-178
该实现提供了一种清晰、模块化的方法来理解和实验胶囊网络,胶囊网络仍然是深度学习研究中一项重要的架构创新。