自监督学习之对比学习:MoCo模型超级详解解读+总结

news2024/12/25 2:25:09

文章目录

  • 一、MoCo简介
    • 1.1 整体思想
    • 1.2 动量
    • 1.3 正负样本如何选取
  • 二、动态字典
    • 2.1 query和key
    • 2.2 字典特点
  • 三、编码器的动量更新
    • 3.1 编码器的更新规则
    • 3.2 使用动量更新的原因
  • 四、实验过程
    • 4.1 目标函数:infoNCE
      • 4.1.1 softmax
      • 4.1.2 交叉熵损失
      • 4.1.3 交叉熵损失函数和softmax的关系
      • 4.1.4 为什么使用NCE loss
    • 4.2 前向传播过程
      • 4.2.1 模型图
      • 4.2.2 伪代码

学习资料:
MOCO论文精读-哔哩哔哩

一、MoCo简介

动量对比学习方法做无监督表征学习。
使用动量的方式更新编码器,使用队列的方法存储memory bank这个字典,从而获得一个又大又一致的字典。

1.1 整体思想

把memory bank这个字典当做一个队列进行维护

1.2 动量

加权移动平均。让当前输出不完全依赖于当前输入,而是也取决于前一时刻的输出。

y t = m ∗ y t − 1 + ( 1 − m ) ∗ x t y_t = m*y_{t-1}+(1-m)*x_t yt=myt1+(1m)xt

  • y t − 1 y_{t-1} yt1 :上一时刻的输出
  • y t y_t yt:这一时刻想要改变的输出
  • x t x_t xt:当前时刻的输入
  • m m m:动量,超参数,介于0-1之间

m m m趋近于1的时候, y t y_t yt改变的非常缓慢,因为它基本就相当于前一刻的输出, x t x_t xt基本不起作用。
m m m趋近于0的时候, y t y_t yt改变的非常迅速,因为前一刻的输出基本不起作用,基本取决于当前输入 x t x_t xt

moco利用动量的特性,缓慢更新编码器。让字典中的特征尽可能保持一致。

1.3 正负样本如何选取

原图x1经过数据增广后产生的两张图片互为正样本对,数据集中除了x1以外的其他图片都可以为负样本。
在这里插入图片描述

二、动态字典

2.1 query和key

把对比学习当成动态字典

These methods can be thought of as building dynamic dictionaries. The “keys” (tokens) in the dictionary are sampled from data (e.g., images or patches) and are represented by an encoder network. Unsupervised learning trains encoders to perform dictionary look-up: an encoded “query” should be similar to its matching key and dissimilar to others. Learning is formulated as minimizing a contrastive loss.

figure 1

在论文中,作者使用:

  • x q x_q xq表示x1’
  • x k x_k xk表示x1’’
  • q q q来表示锚点图片产生的特征f1’,
  • k 0 , k 1 , k 2 … … k_0,k_1,k_2…… k0,k1,k2……表示剩余图片提取到的特征f11,f2,f3……

在这里插入图片描述

2.2 字典特点

  1. 动态:字典中的key都是随机取样的,用来给key做编码的编码器也是在训练中不断改变的。
  2. 足够大:包含足够多的负样本,从而让对比学习的效果更好。
  3. 保持一致性:尽量保持训练神经网络的过程中编码器的变化不要过大,防止由于编码器训练过程中变化过大导致提取到的特征不一致。

三、编码器的动量更新

3.1 编码器的更新规则

  • q编码器:梯度更新
  • k编码器:动量更新,不使用梯度更新

在这里插入图片描述

3.2 使用动量更新的原因

使用队列可以使字典变大,但它也使得通过反向传播(梯度应该传播到队列中的所有样本)更新编码器变得难以处理。

一个解决方案是直接把 f q f_q fq的参数直接复制给 f k f_k fk,而不进行梯度更新,但是这样效果很差,因为这样就会失去 f k f_k fk编码器对特征提取的一致性,由于编码器的参数一直在改变,所以一开始提取的特征就会和后面提取的特征很不一致,所以对 f k f_k fk编码器采用动量更新。
在这里插入图片描述

动量更新通过逐步调整编码器参数,使 f k f_k fk编码器逐渐学习到 f q f_q fq编码器的知识。这种更新策略有助于提高特征表示的一致性和稳定性,使得编码器能够更好地捕捉数据的结构和语义信息。

四、实验过程

一个正样本对:anchor和positive,anchor为q(anchor经过编码器后生成的特征向量),在字典中与q唯一配对的key成为 k + k_+ k+(positive经过编码器后生成的特征向量)

对于目标函数来说,当 q q q与它的 k + k_+ k+相似而与所有其他key(q的负样本)不相似时,它的值应该很低。

4.1 目标函数:infoNCE

4.1.1 softmax

在这里插入图片描述

4.1.2 交叉熵损失

一文详解Softmax函数-知乎
在这里插入图片描述

4.1.3 交叉熵损失函数和softmax的关系

损失函数简化后即可得到:
在这里插入图片描述

4.1.4 为什么使用NCE loss

对于损失函数来说,如果使用交叉熵作为损失函数,那么公式中的k值就会非常大,因为k代表的是类别个数,在个体判别领域,一张图片代表一个类,那么k值就等于数据集的大小,这样计算量过大。

为解决交叉熵损失函数中对类别求概率时k值过大的问题,提出了NCE loss(noise contractive )

NCE loss(noise contractive estimation) 可以把问题转换为只有以下两个类别的二分类问题:

  • data sample:数据类别,即为正样本
  • noise sample:噪声类别,从dataset中抽取出来的部分负样本

在这里插入图片描述
在公式中:

  • τ:温度系数,控制分布形状,超参数
  • q ∗ k + q*k_+ qk+:softmax的logits,点积相乘相当于 q 和 k + q和k_+ qk+的相似值度量
  • q ∗ k i q*k_i qki:softmax的logits,点积相乘相当于 q 和 k i q和k_i qki的相似值度量

其实NCE loss就类似于一个交叉熵损失函数,做了一个k+1类的分类任务,目的就是把q分类为 k + k_+ k+类。

4.2 前向传播过程

MOCO详解-知乎

更新的有两个:encoder和队列

encode_p是根据梯度回传进行更新的,encode_k是通过动量进行缓慢 更新的。

4.2.1 模型图

在这里插入图片描述

4.2.2 伪代码

# f_q, f_k: encoder networks for query and key 
# queue: dictionary as a queue of K keys (CxK) 
# m: momentum 
# t: temperature 
f_k.params = f_q.params # initialize 
	for x in loader: # load a minibatch x with N samples 
		x_q = aug(x) # a randomly augmented version 
		x_k = aug(x) # another randomly augmented version 
		q = f_q.forward(x_q) # queries: NxC 
		k = f_k.forward(x_k) # keys: NxC 
		k = k.detach() # no gradient to keys 
		# positive logits: Nx1 
		l_pos = bmm(q.view(N,1,C), k.view(N,C,1)) 
		# negative logits: NxK 
		l_neg = mm(q.view(N,C), queue.view(C,K)) 
		# logits: Nx(1+K) 
		logits = cat([l_pos, l_neg], dim=1) 
		# contrastive loss, Eqn.(1) 
		labels = zeros(N) # positives are the 0-th 
		loss = CrossEntropyLoss(logits/t, labels) 
		# SGD update: query network 
		loss.backward() update(f_q.params) 
		# momentum update: key network 
		f_k.params = m*f_k.params+(1-m)*f_q.params 
		# update dictionary 
		enqueue(queue, k) # enqueue the current minibatch 		
		dequeue(queue) # dequeue the earliest minibatch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1034140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯选拔赛真题62】Scratch判断小球 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch判断小球 一、题目要求 编程实现 二、案例分析 1、角色分析

BottomNavigationView3个以上图标不显示文字

问题 当BottomNavigationView设置的菜单中超过三个图标时,出现只有焦点聚集到图标时才会显示底部设置的文字描述,当没有焦点聚集则只显示图标,效果如下: 解决办法 设置labelVisibilityMode值 如果BottomNavigationItemView类并…

Jmeter——结合Allure展示测试报告

在平时用jmeter做测试时,生成报告的模板,不是特别好。大家应该也知道allure报告,页面美观。 先来看效果图,报告首页,如下所示: 报告详情信息,如下所示: 运行run.py文件,…

Java笔记:认识一下class文件

1.class文件概述 我们可任意打开一个Class文件(使用Hex Editor等工具打开),内容如下(内容是16进制): 十六进制转字符串:http://www.bejson.com/convert/ox2str/ 进制转换网址(十六进…

谷歌浏览器jsonView插件安装与使用

1、打开 https://github.com ; 2、搜索 jsonView 链接:https://gitee.com/wangl2020/chrome_JSONVue 3、选择需要的插件我是选这个; 4、点击【Download Zip】,插件下载完成,解压缩到相应目录(D:\Downloa…

外贸电商独立站的选品和运营

第一步:选品 做出口跨境电商卖家,最难回答的问题就是我要卖什么产品?销量好的产品,竞争太激烈;价格很高的又卖不动;太小众的又担心客户不好开发,很纠结! 的确,对于出口B2…

若依cloud -【 100 ~ 103 】

100 分布式日志介绍 | RuoYi 分布式日志就相当于把日志存储在不同的设备上面。比如若依项目中有ruoyi-modules-file、ruoyi-modules-gen、ruoyi-modules-job、ruoyi-modules-system四个应用,每个应用都部署在单独的一台机器里边,应用对应的日志的也单独存…

数据结构-----堆(完全二叉树)

目录 前言 一.堆 1.堆的概念 2.堆的存储方式 二.堆的操作方法 1.堆的结构体表示 2.数字交换接口函数 3.向上调整(难点) 4.向下调整(难点) 5.创建堆 6.堆的插入 7.判断空 8.堆的删除 9.获取堆的根(顶)元素 10.堆的遍历…

Linux中sudo命令的添加和操作

使用 sudo分配权限 (1)修改/etc/sudoers 文件分配文件 # chmod 740 /etc/sudoers # vi /etc/sudoers 找到这行:root ALL(ALL) ALL, 在这行下面添加 xxx ALL(ALL) ALL (这里的xxx就是你的普通用户,而ruice就是我的普通用户 ) 编…

nginx部署多个项目

前言 实现在一台服务器上使用nginx部署多个项目的方法 查看并修改nginx安装的默认配置文件 在 Linux 操作系统中,Nginx 在编译安装时默认的配置文件路径是 /usr/local/nginx/conf/nginx.conf。 如果是通过发行版的包管理器安装,则默认的配置文件路径可能…

Cesium加载海量点数据

目录 项目地址实现效果实现方法 项目地址 https://github.com/zhengjie9510/webgis-demo 实现效果 实现方法 const pointCollection viewer.scene.primitives.add(new Cesium.PointPrimitiveCollection({ blendOption: Cesium.BlendOption.OPAQUE })); for (let longitude …

dToF 和iToF傻傻分不清楚? pmd flexx2 见你所不能见

在现下数字化越来越成熟的时代,「3D感知」无疑在生活中成为了一种基础、甚至必须的需求:从人手至少一台的智能手机,到居家生活常见的扫地机器人,再到高科技或医疗产业会使用的无人机或工业机器人,如今高度科技化和便捷的世界,处处都需要比肉眼更加强大的立体视角来进行可…

如何搭建Linux环境

W...Y的主页 😊 代码仓库分享 💕 当我们想要搭建一个Linux系统,我们应该怎么使用呢? 今天我就带领大家搭建Linux系统!!! 目录 Linux环境安装 双系统(不推荐) poww…

计算机毕设 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 这两年开始毕业设计和毕业…

14:00面试,14:06就出来了,问的问题过于变态了。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到5月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

【NAD NADPH; FMN FAD ; NMN -化学】

NAD Nicotinamide adenine dinucleotide nicotinamide 烟酰胺 NAD NADPH 烟酰胺腺嘌呤二核苷酸 nucleosidase Nicotinamide adenine dinucleotide NMN(烟酰胺单核苷酸)简介 NMN全名 nicotinamide mononucleotide,即 烟酰胺单…

【全国科普日,共筑眼健康】景远眼科科普志愿者服务队在行动

今年是第21个全国科普日,为深入贯彻落实新时代中国特色社会主义思想,针对不同群体的需求,践行科普为民,共创美好生活,9月14日至9月24日期间,景远眼科科普志愿者服务队把丰富多样的内容、常有常新的活动带到…

IP归属地应用的几个主要特点

作为一款优秀的IP地址定位工具,主题IP归属地的应用无疑是最好的选择之一。该应用可以将您需要查询的IP地址快速定位到所在的具体物理位置,并提供详细的地址和地图信息。接下来,让我们一起来看一看IP归属地应用的几个主要特点: 1. …

Python:求求按规范写我

B站|公众号:啥都会一点的研究生 写在前面 代码被阅读的次数远多于编写的次数 我们可能花费很多时间来编写一段代码,一旦完成后大概率就再不会重新写它。当这段代码不仅是自己用时,就得注意了,每次自己或其他人浏览,需…

2023.9.23(对这一年过去几个月的总结)

这个时间点杭州正在开亚运会,周六,大周,难得的大周,早上在公司健身房跑完步,就来工位看书了。 反思一下: 技术: 今年在技术学习上的目标,达成率是在太低,但看文章输出来…