本文介绍一下我之前的一个跨模态检索的工作,Triplet Fusion Network Hashing for Unpaired Cross-Modal Retrieval,论文被ACM ICMR2019接收为oral paper。
论文地址:论文PDF下载
论文代码:论文代码下载
1. 问题介绍
跨模态检索即通过一个模态的数据检索另一个模态的数据,例如以文搜图或者以图搜文。
显然,跨模态检索所涉及到的数据来自不同的模态(多模态数据)。而不同模态的数据的获取难度又不一样,譬如人们在社交网站上分享的照片可能是10张,但配的文字可能只有一句,因此不同模态的数据量存在很大的差异。根据这种差异,可以大致把多模态数据分为三种:
- 一对一成对数据(one-to-one paired data),即一张图片对应一张文本。这一类数据的模态间关联性是最强的,不存在任何其他的干扰。但是在现实生活中,这类数据往往较少。
- 一对多不成对数据(one-to-many unpaired data),即一张图片对应多个文本或者反过来。这一类数据也能提供模态间的关联性,但是这种关联比较模糊,一张图的语义会因为一对多的关系出现割裂。这类数据相较第一种数量会更多一些。
- 只有一个模态的不成对数据(unpaired data of only one modality),即只有图片或者文本。这种数据完全不能提供模态间的关联性,但是它们也是最容易获得的一种数据。
目前,大多数方法都集中处理第一种数据,它们一般利用数据之间的成对约束来构建模态间的关联性,进而学习一个共同的语义空间,利用这个空间的语义特征来表示不同模态的数据。第二类数据经过一些预处理也能被这些方法利用。常见的预处理有:随机丢掉多余的数据使其变成一对一关系,或者将较少的数据进行复制得到多对一对一关系。
只有很少的方法,如IMH,GSePH等关注第三类数据。IMH比较早,又由于是无监督方法,所以效果不是很理想。GSePH是2017CVPR的一篇文章,他首次将跨模态检索分为四种不同的任务:(1)单标签成对(single label paired, SL-P),(2)多标签成对(multi label paired, ML-P),(3)单标签不成对(single label unpaired, SL-U),(4)多标签不成对(multi label unapired, ML-U)。GSePH可以同时处理这四种任务。但由于篇幅原因,在那篇文章中,关于不成对场景的实验做的比较少,并没有很好的挖掘这个问题。
本文提出的Triplet Fusion Network Hashing(TFNH)方法就是为了更好地利用上述三类数据,并最大限度的挖掘这个模型处不成对数据的能力。
2. 方法介绍
TFNH的整体框架图如图所示,采用一个共享权重的三重网络组(triplet network)来同时处理成对数据和不成对数据,为它们学习特征表达h。网络后端紧接着一个标签分类器和两个数据分类器。标签分类器用来预测数据的标签。数据分类器是用来判断学习到的特征表达h是来自成对数据还是不成对数据,这个数据分类器和前面的三重网络共同构成了一个类似GAN的结构,三重网络希望为所有数据学习到的特征尽可能同分布,而数据分类器则希望尽可能分辨出两者。这个思想来自于ACMR(ACM MM2017 best paper),不过该文作者用这种方法分辨不同模态的数据,我在文中则是用来分辨不同性质的数据。最后,引入流形学习,用来构建不成对数据与成对数据之间的关系,加强整个网络处理不成对数据的能力。
2.1 问题描述
假设存在图片数据 X = [ X P , X U ] X=[X_P, X_U] X=[XP,XU],分别是成对数据和不成对数据 X P ∈ R n × d 1 X_P\in R^{n\times d_1} XP∈Rn×d1和 X U ∈ R n 1 × d 1 X_U\in R^{n_1\times d_1} XU∈Rn1×d1,文本数据 Y = [ Y P , Y U ] Y=[Y_P, Y_U] Y=[YP,YU],分别是成对数据和不成对数据 Y P ∈ R n × d 2 Y_P\in R^{n\times d_2} YP∈Rn×d2和 Y U ∈ R n 2 × d 2 Y_U\in R^{n_2\times d_2} YU∈Rn2×d2。其中 n ∗ n_* n∗为数据的数量, d ∗ d_* d∗为数据的维度。两个模态的数据对应的标签分别是 L X ∈ { 0 , 1 } ( n + n 1 ) × c L_X\in \{0,1\}^{(n+n_1)\times c} LX∈{0,1}(n+n1)×c L Y ∈ { 0 , 1 } ( n + n 2 ) × c L_Y\in \{0,1\}^{(n+n_2)\times c} LY∈{0,1}(n+n2)×c, c c c为类别数。最终的目的是为了所有数据学习一个长度为 l l l的哈希码 b ∈ { 0 , 1 } 1 × l b\in \{0,1\}^{1\times l} b∈{0,1}1×l。
2.2 三重融合网络
以往的大多数方法都采用的是双流网络结构(two-stream networks),就是用两条并行且独立的网络来分别处理不同模态的数据,而模态间的关联挖掘往往体现在网络末端施加的各种约束,网络结构本身对于关联挖掘起到的作用不大。我们采用融合网络的一个原因是想尽可能地利用网络本身去挖掘数据的关联性。
因为是将利用的融合网络,需要对特征进行拼接才能传入其中。对于成对数据,可以直接拼接起来得到:
F
x
y
(
k
)
=
[
X
P
(
k
)
,
Y
P
(
k
)
]
,
k
=
1
,
2
,
.
.
.
,
n
F_{xy}^{(k)}=[X_P^{(k)}, Y_P^{(k)}]\;\;\;, \;\;\; k=1,2,...,n
Fxy(k)=[XP(k),YP(k)],k=1,2,...,n
对于不成对数据,我们采用零补全操作(zero padding)来进行处理:
F
o
x
(
i
)
=
[
X
(
i
)
,
0
1
×
d
2
]
,
i
=
1
,
2
,
.
.
.
,
n
+
n
1
F_{ox}^{(i)} = [X^{(i)}, \textbf{0}^{1\times d_2}] \;\;\;, \;\;\; i=1,2,...,n+n_1
Fox(i)=[X(i),01×d2],i=1,2,...,n+n1
F
o
y
(
j
)
=
[
0
1
×
d
1
,
Y
(
j
)
]
,
j
=
1
,
2
,
.
.
.
,
n
+
n
2
F_{oy}^{(j)} = [\textbf{0}^{1\times d_1}, Y^{(j)}] \;\;\; , \;\;\; j=1,2,...,n+n_2
Foy(j)=[01×d1,Y(j)],j=1,2,...,n+n2
为了方便处理,也将成对数据视作不成对数据输入到网络中进行训练。
这里将三重网络定义为
G
(
⋅
;
θ
g
)
G(\cdot; \theta_{g})
G(⋅;θg),数据传入其中可以得到特征表达
H
x
y
,
o
x
,
o
y
=
G
(
F
x
y
,
o
x
,
o
y
;
θ
g
)
H_{xy,ox,oy}=G(F_{xy,ox,oy}; \theta_{g})
Hxy,ox,oy=G(Fxy,ox,oy;θg),进一步可以得到对应的哈希码
B
x
y
,
o
x
,
o
y
=
s
i
g
n
(
H
x
y
,
o
x
,
o
y
)
B_{xy,ox,oy}=sign(H_{xy,ox,oy})
Bxy,ox,oy=sign(Hxy,ox,oy)。
2.3 数据分类器
两个数据分类器
D
1
(
⋅
;
θ
d
1
)
D_1(\cdot ;\theta_{d_1})
D1(⋅;θd1)和
D
2
(
⋅
;
θ
d
2
)
D_2(\cdot ;\theta_{d_2})
D2(⋅;θd2)分别用来接收(成对数据,不成对图片)和(成对数据,不成对文本)作为输入。将前者视为true,后者视为false,希望能尽可能分辨出两者,于是定义损失:
L
a
d
v
(
1
)
=
∑
h
1
∈
H
^
x
y
∑
h
2
∈
H
^
o
x
(
l
o
g
D
1
(
h
1
;
θ
d
1
)
+
l
o
g
(
1
−
D
1
(
h
2
;
θ
d
1
)
)
)
\mathcal{L}_{adv}^{(1)} = \sum_{h_1\in \hat{H}_{xy}} \sum_{h_2\in \hat{H}_{ox}} (log D_1(h_1;\theta_{d_1})+log(1-D_1(h_2;\theta_{d_1})))
Ladv(1)=h1∈H^xy∑h2∈H^ox∑(logD1(h1;θd1)+log(1−D1(h2;θd1)))
和
L
a
d
v
(
2
)
=
∑
h
1
∈
H
^
x
y
∑
h
2
∈
H
^
o
y
(
l
o
g
D
2
(
h
1
;
θ
d
2
)
+
l
o
g
(
1
−
D
2
(
h
2
;
θ
d
2
)
)
)
\mathcal{L}_{adv}^{(2)} = \sum_{h_1\in \hat{H}_{xy}} \sum_{h_2\in \hat{H}_{oy}} (log D_2(h_1;\theta_{d_2})+log(1-D_2(h_2;\theta_{d_2})))
Ladv(2)=h1∈H^xy∑h2∈H^oy∑(logD2(h1;θd2)+log(1−D2(h2;θd2)))
将两部分加起来可得
L
a
d
v
=
L
a
d
v
(
1
)
+
L
a
d
v
(
2
)
\mathcal{L}_{adv} = \mathcal{L}_{adv}^{(1)} + \mathcal{L}_{adv}^{(2)}
Ladv=Ladv(1)+Ladv(2)
其中
H
^
x
y
=
{
H
x
y
(
i
)
∣
i
=
1
,
2
,
.
.
.
,
n
}
\hat{H}_{xy}=\{H_{xy}^{(i)}|i=1,2,...,n\}
H^xy={Hxy(i)∣i=1,2,...,n}。
2.4 标签分类器
标签分类器
C
(
⋅
;
θ
c
)
C(\cdot; \theta_c)
C(⋅;θc)用来预测每个样本的标签,其损失为
L
c
l
a
s
s
=
∑
h
∈
H
^
x
y
∪
H
^
o
x
∪
H
^
o
y
∣
∣
C
(
h
;
θ
c
)
−
l
a
b
∣
∣
2
2
\mathcal{L}_{class} =\sum_{h \in \hat{H}_{xy}\cup \hat{H}_{ox} \cup \hat{H}_{oy}} ||C(h; \theta_{c}) - lab||^2_2
Lclass=h∈H^xy∪H^ox∪H^oy∑∣∣C(h;θc)−lab∣∣22
2.5 流形学习
为了利用不成对数据,我们的设想是通过标签构建成对数据种中图片和文本的关联,然后通过流行结构构建各个模态中成对数据和不成对数据的关联,这样以来就能关联起不同模态的不成对数据。
对于成对数据,利用标签构建关联矩阵
S
x
y
(
i
j
)
=
{
1
,
i
f
X
P
(
i
)
a
n
d
Y
P
(
j
)
h
a
v
e
t
h
e
s
a
m
e
c
a
t
e
g
o
r
y
0
,
o
t
h
e
r
w
i
s
e
S_{xy}^{(ij)} = \left\{ \begin{array}{rcl} 1&, & if \; X_P^{(i)} \; and \; Y_P^{(j)} \; have \; the \; same \; category \\ 0&, &otherwise \end{array}\right.
Sxy(ij)={10,,ifXP(i)andYP(j)havethesamecategoryotherwise
对于不成对数据,利用流行结构构建关联矩阵
S
o
x
(
i
j
)
=
{
1
,
i
f
d
i
s
t
(
X
(
i
)
,
X
(
j
)
)
≤
t
h
r
e
s
h
h
o
l
d
0
,
o
t
h
e
r
w
i
s
e
S_{ox}^{(ij)} = \left\{ \begin{array}{rcl} 1 &, & if \; dist(X^{(i)}, X^{(j)})\leq threshhold \\ 0 & ,& otherwise \end{array}\right.
Sox(ij)={10,,ifdist(X(i),X(j))≤threshholdotherwise
S
o
y
(
i
j
)
=
{
1
,
i
f
d
i
s
t
(
Y
(
i
)
,
Y
(
j
)
)
≤
t
h
r
e
s
h
h
o
l
d
0
,
o
t
h
e
r
w
i
s
e
S_{oy}^{(ij)} = \left\{ \begin{array}{rcl} 1 & {,} & if \; dist(Y^{(i)}, Y^{(j)})\leq threshhold \\ 0 & {,} & otherwise \end{array}\right.
Soy(ij)={10,,ifdist(Y(i),Y(j))≤threshholdotherwise
这里的阈值设置为
t
h
r
e
s
h
o
l
d
=
m
a
x
(
d
i
s
t
(
⋅
,
⋅
)
)
/
20
threshold=max(dist(\cdot, \cdot))/{20}
threshold=max(dist(⋅,⋅))/20。
为了保留成对数据模态间的关联性,定义损失
L
i
n
t
e
r
=
∑
i
=
1
n
∑
j
=
1
n
S
x
y
(
i
j
)
∣
∣
H
x
y
(
i
)
−
H
x
y
(
j
)
∣
∣
2
2
\mathcal{L}_{inter} = \sum_{i=1}^n \sum_{j=1}^n S_{xy}^{(ij)}||H_{xy}^{(i)}-H_{xy}^{(j)}||^2_2
Linter=i=1∑nj=1∑nSxy(ij)∣∣Hxy(i)−Hxy(j)∣∣22
为了保留不成对数据和成对数据的模态内关联性,定义损失
L
i
n
t
r
a
=
∑
i
=
1
n
+
n
1
∑
j
=
1
n
+
n
1
S
o
x
(
i
j
)
∣
∣
H
o
x
(
i
)
−
H
o
x
(
j
)
∣
∣
2
2
+
∑
i
=
1
n
+
n
2
∑
j
=
1
n
+
n
2
S
o
y
(
i
j
)
∣
∣
H
o
y
(
i
)
−
H
o
y
(
j
)
∣
∣
2
2
\mathcal{L}_{intra} = \sum_{i=1}^{n+n_1} \sum_{j=1}^{n+n_1} S_{ox}^{(ij)}||H_{ox}^{(i)}-H_{ox}^{(j)}||^2_2 + \sum_{i=1}^{n+n_2} \sum_{j=1}^{n+n_2} S_{oy}^{(ij)}||H_{oy}^{(i)}-H_{oy}^{(j)}||^2_2
Lintra=i=1∑n+n1j=1∑n+n1Sox(ij)∣∣Hox(i)−Hox(j)∣∣22+i=1∑n+n2j=1∑n+n2Soy(ij)∣∣Hoy(i)−Hoy(j)∣∣22
2.6 问题求解
整体的损失函数为
L
a
l
l
=
L
c
l
a
s
s
+
β
L
i
n
t
e
r
+
γ
L
i
n
t
r
a
−
μ
L
a
d
v
\mathcal{L}_{all} = \mathcal{L}_{class} + \beta \mathcal{L}_{inter} + \gamma \mathcal{L}_{intra} - \mu \mathcal{L}_{adv}
Lall=Lclass+βLinter+γLintra−μLadv
采用以下式子优化各个参数
(
θ
g
,
θ
c
)
=
arg
min
θ
g
,
θ
c
L
a
l
l
(\theta_g,\theta_c) = \arg\min_{\theta_g,\theta_c} \mathcal{L}_{all}
(θg,θc)=argθg,θcminLall
(
θ
d
1
,
θ
d
2
)
=
arg
max
θ
d
1
,
θ
d
2
L
a
l
l
=
arg
min
θ
d
1
,
θ
d
2
L
a
d
v
(\theta_{d_1},\theta_{d_2}) = \arg\max_{\theta_{d_1},\theta_{d_2}} \mathcal{L}_{all} = \arg\min_{\theta_{d_1},\theta_{d_2}} \mathcal{L}_{adv}
(θd1,θd2)=argθd1,θd2maxLall=argθd1,θd2minLadv
3. 实验
3.1 成对数据检索结果
主要在两个数据集Wiki和Mirflickr上进行了实验,评价标准是map@all。
3.2 不成对数据检索结果
实验1
首先,遵从GSePH的设置,将Wiki数据集中的一个模态的数据随机去除10%,得到两个不同的数据集:
- case1:90%图片+100%文本
- case2:100%图片+90%文本
结果如下表,可以看到,相比成对数据的结果,我们的方法并没有下降多少。GSePH原文中的结果,成对场景用的是map@all,而不成对场景用的是map@50。为了更公平的评价不成对数据对检索结果的影响,这里一律用的是map@all,因此与原文数据有出入。
实验2
为了进一步探索TFNH处理不成对数据的能力,我们进一步地舍弃更多的数据,得到
- case1: X%图片+100%文本
- case2:100%图片+X%文本
其中X=90, 80, 70, 60, 50。得到如下图结果。可以看到case1中I2T结果随着图片的减少而逐渐降低,而T2I结果则基本维持不变。可能是因为图片数据的减少导致模型处理图片的能力降低。case2则出现了相反的结果。
实验3
为了探索TFNH处理成对约束的能力,我们设计了第三个实验,在保证数据不减少的情况下,丢弃部分数据的成对关系,将其视为不成对数据。结果如下,可以看到我们的方法对于成对约束的依赖是较小的。在区间70%-90%和40%-60%之间基本保持稳定。
3.3 Ablation Analysis
最后研究了各项损失之间的重要性,通过No.1-3或者No. 1,4,5的对比,可以发现
L
i
n
t
r
a
\mathcal{L}_{intra}
Lintra起到的作用最大,其次是
L
a
d
v
\mathcal{L}_{adv}
Ladv,最后是
L
i
n
t
e
r
\mathcal{L}_{inter}
Linter。这说明,通过流形结构挖掘不成对数据之间的关联性是有效的。
4. 总结
我们利用三重融合网络来处理成对数据和不成对数据,利用流形学习来挖掘数据间的关联性,并用GAN的思想来对其进行监督。最终的模型能够很好的处理不成对数据并取得良好的检索结果,同时对成对约束的依赖也较小。