Moco: 无监督视觉表征学习的动量对比

Moco是一种用于无监督视觉表征学习的方法,通过动态字典和动量更新解决高维连续输入的问题。对比学习思想下,Moco利用InfoNCE损失函数,通过不断更新的编码器保持key的一致性。实验显示,相比于端到端和记忆库方法,Moco在大字典设置下表现出更好的性能,且在ImageNet的线性分类和迁移特征任务中取得优秀结果。此外,Moco v2引入SimCLR改进,进一步提升网络性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 概述

在NLP领域,无监督表征学习有GPT、BERT等效果非常好的模型,但是CV领域还是有监督模型作为主流。作者认为主要是因为CV和NLP领域处理的数据对应的信号空间不同:语言任务有离散的信号空间,词语词之间可以视为是独立的词组,能够很方便地构成字典(Dictionary),这种词典是无监督学习便于学习依赖的特征;而视觉领域的原始信号是在一个连续且高维空间中,无法成为结构化的信号,使得无监督学习难以展现在NLP领域发挥出的效果。

moco原理

作者提出了一种动态字典,即MOCO,新的minibatch对应的字典在进入队列时,将会替换最早进入的字典,使得字典始终是所有数据的子集,又始终代表最新的表征,经过试验发现,Moco的表现非常之好。

2 思想

对比学习的思想在于,通过一些已编码的query(q),使其与其对应的key(k)相对应,k是被编码的样本的在字典中的key { k 0 , k 1 , k 2 . . . } \lbrace k_0,k_1,k_2...\rbrace { k0,k1,k2...},假设 q q q k + k_+ k+相匹配,对比损失的目的是尽量拉近 q q q k + k_+ k+之间的距离而增大 q q q与其他 k i k_i ki之间的距离(拉近正对,缩小负对,其他的 k i k_i ki都是负对),Moco用的是点积的方法衡量相似度,称为InfoNCE loss:
ℓ i , j = − log ⁡ exp ⁡ ( q ⋅ k + / τ ) ∑ i = 0 K exp ⁡ ( q ⋅ k i

### 动量对比学习在视觉任务中的应用 动量对比学习(Momentum Contrast, MoCo)是一种用于无监督特征学习的方法,它通过构建动态词典来进行实例级别的区分[^5]。MoCo 的核心思想在于维护一个队列结构以存储历史负样本,并利用动量更新机制保持编码器参数的一致性。 #### 方法概述 MoCo 使用两个神经网络:一个是查询编码器 \( q \),另一个是键编码器 \( k \)。查询编码器负责处理当前批次的数据并生成嵌入向量;而键编码器则用来生成历史数据的嵌入向量。为了减少计算开销,键编码器的权重不是直接优化得到,而是通过动量更新的方式从查询编码器继承: \[ k_{t} = m \cdot k_{t-1} + (1-m) \cdot q_t, \] 其中 \( m \in [0, 1] \) 是动量系数。这种设计使得键编码器能够平滑地跟踪查询编码器的变化,从而提高模型稳定性。 #### 对比损失函数 MoCo 中使用的对比损失函数通常采用 InfoNCE 形式,其定义如下: \[ L = -\log \frac{\exp(\text{sim}(q, k^+)/\tau)}{\sum_{i=0}^{K}\exp(\text{sim}(q, k_i)/\tau)}, \] 这里 \( q \) 表示查询向量,\( k^+ \) 是正样本对应的键向量,\( k_i \) 则是从队列中采样的负样本集合成员[\(^5]\)]。相似度函数 \( \text{sim}() \) 可能是最简单的点积操作或者经过归一化后的余弦距离。 #### 实验设置与性能提升 实验表明,在大规模图像分类任务上预训练过的 MoCo 模型可以通过线性评估协议展示出优异的表现[^3]。具体来说,当与其他自监督方法比较时,MoCo 不仅能够在较小批量大小下工作良好,而且还能随着批尺寸增大进一步改善效果。此外,增加网络宽度和深度同样有助于获得更好的表征质量。 ```python import torch.nn.functional as F def info_nce_loss(query, key_positive, keys_negative, temperature=0.1): """ Compute the contrastive loss using InfoNCE. Args: query: Tensor of shape (B, D), where B is batch size and D is embedding dimension. key_positive: Tensor of shape (B, D). keys_negative: Tensor of shape (K, D), K being number of negatives per positive pair. temperature: Scalar value controlling sharpness of distribution. Returns: Loss scalar tensor. """ logits = torch.cat([F.cosine_similarity(query.unsqueeze(1), key_positive.unsqueeze(2)), F.cosine_similarity(query.unsqueeze(1).unsqueeze(2), keys_negative.T)], dim=-1) labels = torch.zeros(len(query)).long().cuda() return F.cross_entropy(logits / temperature, labels) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值