本文介绍以下损失函数:
①PermutationLoss
②CrossEntropyLoss
③PermutationLossHung
④OffsetLoss
⑤FocalLoss
⑥InnerProductLoss
⑦HammingLoss
(顺序依照ThinkMatch工程中 src/loss_func.py 的顺序)
OffsetLoss
18年的Deep Learning of Graph Matching将深度学习与Graph Matching进行首次结合,论文中对以往一些方法进行了组合,并着重对Graph Matching训练过程中的反向传播进行了严密的推导,其中采用的损失函数为 OffsetLoss
其中φ函数形式如下,即对两位移向量(displacement vector)di、di^gt 之差进行度量,得到一标量。
根号下后一项为一极小数,避免X^TX为0,影响训练的稳定性
di、di^gt 由论文中所提出的 Voting layer进行转换,这一layer,在工程中被称作 displacement_layer,也在src目录下。
displacement vector的计算公式:
对应的代码理解:
①对s进行输出,得到8个10*10的矩阵,8表示batch size的大小,矩阵的大小由source image和target image中节点数决定。(表示两张图 各自节点之间的匹配关系)
②对P_src 和 P_tgt进行输出,都得到了(8,10,2)维度的矩阵。
其内容为坐标值?
是的
target值和source值是否存在数据集中?
是,后面的9行暂时不知道是啥
source得到的point set是否会随着VGG的训练而不断改变?
不会,那VGG是对Pointset中每个点周围的特征进行提取吗?
③对ns-gt进行输出,得到每一组2GM(Graph Matching)的配对数。
④displacement_layer的代码如下:
if ns_gt is None: # 如果整个Batch 8组图片(2*8张图片)中存在配对
max_n = s.shape[1]
P_src = P_src[:, 0:max_n, :]
grad_mask = None
else:
grad_mask = torch.zeros_like(P_src)
for b, n in enumerate(ns_gt):
grad_mask[b, 0:n] = 1
d = torch.matmul(s, P_tgt) - P_src
return d, grad_mask
(grad_mask 暂时不知道是啥)
torch.matmul(s, P_tgt)的输出:
维度:(8,10,2)
s的维度 (8,10,10), P_tgt 的维度(8,10,2)
物理意义:利用匹配关系,调整矩阵内坐标的顺序,使其与src的匹配关系对齐。
最终得到正确匹配关系时的位移向量。
在训练时,还会得到一个预测时的位移向量,OffetLoss就是希望匹配得足够正确,使得两者的位移向量差距最小,是强距离考虑的。因此会出现下面这个问题
马的耳朵都匹配错了,OffetLoss却还很小,因此后续研究者提出了PermutationLoss。
CrossEntropyLoss、PermutationLoss
基于Offset存在的问题,19年相关研究者提出了PermutationLoss,在论文中的全称为:Permutation Cross-Entropy Loss,论文中也提到’Cross entropy loss is adopted to train our model end-to-end’。因此PermutationLoss的核心其实就是一个交叉熵,而计算交叉熵的对象是上一节提到的s矩阵,即配对矩阵(Permutation矩阵),公式表达如下:
但两者在工程代码实现中还是有细微区别,从而导致采用这两个loss分别产生的损失量值不同。
我们利用两者各自的LATAX公式代码生成他们的公式如下:
怀疑CE的工程实现有一些问题,后面再探讨。
PermutationLossHung(Focal Loss)
20年,针对PermutationLoss 存在的 可能的负样本淹没问题(猜的),PermutationLossHung被提出。
与PermutationLoss唯一的区别在于Z矩阵的引入,什么是这里的Z矩阵呢?
论文中Z矩阵的计算公式如下:
这里的Atten 函数,就是一个取并集的操作,即论文中提到的 an element-wise 'logic OR’function 。
而这里是那两个集合取并集呢?从论文的图三我们可以得到答案。
将预测的Permutation矩阵(右上)和真实的Permutation矩阵(左下)作并集操作,得到attention activation矩阵(下中)。
这样做的物理意义是?
只对充满歧义的匹配进行关注,有点像FocalLoss。
并且论文中提到:‘once the match-ing score is calculated in an element-wise fashion’,进一步得在FocalLoss 和 ‘a specifically designed margin loss’上进行了实验。
为什么可以在FocalLoss等上也进行实验?后面再探讨。
HammingLoss
20年,HammingLoss被提出,旨在解决 perm中对离散矩阵反向传播时梯度截断的 问题,放弃原有的交叉熵的形式(理由?)。
损失形式:
和perm进行对比发现:
InnerProductLoss
该损失用于自监督问题,暂时不探讨。