对比学习介绍Contrastive Learning

1. 无监督学习分类

对比学习(Contrastive Learning)综述

  • 生成式方法:以自编码器为代表,主要关注pixel label的loss。举例来说,在自编码器中对数据样本编码成特征再解码重构,这里认为重构的效果比较好则说明模型学到了比较好的特征表达,而重构的效果通过pixel label的loss来衡量。
  • 对比式学习:着重于学习同类实例之间的共同特征,区分非同类实例之间的不同之处。不需要关注实例上繁琐的细节,只需要在抽象语义级别的特征空间上学会对数据的区分即可,因此模型以及其优化变得更加简单,且泛化能力更强。

2. 对比学习Contrastive Learning

2.1 介绍

对比学习(Contrastive Learning)是一种最近非常流行的自监督学习(Self-Supervised Learning)技术,它利用无标签训练数据生成的成对的增广数据(augmentations)去定义一个分类任务作为前置任务(pretext task),目的是学到一个足够好的深度表示(deep embedding)。

对比学习的前置任务则是将每一个实例(instance)作为一个类别(class),然后去学习一个不变的实例表示(invariant instance representation)。具体实现方式为,首先为每个实例生成一对样本,然后将它们输入一个编码器(encoder),然后利用对比损失(contrastive loss)去训练这个编码器。这个对比损失会鼓励,由同一个实例产生的正样本对的表示(embeddings)互相靠近,而由不同实例产生的负样本对的表示互相远离。

对比学习的目标是学习一个编码器,此编码器对同类数据进行相似的编码,并使不同类的数据的编码结果尽可能的不同

2.2 正负样本选择(单个正样本+多个负样本)

Contrastive Methods主要的难点在于如何构造正负样本。

Contrastive Predictive Coding (CPC)

对于语音和文本,可以充分利用了不同的 k 时间步长来采集正样本,而负样本可以从序列随机取样来得到。对于图像任务,可以使用 pixelCNN 的方式将其转化成一个序列类型

具体的:给定声音序列上下文Ct和Xt,我们推断预测Xt+1位置上的声音信号。此时,正样本Xt+1,负样本随机采样Xt*

Deep InfoMax

正样本就是图片的 global feature 和中间 feature map 上个的 local feature,而负样本就是另外一张图片

Contrastive MultiView Coding

除了像上面这样去构建正负样本,还可以通过多模态的信息去构造。比如同一张图片的 RGB图 和 深度图去选择正样本,而且通过这个方式,每个 anchor 不仅仅只有一个正样本,可以通过多模态得到多个正样本。但是如何节省内存和空间获得大量的负样本仍然没有很好地解决。

SimCLR

如果一个批包含N个图像,那么对于每个图像,我们将得到2个表示,这总共占2*N个表示。对于一个特定的表示x,有一个表示与x形成正对(与x来自同一个图像的表示,通过旋转、裁剪、剪切、噪声、模糊、Sobel滤波等数据增强方式),其余所有表示(正好是2*N–2)与x形成负对

Supervised Contrastive Learning 

有标签数据集,除了同一图像不同表示作为正样本,同类别的数据也作为正样本;不同类别的数据作为负样本

2.3 损失函数Loss

Contrastive Loss:

 

W 是网络权重;Y是成对标签,如果X1,X2这对样本属于同一个类,Y=0,属于不同类则 Y=1。Dw 是 X1 与 X2 在潜变量空间的欧几里德距离。

InfoNCE Loss表示为:    (增加了更多的不相似样本)

Supervised Contrastive Learning Loss:

 

具象化表示:

1) 计算相似度

2) Cross-Entropy

2.4 代码实现Loss

import torch
import torch.nn as nn

def  similarity(q,k,queue):
    T=0.07
    # compute logits
    # Einstein sum is more intuitive;相似度计算
    # positive logits: Nx1
    l_pos = torch.einsum('nc,nc->n', [q, k]).unsqueeze(-1)
    # negative logits: NxK
    l_neg = torch.einsum('nc,ck->nk', [q, queue])

    # 正负样本拼接
    # logits: Nx(1+K)
    logits = torch.cat([l_pos, l_neg], dim=1)

    # apply temperature  超参数
    logits /= T

    return logits

batch=32
N=15
im_q=torch.randn(batch,12)
im_k=torch.rand(batch,12)
im_neg=torch.rand(12,N)   #队列中取N个作为负样本

# define loss function (criterion) and optimizer
criterion = nn.CrossEntropyLoss()
# compute output
output = similarity(im_q, im_k,im_neg)
# labels: positive key indicators  生成标签
labels = torch.zeros(output.shape[0], dtype=torch.long)

loss = criterion(output, labels)

reference:

https://zhuanlan.zhihu.com/p/130914340

https://zhuanlan.zhihu.com/p/346686467

 https://zhuanlan.zhihu.com/p/141172794

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
自监督对比学习是一种无监督学习方法,旨在通过将数据样本与其在相同任务下的变体进行比较来进行特征学习。其核心思想是将一个样本与自身的不同变体进行对比,以推动特征的区分度增加。 在自监督对比学习中,通常使用一种转换函数对输入样本进行变换,生成多个变体。这些变换可以是图像旋转、裁剪、亮度调整等,也可以是对文本数据进行掩码、重排等操作。对于每个输入样本及其变体,模型将利用一个对比损失函数来度量它们之间的相似性。 通过自监督对比学习,模型会学习到一组鲁棒的特征表示。这些特征不仅能够区分同一样本与其变体,还能够区分不同样本之间的差异。通过不同样本之间的对比学习,模型可以学习到更加丰富的语义信息,提高数据的表征能力。 自监督对比学习在计算机视觉和自然语言处理等领域得到了广泛的应用。例如,在图像领域,可以利用自监督对比学习来学习图像中的局部特征、形状和纹理等信息。而在自然语言处理领域,可以通过对文本进行掩码、重排等方式来进行自监督对比学习,以学习词语、句子和文档的语义表示。 自监督对比学习的窥探给了我们一个更好的方式,通过无监督学习方法来解决许多现实世界中的问题。它为我们提供了一种从大规模数据中学习有用表示的方式,提高了学习算法的效率和泛化性能。通过进一步的研究和发展,自监督对比学习注定将在更多的领域中发挥重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值