关于Hinton的capsules计划

《Dynamic Routing Between Capsules》读书笔记

前不久Hinton的那篇《Dynamic Routing Between Capsules》论文问世了,引起了广泛的关注。刚好跟着学长做文献阅读,我就是看得这篇文献,写这篇博客记录一下我的一些学习结果。


文章背景

因为hinton本来是机器学习领域的大家,还提出了反向传播算法,但是他近期在很多场合上面都空开表示说现在被广泛使用的BP算法有问题,所以这篇文章的问世受到了很多人的关注。

另一方面,现有的CNN也存在一些缺点。主要的缺点就是在于它对信息的处理都是基于一种平面上的处理方式,也就是说如果我们告诉机器有两个眼睛一个鼻子一个嘴巴的就是人脸,那么就算是随便把这几个器官进行组合,比如说将人的鼻子和嘴巴的位置放错,但CNN都会认定这是一个人脸,显然这是不符合逻辑的。

对于《capsule》这篇文章,大家都觉得是hinton相对于卷积神经网络来说提出的新的深度学习模型,也被大家称为capsule计划。

文章结构

论文本身分为了九章,分别是:

  • Introduction
  • How the vector inouts and outputs of a capsule are computed
  • Margin loss for digit existence
  • CapsNet architecture
  • CapsNet on MNIST
  • Segmenting highly overlapping digits
  • Other datasets
  • Discussion and previous work

我按照我对文章的理解方式,用我的逻辑从下面几个方面来对这篇文章进行梳理:

  • 绪论
  • capsule的input和output
  • 损失函数
  • CapsNet的结构
    最简单的CapsNet结构
    正则化部分结构
  • CapsNet的识别效果
    单个字符的识别效果——基于MNIST数据集
    重叠字符的识别效果——基于MultiMNIST数据集
  • 结语

绪论

在绪论部分主要介绍了三个方面,也就是向读者展示了关于capsule计划的很重要的三个概念:

About capsule/CapsNet
在绪论里面主要是提出了很多关于capsule的思想。首先必须明确什么是capsule.capsule其实本质还是神经元,但是一个capsule是很多神经元组成的一个集合。位于CNN每层中的多个神经元在CapsNet中组成了一个capsule。整个CapsNet就是由多个capsule层组成,每一层中又包含了有多个capsule结构。
就像文章中自己说的那样,其实整个CapsNet还是和原来的CNN的结构很像,只是它的一层不是多少个神经元,而是多少个capsule。在CapsNet中用一个capsule也就是一组神经元来代表一个实体,而且仅代表一个实体。
Routing-by-agreement
第二个文章提出的比较重要的概念就是routing-by-agreement机制。
首先看routing搜索过程。在CapsNet的每一层之间是存在上下层这样的结构关系的。底层的capsule将自己的输出传向高层的capsule,但是底层的capsule更偏向将结果传递给预测结果主要来自于自己的高一层capsule。这就涉及到了上下两层的两个capsule之间的耦合系数,而且这个耦合系数也不是固定不变的,它是一个会在这样的传递过程中不断优化的值。就是因为这个耦合系数的大小是在这样的动态搜索中不断的确定的,所以叫动态搜索过程。
另外一方面,关于agreement,就是指上下两层capsule通过向量的排列顺序进行匹配的过程。
CapsNet&CNN
文章提到CapsNet和CNN之间最大的区别就在于,CapsNet用向量输出替代了CNN中的标量输出,用routing-by-agreement替代了最大池化。

capsule的input和output

hinton提出关于每个capsule的input和output都是一个向量,并且用每个向量的长度来代表一个实体是否存在的概率,用向量的排列方向来代表这个实体的各种参数。

vj=||sj||21+||sj||2sj||sj||

sj=iciju^j|i

u^j|i=Wijui

cij=exp(bij)kexp(bik)

这里的四个公式就概括了一个capsule的输入和输出。其中 sj 表示的是一个capsule的输入; u^ 表示的是从下一层传到这个capsule上的所有的预测值; cij 也就是上下两层之间的耦合系数,动态搜索主要是通过决定 bij 来影响 cij ,其决定公式也是平时在CNN中常用的softmax激活函数的形式; ui vj 表示的是一个capsule的输出,只是在上面的公式中表示的是在不同的两个capsule层中的输出。
下面的截图是关于一个capsule的输入输出的算法伪代码,对这个过程更直观。
关于capsule的输入输出的伪代码
论文为了展示没个每个capsule的输出,还在模型训练的过程中对每个capsule的输出进行了相应的设置,可以从结果中看到每个capsule都代表且仅代表了一个实体。
每一个capsule代表了一个实体

损失函数

Lk=Tkmax(0,m+||vk||)2+λ(1Tk)max(0,||vk||m)2

其中前半部分 Lk=Tkmax(0,m+||vk||)2 是原始的损失函数,后半部分 λ(1Tk)max(0,||vk||m)2 是将重构损失添加进模型来进行正则化的部分。

CapsNet的结构

最简单的CapsNet
最简单的CapsNet结构
文中介绍的最简单的CapsNet结构——一个只有三层网络的CapsNet。其实就像前面在绪论中间提到的那样,CapsNet的结构和CNN很像,他就只是把中间层的神经元组合成了capsule。就这个结构来看,这是个一个有三层网络的CapsNet。第一层是一个卷积层,这一层输出的是一个以为一维的特征数据,并将到输入到第二层中,第二层就是primaryCaps,这一层其实也是实现了卷积的过程,每一层都有一个9*9的卷积kernel,论文例子中在这一层中有32个capsule,每个capsule可以输出一个8维的向量,并且将这些向量输入到第三层的digitcaps这一层,这一个输入过程就是刚刚提到的动态搜索过程。来到第三层,第二层与第三层之间是一个全全连接层的关系。因为论文中是以识别手写数字为例子,所以在第三层digitcaps这一层中有10个capsule,每个capsule代表了一个数字,最后根据这一层的digitcaps的输出向量的长度和排列方向来确定识别字符。

进行正则化部分
正则化部分结构
论文在介绍完了最简单的CapsNet的结构之后又介绍了一下正则化部分的模型。
正则化就是要向原始模型中引入额外的信息来防止过度拟合,并且实现提高模型泛化性能的一种方法。
在论文中用了三个全连接层来实现正则化,在后面的模型识别效果中也可以看到,确实进行了正则化之后的模型效果更好。

CapsNet的识别效果

CapsNet的识别效果
单个字符的识别效果——基于MNIST数据集
文章以识别手写识别数字为例,展示了CapsNet的识别效果。上表中baseline代表的是一个用了三层卷积层的CNN模型。表中表现最好的CapsNet模型是一个进行了三次动态搜索、只有三层capsule,但是使用了正则化重构之后的模型。
可以看到在识别单个数字中,CNN的测试集错误为0.39%而CapsNet的测试集错误率为0.25%。
同时关于所需要训练的参数上面,capsnet也比CNN少很多。
另外,文章中还提到,在对数据进行了仿射变换后CapsNet仍然有很好的鲁棒性。

重叠字符的识别效果——基于MultiMNIST数据集
capsule本身最大的特点就是能够识别重叠的目标对象,因此论文在这里还进行了识别重叠的数字的工作。
首先将MNIST这个数据集进行了相应的处理,将数据库里的部分数字进行重合,生成了MultiMNIST数据集。
然后使用CapsNet进行拟合。
从上表中最后一列中可以看到,CapsNet的表现结果比CNN好很多。
其实论文中举这个例子也是想说CapsNet可以看作是一种并行的注意机制,能把信息提取的注意力集中到下一层里更加活跃的capsule,而忽略掉不活跃的capsule。

结语

最后就是Hinton关于自己工作的一个总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值