当前位置: 代码迷 >> 综合 >> 胶囊网络(Capsule Network)
  详细解决方案

胶囊网络(Capsule Network)

热度:95   发布时间:2023-11-27 01:15:14.0

胶囊网络有意思的解析

  • 1、传统的CNN
  • 2、胶囊
    • 2.1 向量神经元和标量神经元(普通人工神经元)对比
    • 2.2 工作原理
    • 2.3 动态路由

1、传统的CNN

CNN中包含一个很重要的概念——池化(pooling)。它的作用是逐渐减低数据的尺寸,减少网络中参数的数量,从而使得计算资源消耗减少、网络收敛加速学习,还会有效控制过拟合。
但是,这也使CNN网络包含极大的缺陷。Capsule的提出者Hinton就认为池化在CNN中的好效果是个大错误甚至灾难
池化,这一过程中包含了一个滤波器来减低尺度,但是这会导致重要的信息丢失

2、胶囊

胶囊是一个包含多个神经元的载体,每个神经元表示图片中出现的特定实体的属性。是以向量的形式进行表达。

2.1 向量神经元和标量神经元(普通人工神经元)对比

在这里插入图片描述
SN 是从其他神经元接收输入标量,然后乘以标量权重再求和,然后将这个总和传递给某个非线性激活函数 (比如 sigmoid, tanh, Relu),生出一个输出标量。该标量将作为下一层的输入变量。
在这里插入图片描述
而胶囊网络的流程则不一样,如下图所示。
在这里插入图片描述

2.2 工作原理

第一步:矩阵转化
在这里插入图片描述
第二步:输入加权
在这里插入图片描述第三步:加权求和
这一步类似于普通神经元的加权步骤,只是总和不是标量是向量。

第四步:非线性激活
在这里插入图片描述
这是VN的一个创新,使用了一个新的激活函数,称为squash函数。函数功能是使得vj的长度不超过1,而且保持vj 和 sj 同方向。

2.3 动态路由

这部分主要是在2.2中的第二步内容,低级别VNi需要决定如何将其输出向量发送到高级别VNj,它是通过改变权重cij而实现的。
其实就是指低级别的VN会将其输出发送到“同意”该输出的某个高级别VN。这是动态路由的本质。
在这里插入图片描述
算法文字解释如下:

  • 第 1 行:这个过程用到的所有输入 - l 层的输出 Uj|i,路由迭代次数 r
  • 第 2 行:定义 bij 是 l 层 VNi 应该连接 l+1 层 VNj 的可能性,初始值为 0
  • 第 3 行:执行第 4-7 行 r 次
  • 第 4 行:对 l 层的 VNi,将 bij 用 softmax 转化成概率 cij
  • 第 5 行:对 l+1 层的 VNj,加权求和 sj
  • 第 6 行:对 l+1 层的 VNj,压缩 sj 得到 vj
  • 第 7 行:根据 Uj|i 和 vj 的关系来更新 bij

算法逻辑解释如下:

  • 第 1 行无需说明,唯一要指出的是迭代次数为 3 次,Hinton 在他论文里这样说道
  • 第 2 行初始化所有 b 为零,这是合理的。因为从第 4 行可看出,只有这样 c 才是均匀分布的,暗指“l 层 VN 到底要传送输出到l+1 层哪个 VN 是最不确定的”
  • 第 4 行的 softmax 函数产出是非负数而且总和为 1,致使 c 是一组概率变量
  • 第 5 行的 sj 就是小节 2.3 第二步里面讲的红色簇心,可以认为是低层所有 VN 的“共识”输出
  • 第 6 行的 squash 确保向量 sj 的方向不变,但长度不超过 1,因为长度代表 VN 具有给定特征的概率
  • 第 7 行是动态路由的精华,用 Uj|i 和 vj 的点积 (dot product) 更新 bij,其中前者是 l 层 VNi对 l+1层 VNj 的“个人”预测,而后者是所有 l 层 VN 对 l+1 层 VNj 的“共识”预测

附:详细说明地址:https://www.sohu.com/a/226611009_633698

  相关解决方案