Triplet Loss及其梯度

Triplet Loss及其梯度_jcjx0315的博客-CSDN博客

  1. Triplet Loss简介

我这里将Triplet Loss翻译为三元组损失,其中的三元也就是如下图的Anchor、Negative、Positive,如下图所示通过Triplet Loss的学习后使得Positive元和Anchor元之间的距离最小,而和Negative之间距离最大。其中Anchor为训练数据集中随机选取的一个样本,Positive为和Anchor属于同一类的样本,而Negative则为和Anchor不同类的样本。

这也就是说通过学习后,使得同类样本的positive样本更靠近Anchor,而不同类的样本Negative则远离Anchor。

  1. Triplet loss目标函数

下面为Triplet loss的目标函数:

上式中的||*||为欧式距离,所以:

表示的是Positive元和Anchor之间的欧式距离度量。

表示的是Negative和Anchor之间的欧式距离度量。

a是指x_a与x_n之间的距离和x_a与x_p之间的距离之间有一个最小的间隔。

另外这里距离用欧式距离度量,+表示[]内的值大于零的时候,取该值为损失,小于零的时候,损失为零。

由目标函数可以看出:

当x_a与x_n之间的距离 < x_a与x_p之间的距离加时,[]内的值大于零,就会产生损失。

当x_a与x_n之间的距离 >= x_a与x_p之间的距离加时,损失为零。

  1. Triplet loss理解

我们的目的就是使 loss 在训练迭代中下降的越小越好,也就是要使得 Anchor 与 Positive 越接近越好,Anchor 与 Negative 越远越好。基于上面这些,分析一下 margin 值的取值。

当 margin 值越小时,loss 也就较容易的趋近于 0,于是 Anchor 与 Positive 都不需要拉的太近,Anchor 与 Negative 不需要拉的太远,就能使得 loss 很快的趋近于 0。这样训练得到的结果,不能够很好的区分相似的图像。

当 Anchor 越大时,就需要使得网络参数要拼命地拉近 Anchor、Positive 之间的距离,拉远 Anchor、Negative 之间的距离。如果 margin 值设置的太大,很可能最后 loss 保持一个较大的值,难以趋近于 0 。

因此,设置一个合理的 margin 值很关键,这是衡量相似度的重要指标。简而言之,margin 值设置的越小,loss 很容易趋近于 0 ,但很难区分相似的图像。margin 值设置的越大,loss 值较难趋近于 0,甚至导致网络不收敛,但可以较有把握的区分较为相似的图像。

  1. Triplet loss梯度求解

关于triplet loss原理及推导,参考来源:

triplet loss 原理以及梯度推导

【前言】 
最近,learning to rank 的思想逐渐被应用到很多领域,比如google用来做人脸识别(faceNet),微软Jingdong Wang 用来做 person-reid 等等。learning to rank中其中重要的一个步骤就是找到一个好的similarity function,而triplet loss是用的非常广泛的一种。

【理解triplet】

如上图所示,triplet是一个三元组,这个三元组是这样构成的:从训练数据集中随机选一个样本,该样本称为Anchor,然后再随机选取一个和Anchor (记为x_a)属于同一类的样本和不同类的样本,这两个样本对应的称为Positive (记为x_p)和Negative (记为x_n),由此构成一个(Anchor,Positive,Negative)三元组。

【理解triplet loss】 
有了上面的triplet的概念, triplet loss就好理解了。针对三元组中的每个元素(样本),训练一个参数共享或者不共享的网络,得到三个元素的特征表达,分别记为: 。triplet loss的目的就是通过学习,让x_a和x_p特征表达之间的距离尽可能小,而x_a和x_n的特征表达之间的距离尽可能大,并且要让x_a与x_n之间的距离和x_a与x_p之间的距离之间有一个最小的间隔。公式化的表示就是: 

对应的目标函数也就很清楚了: 

这里距离用欧式距离度量,+表示[]内的值大于零的时候,取该值为损失,小于零的时候,损失为零。 
由目标函数可以看出:

  • 当x_a与x_n之间的距离 < x_a与x_p之间的距离加时,[]内的值大于零,就会产生损失。
  • 当x_a与x_n之间的距离 >= x_a与x_p之间的距离加时,损失为零。

【triplet loss 梯度推导】 
上述目标函数记为L。则当第i个triplet损失大于零的时候,仅就上述公式而言,有: 

【算法实现时候的提示】 
可以看到,对x_p和x_n特征表达的梯度刚好利用了求损失时候的中间结果,给的启示就是,如果在CNN中实现 triplet loss layer, 如果能够在前向传播中存储着两个中间结果,反向传播的时候就能避免重复计算。这仅仅是算法实现时候的一个Trick。

下面是关于triplet loss的matlab代码实现,参考来源:

matlab---triplet loss

**摘要:**triplet loss 可以提高特征匹配的性能,可用物体识别,人脸识别,检索等方面,本文用matlab实现triplet loss。

triplet loss 就是学习一个函数隐射, 从特征 映射到 , 有如下关系:. 在一个特征空间中,我们通过欧式距离度量两个特征向量的距离。 triplet loss 的目的在于使同一个类别在空间中靠近,不同类别在空间中远离,那么我们就可以抽象为如下优化函数:

其中, 是锚点,是正样本点,它和属于同一类别,是负样本点,它和不属于同一类别。 
这样我们可以通过无约束优化来约束上面函数。

 function demo_tripletlossclear allclcdata{1} = rand(600,300);data{2} = rand(600,300);data{3} = rand(600,300);inputSize = 600;hiddenSize = 400;theta = initializeParameters(hiddenSize, inputSize);addpath minFunc/options.Method = 'cg'; % Here, we use L-BFGS to optimize our cost% function. Generally, for minFunc to work, you% need a function pointer with two outputs: the% function value and the gradient. In our problem,% sparseAutoencoderCost.m satisfies this.options.maxIter = 400; % Maximum number of iterations of L-BFGS to runoptions.display = 'on';[opttheta, cost] = minFunc( @(p) tripletCost(p, inputSize, hiddenSize, data),theta, options);

tripletCost.m

 function [cost,grad] = tripletCost(theta, inputSize, hiddenSize, data)%================================================%何凌霄 中科院自动化所%创建时间:2016年5月25日%================================================% data: trainning sample for triplet loss% W: transformer matrix% cost: cost function% grad: gradient directionW = reshape(theta, hiddenSize, inputSize);% Cost and gradient variables (your code needs to compute these values).% Here, We initialize them to zeros.cost = 0;Wgrad = zeros(size(W));% the gradient descent update to W1 Would be W1 := W1 - alpha * W1grad, and similarly for W2, b1, b2.%[n m] = size(data{1});%m: the number of samples,m:the dim of featurebias = 0.2;%forWard% calc costfor i = 1:mcost = cost + ((W*data{1}(:,i) - W*data{2}(:,i))'*(W *data{1}(:,i) - W*data{2}(:,i)) - (W*data{1}(:,i) - W*data{3}(:,i))'*(W *data{1}(:,i) - W*data{3}(:,i)) +bias)/m;end%calc gradient%计算W1gradWgrad = (2*W*((data{1} - data{2})*(data{1} - data{2})' - (data{1} - data{3})*(data{1} - data{3})'))/m;%-------------------------------------------------------------------% After computing the cost and gradient, We Will convert the gradients back% to a vector format (suitable for minFunc). Specifically, We Will unroll% your gradient matrices into a vector.grad = Wgrad(:);end

initializeParameters.m

function theta = initializeParameters(hiddenSize, inputSize)% Initialize parameters randomly based on layer sizes.r = sqrt(6) / sqrt(hiddenSize+inputSize+1); % we'll choose weights uniformly from the interval [-r, r]W1 = rand(hiddenSize, inputSize) * 2 * r - r;theta = W1(:);end
  1. 另外需要一个优化包见资源.

其中关于minFunc是一个资源包,作者Author: Mark Schmidt (2006),在这个网址还有不少好资源。

下面是本人关于triplet loss原理推导的一些补充。在上文关于triplet loss的原理推导过程中,有一点容易被忽视,这一点在真正去实现其代码的时候就会发现,无从下手,因为我们要求关于参数的偏导。那么在triplet loss中谁是真正的参数呢(尤其在深度学习中)?很明显在上文的推导过程中我们没看到参数。真正的参数是f这个映射,即把xi映射为一种表示,通常为(w0,w1,...,wn).*(1,x1,...,xn),这里的参数w就是要学习的参数,需要通过triplet loss的梯度反向传播。

三元组损失 Triplet Loss及其梯度相关推荐

  1. 人脸检测、人脸定位、人脸对齐、MTCNN、人脸识别(衡量人脸的相似或不同:softmax、三元组损失Triplet Loss、中心损失Center Loss、ArcFace)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) # ArcFace class ArcMarginProduc ...

  2. 一文理解Ranking Loss/Margin Loss/Triplet Loss

    点击蓝字  关注我们 作者丨土豆@知乎 来源丨https://zhuanlan.zhihu.com/p/158853633 本文已获授权,未经作者许可,不得二次转载. 前言 Ranking loss在 ...

  3. Parameter Sharing Exploration and Hetero-center Triplet Loss

    参数共享探索与异心三元祖损失 摘要 探讨了双流网络应该共享多少参数,通过拆分 ResNet50 模型构建特定模态特征提取网络和模态共享特征嵌入网络,证明了双流网络参数共享对 VT Re-ID 的效果. ...

  4. 一文理解Ranking Loss/Contrastive Loss/Margin Loss/Triplet Loss/Hinge Loss

    一文理解Ranking Loss/Contrastive Loss/Margin Loss/Triplet Loss/Hinge Loss 翻译自FesianXu, 2020/1/13, 原文链接 h ...

  5. Triplet loss 源码解析

    2021最后一天,赶紧学习一手吧.由于 Triplet loss 很重要,而代码不复习又很容易忘,这里记录一下. 代码在这里:https://github.com/VisualComputingIns ...

  6. 机器学习笔记:triplet loss

    1 Triplet loss Triplet Loss,即三元组损失,其中的三元是Anchor.Negative.Positive. 通过Triplet Loss的学习后使得Positive元和Anc ...

  7. 三元组损失(Triplet loss)

    来源:Coursera吴恩达深度学习课程 在人脸识别中,我们希望学习"输入两张人脸图片,然后输出相似度"的函数d,然后Siamese 网络(Siamese network)实现了这 ...

  8. 度量学习(Metric learning、损失函数、triplet、三元组损失、fastreid)

    定义 Metric learning 是学习一个度量相似度的距离函数:相似的目标离得近,不相似的离得远. 一般来说,DML包含三个部分,如下图.. 1)特征提取网络:map embedding 2)采 ...

  9. 三元损失“In Defense of the Triplet Loss for Person Re-Identification”

    更全面的阅读记录可以参考这篇博客:https://blog.csdn.net/xuluohongshang/article/details/78965580 背景描述 提出了一个三元损失的变形用于行人 ...

最新文章

  1. 科学计算工具NumPy(1):ndarray的创建于数据类型
  2. kill -HUP 什么意思?
  3. java类编写sql_用JavaBean编写SQL Server数据库连接类
  4. 深度学习图像融合_基于深度学习的图像超分辨率最新进展与趋势【附PDF】
  5. 面试题——Java虚拟机
  6. 一个内核调试函数的实现
  7. android学习笔记---60_meta-data的使用,在清单文件中是用meta-data来给activity,service,receiver提供参数
  8. 大数据中存在哪些误解
  9. 能源36号文解读_财税2016年36号文件全文解读【专业分析】
  10. Linux:shell变量功能和Bash shell的操作环境
  11. 输入输出运算符的重载
  12. 2021 年网易云音乐实时计算平台发展和挑战
  13. Maxscale读写分离,多实例
  14. 丹佛大学计算机专业,丹佛大学计算机工程专业排名第(2018年USNEWS美国排名)...
  15. 个税汇算清缴是怎么算的,为何有人补税几百,有人退税几千?
  16. 聚播群控微信二次开发sdk完整API
  17. 子系统kali安装桌面
  18. ProxmoxVE折腾记录(二)--版本升级
  19. 7-229 sdut-C语言实验- 排序7-227 sdut- C语言实验-计算1到n的和(循环结构)
  20. 计算机的声音怎么设置在哪设置方法,Win7电脑声音设置的方法

热门文章

  1. desc 枚举类型id_枚举系列(四):实现接口的枚举类
  2. oracle 状态unknown,Oracle RAC 一个节点的instance资源状态为unknown
  3. 数据结构 如何删除单向链表的倒数第m个元素
  4. android+自定义皮肤,android studio自定义更换皮肤详细图文教程
  5. python回文链表_leetcode链表之回文链表
  6. 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击
  7. 电子计算机是一种精准的仪器,常见的八种无损检测仪器
  8. bootstrap自动生成html,Bootstrap框架动态生成Web页面文章内目录的方法
  9. pb调用c语言dll,PB调用C#编写的Dll类库
  10. Java 18 正式发布