(自用学习笔记)moco和mae

对比学习

对比学习是通过对比数据集中的数据去训练模型,模型只需要知道哪些图相似,哪些图不相似就行,对于一个数据x来说,可以对他进行任意的变换得到x1和x2,这样的图片对称为正样本。数据集中的其他样本称为负样本。对比学习有很多的代理任务,这里仅说明了个体判别的任务,因为比较简单。

moco

moco主要提出了两点贡献,1、用队列来代替字典,这样可以把字典的大小和minibatch的大小剥离开,2、用动量的方式来更新encode

图1 三种模型,最右边的是moco

(a)是端到端的方式,这种方式的缺点就是,每一次训练的时候,minibatch的大小和字典的大小是相同的,那这样的话显卡没有办法装得下过多的图片(因为每一次都要输入图片去提取特征)

(b)将图片的特征用memory bank装起来了,那这样确实是解决了内存的问题,但是他只有一个encode,假如一个minibatch的大小是64,那一次前向的过程之后会更新encode,然后把刚刚抽样出来的64个特征在encode上面进行一次特征提取然后放回去,这样往复之后在memory bank里面的特征就会缺乏一致性,导致效果不好

(c)而moco使用了队列来代替字典,首先encode k是复制encode q的然后通过ek=mek+(1-m)eq这样的方式来更新encode k,那队列的好处就是新的一组minibatch进去的时候,很久之前的一组minibatch的特征会出队,这样的话就可以让模型使用更大的字典进行学习了。

为什么要使用大字典

large

  • 从连续高维空间做更多的采样。字典 key 越多,表示的视觉信息越丰富,匹配时更容易找到具有区分性的本质特征。
  • 如果 字典小、key 少,模型可能学到 shortcut 捷径,不能泛化

consistent

  • 字典里的 key (k0, k1, k2, ......, kN) 应该由相同的 or 相似的编码器生成
  • 如果字典的 key 是由不同的编码器得到的,query q 做字典查询时,很有可能 找到和 query 使用同一个 or 相似编码器生成的 key,而不是语义相似的 key。另一种形式的 shortcut solution

伪代码

首先定义了参数fq,fk分别是提取特征的两个encod,queue是队列,m是更新的动量,t是infonce loss的温度

infonce loss:

首先将一组minibatch的数据x分别做两次不同的数据增强然后送到两个encode里面得到q、k,k.detech()是为了去除掉k里面数据的梯度,然后计算qk+,bmm是计算三维张量的主要是后面两个维度做乘法,所以得到N*1的值,然后计算qki,算完之后我们将正样本concat到负样本的前面,这样的话模型预测正确的值就是在第0个位置,所以label是生成了N维的0向量,然后去计算loss,pytorch的交叉熵的输入是【模型预测的概率(N*C),真实的位置(N)】,后面就是算完了loss就回传然后更新就好了。
 

在结论中moco提出了这个模型在使用了亿级数据集的情况下效果却没有提升多少可能是因为代理任务的问题,可能换成带掩码的代理任务效果会有提升,所以接下来讲一下kaiming的mae模型。

MAE

在mae里面一张输入的图像被遮住了3/4,这样是好处是可以让模型真的学到东西和减轻计算量,在这里它使用的是非对称的encode和decode,非对称的意思是编码器和解码器看到的东西不一样,编码器只需要看到没有被遮住的块,而解码器需要看到所有的块然后把整张图片还原出来。

在mae中它的编码器就是一个vit,将可见的块丢进去得到这些块的特征,那些被盖住的块都会被表示成同一个可以由学习得到的向量。在这些块里面都是加入了位置信息的。然后在解码器中它的最后一层就是一个线性层,假如得到最后的结果是256的那就重新reshape成16*16就好了。

因为mae是希望做一个迁移学习效果很好的预训练模型,所以这篇论文比较重要的还是他的实验部分

a:解码器的深度,多少个 Transformer 块; end to end fine-tuning 贵一点,但效果好

  • 全都 ft,深度和效果关系不大 
  • 只调 lin, 深度深一点好

b: 解码器的宽度,每一个 token 表示成一个多长的向量

  • 512 比较好

c: 编码器要不要加入被盖住的 masked 块:

  • 不加很好,精度高、计算量更少
  • 非对称的架构 精度好、性能好

d: 重构的目标

  • 每个像素的MSE
  • 每个像素的MSE(对每个像素) + normalization(对一个块) 均值为0 方差为 1 效果好
  • PCA 做一次降维
  • dVAE: BEiT 的做法,通过 ViT 把每一个块映射到一个离散的 token,像 BERT 一样的去做预测

e :怎么样做数据增强

  • 什么都不做
  • 固定大小的裁剪
  • 随机大小的裁剪
  • 裁剪 + 颜色变化

MAE 对数据增强不敏感

f :怎么采样 被盖住的块

  • 随机采样 最简单最好
  • 按一块块的采样 50 %
  • 按一块块的采样 75 %
  • 网格采样

这个是ft和lin的区别

这个是遮挡多少比较合适

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值