孪生神经网络
孪生神经网络
孪生神经网络(Siamese network)主要用途是比较两图片的相似程度,其核心思想就是权值共享。
卷积神将网络是通过卷积运算提取图像的特征进行训练的,如果想比较两个图像的相似程度,也要对两个图像分别进行特征提取,只判断特征的相似度就可以了。然而不同的卷积核运算后得到的特征很有可能不在一个域中,所以要使用同一个网络进行特征提取。
孪生神经网络的优点:对于类别不平衡问题鲁棒性更强,更易于做集成学习,可以从语义相似性上学习来估测两个输入的距离。
孪生神经网络的缺点,由于有两个输入,两个子网,其训练相对于常规网络运算量更大,需要的时间更长。输出的结果是两个类间的距离而不是概率
训练过程
训练集
孪生神经网络不需要每一类都有很多图片,其训练集叫做support set,数据集的类别可以很多,每个类别只需几张图片即可。
首先选择一个神经网络f,对输入图像进行特征提取,提取结果为h1和h2,z表示两个向量之间的区别,再加上全连接层处理z向量,最后用sigmoid函数输出为一个标量(如果两个图片是同一类,则输出应该接近1,如果不是同一类则应该接近0)。
损失函数
`Triplet Loss
Triplet Loss三元组损失函数,其应用见谷歌2015年发表在CVPR上的做人脸验证的论文facenet。该损失函数定义一个三元组作为输入,分别是
(
X
a
n
c
h
o
r
,
X
p
o
s
i
t
i
v
e
,
X
n
e
g
a
t
i
v
e
)
(X_{anchor},X_{positive},X_{negative})
(Xanchor,Xpositive,Xnegative)
这三个输入的通过如下方式构成,先从训练数据集中随机选一个样本作为Anchor,再随机选取一个和Anchor属于同一类的样本作为正样本
X
p
o
s
i
t
i
v
e
X_{positive}
Xpositive,和一个不同类的样本作为负样本
X
n
e
g
a
t
i
v
e
X_{negative}
Xnegative ,通过这种方式定义一个输入的三元组
X
a
n
c
h
o
r
,
X
p
o
s
i
t
i
v
e
,
X
n
e
g
a
t
i
v
e
X_{anchor},X_{positive},X_{negative}
Xanchor,Xpositive,Xnegative,将其输入到网络可以得到对应的特征向量
[
f
(
X
a
n
c
h
o
r
)
,
f
(
X
p
o
s
i
t
i
v
e
)
,
f
(
X
n
e
g
a
t
i
v
e
)
]
[f(X_{anchor}),f(X_{positive}),f(X_{negative})]
[f(Xanchor),f(Xpositive),f(Xnegative)]
Triplet Loss的目的是通过训练,使得同种类别的距离更近,不通类别的距离更大,即拉近anchor与positive;推远anchor和negative。
通过这种相似度比较式的学习,模型不仅与同类别更像,还学会了与不同类别增大区分度的信息。通常定义一个
α
alpha
α,使得Anchor距离Negative的距离比距离Positive大
α
alpha
α, 公式化表示为:
∣
f
(
X
a
n
c
h
o
r
)
−
f
(
X
n
e
g
a
t
i
v
e
)
∣
∣
−
∣
∣
f
(
X
a
n
c
h
o
r
)
−
f
(
X
p
o
s
i
t
i
v
e
)
∣
∣
>
α
|f(X_{anchor}) - f(X_{negative})|| - ||f(X_{anchor}) - f(X_{positive})|| gt alpha
∣f(Xanchor)−f(Xnegative)∣∣−∣∣f(Xanchor)−f(Xpositive)∣∣>α
定义为:
L
(
X
a
n
c
h
o
r
,
X
p
o
s
i
t
i
v
e
,
X
n
e
g
a
t
i
v
e
)
=
m
a
x
(
∣
∣
f
(
X
a
n
c
h
o
r
)
−
f
(
X
p
o
s
i
t
i
v
e
)
∣
∣
−
∣
∣
f
(
X
a
n
c
h
o
r
)
−
f
(
X
n
e
g
a
t
i
v
e
)
∣
∣
+
α
,
0
)
L(X_{anchor}, X_{positive}, X_{negative}) = max(||f(X_{anchor}) - f(X_{positive})|| - ||f(X_{anchor}) - f(X_{negative})|| + alpha, 0)
L(Xanchor,Xpositive,Xnegative)=max(∣∣f(Xanchor)−f(Xpositive)∣∣−∣∣f(Xanchor)−f(Xnegative)∣∣+α,0)
Contrastive Loss
Contrastive Loss的输入是一对样本,基于相似的一对对象特征距离应该更小,不相似的一对对象特征距离应该较大来计算。从数据中选一对样本
(
X
a
,
X
b
)
(X_a, X_b)
(Xa,Xb),这两个样本的欧式距离表示为$d=||X_a-X_b||_2=sqrt{({X_a-X_b})^2}d=∣∣X $
则Contrastive Loss可表示为:
L
(
X
a
,
X
b
)
=
(
1
−
Y
)
1
2
d
2
+
Y
1
2
{
m
a
x
(
0
,
m
−
d
)
}
2
L(X_a,X_b) = (1-Y)frac{1}{2}d^2 + Yfrac{1}{2}{max(0, m-d)}^2
L(Xa,Xb)=(1−Y)21d2+Y21{max(0,m−d)}2
Y表示
X
a
,
X
b
)
X_a,X_b)
Xa,Xb)是否匹配,匹配为1不匹配为0
m是设置的安全距离,当
(
X
a
,
X
b
)
(X_a, X_b)
(Xa,Xb)的距离小于m 时,Contrasive Loss将变成0,这使得
X
a
X_a
Xa
与
X
b
X_b
Xb 相似而不是相同,能保证算法的泛化能力
有了损失函数就可以通过反向传播进行参数更新了