胶囊网络(Capsule Networks)中的动态路由机制与向量输出原理详解
题目描述:胶囊网络(Capsule Networks, CapsNet)是一种旨在克服传统卷积神经网络在理解物体空间层次关系方面不足的新型神经网络结构。与输出标量激活值的神经元不同,胶囊输出一个向量,其长度表示实体存在的概率,方向编码实体的实例化参数(如姿态、变形等)。本题目聚焦于胶囊网络的核心机制:动态路由(Dynamic Routing)。其目标是将低层胶囊的输出向量,通过迭代路由协议,确定地传递给更高层胶囊,使得高层胶囊能聚合低层实体的证据,形成整体表示。请详细解释胶囊的向量输出含义、动态路由算法步骤、背后的直觉与数学原理。
解题过程与知识详解:
第一步:胶囊的基本概念与向量输出
- 基本单元:胶囊是胶囊网络的基本构建块,一个胶囊是一个小神经元组,其输出是一个向量,而非传统神经元的标量。
- 向量输出的意义:
- 向量长度(模长):通常通过一个非线性“压缩”函数(如
squash函数)计算得到,范围在0到1之间。它表示某个特定实体(如物体的某个部分、某个物体本身)在当前位置存在的概率。例如,||输出向量|| ≈ 1表示该实体极有可能存在;≈ 0表示很可能不存在。 - 向量方向:编码该实体的特定“实例化参数”,例如位置、大小、方向、姿态、纹理、变形等属性。同一类型的不同实例(如不同姿态的“猫脸”),其对应胶囊的输出向量方向会不同,但模长都可能接近1(表示都存在)。
- 向量长度(模长):通常通过一个非线性“压缩”函数(如
第二步:网络结构与高层胶囊的输入计算
- 层级结构:胶囊网络通常包含多层胶囊层。设我们有两层,低层为
L(包含i个胶囊),高层为L+1(包含j个胶囊)。 - 预测向量:每个低层胶囊
i的向量输出u_i,需要通过一个可学习的变换矩阵W_{ij}来预测高层胶囊j的可能状态。这个变换可以理解为从低层实体(如“眼睛”)的姿态,预测其可能属于的更高层实体(如“人脸”)的姿态。- 计算公式为:
û_{j|i} = W_{ij} * u_i - 这里
û_{j|i}被称为“预测向量”,表示低层胶囊i对高层胶囊j输出应该是什么的“投票”。
- 计算公式为:
第三步:动态路由算法原理与步骤
动态路由的核心目标是:决定如何将低层胶囊的“投票”(预测向量)传递到高层胶囊。它不是通过前向传播的固定权重连接,而是通过一个迭代的、基于一致性的协议来实现。
直觉:如果多个低层胶囊的预测向量 û_{j|i} 在方向和长度上高度一致,那么它们很可能都在“投票”给同一个高层实体,因此它们的投票应该被加强,并以更高的权重聚合到对应的高层胶囊中。
算法步骤详解(以第 L 层到第 L+1 层为例):
-
初始化路由权重:
- 对于每一对低层胶囊
i和高层胶囊j,初始化一个“耦合系数”c_{ij},表示低层胶囊i的输出应被路由到高层胶囊j的概率权重。 - 初始时,我们不知道如何路由,所以通常将所有
c_{ij}初始化为相等的值,并满足Σ_j c_{ij} = 1(即,对每个低层胶囊i,其所有权重之和为1)。通常初始化为c_{ij} = 1 / (高层胶囊数量)。
- 对于每一对低层胶囊
-
迭代路由过程(进行 r 次迭代,r 是一个超参数,如3次):
-
a. 计算高层胶囊的加权输入:
对于每个高层胶囊j,它从所有低层胶囊收到的总输入s_j是所有低层胶囊的预测向量û_{j|i}的加权和,权重正是当前的耦合系数c_{ij}。
s_j = Σ_i (c_{ij} * û_{j|i})
这个s_j是所有低层胶囊对高层胶囊j的“共识”的当前估计。 -
b. 计算高层胶囊的向量输出:
对s_j应用“压缩”函数,得到高层胶囊j的当前输出向量v_j。
v_j = squash(s_j) = (||s_j||^2 / (1 + ||s_j||^2)) * (s_j / ||s_j||)
压缩函数作用:- 保持向量方向不变(
s_j / ||s_j||是单位方向向量)。 - 将向量长度(模长)压缩到0和1之间。当
s_j很短时,squash值接近0;当s_j很长时,squash值接近1。这使得||v_j||可以直接解释为高层实体j存在的概率。
- 保持向量方向不变(
-
c. 更新路由权重(关键步骤):
现在,我们有了高层胶囊的当前输出v_j。我们需要检查每个低层胶囊的预测û_{j|i}是否与这个当前共识v_j一致。- 计算一致性:一致性通过点积(内积)
a_{ij} = v_j · û_{j|i}来衡量。点积越大,表示向量û_{j|i}和v_j的方向越一致(夹角越小),即低层胶囊i的投票与当前的高层共识越匹配。 - 更新权重:根据这个一致性度量,更新耦合系数
c_{ij}。路由协议倾向于增加那些与当前高层输出v_j一致的低层预测的权重。
具体更新规则为:c_{ij} = softmax(b_{ij}),其中b_{ij}是一个对数先验概率,初始为0,在每次迭代中更新为:
b_{ij} ← b_{ij} + a_{ij}b_{ij}初始为0,意味着所有路由路径初始同等可能。- 每次迭代,我们将一致性得分
a_{ij}加到对应的b_{ij}上。这使得与当前共识一致的b_{ij}变大。 - 然后对每个低层胶囊
i的所有b_{i:}应用softmax函数(沿j维度),得到更新后的、和为1的耦合系数c_{ij}。softmax确保了一致性高的路由路径权重增加,一致性低的路径权重减少。
- 计算一致性:一致性通过点积(内积)
-
-
迭代结束:重复步骤2(a, b, c)共
r次。经过几轮迭代后,耦合系数c_{ij}会收敛到一个状态,使得低层胶囊的输出被清晰地、有选择性地路由到那些其预测与之最一致的高层胶囊。
第四步:输出与训练
- 最终输出:经过
r次动态路由迭代后,得到最终的高层胶囊输出向量v_j。整个网络的输出通常是最高层胶囊输出向量的模长,代表了各类别存在的概率。 - 损失函数:胶囊网络使用一种特殊的“边缘损失”来训练,它直接作用于胶囊输出的模长,鼓励正确类别的胶囊模长很大,而错误类别的模长很小。同时,网络还通过重构损失(用最高层胶囊解码输入图像)来正则化,鼓励胶囊的方向编码有意义的实例化参数。
总结:动态路由机制是一种迭代的、自底向上的协议。它通过比较低层预测与高层当前共识的一致性,来动态地、自适应地确定信息流动的路径。这使得高层胶囊能够整合来自低层、且在空间上相互一致的特征证据,从而更好地建模各部分与整体之间的空间层次关系,提升对视角、姿态等变化的鲁棒性。向量输出则优雅地将存在概率与实例属性统一在一个表示中。