1.引言
这一篇总结已经写好很久了,一直没时间发到博客里.是因为这篇我完全是按照公式去推理的,怕大家对很长很长的公式反感,所以一直没在博客里.
但是我觉得这篇论文的思想还是蛮重要的,(它提出的动态自注意力我觉得现在很多方向仍然可以使用!)因此本篇博客想从理论出发,用通俗的语言来解释每一个公式的含义.希望能够帮助到各位!
文章的引言和相关工作介绍了之前VQA的一些方法,从全局特征融合到局部特征是怎么玩儿呢,还有很多的注意力网络.如果感兴趣可以去原文看看!
论文地址
参考博客
2.理论部分
2.0 方法总览图
2.1 特征提取部分
假设原始输入图片是V[3,448,448],代表一张图片V,长和宽均为448,有三个通道。原始输入问题是Q[14],代表一个问题Q,问题由14个词组成.
视觉那边特征提取用一个预训练好的FastRCNN。文本那边的词嵌入用预训练的Glove,特征提取用一个GRU。
R
=
F
a
s
t
R
C
N
N
(
V
)
∈
R
μ
×
2048
\begin{equation} R = FastRCNN(V) \in \mathbb{R}^{ \mu \times 2048} \end{equation}
R=FastRCNN(V)∈Rμ×2048
E
=
G
R
U
(
G
l
o
v
e
(
Q
)
)
∈
R
14
×
1280
\begin{equation} E = GRU(Glove(Q)) \in \mathbb{R}^{ 14 \times 1280} \end{equation}
E=GRU(Glove(Q))∈R14×1280
R代表原图上的
μ
\mu
μ个目标框,每个目标框用一个2048维的向量表示。E代表问题有14个单词,每个单词用1280维的向量表示。
2.2 模态间的co-attention(共同注意力)
首先要明确为什么做的是共同注意力而不是双线性融合里面的协同注意力,因为协同注意力只考虑文本对视觉的影响,而实际上视觉对文本也会产生影响,因此我们需要去做双向的注意力,也就是共同注意力机制。
我们以
I
t
e
r
M
A
F
R
←
E
IterMAF_{R\leftarrow E}
IterMAFR←E(模态间视觉注意力流)为例,来过一遍更新视觉特征的计算过程,
I
t
e
r
M
A
F
E
←
R
IterMAF_{E\leftarrow R}
IterMAFE←R同理。
I
t
e
r
M
A
F
R
←
E
IterMAF_{R\leftarrow E}
IterMAFR←E是为了更新视觉特征,应该是用R作为查询,被查询对象是E。
R
=
(
R
1
R
2
⋮
R
μ
)
,
R
i
∈
R
1
×
2048
,
E
=
(
E
1
E
2
⋮
E
14
)
,
E
i
∈
R
1
×
1280
\begin{equation}%\quad是为了将它们两放在同一行! R = \begin{pmatrix} R_1 \\ R_2 \\ \vdots \\ R_{\mu} \\ \end{pmatrix} \ , R_i\in \mathbb{R}^{1\times 2048} \quad , E = \begin{pmatrix} E_1 \\ E_2 \\ \vdots \\ E_{14} \\ \end{pmatrix} \ , E_i\in \mathbb{R}^{1\times 1280} \end{equation}
R=
R1R2⋮Rμ
,Ri∈R1×2048,E=
E1E2⋮E14
,Ei∈R1×1280
R
Q
=
(
R
1
Q
R
2
Q
⋮
R
μ
Q
)
=
(
R
1
W
Q
R
R
2
W
Q
R
⋮
R
μ
W
Q
R
)
=
(
R
1
R
2
⋮
R
μ
)
W
Q
R
=
R
W
Q
R
∈
R
μ
×
d
i
m
\begin{equation} R_Q = \begin{pmatrix} R^Q_1 \\ R^Q_2 \\ \vdots \\ R^Q_{\mu} \\ \end{pmatrix} = \begin{pmatrix} R_1W^R_Q \\ R_2W^R_Q \\ \vdots \\ R_{\mu}W^R_Q \\ \end{pmatrix} = \begin{pmatrix} R_1 \\ R_2 \\ \vdots \\ R_{\mu} \\ \end{pmatrix}W^R_Q = RW^R_Q \in \mathbb{R}^{\mu \times dim} \end{equation}
RQ=
R1QR2Q⋮RμQ
=
R1WQRR2WQR⋮RμWQR
=
R1R2⋮Rμ
WQR=RWQR∈Rμ×dim
E
K
=
(
E
1
K
E
2
K
⋮
E
14
K
)
=
(
E
1
W
K
E
E
2
W
K
E
⋮
E
14
W
K
E
)
=
(
E
1
E
2
⋮
E
14
)
W
K
E
=
E
W
K
E
∈
R
14
×
d
i
m
\begin{equation} E_K = \begin{pmatrix} E^K_1 \\ E^K_2 \\ \vdots \\ E^K_{14} \\ \end{pmatrix} = \begin{pmatrix} E_1W^E_K \\ E_2W^E_K \\ \vdots \\ E_{14}W^E_K \\ \end{pmatrix} = \begin{pmatrix} E_1 \\ E_2 \\ \vdots \\ E_{14} \\ \end{pmatrix}W^E_K = EW^E_K \in \mathbb{R}^{14 \times dim} \end{equation}
EK=
E1KE2K⋮E14K
=
E1WKEE2WKE⋮E14WKE
=
E1E2⋮E14
WKE=EWKE∈R14×dim
E
V
=
(
E
1
V
E
2
V
⋮
E
14
V
)
=
(
E
1
W
V
E
E
2
W
V
E
⋮
E
14
W
V
E
)
=
(
E
1
E
2
⋮
E
14
)
W
V
E
=
E
W
V
E
∈
R
14
×
d
i
m
\begin{equation} E_V = \begin{pmatrix} E^V_1 \\ E^V_2 \\ \vdots \\ E^V_{14} \\ \end{pmatrix} = \begin{pmatrix} E_1W^E_V \\ E_2W^E_V \\ \vdots \\ E_{14}W^E_V \\ \end{pmatrix} = \begin{pmatrix} E_1 \\ E_2 \\ \vdots \\ E_{14} \\ \end{pmatrix}W^E_V = EW^E_V \in \mathbb{R}^{14 \times dim} \end{equation}
EV=
E1VE2V⋮E14V
=
E1WVEE2WVE⋮E14WVE
=
E1E2⋮E14
WVE=EWVE∈R14×dim
em…,公式有点懵嘛?别走!坚持一下,听我解释解释.
Eq(3)的主要目的是为了写一下
R
i
R_i
Ri和
E
i
E_i
Ei,
R
i
R_i
Ri表示原图上的一个框框的特征向量,
E
i
E_i
Ei表示原文本第i个单词的向量表示(这里是为了大家能懂才这么解释,实际上
E
i
E_i
Ei代表的仅仅是一个词级别的特征,不过都不重要,先按我这么理解着)。
Eq(4)-Eq(6)都是注意力机制那块的东西。Eq(4)代表视觉特征的查询,Eq(5)和Eq(6)是被查询对象E的key和value。
其中 R ∈ R μ × 2048 R\in \mathbb{R}^{\mu \times 2048} R∈Rμ×2048 , E ∈ R 14 × 1280 E \in \mathbb{R}^{14 \times 1280} E∈R14×1280 . R i Q ∈ R 1 × d i m R^Q_i \in \mathbb{R}^{1\times dim} RiQ∈R1×dim是代表 R i R_i Ri的查询向量 , W Q R ∈ R 2048 × d i m W^R_Q \in \mathbb{R}^{2048\times dim} WQR∈R2048×dim. E i K ∈ R 1 × d i m E^K_i \in \mathbb{R}^{1\times dim} EiK∈R1×dim是代表 E i E_i Ei的被查询向量 , W K E ∈ R 1280 × d i m W^E_K \in \mathbb{R}^{1280\times dim} WKE∈R1280×dim. E i V ∈ R 1 × d i m E^V_i \in \mathbb{R}^{1\times dim} EiV∈R1×dim是代表 E i E_i Ei的值向量 , W V E ∈ R 1280 × d i m W^E_V \in \mathbb{R}^{1280\times dim} WVE∈R1280×dim.
下面开始计算新的 R 1 R_1 R1,其余新的 R i R_i Ri计算同理,具体计算过程如下:
Step1:计算
E
i
E_i
Ei与
R
1
R_1
R1的注意力分数
{
α
11
R
=
S
o
f
t
m
a
x
(
R
1
Q
(
E
1
K
)
T
d
i
m
)
α
12
R
=
S
o
f
t
m
a
x
(
R
1
Q
(
E
2
K
)
T
d
i
m
)
⋮
α
1
,
14
R
=
S
o
f
t
m
a
x
(
R
1
Q
(
E
14
K
)
T
d
i
m
)
\begin{equation} \left\{ \begin{aligned} \alpha^R_{11}& = Softmax(\frac{R^Q_1(E^K_1)^T}{\sqrt{dim}}) \\ \alpha^R_{12}& = Softmax(\frac{R^Q_1(E^K_2)^T}{\sqrt{dim}}) \\ \vdots \\ \alpha^R_{1,14}& = Softmax(\frac{R^Q_1(E^K_{14})^T}{\sqrt{dim}}) \end{aligned} \right. \end{equation}
⎩
⎨
⎧α11Rα12R⋮α1,14R=Softmax(dimR1Q(E1K)T)=Softmax(dimR1Q(E2K)T)=Softmax(dimR1Q(E14K)T)
Step2:计算新的
R
1
R_1
R1,新的
R
1
R_1
R1定义为
R
1
u
p
d
a
t
e
R^{update}_1
R1update
R
1
u
p
d
a
t
e
=
∑
i
=
1
14
α
1
i
R
E
i
V
∈
R
1
×
d
i
m
\begin{equation} R^{update}_1 = \sum_{i=1}^{14}\alpha^R_{1i}E^V_i \ \in \mathbb{R}^{1\times dim} \end{equation}
R1update=i=1∑14α1iREiV ∈R1×dim
重复Setp1到Step2,可以得到:
R
i
u
p
d
a
t
e
,
i
=
2
,
3
,
.
.
.
,
μ
R^{update}_i , i=2,3,...,\mu
Riupdate,i=2,3,...,μ,记:
R
u
p
d
a
t
a
=
(
R
1
u
p
d
a
t
e
R
2
u
p
d
a
t
e
⋮
R
μ
u
p
d
a
t
e
)
∈
R
μ
×
d
i
m
\begin{equation} R_{updata} = \begin{pmatrix} R^{update}_1 \\ R^{update}_2 \\ \vdots \\ R^{update}_{\mu} \\ \end{pmatrix} \ \in \mathbb{R}^{\mu \times dim} \end{equation}
Rupdata=
R1updateR2update⋮Rμupdate
∈Rμ×dim
然后原论文说:将原来的
R
R
R与
R
u
p
d
a
t
a
R_{updata}
Rupdata拼接,可以得到一个
μ
×
(
2048
+
d
i
m
)
\mu \times (2048+dim)
μ×(2048+dim)的张量,然后再经过一个线性映射得到更新后的R。
R
=
c
o
n
c
a
t
(
R
,
R
u
p
d
a
t
e
)
W
R
∈
R
μ
×
2048
,
W
R
∈
R
(
2048
+
d
i
m
)
×
2048
\begin{equation} R = concat(R,R_{update})W_R \ \in \mathbb{R}^{\mu \times 2048} , W_R \in \mathbb{R}^{(2048+dim)\times 2048} \end{equation}
R=concat(R,Rupdate)WR ∈Rμ×2048,WR∈R(2048+dim)×2048
然后再用这个更新后的R,作为被查询对象,一样的步骤,去得到更新后的E。这里可以自己推一下,我们就不写了!然后得到更新好的R与E,可以理解为R中的视觉信息受到了文本信息的约束,E中的文本信息受到了视觉信息的影响,其实说白了就是两者都有了对方的信息。
2.3 动态模态间的自注意力流
首先解释一下什么是自注意力流,上一节说过新的R与E会作为本小节的输入,那么自注意流就是R与自身做注意力,E也与自身做注意力。(我们叫Eq11为朴素模态内信息流)
实际上用公式刻画就是:
R
=
S
o
f
t
m
a
x
(
R
Q
R
K
T
d
i
m
)
R
V
,
E
=
S
o
f
t
m
a
x
(
E
Q
E
K
T
d
i
m
)
E
V
\begin{equation} R = Softmax(\frac{R_QR^T_K}{\sqrt{dim}})R_V \ ,\ E = Softmax(\frac{E_QE^T_K}{\sqrt{dim}})E_V \end{equation}
R=Softmax(dimRQRKT)RV , E=Softmax(dimEQEKT)EV
若是上面这种朴素的模态内信息流,只是单纯利用模态内的信息来估计区域到区域和词到词之间的相似度,它所确定的区域与区域之间的关系永远都是一样的,词与词之间的关系也是永远一样的,所以有些很重要的关系只能通过来自另一模态中的信息来确定,例如,即使对于相同的输入图像,不同的视觉区域对之间的关系也应该根据不同的问题具有不同的权重。因此作者提出来一种动态的模态内注意流,用于基于另一模态的信息来计算模态关系的重要性。(也就是说,即使是模态内的自注意,也不纯粹是模块内的,而是动态的,收到另一模态约束的)
它所确定的区域与区域之间的关系永远都是一样的,这句话的意思是说:假设我现在图片的内容是一个人正在滑滑板,然后滑板是一个区域,滑板上面的人是一个区域,背景(雪)是一个区域,然后如果是朴素的自注意力,那么人和滑板之间的关系程度可能为0.6,滑板和背景的关注程度可能为0.3,因为毕竟只是做了区域与区域之间的相似度它不会非常细节的考虑到滑板与背景之间的关系。而如果加了一个外部条件(问题)就可以改变它们之间的关注程度(这就叫动态):这个人在什么地方滑滑板?那这样的话再去做自注意力的时候,就有了问题的限制,从而自注意力会更加关注滑板与背景之间的关注程度,这就是所谓的动态自注意力!一句话说:可以根据条件的限制来改变对各个区域的关注度。
为了解释自注意力和动态自注意力,我搞了一张图:可以再次根据图去理解一下。
有了上面的解释,下面的内容应该好理解了。那现在:如果我想去更新视觉区域,我应该同时用一个文本来限制我的更新视觉区域的注意力。
以更新视觉,文本做限制为例。假设上面通过模态间共同注意力得到的新的视觉特征记为R,得到新的文本特征记为E,其中 R ∈ R μ × 2048 , E ∈ R 14 × 1280 R \in \mathbb{R}^{\mu \times 2048} , E \in \mathbb{R}^{14\times 1280} R∈Rμ×2048,E∈R14×1280。
Step1:
将文本特征沿着词维度进行平均池化,得到一个向量q,
q
∈
R
1
×
1280
q\in \mathbb{R}^{1\times 1280}
q∈R1×1280。然后再将q做两个线性变换(这个目的是为了与后面
R
Q
,
R
K
,
R
V
R_Q,R_K,R_V
RQ,RK,RV的维度匹配),然后再加上一个Sigmoid层进行非线性激活,这个过程下来得到的结果记为:
G
E
∈
R
μ
×
dim
G_E \in \mathbb{R}^{\mu \times \dim}
GE∈Rμ×dim,相当于一个限制特征,原文里面叫做通道调节门。这个流程我也画了个图,方便大家理解!
Step2: 将限制放到查询和被查询对象上,如下:
R
Q
^
=
(
1
+
G
E
)
⋅
R
Q
,
R
K
^
=
(
1
+
G
E
)
⋅
R
K
\begin{equation} \hat{R_Q} = (1+G_E)\cdot R_Q \ , \ \hat{R_K} = (1+G_E)\cdot R_K \end{equation}
RQ^=(1+GE)⋅RQ , RK^=(1+GE)⋅RK
(Eq12的本质意思是:我的视觉查询也应该收到文本的限制,视觉key也一样.但是注意!这里视觉的value还是原来的value)
R Q R_Q RQ和 R K R_K RK和 R V R_V RV和前面的一样,是共享的。然后 ⋅ \cdot ⋅是逐元素乘法,em在latex里面我没有找到那个符号,暂时用这个符号代替哈!然后解释一下为什么 G E G_E GE要加上1:原本没讲,但个人猜测是为了尽量减少问题的先验而产生的误判,从而提升后验正确率的提升。
Step3: 计算
R
u
p
d
a
t
e
R_{update}
Rupdate
R
s
c
o
r
e
=
S
o
f
t
m
a
x
(
R
Q
^
(
R
K
^
)
T
d
i
m
)
∈
R
μ
×
μ
\begin{equation} R_{score} = Softmax(\frac{\hat{R_Q}(\hat{R_K})^T}{\sqrt{dim}}) \in \mathbb{R}^{\mu \times \mu} \end{equation}
Rscore=Softmax(dimRQ^(RK^)T)∈Rμ×μ
R
u
p
d
a
t
e
=
S
o
f
t
m
a
x
(
R
Q
^
(
R
K
^
)
T
d
i
m
)
R
V
∈
R
μ
×
d
i
m
\begin{equation} R_{update} = Softmax(\frac{\hat{R_Q}(\hat{R_K})^T}{\sqrt{dim}})R_V \in \mathbb{R}^{\mu \times dim} \end{equation}
Rupdate=Softmax(dimRQ^(RK^)T)RV∈Rμ×dim
Step4: 残差连接作为最后的输出
R
=
(
R
+
R
u
p
d
a
t
e
W
u
p
)
∈
R
μ
×
2048
\begin{equation} R = (R + R_{update}W_{up}) \ \in \mathbb{R}^{\mu \times 2048} \end{equation}
R=(R+RupdateWup) ∈Rμ×2048
其中 W u p ∈ R d i m × 2048 W_{up} \in \mathbb{R}^{dim\times 2048} Wup∈Rdim×2048
然后再用同样的方式去得到动态自注意力更新后的E即可。这里要特别提醒一下看原论文的同学,原论文的公式16我觉得是写错了,应该为:
最后的最后,把模态间的co-attention和模态内的动态self-attention二者作为一个模块,堆叠起来就可以了.堆叠的方式可以选择Stacking或者Encoder-Decoder,都可以(原文用的是Stacking)。
3. 写在最后
制作不易!如果对您有帮助请动动您发一区的小手点个赞吧~
如果转载本篇博客需征得本人的同意,盗者必究!