胶囊网络(Capsule Network)的动态路由机制与特征编码原理
字数 3261 2025-10-28 20:05:13
胶囊网络(Capsule Network)的动态路由机制与特征编码原理
题目描述
胶囊网络是一种旨在克服传统卷积神经网络(CNN)局限性(如对空间关系理解不足、对视角变化敏感)的新型深度学习架构。其核心思想是用"胶囊"(一组神经元)来替代CNN中的标量神经元,每个胶囊不仅编码特征是否存在,还编码其特征的实例化参数(如姿态、纹理、变形)。本题目重点讲解胶囊网络中最关键的"动态路由"机制,该机制用于在胶囊层之间传递信息,确保高级胶囊能聚合来自低级胶囊的、在空间上一致的特征信息。
解题过程
-
胶囊的基本概念
- 问题:CNN中的神经元输出一个标量(激活值),表示某个特征存在的概率,但丢失了该特征的具体状态信息(如精确位置、方向、比例)。
- 解决方案:胶囊输出一个向量。该向量的模长(长度)表示某个实体(如图中的某个特定物体或物体部分)存在的概率,其方向编码该实体的实例化参数(如姿态、大小、旋转等)。
- 举例:一个检测"脸"的胶囊,其输出向量的长度表示"检测到一张脸"的置信度,而向量的方向则编码了这张脸的具体朝向、大小等信息。
-
胶囊间的信息传递:仿射变换
- 问题:低级胶囊(如检测"眼睛"、"鼻子"的胶囊)需要将信息传递给高级胶囊(如检测"脸"的胶囊)。但高级胶囊所期望的"眼睛"和"鼻子"特征,其姿态(位置、角度)与低级胶囊实际检测到的姿态可能不同(由于整体物体的平移、旋转等)。
- 解决方案:引入一个可学习的权重矩阵 \(\mathbf{W}_{ij}\) 来进行仿射变换。
- 计算步骤:对于低级胶囊 \(i\) 的输出向量 \(\mathbf{u}_i\),我们将其与一个权重矩阵 \(\mathbf{W}_{ij}\) 相乘,得到一个"预测向量" \(\hat{\mathbf{u}}_{j|i}\)。
\(\hat{\mathbf{u}}_{j|i} = \mathbf{W}_{ij} \mathbf{u}_i\) - 物理意义:矩阵 \(\mathbf{W}_{ij}\) 学习了从低级特征 \(i\)(如"眼睛")的姿态到高级特征 \(j\)(如"脸")的姿态之间的空间变换关系。\(\hat{\mathbf{u}}_{j|i}\) 可以理解为:"如果低级胶囊 i 检测到的特征确实是高级胶囊 j 所代表物体的一部分,那么高级胶囊 j 所期望的特征姿态应该是 \(\hat{\mathbf{u}}_{j|i}\) 所编码的样子。"
-
动态路由机制的核心:加权求和与耦合系数
- 目标:将所有低级胶囊对高级胶囊 \(j\) 的预测向量 \(\hat{\mathbf{u}}_{j|i}\) 合成为高级胶囊 \(j\) 的输入向量 \(\mathbf{s}_j\)。
- 简单思路:直接求和,\(\mathbf{s}_j = \sum_i \hat{\mathbf{u}}_{j|i}\)。但这样所有低级胶囊的贡献是均等的,不合理。
- 核心思路:使用加权求和,权重(称为耦合系数 \(c_{ij}\))应分配给那些预测结果彼此"一致"的低级胶囊。动态路由就是一个迭代更新这些权重 \(c_{ij}\) 的过程。
\(\mathbf{s}_j = \sum_i c_{ij} \hat{\mathbf{u}}_{j|i}\) - 耦合系数 \(c_{ij}\) 的性质:
- \(c_{ij}\) 表示低级胶囊 \(i\) 与高级胶囊 \(j\) 的"耦合程度"或"关联强度"。
- 对于每个低级胶囊 \(i\),所有指向高级胶囊的耦合系数之和应为1(即 \(\sum_j c_{ij} = 1\)),这可以看作是将胶囊 \(i\) 的"投票权"分配给不同的高级胶囊。
- \(c_{ij}\) 通过动态路由过程迭代确定,而非通过反向传播学习。
-
动态路由的迭代算法(详细步骤)
假设我们有一层 \(L\) 个低级胶囊和一层 \(H\) 个高级胶囊。- 步骤 1:初始化对数先验概率 \(b_{ij}\)。
对于每一对 (低级胶囊 i, 高级胶囊 j),初始化一个路由对数 \(b_{ij} = 0\)。它将在迭代中用于计算耦合系数 \(c_{ij}\)。 - 步骤 2:迭代 r 次(通常 r=3)。
- 2a. 计算耦合系数 \(c_{ij}\):
对每个低级胶囊 \(i\),使用 softmax 函数计算其与所有高级胶囊的耦合系数。softmax 作用于 \(b_{ij}\) 的 \(j\) 维度。
\(c_{ij} = \frac{\exp(b_{ij})}{\sum_k \exp(b_{ik})}\)
这样确保了 \(\sum_j c_{ij} = 1\)。 - 2b. 计算高级胶囊的输入向量 \(\mathbf{s}_j\):
对于每个高级胶囊 \(j\),按照加权求和公式计算:\(\mathbf{s}_j = \sum_i c_{ij} \hat{\mathbf{u}}_{j|i}\)。 - 2c. 使用非线性"压缩"函数计算高级胶囊的输出向量 \(\mathbf{v}_j\):
这个函数(squashing function)保持向量方向不变,但将长度压缩到0和1之间,以表示概率。
\(\mathbf{v}_j = \frac{\|\mathbf{s}_j\|^2}{1 + \|\mathbf{s}_j\|^2} \frac{\mathbf{s}_j}{\|\mathbf{s}_j\|}\)- 分子第一部分 \(\frac{\|\mathbf{s}_j\|^2}{1 + \|\mathbf{s}_j\|^2}\) 将模长压缩到 [0, 1)。
- 分子第二部分 \(\frac{\mathbf{s}_j}{\|\mathbf{s}_j\|}\) 是单位向量,保持方向。
- 2d. 更新路由对数 \(b_{ij}\):
更新规则为:\(b_{ij} \leftarrow b_{ij} + \hat{\mathbf{u}}_{j|i} \cdot \mathbf{v}_j\)。- 一致性度量:点积 \(\hat{\mathbf{u}}_{j|i} \cdot \mathbf{v}_j\) 度量了低级胶囊 \(i\) 的预测 \(\hat{\mathbf{u}}_{j|i}\) 与当前迭代下高级胶囊 \(j\) 的实际输出 \(\mathbf{v}_j\) 之间的一致性(agreement)。如果两者方向相似,点积为正且较大,\(b_{ij}\) 增加;反之则减少。
- 路由逻辑:在下一轮迭代中,步骤2a会根据更新后的 \(b_{ij}\) 重新计算 \(c_{ij}\)。这使得与当前高级胶囊输出 \(\mathbf{v}_j\) 一致性高的低级胶囊 \(i\) 会获得更大的权重 \(c_{ij}\)。"动态路由"即指这个通过一致性反馈迭代调整连接权重的过程。
- 2a. 计算耦合系数 \(c_{ij}\):
- 步骤 1:初始化对数先验概率 \(b_{ij}\)。
-
最终输出与损失函数
- 经过 \(r\) 次迭代后,高级胶囊的输出向量 \(\mathbf{v}_j\) 就是最终输出。
- 边际损失函数:胶囊网络通常使用一种特殊的边际损失函数来同时训练胶囊的存在概率(向量模长)和分类标签。它鼓励正确类别胶囊的模长足够大,而错误类别胶囊的模长足够小。
总结
动态路由机制是胶囊网络的灵魂。它通过迭代的"协商"过程,使得高级特征能够有选择地聚合那些在空间上一致的低级特征信息,从而增强了模型对视角变化和空间层次结构的理解能力,这是传统CNN中的池化操作所不具备的。