共计 2145 个字符,预计需要花费 6 分钟才能阅读完成。
技术背景
在跨模态检索任务中,传统方法通常需要先分别提取图像和文本的特征,再通过后处理对齐这两个模态的特征空间。这种方法存在两个主要问题:

- 特征对齐过程通常需要大量标注数据
- 两阶段训练容易导致信息损失
对比学习通过直接在特征空间中拉近匹配样本对、推开不匹配样本对,实现了端到端的跨模态特征学习。CLIP(Contrastive Language-Image Pretraining) 将这一思想发挥到极致,在大规模互联网数据上预训练后,在零样本分类等任务上表现出色。
核心原理
CLIP 的核心是对比损失函数,它计算图像 - 文本对的相似度矩阵,并最大化对角线元素(正样本对)的相似度,同时最小化非对角线元素(负样本对)的相似度。数学表达为:
[L = -\frac{1}{2N}\left(\sum_{i=1}^N \log \frac{e^{s_{ii}/\tau}}{\sum_{j=1}^N e^{s_{ij}/\tau}} + \sum_{j=1}^N \log \frac{e^{s_{jj}/\tau}}{\sum_{i=1}^N e^{s_{ij}/\tau}}\right)]
其中:
– (s_{ij}) 是第 i 个图像和第 j 个文本的相似度得分
– (\tau) 是温度参数,控制分布的尖锐程度
– N 是 batch size
双塔结构意味着图像和文本编码器完全独立,只在计算损失时产生交互。这种设计使得预训练后的编码器可以单独使用。
代码实现
以下是 PyTorch 实现的关键部分:
import torch
import torch.nn as nn
import torch.nn.functional as F
class CLIPModel(nn.Module):
def __init__(self, image_encoder, text_encoder, temp=0.07):
super().__init__()
self.image_encoder = image_encoder # 通常是 ResNet 或 ViT
self.text_encoder = text_encoder # 通常是 Transformer
self.temp = temp # 温度参数
def forward(self, images, texts):
# 编码图像和文本
image_features = self.image_encoder(images)
text_features = self.text_encoder(texts)
# 归一化特征向量
image_features = F.normalize(image_features, dim=-1)
text_features = F.normalize(text_features, dim=-1)
# 计算相似度矩阵
logits = image_features @ text_features.T / self.temp
# 对称交叉熵损失
labels = torch.arange(logits.size(0), device=logits.device)
loss_i = F.cross_entropy(logits, labels)
loss_t = F.cross_entropy(logits.T, labels)
loss = (loss_i + loss_t) / 2
return loss
关键实现细节:
- 特征归一化:确保不同模态的特征在同一尺度
- 温度参数:控制 softmax 分布的尖锐程度
- 对称损失:同时考虑 image-to-text 和 text-to-image 方向
实战建议
数据预处理
- 图像:随机裁剪、颜色抖动、灰度化等增强
- 文本:使用与模型匹配的 tokenizer(如 BERT tokenizer)
超参数设置
- batch size:越大越好(但受限于显存)
- 学习率:通常设置为
base_lr * batch_size / 256 - 温度参数:常用 0.05 到 0.1 之间的值
特征可视化
可以使用 t -SNE 或 UMAP 将高维特征降到 2D/3D 可视化:
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2)
features_2d = tsne.fit_transform(features)
避坑指南
-
模态不平衡问题:如果图像特征范数远大于文本特征,可以分别对两个模态的特征进行层归一化
-
小 batch size 问题:当 batch size 较小时,负样本数量不足会导致性能下降。解决方法:
- 使用 memory bank 存储历史特征
-
梯度累积模拟大 batch
-
过拟合识别:监控验证集损失,如果训练损失下降但验证损失上升,可能出现过拟合
延伸阅读
- Radford et al. “Learning Transferable Visual Models From Natural Language Supervision” (CLIP 原论文)
- Chen et al. “A Simple Framework for Contrastive Learning of Visual Representations” (SimCLR)
- He et al. “Momentum Contrast for Unsupervised Visual Representation Learning” (MoCo)
CLIP 对比学习虽然原理简单,但在实际应用中需要仔细处理各种实现细节。希望这篇指南能帮助初学者快速掌握这一强大技术。
