首先,capsule 的概念与卷积的概念大部分是独立的。例如,你可以有一个完全连接的capsule网络。但是,它们确实使用了卷积,而且也被与CNN进行比较。但是,我将在接下来解释中抽象出卷积,因为这会分散我们的核心思想。
因为capsule网络与传统的神经网络相比是如此的不同,以至于很难理解它们之间的差异。在这里我将详细介绍capsule网络的细节,然后总结一下不同之处。
简单描述capsule网络
首先,我们可以看看capsule的动机(从Hinton的谈话中摘出来的)。CNN的过滤器所做的就是检测源图像中是否存在特定的模式/特性。 我们通常希望并行地在源图像的同一个patch上堆叠多个过滤器,这样就可以在同一个patch检测多个特征。
但是,请注意,由于堆叠的过滤器数量的线性因子,这个维度会增加很多。为了减少网络的维度,同时允许使用更多的过滤器,我们可以应用max-pooling,这样就可以得到一个神经元,它在语义上的意思是“这个区域某处有一个特征X。”但是,请注意,这个特征的精确位置已经被丢弃。在许多层重复这个操作,我们实际上丢失了许多关于特征精确位置的信息。
另一个稍微切向的动机是:如果一个人被展示一个鼻子,它就可以对眼睛、嘴、耳朵等部位的大约位置进行反向工程,从而预测整个脸部的位置和方向。如果我们看到一个鼻子,并预测了脸部的位置;但是假如看到一个嘴巴,基于它预测的脸部位置就会稍微不同,看起来会很奇怪。如果我们仅仅使用1/0来检测特征(鼻子,嘴巴)的存在,我们可能会被引导去相信这两者在正确位置的组合就可以预测出一张脸。但实际不是这样,我们也需要知道它们的方向。
想法:在检测特性的基础上,我们可以输出额外的2个值,对应该特性被检测到的X和Y位置。但是方向呢?我们需要一种更通用的方式来封装这些信息。一个更好的想法是:我们可以让神经网络学习一种方法来表示这个位置/方向信息本身!这就是capsule网络的由来。
差异
1)标量vs向量的输入和输出
神经元从上一层接收一堆标量,并输出一个标量。一个capsule是从上一层获取一堆向量,并输出一个向量。
如果你仔细阅读了,你可能已经注意到(1)实际上并没有完全改变网络。假设我被允许任意地将前一层的神经元组合在一起,将来自当前层的神经元组合在一起,将它们称为向量,并没有什么区别。这里,我们将输入设为向量,对它应用一个矩阵(matrix),然后做一个加权和。这与简单地将输入激活作为一个巨大的向量,然后再应用一个更大的矩阵相比,没有什么不同。
2)挤压函数
引入挤压函数(squash function)是真正的区别。但现在,仍然是一个任意非线性。你可以想象一个奇怪的网络,它在两个层之间变换,一个变换向量,另一个对这些向量做加权和(这实际上是另一个线性变换!),然后挤压。结合(1)和(2),这意味着我们的网络使用的是不同于一般类型的非线性。
3)capsule之间的routing
这就是capsule网络如此与众不同的原因。与普通的层相比,capsule层是完全不同的。首先,我们转换输入向量来得到预测向量。然后我们将children capsule分配给parent capsule,它的总预测向量与它自己的预测向量有很大的一致,从而可以对预测向量进行加权和。然后把它拿出来,进行挤压(squash)。
原文发布时间为:2017-11-11
本文作者:GraceFu
本文来自云栖社区合作伙伴新智元,了解相关信息可以关注“AI_era”微信公众号