损失函数约束类间不一致性及类内一致性
参考书籍:Python深度学习-基于PyTorch
交叉熵损失函数对不同类之间的距离的区分性较小。原因:softmax具备分类能力但是不具备度量学习的特征,没法压缩同一类别。因此,研究者们提出了几种损失函数。
(1)三元组损失Triplet loss
三元组损失属于度量学习,通过计算两张图象之间的相似度,使得输入图像被归入到相似度大的图像类别中去。
L
t
=
∑
[
∥
f
(
x
i
a
)
−
f
(
x
i
p
)
∥
2
2
−
∥
f
(
x
i
a
)
−
f
(
x
i
n
)
∥
2
2
+
α
]
+
L_t=\sum [\left \| f(x_{i}^{a}) -f(x_{i}^{p}) \right \|_{2}^{2}-\left \| f(x_{i}^{a}) -f(x_{i}^{n}) \right \|_{2}^{2}+\alpha ]_{+}
Lt=∑[∥f(xia)−f(xip)∥22−∥f(xia)−f(xin)∥22+α]+
∑
\sum
∑表示一个batch内所有图像的损失和,
x
i
a
、
x
i
p
、
x
i
n
x_{i}^{a}、x_{i}^{p}、x_{i}^{n}
xia、xip、xin为每次从训练数据中去除的3张图像,前两项为同一类,第三项为不同类。||表示欧式距离。
[
]
+
[]_{+}
[]+表示当括号内值大于0时,为括号内值,否则取0。
优点:使用量化学习解决特征表示的类别间距问题;缺点:在训练过程中,对元组的选择的要求的技巧较高,而且要求数据集比较大。
(2)中心损失Center Loss
Center Loss用于压缩同一类别,为每个类别提供一个类别中心,最小化每个样本与其类别中心的距离。
L
c
=
∑
∥
x
i
−
c
y
i
∥
2
2
L_c=\sum\|x_i-c_{y_i}\|_2^2
Lc=∑∥xi−cyi∥22。其中,
x
i
x_i
xi为一个样本,
y
i
y_i
yi为对应样本类别,
c
y
i
c_{y_i}
cyi为该类别中心。该损失函数可较好的解决类间内聚性。利用中心损失的同时,一般还会加上softmax损失以保证类间的可分性。所以,最终的损失函数包括softmax损失和中心损失。
L
=
λ
×
L
c
+
L
s
o
f
t
m
a
x
L=\lambda \times L_c+L_{softmax}
L=λ×Lc+Lsoftmax.其中,
λ
\lambda
λ用于平衡两种损失函数,该权重越大,生成的特征就会越具有内聚性。优点:训练得到的特征具有内聚性;缺点:当类别数目较多时(>10000)时,内存消耗大,对GPU的要求非常高。
(3)ArcFace损失additive angular margin loss该损失函数使用归一化的网络权重和偏差来计算损失函数,对原输出
ω
y
i
T
x
i
+
b
y
i
\omega_{y_i}^Tx_i+b_{y_i}
ωyiTxi+byi可转化为
∣
ω
y
i
∣
⋅
∣
x
i
∣
⋅
c
o
s
(
θ
)
|\omega_{y_i}|\cdot|x_i|\cdot cos(\theta)
∣ωyi∣⋅∣xi∣⋅cos(θ),
θ
\theta
θ 为
ω
y
i
,
x
i
\omega_{y_i},x_i
ωyi,xi之间的角度。对输出归一化为
s
⋅
(
c
o
s
(
θ
y
i
)
+
m
)
s\cdot(cos(\theta_{y_i})+m)
s⋅(cos(θyi)+m)得到新的损失函数为
优点:不仅对权重进行了正则化,对特征也进行了正则化。