胶囊网络有意思的解析
- 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