在类似siamese 网络里一般我们用对比损失函数Contrastive Loss函数。它一般是在孪生网络里提取特征时用的。它根据两组特征向量来计算loss。
具体公式如下:
L=\frac{1}{2N}\sum_{n=1}^Nyd^2+(1-y)max(margin-d,0)^2
其中N为样本数。
d表示两个向量的欧式距离:
d=||a_n - b_n||_2
y为1表示两个特征向量是同一类,比如都是同一个人的头像。y为0表示两个特征向量属于不同类。

因为我们需要根据loss来训练网络,我们希望如果同一个分类,loss值随着d值得增大而增大。这样经过训练后同一个分类的两个向量就更加集中。如果不是同一个分类,loss值应该随着d值得减小而增大。而且我们希望放大loss来加速网络训练。

而对比损失函数刚好就是这么设计的:
当两个特征向量表示同一个分类时(y=1):
L=\frac{1}{2N}\sum d^2
这时d越大L就越大,而且有平方项来放大。
当两个特征向量表示的不是同一个分类时(y=0):
L=\frac{1}{2N}\sum max(margin-d,0)^2
margin是一个超参数,用来调节你认为两个类别之间的安全距离。max(margin-d,0)表示大于安全距离就认为loss为0。如果小于我们设置的安全距离,则两个类别之间的距离d越小max(margin-d,0)越大。同样也有平方项来放大loss。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: