Paper : https://arxiv.org/abs/2007.12146 [ECCV2020]
spatially aware self-attention layer : 使用空间图定义每一个视觉实体只看相邻的实体,多头自注意力层的每个头都专注于关系的不同子集。
- 每个头都考虑局部上下文,而不是将注意力分散在所有视觉实体中;
- 避免学习多余的特征
在TextVQA数据集中大约有13% 的问题存在一个或多个空间词,SA-M4C构建一个空间图编码视觉实体之间的空间关系,使用此关系辅助多模态 transformer 的自注意力层,在多头注意力的每个头上每个实体只关注通过空间图定义的邻居实体,限制每个头只能看关系的子集,以防止学习冗余特征。
自注意力层的两个限制
- 自注意层通过对每对输入之间的关系进行编码来对全局上下文进行建模。 这将注意力分散在每个输入上,而忽略了序列中语义结构的重要性。 例如,在语言建模的情况下,事实证明,通过在解析树中编码每个单词的深度来捕获局部上下文或输入句子的层次结构是有益的
- 多个头允许自注意力层共同参与不同头中的不同上下文。 但是,每个头独立地查看整个全局信息,并且没有明确的机制来确保不同的关注头捕获不同的上下文。 确实,已经证明可以将头剪枝而不会显着损害模型的性能,并且不同的杆头会学习多余的功能。
Graph over Input Tokens
定义有向异构图 G = ( X , E ) \mathcal{G} = (X, \mathcal{E}) G=(X,E) ,每一个节点对应一个输入 x i ∈ X \Bbb{x}_i \in X xi∈X, E \mathcal{E} E 是全部边的集合 e i → j , ∀ x i , x j ∈ X e_{i \to j}, \forall \Bbb{x}_i, \Bbb{x}_j \in X ei→j,∀xi,xj∈X 。
映射函数 Φ x : X → T x \Phi_x : X \to \mathcal{T}^x Φx:X→Tx ,把一个节点 x i ∈ X \Bbb{x}_i \in X xi∈X 映射到一个模态,节点类型的数量等于输入模态的数量 ∣ T x ∣ = M |\mathcal{T}^x| = M ∣Tx∣=M
映射函数 Φ e : E → T e \Phi_e : \mathcal{E} \to \mathcal{T}^e Φe:E→Te ,把一个边 e i → j ∈ E e_{i \to j} \in \mathcal{E} ei→j∈E 映射到一个关系类型 t l ∈ T e t_l \in \mathcal{T}^e tl∈Te
问题 X ques = { x ∈ X : Φ x ( x ) = ques } X^{\text{ques}} = \{\Bbb{x} \in X:\Phi_x(\Bbb{x}) = \text{ques} \} Xques={x∈X:Φx(x)=ques} ,视觉内容 X obj = { x ∈ X : Φ x ( x ) = obj } X^{\text{obj}} = \{\Bbb{x} \in X:\Phi_x(\Bbb{x}) = \text{obj} \} Xobj={x∈X:Φx(x)=obj} ,OCR tokens X ocr = { x ∈ X : Φ x ( x ) = ocr } X^{\text{ocr}} = \{\Bbb{x} \in X:\Phi_x(\Bbb{x}) = \text{ocr} \} Xocr={x∈X:Φx(x)=ocr},答案 Y ans = ( y 1 a n s , . . . , y T a n s ) Y^{\text{ans}} = (\Bbb{y}_1^{ans}, ..., \Bbb{y}_T^{ans}) Yans=(y1ans,...,yTans)
Spatial Relationship Graph
需要对出现在图像上的所有的 object X obj X^{\text{obj}} Xobj 和 OCR tokens X ocr X^{\text{ocr}} Xocr 编码,全部的区域就是 r ∈ R = X obj ∪ X ocr r \in \mathcal{R} = X^{\text{obj}} \cup X^{\text{ocr}} r∈R=Xobj∪Xocr ,用所有的对应于全部的 objects 和 OCR tokens 构建空间图 G spa = ( R , E spa ) G_{\text{spa}} = (\mathcal{R}, \mathcal{E}_{\text{spa}}) Gspa=(R,Espa) ,映射函数 Φ spa : E spa → T spa \Phi_{\text{spa}}:\mathcal{E}_{\text{spa}} \to \mathcal{T}^{\text{spa}} Φspa:Espa→Tspa 将空间关系 t l ∈ T spa t_l \in \mathcal{T}^{\text{spa}} tl∈Tspa 分配给一个边 e = ( r i , r j ) ∈ E spa e = (r_i, r_j) \in \mathcal{E}_{\text{spa}} e=(ri,rj)∈Espa 。映射函数使用下图 (a) 规则。总共 12 种空间关系类型,图 G spa G_{\text{spa}} Gspa 是对称有向图,对于每一个边 e i → j e_{i \to j} ei→j 都有 e j → i e_{j \to i} ej→i 。
(a) 编码两个 objects 和 OCR tokens 之间的 12 种关系的空间图
(b) 表示不同模态之间的 attention mask 。在 spatially aware self-attention layer 中,objects 和OCR tokens 基于空间关系的子集 T h ⊆ T spa \mathcal{T}^h \subseteq \mathcal{T}^{\text{spa}} Th⊆Tspa 相互添加。通过 t imp t_{\text{imp}} timp 关系加入问题。 任何输入 x ∈ X x \in X x∈X 都不参答案 y ans ∈ Y y^{\text{ans}}∈Y yans∈Y ,而 y ans y^{\text{ans}} yans 可以参与 X X X 中以及先前的答案 y < t ans y^{\text{ans}}_{<t} y<tans
Implicit Relationship between Objects, OCR and Question Tokens
对于 TextVQA 任务,不同类型的空间关系可能对于不同的问题是有用的。因此,要将问题的语义信息注入到 object 和 OCR 表示中,我们允许 object 和 OCR tokens 加入到问题 tokens 中。通过一个二分图 G imp ( R , X ques , E imp ) G_{\text{imp}} (\mathcal{R}, X^{\text{ques}}, \mathcal{E}_{\text{imp}}) Gimp(R,Xques,Eimp) 使用一个隐含的关系类型 t imp t_{\text{imp}} timp 的边 e i → j e_{i \to j} ei→j 把全部的 object 和 OCR tokens r i ∈ R r_i \in \mathcal{R} ri∈R 与全部的问题 tokens x j ∈ X ques \Bbb{x}_j \in X^{\text{ques}} xj∈Xques 连接。因此,通过关注问题,每个 object 和OCR token 都学会了将问题的有用语义信息隐式地合并到其表示中。
Spatial Aware Self-Attention Layer
在多头注意力的每个头上每个实体只关注通过空间图定义的邻居实体,限制每个头只能看关系的子集,以防止学习冗余特征。每个输入 x i \Bbb{x}_i xi 只关注通过关系类型 Φ e ( e i → j ) ∈ T h ⊆ T e \Phi_e(e_{i \to j}) \in \mathcal{T}^h \subseteq \mathcal{T}^e Φe(ei→j)∈Th⊆Te 的一个边 e i → j e_{i \to j} ei→j 连接的输入 x j \Bbb{x}_j xj 。
在 TextVQA 上下文中,使用两个图的结合
G
spa
∪
G
imp
G_{\text{spa}} \cup G_{\text{imp}}
Gspa∪Gimp 从全部的输入数据模态
x
∈
X
\Bbb{x} \in X
x∈X 定义所有的输入。每个头
h
h
h 所参与的关系 的子集
T
h
\mathcal{T}^h
Th 是
(
x
i
,
x
j
)
(\Bbb{x}_i,\Bbb{x}_j)
(xi,xj) 和问题和图像之间的一种隐式关系之间
c
c
c 个空间关系的子集:
T
h
=
{
t
imp
,
t
h
,
t
h
+
1
,
.
.
.
,
t
(
h
+
c
)
mod
∣
T
spa
}
,
t
∈
T
e
=
T
spa
∪
t
imp
(1)
\mathcal{T}^h = \{t_{\text{imp}}, t_h, t_{h+1}, ..., t_{(h+c) \; \text{mod} | \mathcal{T}^{\text{spa}}}\}, t \in \mathcal{T}^e = \mathcal{T}^{\text{spa}} \cup t_{\text{imp}} \tag{1}
Th={timp,th,th+1,...,t(h+c)mod∣Tspa},t∈Te=Tspa∪timp(1)
当
c
>
1
c > 1
c>1 时,多个头关注给定的空间关系,因此我们鼓励模型共同关注来自不同表示子空间的信息。 当
c
=
1
c = 1
c=1 时,每个头仅关注一种类型的空间关系。 类似地,当
c
=
∣
T
spa
∣
+
1
c = |\mathcal{T^{\text{spa}}}| + 1
c=∣Tspa∣+1时,每个头都处理所有空间关系以及隐式关系图。 根据经验,我们发现
c
=
2
c = 2
c=2 最适合我们的设置。
如上图所示,为了根据空间关系的子集
T
h
\mathcal{T}^h
Th 权衡每个头的注意力,我们引入一个偏差项定义为
b
i
,
j
h
=
{
β
t
1
h
t
l
∈
T
h
,
x
i
,
x
j
∈
X
−
∞
otherwise
(2)
b_{i,j}^h = \begin{cases} & \beta_{t1}^h & t_l \in \mathcal{T}^h, \Bbb{x}_i,\Bbb{x}_j \in X \\ & -\infty & \text{otherwise} \end{cases} \tag{2}
bi,jh={βt1h−∞tl∈Th,xi,xj∈Xotherwise(2)
修改不同输入的注意力权重
α
i
j
h
\alpha_{ij}^h
αijh 的计算。 具体来说,我们按以下方式计算注意力权重:
α
i
j
h
=
Softmax
(
q
i
h
(
k
j
h
)
T
+
b
i
,
j
h
d
h
)
(3)
\alpha_{ij}^h = \text{Softmax} \big(\frac{\Bbb{q}_i^h(k_j^h)^T + b_{i,j}^h}{\sqrt{d_h}} \big) \tag{3}
αijh=Softmax(dhqih(kjh)T+bi,jh)(3)
如上图,如果在节点
x
i
\Bbb{x}_i
xi 和
x
j
\Bbb{x}_j
xj 之间没有关系
t
l
∈
T
h
t_l \in \mathcal{T}^h
tl∈Th 的边
e
i
→
j
e_{i \to j}
ei→j ,然后相容性分数
q
i
h
(
k
j
h
)
T
+
b
i
,
j
h
\Bbb{q}_i^h(k_j^h)^T + b_{i,j}^h
qih(kjh)T+bi,jh 是负无穷大,则注意力权重
α
i
j
h
\alpha_{ij}^h
αijh 为 0 。否则的话,注意力权重可以基于特殊的边
t
l
=
Φ
e
(
e
i
→
j
)
t_l = \Phi_e (e_{i \to j})
tl=Φe(ei→j) 通过学习每个边的偏差
β
t
l
h
∈
{
β
t
1
h
,
.
.
.
,
β
∣
T
e
∣
h
}
\beta_{t_l}^h \in \{\beta_{t_1}^h, ..., \beta_{|\mathcal{T}^e|}^h\}
βtlh∈{βt1h,...,β∣Te∣h} 项进行调整。如果不想基于两个输入的边类型调整注意力,可以设置
β
t
l
h
\beta_{t_l}^h
βtlh 为 0 。
Causal Attention for Answer tokens
在解码期间,M4C 模型每个时间生成一个答案 y t ans ∀ t \Bbb{y}_t^{\text{ans}} \forall t ytans∀t 。 受到几种文本到文本模型成功的启发,M4C体系结构使用 causal attention mask ,其中 y t ans \Bbb{y}_t^{\text{ans}} ytans 使用所有问题,图像和OCR token 以及时刻 t t t 之前的答案 y < t ans \Bbb{y}_{<t}^{\text{ans}} y<tans 得到。在解码期间,在每个步骤中,模型都会将前一步骤中的预测 token 转换为 d d d 维向量 z t z_t zt 。 我们使用 z t z_t zt 计算与所有 OCR token和词汇单词的相似度,并选择最相似的一个。 我们以 12 个时间步长迭代地解码答案。
Implementation Details
与M4C的不同:
- 加入空间关系图, 并且把 self-attention 部分替换为 空间感知的 self-attention
- Question Features 使用预训练在 English Wikipedia 和 Book-Corpus 数据上的三层 BERT
- 目标检测和文本检测 : SA-M4C使用基于 ResNeXT-152 的Faster R-CNN模型提取特征, M4C使用的是基于 ResNet-101的 Faster R-Cnn
- 文本识别 : SA-M4C使用的是 Google OCR, M4C使用的是 Rosetten
- SA-M4C 额外添加了 2 个 transformer 层, 使用总共 6 层的 transformer, M4C使用的是 4 层
Experiments
在 TextVQA 数据集上的结果
在 ST-VQA 数据集上的结果
与 M4C 对比的一些例子: