Constrast Learnning

本文介绍了对比学习的基本概念,包括使用队列高效存储负样本,记忆库作为早期的负样本存储方案,以及动量更新在负样本模型参数中的应用。对比学习中,队列可以动态调整大小,解决大数据量问题,而MOCO模型通过动量更新部分解决了梯度更新与特征滞后性的问题。文章还讨论了对比学习在实际应用中的挑战及内存管理和shuffle-BN的影响。
摘要由CSDN通过智能技术生成

Constrast Learnning

一. 概念简介

有一篇英文说得很好:

英文版

中文翻译

  • queue

一个队列,用于存放负样本

  1. 使用立马拿出来,效率高
  2. 可以设置的非常大,数量大(对比学习需要大量负样本,这点最重要)
  3. MOCO使用了动态的方式(总数设置固定值,每次iteration传入一个batch的新特征,移除一个batch的老特征)
  • keys

因为是对比学习,所以要记住特征的ID,在计算loss的时候同一个ID相似度最大,不同ID相似度最小

  • memory bank

原始版本的queue-key系统,原始版本把全部的负样本都存储起来(这样做坏处是内存需求太大,而且梯度更新和存储的特征不匹配-一个epoch更新一次queue,中间的iteration都使用老的特征)。这个不是硬件中的表述,仅仅作为一个代号(刚开始我还以为是硬件的标识)。

  • momentum

更新负样本的模型参数,这里得结合下面训练方式说明,正样本模型正常训练,假设正样本模型参数\(\theta^+\),负样本模型参数\(\theta^-\),负样本模型不参与训练,但更新为\(\theta^-=\theta^-+\alpha*\theta^+\) 和论文中的表述相同。

  • 训练方式
  1. 模型可以是一个也可以是两个(比如MOCO是一个,End-to-End是两个),但是训练会使用两个共享(MOCO不共享)的模型进行
  2. 模型以A和B为例
  3. 接着上面的链接,从dataloader中读取一个batch的数据(假设B=10,会获得20或者30个数据,30的数据目前不清楚用途,这是以20为例)
  • End-To-End模型
    • 前向计算A模型获得\(A_{pos}\),这里假设模型A和模型B相同,那么仅需计算一次即可。其中正样本2个+负样本18个,计算loss即可。
  • memory模型
    • 每个epoch开始时,首先前向计算\(A_{pos}\)输入所有的样本,获得所有的特征存储到memory bank之中。
    • 计算Batch样本\(A_{pos}\),负样本就是memory中的所有值(除去当前batch),很明显增大了负样本的数量
    • 下一个iteration不改变memory bank数据,按照第二步往复计算
    • 等到新的epoch开始重新计算memory bank
    • 很明显的发现memory bank中的值和更新的梯度不匹配,用的都是老的数据
  • MOCO模型
    • 前向计算A模型获得\(A_{pos}\),计算B模型获得\(B_{neg}\)
    • \(B_{neg}\)存储到queue内(如果满了就先pop然后再push)
    • 计算\(A_{pos}\)和queue的loss,更新A模型的梯度
    • 然后根据A模型的参数,通过动量更新B模型的参数(参见momentum)
    • 往复此过程即可
    • 很明显的发现queue的大小是可以设置的,不会出现大数据不能跑。对于queue和梯度更新滞后性解决了一部分,但未根本性的解决。
  • 内存的存储和shuffle-BN

未仔细阅读源码

看了一下CLR、MOCO、MoCo_V2、CLR_V2在imagenet上的最终表现,感觉对比学习任重而道

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值