当前位置: 代码迷 >> 综合 >> [计算机视觉]Stacked Capsule Autoencoders
  详细解决方案

[计算机视觉]Stacked Capsule Autoencoders

热度:105   发布时间:2023-10-18 08:34:31.0

Stacked Capsule Autoencoders

前言

由Hinton提出的Capsule的概念从最早的Transforming auto-encoders的首次提出,到Dynamic Routing Between Capsules的首次实现,再到EM routing的优化。如今的Stacked Capsule Autoencoders已经是第三个版本的CapsNet。2020年AAAI,Hinton也调侃这一版Capsule才是对的,把之前的都忘了吧。所以,接下来我们就一起看看这一版的Capsule究竟和之前的版本有何不同。(本科毕业论文笔记)

前置知识介绍

Attention机制

参考文章:
1. 关于attention机制在nlp中的应用总结
2. 深度学习中的注意力机制
3. 一步步解析Attention is All You Need!
4. CV领域的注意力机制综述

Attention机制最早是在计算机视觉领域中被提出的。它模拟了人类观察一张图片时的注意力并不是分散的,而是有焦点的。如图,图中有一个婴儿、一叠布料和一些文本。那么当人们从这张图片中获取信息时,我们会将注意力放在婴儿的脸上、文本的标题等我们想要获得信息的区域上而不会在意空白的区域。换而言之,注意力机制就是当我们从图片中获取信息时,不同信息的来源分别会对应不同的区域。这就是注意力机制的一个感性的认识。更抽象一点,特征提取过程中,不同的浅层特征(如图片中不同的像素、NLP句子模型中不同的词语、卷积神经网络中浅层特征图的不同位置等)对之后提取出来的深层特征的贡献是不同的,反过来深层的特征应该能关注浅层中重要的信息,同时忽略无关信息。
[计算机视觉]Stacked Capsule Autoencoders

Attention机制示例图

虽然最早Attention机制是在计算机视觉领域中提出的,但其大放异彩之初是在自然语言处理领域中处理机器翻译等问题中。此处我们也用NLP中引入Attention机制的方法进行简略阐述,因为Hinton在文中使用的Set Transformer技术也是从NLP的思路中出发的。

1. Encoder-Decoder框架
首先要说明的是Attention Model并不是附着在Encoder-Decoder框架下的,其更多的是一种通用的思想。利用Encoder-Decoder框架是为了更好的解释Capsule中Set Transformer的原理。而Attention模型又可分为Soft Attention模型、Hard Attention模型和Local Attention模型,原文中使用的是Soft Attention 模型的概念,所以以下介绍的是Soft Attention模型。
[计算机视觉]Stacked Capsule Autoencoders

Encoder-Decoder模型

直观理解可以将其看作处理NLP中一个句子生成另一个句子,可以是不同语言(翻译问题)、不同长度(文段总结)等的通用模型。每一个XXX是一个词向量,一句话就是这些XXX按照顺序排列的结果,同样的YYY也是如此。那么一个句子可以表示成如下形式:

X=<x1,x2,x3...xn>Y=<y1,y2,y3...ym>X\;=\;<x_1, x_2, x_3...x_n>\\ Y\;=\;<y_1, y_2, y_3...y_m>X=<x1?,x2?,x3?...xn?>Y=<y1?,y2?,y3?...ym?>

那么Encoder和Decoder分别做的就是将输入XXX编码成中间的语义编码CCCDecoder就是将语义编码CCC解码成YYY。但是传统的不加入Attention机制的Encoder-Decoder框架会有一个问题,就是作为分心模型的它的注意力是分散的,是不集中的。具体示意图如下:
[计算机视觉]Stacked Capsule Autoencoders

传统Encoder-Decoder框架示意图

我们可以看到我们将原本的句子XXX编码到了语义编码CCC中,而后通过解码器解码成了翻译后的句子YYY。这其中的数学形式可以表达成如下形式:
y1=Decoder(C)y2=Decoder(C,y1)y3=Decoder(C,y1,y2)......y_1\,=\,Decoder\,(C)\\ y_2\,=\,Decoder\,(C,y_1)\\ y_3\,=\,Decoder\,(C,y_1,y_2)\\......y1?=Decoder(C)y2?=Decoder(C,y1?)y3?=Decoder(C,y1?,y2?)......

(注意到这里每次解码下一个单词也会用到之前已经解码出来的单词,这是因为NLP问题中的解码器往往都是RNN、LSTM等模型的原因)

但是事实上我们去理解这一个句子时,他应当更注重的是小明,书应当注重的是我。即在翻译的时候,每一个单词在解码时,使用的语义编码C应当是有所不同的,有所侧重的。而分心模型显然无法体现出这种不同的单词对于最终结果的贡献是不同的这一点。

没有引入注意力的模型或许在句子比较短的时候并没有太大的问题,但如果输入的句子比较长,此时所有的语义完全通过一个中间语义向量来表示,可想而知由于单词自身的消息被编码后丢失了很多细节,如当有一词多义的情况出现,它必定会需要周围的词语的信息才能在正确的语境中被翻译。但当句子过长,那么其中指代的情况便有可能丢失,这便是分心模型的缺陷。

根据以上分析可得,我们想要得到的就是解码出来的不同单词所接受的不同输入单词信息的贡献应当是不同。而Attention模型就是解决这个问题,所以增加了Attention模型之后的Encoder-Decoder框架应当是这样的。
[计算机视觉]Stacked Capsule Autoencoders

Attention机制的Encoder-Decoder框架

其中每一个CiC_iCi?的表达式如下:

Ci=Encoder(pi1?x1,pi2?x2,pi3?x3,pi4?x4)C_i\,=\,Encoder(p_{i1}*x_1,\,\, p_{i2}*x_2, \,\,p_{i3}*x_3,\,\, p_{i4}*x_4)Ci?=Encoder(pi1??x1?,pi2??x2?,pi3??x3?,pi4??x4?)

其中∑jpij=1\sum_jp_{ij}=1j?pij?=1,向量pi?\vec{p_i}pi? ?就表示对于第iii个语义向量,每一个source句子中不同单词对于其的贡献比例。那么在之后的Decoder过程中就变成了如下新的形式:
y1=Decoder(C1)y2=Decoder(C2,y1)y3=Decoder(C3,y1,y2)......y_1\,=\,Decoder\,(C_1)\\ y_2\,=\,Decoder\,(C_2,y_1)\\ y_3\,=\,Decoder\,(C_3,y_1,y_2)\\......y1?=Decoder(C1?)y2?=Decoder(C2?,y1?)y3?=Decoder(C3?,y1?,y2?)...... 那么这个权值是怎么来的呢,方法有很多种,但其主要思想实际上可以表达成如下图所示:
[计算机视觉]Stacked Capsule Autoencoders

Attention机制核心思想

将原本我们需要进行转换的数据Source中每一个元素看成是一个<Key,Value>的键值对。而给定训练目标句子Target中某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,之后对Value进行加权求和,记得到了最终的Attention数值:

Attention(Query,Source)=∑iSimilarity(Query,Keyi)?ValueiAttention(Query,Source)=\sum_iSimilarity(Query,Key_i)*Value_iAttention(Query,Source)=i?Similarity(Query,Keyi?)?Valuei?

然而,很多文章并没有说明为何如此设置,Query、Key和Value究竟代表着什么。我的理解是,Value就是原本的单词的值。而Key实际上是我们需要抽象出来的一个特征,它是一个具有语义信息的一个变量,而并非简单只是一个单词的值了。相当于把单词从一种语言表达的空间中,抽象成所有语言共同的一种共性的特征。而Query也是如此,是将Target中的每一个单词抽象成一个共性的特征。之后通过比较这些特征的相似之处,当然就可以得到越是相似的Source的元素xpx_pxp?和Target中的元素yqy_qyq?xpx_pxp?对于yqy_qyq?的贡献应该越大。

举例,我们脑子里想的是我饿了,而不同的语言下我饿了在我们大脑中都是同一个意思,但中文中我们会说我饿了。是因为,这是我饿了这个意思在中文的语言空间中的表示,但Key和Value应该是你脑子里的我饿了这个概念。这时候,Query表达的就是目标单词中抽象出来的具有语义的共性的特征。但这种共性的特征在原始的句子中既可能是原始句子中全部的信息得到的,也有可能只是一部分信息便可得到的,因为一句话可以有很多个这种共性的特征。比如:Source:“小明说我饿了"和“小红说我饿了”这两句话编码所得的语义向量C1,C2C_1,C_2C1?,C2?一定是不同的,但我们在解码"我饿了"这一部分时用到的如果是全部的C1,C2C_1,C_2C1?C2?这样对于解码器来说其实是不合理的。因为我们希望编码器中储存的应该是将对应的高度抽象出来的语义到具体的表达的变换方式,所以当我们用C1,C2C_1,C_2C1?,C2?去训练整个模型之后,你再给他输入了Source:“我饿了”,它可能并不能正确的编码解码出来,只有输入了"小明说我饿了”,它才可能编码解码出来。

实际应用中,有一些Value和Key是一样的,因为我们大部分的Encoder(如RNN等)得到的Value已经带有语义信息了。所以Value就已经带有语义信息了,所以大家发现大部分模型中Key和Value是同一个值。这样的话,Key和Value实际上表达的就是那个共性的特征。

Attention机制用Similarity让Target中的因素只专注与和它有关的部分Source。而Attention就是让那些,具有相关的共性的Source对Target的贡献更多一些从而使得训练过程中Encoder和Decoder都能关注到正确的信息,从而使训练出来的模型因为被“污染”而造成的Bias更小。具体的计算过程如下:
[计算机视觉]Stacked Capsule Autoencoders

计算Attention过程

Self-Attention机制

以上是Attention本质思想的梳理,那么Self Attention顾名思义,便是Source内部自己的Attention模型。将以上模型中的Target换成Source即可,那么其中的Query、Key和Value都是来自一样的单词了。这么做的目的是什么呢?下面举两个可视化的Self Attention的例子:
[计算机视觉]Stacked Capsule Autoencoders

Self Attention示例1

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210203142355665.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0ODg2NjM1,size_16,color_FFFFFF,t_70#pic_center)
Self Attention示例2

可以看到,Self Attention可以提取到一个句子中互相之间有所联系的单词。如果我们将其推广一下,想象一下我们有一个集合,集合中每一个元素都有其各自的特征。通过Attentino机制,我们可以得到这些元素之间的联系。

Multi-Head Attention

文章名称:Attention Is All You Need

文章作者:Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin

收录情况:Accepted by NIPS 2017

文章链接:https://arxiv.org/abs/1706.03762

代码链接:https://github.com/princewen/tensorflow_practice/tree/master/basic/Basic-Transformer-Demo

这一概念是由Attention Is All You Need这篇论文介绍出来的,其也是Self Attention机制的具体实现的一种。而Stacked Capsule Autoencoders论文中的Set Transformer正是这一具体算法的延伸。
首先介绍只有一个头的情况 Scaled Dot-Product Attention:
1.Embedding

首先我们对原本的句子进行position embedding。由于这部分实际上是NLP部分的问题,此处做过多介绍。简单来说就是将每一个单词进行编码,将原本的一个句子中nnn个单词映射成nnnddd维的向量。

2.得到Q,K,V

将原本的nnnddd维的向量通过线性变换得到Q,K,VQ,K,VQ,K,V(注意:此处线性变换的参数是可以训练的)分别得到n×dqn\times d_qn×dq?QQQ矩阵,n×dkn\times d_kn×dk?KKK矩阵,n×dvn\times d_vn×dv?VVV矩阵

3.计算相似度

原文是通过点乘的方式,即Q?KTQ*K^TQ?KT

4.增加Mask

这部分是因为Attention is All You Need!中,Query和Key有些部分是用了0填充的,但Set Transformer中是没有这种情况的。故不过多讲解了,有兴趣可以查看参考文章一步步解析Attention is All You Need!。

5.得到Attention结果

得到了Attention的相似度矩阵,我们就可以将其通过Soft-max函数然后和Value进行相乘,得到经过attention加权的结果:Att(Q,K,V;w)=w(QKT)VAtt(Q,K,V;w)=w(QK^T)VAtt(Q,K,V;w)=w(QKT)V.

而多个头的Multi-Head Attention实际上就是把Scaled Dot-Product Attention的过程做H次,然后把得到的H个AtthAtt_hAtth?拼接起来。将H个n×dvn\times d_vn×dv?个矩阵Concat成1个n×(hdv)n\times (hd_v)n×(hdv?)矩阵,之后再进行线性转换,结构如下:
[计算机视觉]Stacked Capsule Autoencoders

Multi-Head Attention结构

原文说这么做的目的是可以让模型去关注不同方面的信息,即每一个头关注的相关性是不同方面的相关性。

这里在放两篇关于CV领域的Attention机制综述文章,因为感觉这个机制还是很有意义的:

CV领域的注意力机制综述

CV中的注意力机制

Set Transformer: A Framework for Attention-based Permutation-Invariant Neural Networks

文章作者:Juho Lee,Yoonho Lee,Jungtaek Kim,Adam R. Kosiorek,Seungjin Choi, Yee Whye Teh

收录情况:Accepted by ICML 2019

文章链接:http://proceedings.mlr.press/v97/lee19d/lee19d.pdf

代码链接:https://github.com/juho-lee/set

终于讲到Set Transformer了,简而言之他就是在刚刚的Multi-Head Attention的基础上,将输入的一个句子延伸到了一个集合上,然后运用其提出的Set Pooling,将其变成了一个处理与顺序无关的集合型数据的Transformer。但其的用途实际上是十分广泛的,而且其还具有Permutation Invariance。这也是Hinton为什么会在Capsule中引入这一方法的重要原因之一,毕竟Capsule的提出就是为了解决Equivariance的问题,关于这一部分将会在之后进行阐述。

1.Pooling Architecture for Sets

[计算机视觉]Stacked Capsule Autoencoders

原论文中的Pooling Architecture for Sets

论文中提到Zaheer et al. (2017)的文章Deep Sets证明了在神经网络中任何具有置换不变性的函数均具有其中的的形式:

net(x1,...,xn)=ρ(pool({?(x1),...,?(xn)}))net({x_1,...,x_n})=\rho(pool(\{\phi(x_1),...,\phi(x_n)\}))net(x1?,...,xn?)=ρ(pool({ ?(x1?),...,?(xn?)}))

注:池化是对Set进行池化的,举个例子,当你同时输入了n个不同的元素,最终池化出来只有1个元素的特征

同时,其也发现当Encoder是一层层具有置换等变性的结构(如卷积神经网络的卷积结构),那么这个模型依然具有置换不变性。

2.Attention
这部分在之前的Multi-Head Attention已经介绍过了,运算是一模一样的,此处就不再过多阐述了。
[计算机视觉]Stacked Capsule Autoencoders

1.原论文中的Attention实现

[计算机视觉]Stacked Capsule Autoencoders

2.原论文中的Attention实现

注:作者对于其中参数矩阵尺寸的这一超参数的给定,在实验中也是如此设定的。

3.Permutation Equivariant (Induced) Set Attention Blocks

[计算机视觉]Stacked Capsule Autoencoders

1.Set Attention Blocks

这里作者定义了以下操作模块:

MAB(X,Y)=LayerNorm(H+rFF(H)),whereH=LayerNorm(X+Multihead(X,Y,Y;w))SAB(X)=MAB(X,X)MAB(X,Y)=LayerNorm(H+rFF(H)), \\ where\ H=LayerNorm(X+Multihead(X,Y,Y;w))\\ SAB(X)=MAB(X,X)MAB(X,Y)=LayerNorm(H+rFF(H)),where H=LayerNorm(X+Multihead(X,Y,Y;w))SAB(X)=MAB(X,X)

这里MABMultihead Attention BlockrFF为一个按行进行的前向网络层。举个例子,n个行向量进去,n个行向量出来,每一个行向量前向的过程是独立且权值一样的。其中"X+Multihead(X,Y,Y;w)","H+rFF(H)""X+Multihead(X,Y,Y;w)",\ "H+rFF(H)""X+Multihead(X,Y,Y;w)", "H+rFF(H)"的结构借鉴了ResNet中shortcut connection的思想。

LayerNorm此处就不再做介绍了,具体操作可以看这几篇文章Batchnorm\layernorm和BatchNorm, LayerNorm, InstanceNorm和GroupNorm总结,这两篇是我觉得说的比较详细和准确的了,把每一个维度都进行举例说明了。

简单来说,LayerNorm就是在每一层所有节点进行标准化然后加入偏置和尺度项。比如在输入第1个行向量的时候,这个向量每一个值都进行标准化,均值和方差是这一个行向量的均值方差。

SAB就是Self Attention版本的MAB

[计算机视觉]Stacked Capsule Autoencoders

2.Set Attention Blocks

ISABm(X)=MAB(X,H)∈Rn×d,whereH=MAB(I,X)∈Rm×dISAB_m(X)=MAB(X,H)\in\mathbb{R}^{n\times d},where\ H=MAB(I,X)\in\mathbb{R}^{m\times d}ISABm?(X)=MAB(X,H)Rn×d,where H=MAB(I,X)Rm×d

作者说设计ISAB目的是为了减少运算的时间复杂度。而且,从直觉上来说,作者这种操作,相当于是把原本的n个元素先抽象编码成了m个类的感觉。之后再通过这m个类,和每一个n进行Attention操作,得到这个集合中每一个元素相互的关系,即是否相似。

[计算机视觉]Stacked Capsule Autoencoders

Pooling by Multihead Attention

[计算机视觉]Stacked Capsule Autoencoders

Overall Architecture

PMAk(Z)=MAB(S,rFF(Z))H=SAB(PMAk(Z))Encoder(X)=SAB(SAB(X))Encoder(X)=ISABm(ISABm(X))Decoder(Z;λ)PMA_k(Z)=MAB(S,rFF(Z)) \\ H=SAB(PMA_k(Z))\\ Encoder(X)=SAB(SAB(X))\\ Encoder(X)=ISAB_m(ISAB_m(X))\\ Decoder(Z;\lambda)PMAk?(Z)=MAB(S,rFF(Z))H=SAB(PMAk?(Z))Encoder(X)=SAB(SAB(X))Encoder(X)=ISABm?(ISABm?(X))Decoder(Z;λ)

Z∈Rk×dZ\in\mathbb{R}^{k\times d}ZRk×d是原始的X经过层层编码之后的向量,而S∈Rk×dS\in\mathbb{R}^{k\times d}SRk×d是可以学习的参数矩阵。有趣的事情发生了,将经过层层编码之后的ZZZ经过多头注意力池化操作可以变成一个K个实例的集合,而这种抽象的编码过程是基于注意力的。其实有点像聚类的过程了已经,只是我们聚类出来的并不是每一个元素的标签,而是每一个大的类别所拥有的特征。

之后整体的Encoder-Decoder框架基本上就和传统的框架没什么太多区别了,更多的都是堆叠了Encoder。而Decoder中为什么经过PMA之后还要再进行SAB是为了得到抽象的类别之间的联系。

同时作者表示,这样的结构依然具有置换不变性。首先,Encoder是置换等变的,这是因为其使用了Attention机制进行相似度拟合,因此是置换等变的。想象一下,n个元素假如说调换了第一个和第二个的位置,由于Attention注重的是其相似性,和其位置无关,那么得到的结果也应该是之前的结果调换了位置而已。

注:这个性质对于Hinton是很重要的,因为他一直在强调Capsule的等变性和不变性。

Set Transformer就介绍到这里了,之后的实验部分如果感兴趣可以看原论文的实验部分,终于要正式进入到Stacked Capsule Autoencoders了。

  相关解决方案