模型训练与测试 ----余弦距离的实现与L2范数的关系

目前的模型需要计算余弦距离,作为两个向量的距离,然后发现代码有两部分。第一部分是距离的计算,第二部分是L2范数归一化的使用。L2范数的话是这样计算的。
在这里插入图片描述

由于我的是一列向量的距离所以,上面就是某一列的L2范数,代码实现如下:

        x_norm = x.norm(p=2, dim=1, keepdim=True)
        x_norm = x_norm.clamp(min=1e-7)
        x =x.div(x_norm)

上面是pytorch的代码,每个数值都会除以L2范数,其实上面仔细一开你会发现L2范数其实就是余弦距离的下面部分的两个绝对值了。
在这里插入图片描述

通过L2归一化后的参数我们就可以直接对应位置相乘相加即可得到了余弦距离。具体的数学推到如下:

distmat = 1 - qf.mm(gf.t())

在这里插入图片描述
我们可以看出余弦距离和欧式距离的公式,是一个单调函数(图像类似于单位元的第一象限部分),也就意味着,两者在归一化为单位向量的时候计算相似度结果完全一样。只不过余弦相似度是值越大月相似,欧式距离是值越小越相似。所以我们通过L2范数归一化除了更方便的计算余弦距离,同时也可以让我们的欧式距离替代余弦距离的使用。

而在我们项目中,其实可以先通过L2范数,然后在tripletloss中,无论用什么距离都是一样的了。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值