capsule系列之Dynamic Routing Between Capsules

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014665013/article/details/87951016

capsule在出现之后就除了Hinton老爷子的两个版本之外,还有例如Investigating Capsule Networks with Dynamic Routing for Text Classification这样的新作,可见capsule的很多理念都是work的,因为打算好好拜读几篇paper,做一个系列,深刻理解capsule。
本篇文章我觉得确实还是有难度的,作为一篇笔记博客,为了能够比较透彻的理解,在原文基础上参考了很多的文章,并添加了相关自己的理解,参考文献会在最后章节详细列出。

1.背景

一个新的事物出现,必然以藏着以往事物的缺陷,那么capsule因何而生呢?
在讲胶囊网络之前,首先我们回顾一下我们熟悉的CNN:
在这里插入图片描述
CNN做了什么事情呢? 假设这里有一个卷积核(左图),除了曲线轨迹上的值很大,其他的值都是零,所以这个卷积核对旁边这种曲线(右图)就有很高的输出,也就是说对这种曲线有很高的识别,而对其他的曲线类型输出就低。

所以比如图像分类中,一旦卷积核检测到了类似于眼睛啊、鼻子啊、嘴巴啊这种特征;从数学角度上说就,相关卷积核对鼻子、眼睛等卷积出来的值很大,那么与人脸相关的神经元就相当兴奋,最后将图像分类到人脸这一类。

所以这就导致了一个问题。如图,右边那张眼睛、鼻子、嘴巴都有了,当然我们的CNN也相当兴奋的将它归于人脸。

这就就暴露了CNN的问题:

  • 组件的朝向和空间上的相对关系对它来说不重要,它只在乎有没有特征。
  • CNN还有一个问题,那就是池化层。Hinton自己就说过:最大池化层表现的如此优异是一个巨大的错误,是一场灾难。诚然,从网络设计上来说,池化层不仅减少了参数,还可以避免过拟合。但是,它的确抛弃了一些信息,比如位置信息。

再比如说,下面这张图,尽管拍摄的角度不同,但你的大脑可以轻易的辨识这些都是同一对象,CNN却没有这样的能力。它不能举一反三,它只能通过扩大训练的数据量才能得到相似的能力。
在这里插入图片描述

2.什么是capsule

现在网上有关于capsule多数翻译成胶囊,但是我觉太缺乏学术性,知乎上的
云梦居客大佬把它称作“矢量神经元”或者“张量神经元”,我觉得比较合适,但是很多人可能又没听说过这种说法,所以还是直接称之为capsule吧!(懒癌犯了…)

论文中说道,capsule是一个实体,那实体又是什么?一般是指能够独立存在的、作为一切属性的基础和万物本原的东西(百度百科)。capsule就是一个完整概念单元的封装,能够表征不同属性。

这次Capsule盛宴的特色是“vector in vector out”,取代了以往的“scaler in scaler out”,也就是神经元的输入输出都变成了向量,从而算是对神经网络理论的一次革命。然而真的是这样子吗?难道我们以往就没有做过“vector in vector out”的任务了吗?有,而且多的是!NLP中,一个词向量序列的输入,不就可以看成“vector in”了吗?这个词向量序列经过RNN/CNN/Attention的编码,输出一个新序列,不就是“vector out”了吗?在目前的深度学习中,从来不缺乏“vector in vector out”的案例,因此显然这不能算是Capsule的革命。

Capsule的革命在于:它提出了一种新的“vector in vector out”的传递和权重更新方案,并且这种方案在很大程度上是可解释的。

那最后,什么是capsule?
其实,只要把一个向量当作一个整体来看,它就是一个capsule。 你可以这样理解:神经元就是标量,胶囊就是向量,就这么粗暴!Hinton的理解是:每一个胶囊表示一个属性,而胶囊的向量则表示这个属性的“标架”。也就是说,我们以前只是用一个标量表示有没有这个特征(比如有没有羽毛),现在我们用一个向量来表示,不仅仅表示有没有,还表示“有什么样的”(比如有什么颜色、什么纹理的羽毛),如果这样理解,就是说在对单个特征的表达上更丰富了。

说到这里,我感觉有点像NLP中的词向量,以前我们只是用one hot来表示一个词,也就是表示有没有这个词而已。现在我们用词向量来表示一个词,显然词向量表达的特征更丰富,不仅可以表示有没有,还可以表示哪些词有相近含义。词向量就是NLP中的“胶囊”?这个类比可能有点牵强,但我觉得意思已经对了。

3.capsule原理和结构

在论文中,Geoffrey Hinton 介绍 Capsule 为:「Capsule 是一组神经元,其输入输出向量表示特定实体类型的实例化参数(即特定物体、概念实体等出现的概率与某些属性)。我们使用输入输出向量的长度表征实体存在的概率,向量的方向表示实例化参数(即实体的某些图形属性)。同一层级的 capsule 通过变换矩阵对更高级别的 capsule 的实例化参数进行预测。当多个预测一致时(本论文使用动态路由使预测一致),更高级别的 capsule 将变得活跃。
Capsule 中的神经元的激活情况表示了图像中存在的特定实体的各种性质。这些性质可以包含很多种不同的参数,例如姿势(位置,大小,方向)、变形、速度、反射率,色彩、纹理等等。而输入输出向量的长度表示了某个实体出现的概率,所以它的值必须在 0 到 1 之间。

下面我们来看看capsule的结构
Capsule针对着“层层递进”的目标来设计的,我们先来看一张整体的capsule结构图,更好理解:
在这里插入图片描述
上图展示了Capsule整体结构:Capsule层级结构动态 Routing 的过程
其中最下面的层级 u i u_i 共有两个 Capsule 单元,该层级传递到下一层级 v_j 共有四个 Capsule。u_1 和 u_2 是一个向量,即含有一组神经元的 Capsule 单元,它们分别与不同的权重 W_ij(同样是向量)相乘得出 u_j|i hat。例如 u_1 与 W_12 相乘得出预测向量 u_2|1 hat。随后该预测向量和对应的「耦合系数」c_ij 相乘并传入特定的后一层 Capsule 单元。不同 Capsule 单元的输入 s_j 是所有可能传入该单元的加权和,即所有可能传入的预测向量与耦合系数的乘积和。随后我们就得到了不同的输入向量 s_j,将该输入向量投入到「squashing」非线性函数就能得出后一层 Capsule 单元的输出向量 v_j。然后我们可以利用该输出向量 v_j 和对应预测向量 u_j|i hat 的乘积更新耦合系数 c_ij,这样的迭代更新不需要应用反向传播。

在这里插入图片描述

4.CapsNet模型介绍

5.源码解析

6.实验结果

在这里插入图片描述
什么是Capsule?=Entity

中心和输入的距离

模型提高点:
优化squashing函数,目的就是缩放到0-1,这样才能在后面把长度表示概率

在这里插入图片描述

多分类损失函数的方式设计单分类损失函数

贡献:

  • capsule概念,将标量的输入输出转为向量

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.capsule相关论文

参考文献

猜你喜欢

转载自blog.csdn.net/u014665013/article/details/87951016