胶囊网络(Capsule Networks)中的动态路由算法(Dynamic Routing)推导与计算流程详解
题目描述
胶囊网络(Capsule Networks)是一种旨在改进传统卷积神经网络(CNN)在表示物体姿态、视角等空间关系方面局限性的新型神经网络结构。其核心思想是用“胶囊”替代神经元,每个胶囊输出一个向量(而非标量),向量的长度表示实体存在的概率,向量的方向编码实体的姿态属性(如位置、方向、大小等)。而动态路由算法(Dynamic Routing) 是胶囊网络中用于实现胶囊间信息传递与协调的关键机制,它通过迭代过程,决定低层胶囊的输出应如何被加权组合并传递给高层胶囊,以形成更复杂的视觉实体表示。动态路由的本质是一种协议路由,通过高层胶囊与低层胶囊输出之间的一致性(agreement)来调整连接权重,使网络能更自然地处理视角变换等任务,并提高模型的可解释性与鲁棒性。
解题过程(循序渐进讲解)
1. 胶囊与胶囊网络的基本概念
- 胶囊(Capsule):可视为一组神经元的集合,这些神经元共同学习检测特定视觉实体(如边缘、角点、物体部件等)的存在及其属性。胶囊输出一个向量 \(\mathbf{u}_i\),其中向量长度(通常用L2范数)表示检测到该实体的概率,向量方向编码其实例化参数(如位置、角度等)。
- 胶囊网络结构:一般包含若干胶囊层。低层胶囊(如PrimaryCaps)检测简单模式,高层胶囊(如DigitCaps)检测更复杂的对象。胶囊之间并非全连接,而是通过动态路由确定信息传递的权重。
2. 动态路由算法的目标与直观理解
- 目标:给定低层胶囊的输出向量 \(\{\mathbf{u}_1, \mathbf{u}_2, ..., \mathbf{u}_n\}\),我们希望为每个高层胶囊 \(j\) 找到一个输入向量 \(\mathbf{s}_j\),它是低层胶囊输出的加权和,权重取决于低层胶囊与高层胶囊之间的“一致性”。
- 直观理解:想象低层胶囊检测到的部件(如眼睛、鼻子、嘴巴)需要组合成一个高层概念(如人脸)。如果低层胶囊预测的姿态(方向)与高层胶囊预测的姿态一致(例如都指向同一方向的位置),则认为它们“达成协议”,低层胶囊应对高层胶囊有更大的贡献权重。这个过程通过迭代更新权重来实现。
3. 动态路由算法的详细步骤与公式推导
步骤1:预测向量的生成(低层 → 高层)
- 对于每个低层胶囊 \(i\) 和每个高层胶囊 \(j\),通过一个可学习的变换矩阵 \(\mathbf{W}_{ij}\) 将低层胶囊的输出向量 \(\mathbf{u}_i\) 映射为“预测向量” \(\hat{\mathbf{u}}_{j|i}\):
\[ \hat{\mathbf{u}}_{j|i} = \mathbf{W}_{ij} \mathbf{u}_i \]
\(\hat{\mathbf{u}}_{j|i}\) 表示低层胶囊 \(i\) 对高层胶囊 \(j\) 应呈现姿态的预测。\(\mathbf{W}_{ij}\) 捕获了低层与高层实体之间的空间关系(如部件到整体的几何变换)。
步骤2:加权求和与高层胶囊的初始输出
- 高层胶囊 \(j\) 的输入 \(\mathbf{s}_j\) 是所有低层预测向量的加权和:
\[ \mathbf{s}_j = \sum_{i} c_{ij} \hat{\mathbf{u}}_{j|i} \]
其中 \(c_{ij}\) 是耦合系数(coupling coefficient),满足 \(c_{ij} \geq 0\) 且 \(\sum_j c_{ij} = 1\)(对每个低层胶囊 \(i\),其分配到所有高层胶囊的权重和为1)。初始时,\(c_{ij}\) 通常设置为均匀分布(如 \(c_{ij} = 1 / \text{高层胶囊数量}\))。
步骤3:高层胶囊的输出向量计算
- 对 \(\mathbf{s}_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\|} \]
该函数使得长向量被压缩至接近1,短向量被压缩至接近0。
步骤4:迭代更新耦合系数(动态路由的核心)
- 耦合系数 \(c_{ij}\) 不是直接学习的参数,而是通过迭代更新的,更新依据是高层胶囊输出 \(\mathbf{v}_j\) 与低层预测向量 \(\hat{\mathbf{u}}_{j|i}\) 之间的点积(即一致性度量):
\[ b_{ij} \leftarrow b_{ij} + \hat{\mathbf{u}}_{j|i} \cdot \mathbf{v}_j \]
这里 \(b_{ij}\) 是原始未归一化的对数先验概率(log prior),初始化为0(或小随机值)。点积越大,说明预测与高层输出越一致,对应的 \(b_{ij}\) 增加越多。
- 然后通过softmax计算新的耦合系数(按每个低层胶囊 \(i\) 对不同的高层胶囊 \(j\) 归一化):
\[ c_{ij} = \frac{\exp(b_{ij})}{\sum_k \exp(b_{ik})} \]
这样,与高层胶囊更一致的低层胶囊会获得更大的权重 \(c_{ij}\)。
步骤5:重复迭代
- 重复步骤2-4(通常3到5次),每次迭代更新 \(c_{ij}\),逐步精炼高层胶囊的输入 \(\mathbf{s}_j\) 和输出 \(\mathbf{v}_j\),最终使得高层胶囊的表示能更好地与低层胶囊的一致预测对齐。
4. 动态路由算法的整体流程总结
- 初始化:设 \(b_{ij} = 0\),\(c_{ij} = 1/\text{高层胶囊数}\)。
- 迭代循环(共 \(r\) 轮):
a. 计算高层胶囊输入:\(\mathbf{s}_j = \sum_i c_{ij} \hat{\mathbf{u}}_{j|i}\)。
b. 计算高层胶囊输出:\(\mathbf{v}_j = \text{squash}(\mathbf{s}_j)\)。
c. 更新对数先验:\(b_{ij} \leftarrow b_{ij} + \hat{\mathbf{u}}_{j|i} \cdot \mathbf{v}_j\)。
d. 计算新耦合系数:\(c_{ij} = \text{softmax}(b_{ij})\)。 - 输出:最终高层胶囊向量 \(\mathbf{v}_j\)。
5. 动态路由的意义与优缺点
- 意义:
- 实现了部分-整体关系的显式建模,通过姿态一致性组合部件,提升对视角、形变的鲁棒性。
- 权重 \(c_{ij}\) 由数据动态决定,增加了模型可解释性(可视为一种注意力机制)。
- 优点:更强的姿态表示能力;对仿射变换更鲁棒;潜在的更好可解释性。
- 缺点:计算开销大(迭代导致慢);训练不稳定;在大规模任务中表现尚未显著超越CNN。
6. 实例说明(以数字识别为例)
- 假设低层胶囊检测到“圆弧”、“竖线”等部件,每个部件胶囊输出向量编码其位置和方向。
- 高层胶囊可能对应数字“0”、“6”、“8”等。
- 动态路由中,若低层胶囊预测的圆弧姿态与高层“0”胶囊预测的整体姿态高度一致,则权重 \(c_{ij}\) 增大,该部件对“0”的贡献增加;若不一致,权重减小。
- 最终,高层胶囊输出向量的长度表示对应数字存在的概率,方向编码其具体姿态(如旋转角度)。