理解Hinton的胶囊网络—第二部分:胶囊是如何工作的
fastai深度学习社区Max著MA译
介绍
在这个关于胶囊网络的系列文章的第一部分,我谈到了这个新架构背后的基本直觉和动机。在这一部分,我将描述什么是胶囊,它内部是如何工作的,以及它背后的直觉。在下一部分我将主要关注动态路由算法。
什么是胶囊?
为了回答这个问题,我认为引用胶囊的第一篇论文是一个好主意—Hinton等人的“转化自动编码器”。下面提供了对于理解胶囊很重要的部分:
“人工神经网络应该使用局部胶囊”来执行一些相当复杂的内部计算,而不是针对”神经元“活动中的视点不变性,使用单个标量输出来总结局部复制特征检测器的活动。他们的输入,然后将这些计算的结果封装成一个高度信息量输出的小向量。每个胶囊学习识别在有限范围下的观察条件和变形的隐式定义的视觉实体,并且输出实体存在于其有限的域内的概率和一组“实例化参数”,其可以包括精确的姿态,照明以及视觉实体相对于该实体的隐式定义规范版本的变形。当胶囊正常工作时,视觉实体存在的概率是局部不变的 — 当胶囊覆盖的有限范围内的实体在可能的外观上移动时,它不会改变。然而,实例化参数是“等变的” —随着观察条件的变化以及实体在外观流形上的移动,实例化参数会发生相应的变化,因为它们代表了实体在外观流形上的固有坐标。
上面的段落非常密集,我花了一段时间才逐句弄清楚它的意思。以下是上述段落的版本,据我所知:
人造神经元输出一个标量。此外,CNN使用卷积层,对于每个内核,在整个输入体积内复制相同内核的权重,然后输出一个2D矩阵,其中每个数字是该内核与一部分输入体积的卷积输出。所以我们可以把这个二维矩阵作为复制特征检测器的输出。然后将所有内核的二维矩阵堆叠在一起,以产生卷积层的输出。
CapsNet不仅可以识别数字,还可从内部表示生成它们
然后,我们试图在神经元的活动中实现视点不变性。我们通过连续查看上述二维矩阵中的区域并选择每个区域中的最大数目的最大池化的方法来做到这一点。结果,我们得到了我们想要的 —活动的不变性。不变意味着通过改变输入一点,输出仍然保持不变。活动只是神经元的输出信号。换句话说,在输入图像中,我们将要检测的对象稍微移动一下,网络活动(神经元的输出)将不会因为最大池化而改变,网络仍然会检测到对象。
上面描述的机制不是很好,因为最大池化丢失有价值的信息,也不编码特征之间的相对空间关系。我们应该使用胶囊,因为它们将以矢量形式(而不是神经元输出的标量)封装关于它们正在检测的特征状态的所有重要信息。
胶囊封装了所有关于他们正在以向量形式检测到的特征状态的重要信息。
胶囊将特征检测的概率作为其输出向量的长度进行编码。并且检测到的特征的状态被编码为该向量指向的方向(“实例化参数”)。因此,当检测到的特征在图像周围移动或者其状态以某种方式改变时,概率仍然保持不变(矢量长度不变),但是其方向改变。
设想一个胶囊检测图像中的脸部,其输出长度为0.99的3D矢量。然后我们开始移动面部图像。矢量将在其空间中旋转,表示检测到的脸部的变化状态,但其长度将保持固定,因为胶囊仍然确定已经检测到脸部。这就是Hinton所说的活动等量变化:当一个物体在图像中“移动到可能的外表上”时,神经活动将会改变。与此同时,检测的概率保持不变,这是我们应该针对的不变性的形式,而不是CNNs提供的最大池化类型。
胶囊是如何工作的?
让我们比较胶囊与人造神经元。下表总结了胶囊和神经元之间的差异:
胶囊和神经元之间的重要区别。 来源:naturomics给出的CapsNets的讨论
回想一下,神经元从其他神经元接收输入标量,然后乘以标量权重和总和。 然后将这个总和传递给许多可能的非线性激活函数中的一个,这些非线性激活函数采用输入标量并根据函数输出标量。该输出标量将作为到其他神经元的输入。这个过程的总结可以在表格和图表的右边看到。实质上,人造神经元可以用3个步骤来描述:
输入标量的标量加权
加权输入标量之和
标量到标量的非线性
左:胶囊图;右:人造神经元
另一方面,除了新的步骤之外,胶囊具有上述3个步骤的矢量形式,输入的仿射变换:
输入向量的矩阵乘法
输入向量的标量加权
加权输入向量之和
矢量到矢量的非线性
让我们更好地了解胶囊内部发生的4个计算步骤。
1.输入向量的矩阵乘法
我们的胶囊收到的输入矢量(图中的u1,u2和u3)来自下面三层中的其他胶囊。这些矢量的长度对较低级别的胶囊检测其相应对象的概率进行编码,并且矢量的方向对被检测对象的内部状态进行编码。让我们假设较低级别的胶囊分别检测眼睛,嘴巴和鼻子,然后输出胶囊检测脸部。
然后这些矢量乘以相应权重矩阵W,W编码重要空间和较低级的特征(眼睛,嘴和鼻子)和较高级特征(脸)之间的其他关系.例如,矩阵W2j可以编码鼻子和脸部之间的关系:脸部以鼻子为中心,其大小是鼻子大小的10倍,并且其在空间中的方向对应于鼻子的方向,因为它们都位于同一平面上。可以为矩阵W1j和W3j绘制类似的直觉。乘以这些矩阵后,我们得到的是更高级特征的预测位置。换句话说,u根据检测到的眼睛位置来表示脸部的位置,u2表示根据检测到的嘴部位置来表示脸部的位置,u3表示根据检测到的鼻子位置来表示脸的位置。
在这一点上,你的直觉应该是这样的:如果这三个低层次特征的预测指向同一个位置和状态,那么它必定是一张脸。
鼻子,嘴和眼睛胶囊的面部位置的预测紧密匹配。那里必须有一张脸
2.输入向量的标量加权
乍一看,这个步骤与人造神经元在加入之前对其输入进行加权似乎是非常类似的。在神经元的情况下,这些权重是在反向传播期间学习的,但是在胶囊的情况下,它们是使用“动态路由”确定的,这是一种确定每个胶囊的输出去哪里的新方法。我将专门给这个算法写一个帖子,在这里只提供一些直觉。
较低级别胶囊会将其输入发送到同意其输入的较高级别胶囊。这是动态路由算法的本质
在上面的图片中,我们有一个较低级别的胶囊需要“决定”发送它的输出到哪个更高级别的胶囊。
它将通过调整权重C做出决定,该权重将在把胶囊的输出发送到左侧或右侧的更高级别胶囊J和K之前,将该胶囊的输出相乘。
现在,更高级别的胶囊已经接收到来自其他更低级别胶囊的许多输入向量。所有这些输入都以红点和蓝点表示。这些点聚集在一起,这意味着较低级别胶囊的预测彼此接近。这就是为什么,例如,在胶囊J和K中都有一组红点。
那么,我们的低级胶囊应该把它输出到胶囊J还是胶囊K?这个问题的答案是动态路由算法的本质。当低级胶囊的输出乘以相应的矩阵W时,远离左边胶囊J中的“正确”预测的红色簇。另一方面,如果将落在与“正确”预测非常接近的右边胶囊中的红色簇K.低级胶囊具有测量哪个高级胶囊更好地适应其结果的机制,并且将自动调整其权重,使得对应于胶囊K的权重C将是高的,并且对应于胶囊J的权重C将是低的。
3.加权输入向量的和
这一步类似于普通的人造神经元,代表了输入的组合。我不认为这一步有什么特别之处(除了是向量和标量的总和)。因此,我们可以直接继续下一步。
4.“压扁”:新的矢量对矢量非线性
CapsNet引入的另一个创新是采用矢量的新型非线性激活函数,然后“压扁”它的长度不超过1,但不改变方向。
压缩非线性缩放输入矢量而不改变其方向
公式(蓝色矩形)的右侧缩放输入矢量su,它将具有单位长度,左侧(红色矩形)执行附加缩放。请记住,输出矢量长度可以解释为胶囊检测到给定特征的概率。
标量形式的新型非线性图。在实际应用中该功能对矢量进行操作
左边是应用于一维向量的压缩函数,这是一个标量。我用它来演示函数的有趣的非线性形状。
只有将一维情况可视化才有意义;在实际应用中,它采用向量并输出一个向量,这将难以可视化。
结论
在这一部分,我们讨论了胶囊是什么,它执行的是什么样的计算,以及它背后的直觉。我们看到胶囊的设计建立在人造神经元的设计之上,但将其扩展到矢量形式以允许更强大的代表性能力。它还引入了矩阵权重来编码不同层次特征之间的重要层次关系,结果成功地实现了设计者的目标:关于输入变化和特征检测概率的不变性的神经元活动的等变性。
胶囊内部工作总结。请注意没有偏差,因为已经包含在W矩阵中,W可以容纳它和其他更复杂的变换和关系
CapsNet上唯一剩下的部分就是胶囊算法之间的动态路由,以及这个新型网络体系结构的详细演练。这些将在以后的帖子中讨论。
未完待续ing