雷锋网(公众号:雷锋网) AI 科技评论按,胶囊网络是一种热门的计算机网络模型,倍受人工智能领域相关研究人员的关注。而 transformer 是谷歌在 2017 年的一篇著名论文「Attention Is All You Need」中提出的一种网络结构,这种网络结构是基于注意力机制的,主要关注 NLP 领域的机器翻译问题。
Amsterdam 大学的博士生 Samira 思考了胶囊网络和 transformer 之间的关系,并发表了一篇博客。在博客中,她讨论了 transformer 和胶囊网络的主要组成部分以及它们之间的关系。雷锋网 AI 科技评论将她的文章编译整理如下:
在本文中,我们将介绍 transformer 和胶囊网络的主要组成部分,并尝试在这两个模型的不同组件之间建立连接。我们的主要目标是研究这些模型本质上是否是不同的,如果是不同的,它们之间的关系是什么。
transformers:
transformers,或所谓的自注意力网络,是一系列深度神经网络体系结构,其中自注意力层相互堆叠,通过多重转换学习输入分词在具体的情境中如何表示。这些模型已经能够在许多视觉和 NLP 任务上实现 SOTA。关于如何实现 transformer 有很多细节,但从整体上来看,transformer 是一种编码器-解码器体系结构,其中每个编码器和解码器模块由一组 transformer 层组成,在每个层中,我们学习(重新)计算每个输入分词的表示。这个表示是通过关注前一层中所有分词的表示方式计算出来的。具体如下图所示。
因此,为了计算层 L+1 中的表示,来自它前面的层 L 的表示通过一个自注意力模块传递过来,该模块更新每个和其它分词有关联的分词的表示。后面的层的分词在解码器块的自注意力中被屏蔽。另外,除了自注意力之外,解码器中还有编码器-解码器注意(「encoder-decoder-attention」,上图中没有描述)。要了解有关 transformer 的更多详细信息,请查看这篇伟大的文章:http://jalammar.github.io/illustrated-transformer。
transformer 的关键组成部分是自注意力机制,它的一个重要特性是采用多头注意力机制。在这篇文章中,我们主要关注这个部分,并在将胶囊网络与 transformer 进行比较的过程中,深入探讨它的一些细节。
使用多头注意力机制的主要动机是获得探索多个表示子空间的机会,因为每个注意力头得到的表示投影是不一样的。在理想的情况下,每个注意力头都会通过考虑一个不同的方面来学习处理输入的不同部分,并且在实践中,不同的注意力机制计算出来的注意力分布也是不同的。transformer 中的多个注意力头和 CNN 中的多个滤波器是类似的。
在这里,我们解释了如何使用多个头的自注意力机制来整合来自较下层 L 中不同位置的信息,以计算较上层的 L+1 表示。
首先,我们应该注意到,每一层的每个位置的表示都形式都是(键、值、查询)三元组。因此,对于每一层,我们有三个矩阵(K,Q,V),这些矩阵中的每一行对应一个位置。
注意力头 i 的输入是 K、Q 和 V 的线性变换:
然后,该注意力头 i 输出为:
di 表示 Ki 的长度。
直观地说,在 L+1 层中每个位置的表示是 L 层中所有表示的加权组合。为了计算这些权重,注意力分布,每个注意力头,计算 L+1 层中每个位置的查询与 L 层中所有位置的键之间的相似性,然后通过 softmax 函数对这些相似性分数进行计算,得出所有位置的注意力分布。因此,对于每个自注意力层中的每个位置,我们在每个注意力头下一层的位置上都有一个注意力权重分布。最后,对于每个注意力头,使用头部的注意力概率组合所有位置的值。在最后一步中,将所有注意力头的值进行线性连接和转换,以计算多个注意力集中部分的输出:
因此,根据所学的参数,对于每一层,我们有一个转换矩阵Wo,它将所有注意力头的输出组合起来。同时,对每个注意力头来说,我们有三个转换矩阵,即
和
。
带 EM 路由的矩阵胶囊:
从一开始,胶囊网络就被用于以更自然的方式来处理图像。在 2000 年,Hinton 和 Gharamani 认为,依赖于分割预处理阶段的图像识别系统存在这样一个事实,即分割器不知道被处理对象的一般信息,同时,他们建议图像的识别和分割都可以在同一个系统里面完成。其思想是,为了识别对象的某一部分,必须首先需要对对象是什么有一个大致的了解。换句话说,我们需要同时拥有自上而下和自下而上的信息流。
对于 NLP 问题来说这也同样适用。这方面的一个例子是解析 garden path 里面的句子。胶囊网络可以被看作是 CNN,在那里内核的输出有一些结构,池被动态路由所取代。
胶囊是一个单元,它学习如何在有限的查看条件域中检测隐式定义的实体。它输出实体存在的概率和一组反映实体特征(如姿态信息)的「实例化参数」。存在概率是视点不变的,例如,它不会随着实体的移动或旋转而改变,然而实例化参数是视点等变的,例如,如果实体移动或旋转,这些参数就会发生变化。
在具有 EM 路由的矩阵胶囊中,它们使用了一个胶囊网络,这个网络包含标准的卷积层,以及一层初级胶囊,随后是几层卷积胶囊。在这个版本的胶囊网络中,实例化参数被表示为一个矩阵,这个矩阵被称为姿态矩阵。
每个胶囊层都有固定数量的胶囊类型(类似于 CNN 中的滤波器),它们被选作超参数。每个胶囊都是某种胶囊类型的实例。每个胶囊类型对应于一个实体,并且所有相同类型的胶囊都对应于不同位置的类型相同的实体。在较下层中,胶囊类型学习识别下层实体,例如眼睛,在较上层中,它们会呈现更多的上层实体,例如脸。
在卷积胶囊层中,每种胶囊类型的权矩阵在输入上进行卷积,类似于内核在 CNN 中的应用。这会导致每种胶囊类型具有不同的实例。
在胶囊网络中,每个层中胶囊类型的数量是预先定义好的。在两个相邻层中的每种胶囊类型之间,都有一个变换矩阵。这样,每一个上层胶囊看到的都是不同角度的下层胶囊中的实体。
姿态矩阵
该方程显示了如何根据下层胶囊的姿势矩阵计算上层胶囊的姿势矩阵 Mj,即 Mis 是:
在这个方程中,rij 是胶囊 i 分配给胶囊 j 的概率,也就是说,胶囊 i 对胶囊 j 所捕获概念的贡献程度。WijMi 是下层胶囊 i 相对于胶囊 j 的姿态矩阵投影,也称为「vote 矩阵」,表示为 Vij。因此,胶囊 j 的姿态矩阵基本上是下层胶囊投票矩阵的加权平均数。请注意,分配概率是作为动态路由 EM 过程的一部分计算的,与胶囊的存在概率或激活概率不同。
存在概率
现在,让我们看看如何计算上层胶囊的激活概率。简单地说,较上层胶囊的激活概率是根据激活成本与不激活成本相权衡计算出来的。
问题是:这些成本是什么,我们该如何计算它们?
如果分配给更上层胶囊的概率总和大于零,即有一些较下层胶囊分配给这个胶囊,则不激活该胶囊会产生成本。但胶囊的激活概率并不是仅根据分配概率的值来计算的。我们还应该考虑分配给上层胶囊的下层胶囊的 vote 矩阵彼此之间的一致性。
换句话说,分配给上层胶囊的下层胶囊应该是上层胶囊所代表的同一实体的一部分。因此,激活胶囊的成本也反映了下层胶囊的 vote 矩阵与上层胶囊计算出的姿态矩阵之间的不一致程度。此外,为了避免随意激活胶囊,激活每个胶囊时都有固定的惩罚。
带 EM 的动态路由
这里的主要挑战是计算分配概率 rij。也就是如何将下层胶囊
连接到上层胶囊
,或者换句话说,如何在胶囊层之间路由信息。我们希望这些联系不仅取决于下层胶囊的存在,还取决于它们彼此之间的关系以及它们和上层胶囊之间的关系。例如,代表眼睛的胶囊(面部的一部分)可能不应该和代表桌子的胶囊联系在一起。这可以看作是在计算从下层胶囊到上层胶囊的注意力。但问题在于,为了能够根据下层胶囊与上层胶囊的相似性来计算这一概率,我们事先没有对上层胶囊的初始表示。这是因为胶囊的表示取决于下层的哪些胶囊将会被分配给它。这正是动态路由起作用的地方,它通过使用 EM 解决了这个问题。
基于
的表示和下层胶囊到上层胶囊的分配概率,我们可以使用 EM 计算出
的表示。这种迭代过程称为带 EM 的动态路由。请注意,带 EM 的动态路由是胶囊网络中前向传递的一部分,在训练期间,错误通过动态路由的展开迭代进行反向传播。
值得注意的是,它的计算方法和主要胶囊层的计算方法有点不同,因为其下面的层不是胶囊层。初级胶囊的姿态矩阵只是下层内核输出的线性变换。此外,每个输出类的最终胶囊层有一个胶囊。当将最后一个卷积胶囊层连接到最后一层时,变换矩阵在不同的位置上共享,它们使用一种称为「坐标加成」(Coordinate Addition)的技术来保存关于卷积胶囊位置的信息。
胶囊网络与 transformer:
最后,我们来到了本文最有趣的部分:比较这两个模型。虽然从实现的角度来看,胶囊网络和 transformers 似乎并不十分相似,但这两个系列模型的不同组件之间存在一些功能上的相似性。
动态路由与注意力机制
在胶囊网络中,我们使用动态路由来确定从下层到上层的连接,与 transformer 中的情况一样,我们使用自注意力来决定如何处理输入的不同部分以及来自不同部分的信息如何促进表示的更新。我们可以将 transformer 中的注意力权重映射到胶囊网络中的分配概率,但是,胶囊网络中的分配概率是自下而上计算的,而 transformer 中的注意力是自上而下计算的。即 transformer 中的注意力权重分布在下层的表示上,而在胶囊网络中,分配概率分布在上层胶囊上。请注意,在 transformer 中,注意力概率是基于同一层中表示的相似性计算的,但这相当于假设上层首先用下层的表示进行初始化,然后通过将这些初始表示与下层的表示进行比较,计算出注意力概率来更新上层的表示。
胶囊网络中的自下而上的注意力机制以及存在概率和激活胶囊会产生的惩罚,明确允许模型在信息传播到更上面的层时抽象出概念。另一方面,在 transformer 中,自上而下的注意力机制允许上层节点不关注下层节点,并过滤掉在这些节点中捕获的信息。
现在的问题是,为什么在胶囊网络中我们需要使用 EM 来进行动态路由?为什么我们不能用一个和 transformer 中计算注意力的机制类似的方法来计算胶囊网络中的分配概率呢?
我们的猜想是,可以使用点积相似度来计算下层胶囊与上层胶囊的相似度,从而计算出分配概率。
目前面临的挑战在于,在胶囊网络中,我们对更上层胶囊的表示没有任何先验的假设,因为我们事先并不知道它们所代表的是什么。另一方面,在 transformer 中,所有层中的节点数是相同的,并且数量上和输入的分词数相同,因此,我们可以将每个节点解释为相应输入分词结合了上下文的表示。这样,我们就可以用较下层的对应表示来初始化每个较上层中的表示,这样就可以使用这两种表示之间的相似性分数来计算注意力权重。
胶囊类型和注意力头:
胶囊网络和 transformer 体系结构都有一种机制,允许模型从不同的角度处理较下层的表示,以此来计算较上层的表示。在胶囊网络中,来自两个相邻层的每对胶囊类型之间有不同的转换矩阵,因此作为不同胶囊类型实例的胶囊从不同的角度查看前一层的胶囊。与此相同,在 transformer 中,我们有多个注意力头,其中每个注意力头使用一组不同的转换矩阵来计算键、值和查询的投影值。因此,每个注意力头在下层表示的不同投影上工作。这两种机制和卷积神经网络中有不同的核是类似的。
现在,胶囊网络和 transformer 在这方面的不同之处在于,在胶囊网络中,不同类型的胶囊有不同的查看角度,最终,较下层胶囊的分配概率在较上层中的所有胶囊上进行归一化,而不管其类型如何。因此,在较低层中,每个胶囊有一个分配分布。而在 transformer 中,每个注意力头独立地处理其输入。这意味着我们在更高层的每个位置都有一个单独的注意力分布,注意力头的输出只在最后一个步骤中组合,在最后一个步骤中它们被简单地连接和线性转换,以计算多头注意力块的最终输出。
位置嵌入和坐标添加:
在 transformer 和胶囊网络中,都有一些机制可以将特征的位置信息显式地添加到模型计算的表示中。然而,在 transformer 中,这是在第一层之前完成的,其中位置嵌入被添加到单词嵌入中。而在胶囊网络中,它是通过坐标添加在最后一层中完成的,其中每个胶囊的感受野中心的缩放坐标(行、列)被添加到 vote 矩阵的右边列的前两个元素中。
结构化隐藏表示:
在 transformer 和胶囊网络中,隐藏的表示是以某种方式构建的。在胶囊网络中,我们用一种胶囊代替标准神经网络中的标量激活单元,每个这种胶囊都用姿态矩阵和激活值表示。姿态矩阵对每个胶囊的信息进行编码,并用于动态路由计算下层胶囊和上层胶囊之间的相似性,激活概率决定了它们是否存在。
与此相反,在 transformer 中,表示被分解成键、查询和值三元组,其中键和查询是用于计算输入不同部分之间相似性的寻址向量,并计算注意力分布,以计算输入的不同部分对彼此的表示的贡献程度。
从广义的概念来看,胶囊网络中的姿态矩阵在 transformer 中扮演着键和查询向量的角色。这里的要点是,它在不同类型信息的表示分离中似乎有一些优势,并且在这两个模型中,这是基于路由或注意力处理过程中隐藏状态的角色来完成的。
via:https://staff.fnwi.uva.nl/s.abnar/?p=108
雷锋网雷锋网
雷锋网版权文章,未经授权禁止转载。详情见转载须知。