作者 | 一轩明月   


在使用卷积神经网络(CNNs)解决计算机视觉任务的时候,视角的改变(角度、位置、剪应力等等)很大程度上会造成网络表现的剧烈波动,从而限制了模型的泛化能力。有鉴于此,一般 CNN 网络都会有海量参数,辅以大规模数据和超强算力来勉强应对。

于是人们针对性的提出了胶囊网络(Hinton, Krizhevsky, & Wang, 2011[1])。胶囊网络旨在借助同一对象不同部分间的关系不随视角切换而改变这一事实,弥合不同视角下的差距。经验证胶囊网络泛化性能优于传统 CNNs,同时对于对抗攻击的鲁棒性更强,准确度更高,显著减少了所需参数量。

本文主要内容有:

  • 视角问题介绍
  • 传统 CNN 解决方案
  • 胶囊网络解决办法
  • 胶囊网络介绍
  • 路由算法
  • 背景知识介绍:EM 算法与高斯混合模型
  • 胶囊间动态路由(Sabour, Frosst, & Hinton, 2017[2]
  • EM 胶囊矩阵路由(Hinton, Sabour, & Frosst, 2018[3]

看起来有些吓人,别担心,只要没有胶囊恐惧症,你咽下去的只有知识。

视角问题

视角问题源自计算机视觉领域对泛化的追求,谁都希望自己的模型对未知数据具备泛化能力。我将“泛化”这一概念表述为:「经某图像训练后,轻微改动该图像进行测试,二者返回结果具有高度相似性」

之所以强调测试图像是“轻微改动”过的,主要是视角会发生变动。此处将“视角变换”定义为:「某人或某物观测位置的变化」

常见的视角变换有:

  • 旋转(旋转90度)
  • 平移(左移 30 像素)
  • 缩放(放大/靠近,沿 z 轴移动)

视角变换可以是对图像局部,也可以是对图像整体。3 个维度(x,y 或 z)任意一个都可以进行视角变换。理想模型能从任意角度识别出图中汽车

胶囊网络pytorch实现 胶囊网络为什么不流行_胶囊网络pytorch实现

如果能恰当地处理图像的视角变动性,就能进一步提高模型泛化能力。而随着模型泛化性能的提高,模型所需样本和参数会减少,测试准确率会提高。

解决方案

这里我们简单介绍一下针对视角变换问题 CNN 和胶囊网络两个解决方案。两个方案都包括一些表示学习和信息路由的内容。

定义激活结果为 ,模型输入 ,模型 , 为视角变换

CNN 方案——暴力抽取

相较于视角变换,传统 CNNs 追求的是视角不变性,不变性定义为

不严谨地讲, CNNs 期望网络忽视掉所施加的视角变换,保持原样输出。为了说明 CNNs 是怎么做到这一点的,先介绍一下数据增强和最大池化(max-pooling)

  • 数据增强——表示

改善模型泛化能力的流行做法之一是在一些随机增强过的数据样本上进行训练,但该做法被最终证明存在问题且效率低下。

通过数据增强手段学习视角表示的难处在于,多数视角变换需要的是 3D 数据。而绝大多数计算机视觉任务是在 2D 数据上训练的,可进行的操作也就被限制在了 2D 变换上。

我们能施加的视角变换太过有限,模型由此习得的结果就是参数“无能”。经证实,使用数据增强训练得到的 CNN 网络,前面几层不过是彼此之间的旋转,缩放和形式转化。这可能意味着 CNNs 针对每个可能的视角变换分别学了一个“检测器”出来——这也太低效了。

  • 最大池化——路由

假设已经对每种视角变换都学到了相应的特征检测器,CNNs 接下来就会尝试通过最大池化层将该信息路由出去。

最大池化就是从一组近邻值中将最大值抽出来

,具有局部平移不变性,因为最大池化操作并没有将最大值移出所在组,只是将等值的

取出来。

最大池化的不变性可以表述为

特征映射后加上最大池化有助于得到视角恒定的模型。比如,对一组带有旋转权重的神经元激活结果进行最大池化,就能从中找出最佳旋转特征,这样模型就具备了旋转不变性。

而这也就是 CNNs 实现视角恒定的方法:根据不同的视角变换学习一系列特征检测器,再对每组变换权重参数进行最大池化,就能得到/分发最佳特征了。当然,最大池化也意味着我们选择抛弃了许多有用信息。

  • 小议

实际上,这种方法并没有所描述的那样简洁、好用。但起码对于表示学习和路由与 CNNs 的结合,你有了直观印象。这种套路或许能带来不错的效果,但也要看到其低效和高开销的一面。

胶囊网络方案

和 CNNs 不同的地方在于,胶囊网络的目标是视角等价性。等价性定义为

不严谨地讲,胶囊网络希望能以一种结构化的方式应对视角变换。如果能以结构化的方式对结果变换,像图像这种复杂分布处理起来会容易一些。

胶囊网络实现等价性分两步:

  1. 精确表示图像各部分
  2. 利用“物体各部分之间的关系不随视角变换而改变”的客观现实

假如能识别出图像的基本组成并将其表示出来,那就有望通过这些局部组合来检测更为复杂的对象。

例如,现在告诉你一张图像中有一对眼睛,一个鼻子一张嘴。然后我问你,图像中是不是存在一张脸?你大概就会去核对这些成分是否按特定的结构化方式组织在了一起(眼睛在鼻子上方,嘴巴在鼻子下方等等)如果答案是肯定的,那你就有信心确认图像里确实有一张脸。

之所以有信心是因为眼睛、鼻子和嘴巴间的关系显然可以构成一张脸。这种关系的一大特性就是视角不变性。不论是对脸(对象)进行旋转、平移、调整亮度还是别的什么视角变换,局部(眼睛、鼻子和嘴)和总体(脸)间的关系依然不变。

这就是胶囊网络遵循的原理,同时也是依靠等价性,使用更少数据和参数改善泛化性能的基础

胶囊网络介绍

接下来,我们就详细说说胶囊网络的细节与背后思想。先做一些约定。

我们将图像中的实例称为部件或对象,而“关系”是指部件从属于对象。简单起见,设定胶囊网络只有两层。第一层是低维胶囊(简单部件),第二层则是高维胶囊(复杂对象)。通常情况下,低维胶囊是我们所知道的,高维胶囊是要计算的。

部件与对象的表示
  1. 精确表示图像中的各个部件

直接对图像各部件建模会非常困难,因为即使是简单的视角变换都会带来像素空间的巨大变动。所以要学习一个流形,使像素空间内视角变换间的差异变得简单且易于建模。

流形和部件呈现方式相关(位置,方向,大小),视角变换后会引起部件姿态的一点小变化。同时鉴于流形设计起来会很复杂,我们用 CNN 来进行学习。

要得到胶囊,先将图像通过 CNN 处理并将特征向量改造成

形状。这一步的目的在于把图像部件信息封装进所学流形之中。


既然将图像各部分视作部件,就要有一个值来表示部件存在可能性,将其约定为呈现概率。

「存储着部件姿态和呈现概率信息的向量就叫做“胶囊”」

信息路由

接着来看怎么通过已探明部件间的组合,去检测更复杂的对象,这一过程叫做“路由”

  1. 利用“物体各部分之间的关系不随视角变换而改变”的客观现实

因为我们是用姿态矩阵(pose matrix)表示部件和对象的,所以可以用一个权重矩阵来表示部件姿态和其对象姿态间的关系。再提醒一下,视角变换后权重依然不变,因为关系是不随视角变动的。

举例来讲,给定眼睛的姿态向量 ,那么对应的脸部姿态 可表示为

对面部对象进行变换,因为视角不变性的缘故,有

整理替换一下,有

等价性出现了,

。神经元激活结果明确表达了姿态信息,我们的模型也就有了视角等价性。但怎么能确定预测的姿态就是正确的呢?预测中的脸真的存在吗?


  • 预测置信度——预测一致性

回想上学时抄作业的情景,你找到你的朋友们要答案。如果他们的答案一致那就能确信答案靠谱。如果每个人的答案都不一样,那就无法判别哪个才是正确选项了。

同样的道理,用从图像中抽取出的多个部件/低维胶囊(鼻子,耳朵等)来预测对象/高维胶囊(脸)时,将预测一致性最高的姿态作为高维胶囊的结果,呈现概率大小就是一致性大小。比方说大多数低维胶囊认定了高维胶囊的某个姿态,那就对该姿态设一个高呈现概率(激活高维胶囊)

通常一幅图像里不只有一个对象,所以要对每个高维胶囊重复这一过程。每个低维胶囊分别对各个高维胶囊进行预测,计算预测结果间的一致性并给高维胶囊赋值。

胶囊小结

通过对部件的准确表示和对“对象-部件”关系的视角不变性的利用,我们找到了视角等价转换方式。

首先将图像转换成流形,此时视角变换会带来细微的变化。从图像中抽取各部件的姿态与呈现概率。之后用部件(低维胶囊)分别对对象(高维胶囊)进行预测。对一致性最高的预测结果进行路由,并将不同预测间的一致性与相应呈现概率对应。

注意,低维胶囊的数量和视野内感受野数量相关(太少会导致“拥挤”,一个胶囊表示了多个部件/对象)。

感受野(Receptive Field):卷积神经网络特征所能看到输入图像的区域,也就是网络内部的不同位置的神经元对原图像的感受范围的大小

至于路由实现方式则有很多,下面主要介绍两种

路由算法

胶囊间动态路由

原论文[4]提供了一种简单易懂的胶囊网络标准实现方式。本文主要介绍高维相关部分,更多具体内容可以看论文,或者看视频[5]

架构

整体网络由 CNN 流形构成,分类任务中的所有结果都能通过单层低维胶囊和单层高维胶囊进行表示。(MNIST 上是 10 个类别/高维胶囊)

求解过程分两步:

  1. 使用 CNN 抽取低维胶囊
  2. 计算高维胶囊

胶囊使用 8 维向量表示,呈现概率对应胶囊数值大小。通过标准 CNN 抽取特征,再对特征重新塑形(reshape)来生成胶囊。

预测计算

低维胶囊结合权重 计算高维结果。第 个低维胶囊对第 个高维胶囊的预测用 表示

对第 个高维胶囊而言,有 个预测结果(),每一个结果对应于一个低维胶囊。三步走骤迭代计算一致性

  1. 计算高维胶囊 ,即预测结果的线性组合
  2. 对 使用压缩函数进行处理
  3. 对内点(inlier,可接受范围内被认为是正确的结果)升权

首先给预测结果分配权重,胶囊 的权重为 ,初始值为 0

  • 迭代开始

为确保每个部件只对应一个对象,对每个低维胶囊的路由权重进行 softmax

低维胶囊的路由权重与预测结果的线性组合得到各高维胶囊的姿态

进行压缩保证

接着更新权重 以反映胶囊对结果 的意见一致性。就是向量点积

因为 , 是向量间夹角,当 , 取得最大值。这样就加大了对接近 的向量的权重。

  • 迭代结束

实际上,我们会重复迭代 3-5 次来确认一致性。迭代过程有些像寻找预测结果的聚类质心

胶囊网络pytorch实现 胶囊网络为什么不流行_机器学习_02

上图是视频教程中的案例,每一点对应一个预测结果 。点的颜色越深对应路由权重 越大。Mean 代表高维胶囊值 。鉴于网上对该算法介绍的资料众多,本文就说到这里。论文中的算法流程

胶囊网络pytorch实现 胶囊网络为什么不流行_机器学习_03

EM 胶囊矩阵路由

接着要说到的算法是 EM 矩阵路由。因为这个算法相对复杂且资料少,我们重点介绍一下

背景知识
  • 混合高斯模型

胶囊网络pytorch实现 胶囊网络为什么不流行_算法_04

假设我们的数据分布是多峰的(多于一个驼峰)。要用高斯分布对数据建模的话,单个高斯模型可能无法很好的拟合数据,这时就要用多个高斯分布进行混合了。

假如想用 个高斯分布对有 条数据的数据集建模,则取得某个值的概率可以表示为

所以要优化的参数是

  • 期望最大优化法

能优化模型的方法有很多,这里我们采用的是期望最大法(EM)。虽然存在通用 EM 形式可以适应任何潜在分布,但我们这里只用到了高斯混合形式,所以按下不表。算法核心是下面的公式

计算 和 不难,因为 是所学得的参数 而  可以通过高斯 PDF 公式计算得到

既然知道了每一项的计算方法,看一下对数似然函数对参数 的偏导,为表述简洁,令

求第 个高斯分布均值 的偏导数

看上去很简洁,令偏导数为 0 可以得到最优值 的估计 ,也就是向最优值走了“一步”

相似的方法可以得到参数 的最优估计值

这样就能用 EM 算法迭代求解了

E 步:计算

M 步:计算并更新参数 得到近似最优

两步走迭代拟合数据:

  1. 对拟合最好/最差的分布增加/减少权重
  2. 更新参数拟合当前权重

有了背景知识,接下来就能讨论怎么用 EM 算法对胶囊路由过程和服从高斯分布的一致性进行建模了

EM 路由矩阵胶囊

假定低维胶囊的投票结果服从多维高斯分布,EM 路由就是要对其建模。结果非常像混合高斯模型中的 EM 算法

每个胶囊对应一个 的姿态矩阵 和激活概率 ,所以每个胶囊的维度是

图像经 CNN 处理得到第一层胶囊,然后将特征重塑为 形状

预测计算

第 个低维胶囊通过习得的 权重矩阵 对第 个高维胶囊进行预测。论文中的符号稍有变化,为保持一致我们也采用论文中的符号表示。

变为 。 是第 个低维胶囊对第 个高维胶囊的“投票”意见。同时路由权重 现由 表示。低维胶囊集合 对第 个高维胶囊的预测结果 ,将第 层的胶囊表示为 ,低维胶囊是已知条件(),高维胶囊是要计算内容()

算法的主要差别是在路由是怎样进行的。

首先,初始化低维到高维的路由权重,均匀分配即可

然后在对高维胶囊的 M 步操作和对低维胶囊的 E 步操作间反复迭代

  • 迭代开始

M 步执行操作为:

  1. 因为只关心既有部件和活跃胶囊,所以按照呈现概率对低维胶囊的路由权重重新分配
  2. 低维胶囊投票结果符合高斯分布,用 EM 算法计算最优近似参数。因为投票结果 是多维的,所以要分别对单个维度 计算参数
  3. 再来看下怎么计算高维胶囊的呈现概率 。直觉上,如果投票一致那么高维胶囊就该展现出来,所以可以用高斯模型对投票权重的拟合效果与其概率密度函数(probability density function,PDF)来计算“一致性”

低维胶囊 对高维胶囊 投票的高斯分布中属性 所对应的概率密度函数为

加上路由权重,属性 对应的总一致性为

接下来就是最大化一致性,取负变成求最小损失,可以简化为

可见损失可以表示为输入信息的标准差的线性组合,标准差越小投票的一致性越高, 决定了损失。所以用下列方式计算损失

是习得参数。相较于直接使用推导公式中的 这样更有灵活性

因为胶囊要么激活要么休眠,所以要定一个激活胶囊的一致性阈值。换句话说,就是需要定一个最大损失,只有损失比该值小,我们才激活。公式表示为

可见激活胶囊的损失必须小于 , 也是要学习的参数

因为初始训练时结果是随机的,因此引入 来放松一点激活胶囊的限制,保证梯度可以正常更新。随着预测愈加准确,也会相应增强对训练过程的限制。逻辑斯蒂函数也是通过判断结果是否大于某一阈值来决定是否激活胶囊

胶囊网络pytorch实现 胶囊网络为什么不流行_胶囊网络pytorch实现_05

这就是 M 步要做的事情,求解低维胶囊投票结果背后的高斯分布的最优估计参数,并通过高斯分布的标准差大小决定是否激活高维胶囊。

下面来看看简单一些的 E 步,这一步主要是依照对高维高斯的意见一致性更新权重

  1. 首先计算高维胶囊的票选一致性
  2. 接着计算路由权重 并归一化,保证总权重为 1

的计算方法和 一样。首先计算 , 即 , 和 ,即 ,然后归一化以满足贝叶斯规则。我们只是改变了计算 的方式。

  • 迭代结束

迭代完成后, 就是呈现概率, 就是高维胶囊的姿态。EM 路由矩阵胶囊大体过程就是这样了,依照论文可以总结为

胶囊网络pytorch实现 胶囊网络为什么不流行_计算机视觉_06

EM 路由小结

我们首先了解了混合高斯模型中 EM 算法的应用,知道了如何使用这种方法对投票结果进行高斯拟合从而实现路由目的

之后先介绍了 M 步操作,这里求解出低维胶囊投票结果背后的高斯分布的最优估计参数,并依靠投票间一致性的大小判断是否激活高维胶囊。

随后提到了 E 步操作,凭借投票和高维高斯间的拟合效果重新计算了路由权重

当下胶囊网络没达到 SOTA 的主要原因在于主流硬件未对这类算法进行优化,无法实现大规模计算

本文参考资料

[1]

Hinton, Krizhevsky, & Wang, 2011: https://gebob19.github.io/capsule-networks/#tae


[2]

Sabour, Frosst, & Hinton, 2017: https://gebob19.github.io/capsule-networks/#drbc


[3]

Hinton, Sabour, & Frosst, 2018: https://gebob19.github.io/capsule-networks/#mcwer


[4]

原论文: https://arxiv.org/pdf/1710.09829


[5]

视频: https://www.youtube.com/watch?v=pPN8d0E3900


胶囊网络pytorch实现 胶囊网络为什么不流行_神经网络_07