槽:我发现网上的很多博客要么误人子弟,要么就是学艺不精就出来写,一开始我对这个概念不太理解,看别人写的博客,知道了这个loss是什么,但是怎么用,那是完全没人提啊。大家都知道,contrastive loss用在embedding vector上,这个embedding vector怎么得到的?压根就没人讲。另外,loss函数里也涉及一些超参数,超参数应该取多少?也压根没人提。都是看了看表明文章,就出来咔咔写博客,论实用性,那是真的屁用没有。

前言:这篇文章是看了论文《Supervised Contrastive Learning》极其源码之后的简单总结。想深入学习的同学建议别光看这个博客,去看论文原文和源码。

论文地址:https://papers.nips.cc/paper/2020/file/d89a66c7c80a29b1bdbab0f2a1a94af8-Paper.pdfhttps://papers.nips.cc/paper/2020/file/d89a66c7c80a29b1bdbab0f2a1a94af8-Paper.pdf

Contrastive loss的目标是让同类样本的特征相互靠近,不同类样本的特征相互远离。这里的“同类”实际上是一个更宏观的概念。比如在自监督学习当中,一张图像经过不同的随机数据增强,得到多张图像,这多张图像是同类的。在监督学习当中,相同类别的图像,是同类的。下面首先讲一下loss的定义,然后再讲loss如何使用。

self-supervised contrastive loss

自监督学习,没有标签。假设一个batch有N张图像,将这N张图像做2遍不同的数据增强,得到2N张图像。上式中的 I 则代表了这2N张图像的集合。z_i是集合中,第i张图像的embedding特征(后面讲这个embedding特征是如何得到的),z_{j(i)}指那张与图像i同源的图像。A(i)是指除第i张图像之外剩下的2N-1张图像的集合。

这个式子比较容易理解。

Supervised contrastive loss

同样的N张图像,同样的2遍数据增强,得到同样的2N张图像。只不过,这2N张图像现在是带标签的。那么,同类别图像的特征应该互相靠近,不同类别图像的特征应该互相远离。于是,在上式当中加个类被限制,就得到了Supervised contrastive loss。

P(i)指与图像i具有相同标签的图像的集合。这个式子也比较简单。人家能把这么点事情写成一篇文章,还能中,足以说明,写作能力对中文章的重要性。写作能力着实是头等重要的科研能力。

如何使用

其他博客基本讲了讲这loss是怎么回事就结束了。实际上还有很多问题没解决。图像的embedding特征z是如何得到的?公式里那个超参数\tau一般取值为多少?

整体上来讲,contrastive loss的使用,需要在原来的分类器的基础上,额外添加一些embedding layer。分类器由特征提取器(backbone)以及分类头构成。特征提取器就是卷积,然后拉平,将一张图像转换为一个向量。然后,分类头则是Fc+softmax。那么contrastive loss如何用进来呢?要想用,得添加embedding layer。一般就是MLP,中间采用常用的Relu激活函数就行了。MLP中,最后一层FC的输出接L2 norm,就得到了图像的embedding。 L2 norm讲图像的特征映射到一个单位超球面上,然后,采用向量之间的角度,来作为向量的相似度。向量内积除以向量长度就是角度嘛。单位向量,长度都是1,所以,向量内积直接就是角度。L2 norm可以直接用pytorch的torch.nn.functional.normalize来实现。训练的时候,分类器上的cross entropy loss,embedding layer这里的contrastive loss一起上。测试的时候,embedding layer就被弃用了,走原本的测试流程就行。超参数\tau,论文源码中使用了0.07。

另外再吐槽一下,L2 norm好多人写博客都说,把向量归一化到0--1之间。我真的呕血,看看公式行吗,向量里的正负号是假的吗?真的是瞎**乱写又不负任何责任。实际上,是把向量归一化到-1到1之间。如果原本的向量当中没有负值,那确实L2 norm的输出不会出现负值。

总之就是简单讲一下。详细内容,看论文和源码即可。论文写的不错,非常容易读。这方面我得多学习学习。源码也非常简单。一看就明白是咋回事了。

Contrastive Loss 详解及用法相关推荐

  1. OpenCV Mat类详解和用法(官网原文)

    参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...

  2. windows下创建进程,CreateProcess()详解及用法

    windows下想要创建一个子进程不如linux的fork函数来得方便,通过CreateProcess函数创建一个新的进程,函数的定义如下 [cpp]  view plain copy BOOL Cr ...

  3. OpenCV Mat类详解和用法

    OpenCV Mat类详解和用法 我们有多种方法可以获得从现实世界的数字图像:数码相机.扫描仪.计算机体层摄影或磁共振成像就是其中的几种.在每种情况下我们(人类)看到了什么是图像.但是,转换图像到我们 ...

  4. 【ADB 操作命令详解及用法大全(非常全)】

    ADB操作命令详解及用法大全 一.ADB是什么?   ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供 ...

  5. spring注解详解与用法(总览)

    这篇文章收集了我写的所有的spring注解的详细说明与用法,点击可以跳转到对应文章,此文章会不断更新 spring注解详解与用法(1)最基础也是最常见的如下所示,详情点击这里 @Controller/ ...

  6. Symbol 详解与用法

    目录 前言: 一.什么是 Symbol? 二.Symbol 的特点 三.Symbol 的使用 总结: 前言: ES5中对象的属性名都是字符串,容易造成重名,污染环境 一.什么是 Symbol? Sym ...

  7. 最全ES6详解及用法

    最全ES6详解及用法 前言 babel babel使用方法 变量的定义 let.const this 和作用域 do 顶层对象 global对象 import class JS中的原型 原型语言 pr ...

  8. chatgpt赋能python:Python取ln函数详解:用法及常见问题解答

    Python取ln函数详解:用法及常见问题解答 Python取ln函数是一种非常常用的数学函数,它可以帮助开发者在计算中处理数据的自然指数对数.本篇文章将会介绍Python中取ln函数的基础知识,让您 ...

  9. 【C语言】结构体定义 typedef struct 用法详解和用法小结

    结构体定义 typedef struct 用法详解和用法小结 文章目录 结构体定义 typedef struct 用法详解和用法小结 0. 前言 1. 首先:在C中定义一个结构体类型要用typedef ...

  10. Object.keys()的详解和用法

    Object.keys()的详解和用法 在实际开发中,我们有时需要知道对象的所有属性; ES5 引入了Object.keys方法,成员是参数对象自身的(不含继承的)所有可遍历( enumerable ...

最新文章

  1. 8种方案解决重复提交问题
  2. java经典算法四十题
  3. 161. Leetcode 55. 跳跃游戏 (贪心算法-贪心区间)
  4. 【OpenCV3】模板匹配——cv::matchTemplate()详解
  5. 前端编程提高之旅(六)----backbone实现todoMVC
  6. 2011.10.16
  7. gacutil不是内部或外部命令_Win7命令提示符输入taskkill提示不是内部或外部命令...
  8. spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法
  9. MyBatis6:MyBatis集成Spring事物管理(下篇)
  10. python动态生成数据库表_带有SQLalchemy的动态表名
  11. 如何让一个函数返回多个值(C#)
  12. 以虎嗅网4W+文章的文本挖掘为例,展现数据分析的一整套流程
  13. 使用MATLAB计算个人所得税
  14. core dumped 错误
  15. ImageButton点击替换背景再次点击显示默认图片
  16. Unity 3D官方教程——Adventure Game学习记录
  17. 【转】最容易理解的对卷积(convolution)的解释
  18. 程伟健:新城易居携手中旅联盟深度发力打造城市中心文旅目的地
  19. 微医(挂号网) 自动挂号python
  20. 人行征信报告学习经验

热门文章

  1. 【UE5】使用快捷键切换编辑器中英文设置
  2. 笔记本不小心网络重置后,不能上网,网络适配器存在感叹号
  3. 概率练习 (16.04.30)
  4. 最新杭州地铁开通时间表
  5. 猜数游戏--python(设定猜测次数)
  6. 网站外链如何才能被搜索引擎快速收录呢?
  7. 袁帅做了两件意义非凡的事
  8. 联想台式计算机设置u盘启动不了,联想扬天M4000e台式电脑bios设置U盘启动图文方法...
  9. 有免费且好用的云服务器推荐?
  10. 分析virtio-blk+qemu+spdk环境中virtio-blk不用执行virtqueue_kick操作通知后端处理IO的原因