PaperLink: https://arxiv.org/pdf/2303.15343
code: https://github.com/mlfoundations/open_clip/blob/main/src/open_clip/loss.py
参考: https://zhuanlan.zhihu.com/p/709572492
概要
CLIP面临的挑战
1.需要较大的batch,即需要大量的GPU;
2.图像和文本的特征需要gather所有GPU上的,需考虑GPU之前的大量通信
提出SigLip(使用sigmoid计算loss,替换之前的softmax函数),减少clip对batch大小的要求。
技术细节
- ClipLoss
1)非对称loss,由文本–图像的softmax+图像到文本的softmax两项组成,
2)以image–>text softmax计算为例,分子中的每个正样本对(xi, yi),都会被分母中的所有负样本(xi,yj)对进行全局归一化。每个GPU需要维护一个N*N的成对相似性矩阵(导致二次复杂)
t为温度超参,控制softmax输出的锐度/平滑度
softmax:多分类问题,给定查询图像I,分配给其对应的正文本T(小batch中所有其他负文本中的文本)
- SigLipLoss
SigLIP 既不对称,也不需要全局归一化因子。因此,每对(正数和负数)的损失都与小批量内的其他对无关
zij为图像-文本对的标签,正对为1,负对为-1
b: logit bias, 训练初期很多负样本的严重不平衡占据loss主体,导致较大的初始化优化步长去纠正这种偏差,为了避免这种情况,引入额外可学习的bias参数,初始化值为-10,确保训练初期和先验值较接近,且不需要过度纠正。
对显存的需求(都计算小批量中每对(正/负)之间的相似性):
Clip:每个GPU 都会为所有成对相似性维护一个NxN矩阵,以便对正对进行规范化–>需要两次gather
SigLip:无需维护NxN矩阵,因为每个正/负对都是独立的–>1次全收集
Sigmoid: 二分类问题, 匹配对(I,T)为正样本,其余为负标签,无需全局归一化因子
全收集时间成本较大: 所有 GPU 都处于空闲状态,等待接收所有特征后再计算损失
- "chunk"实现
对于每个 GPU(设备),“分块”实现可以总结如下:
a)计算其自身文本和图像特征的损失
b)从单个兄弟 GPU接收文本特征
c)使用其自身的图像及其同级文本特征来计算新的损失。
d)将总损失增加新计算的损失。
e)重复步骤#2,直到所有兄弟 GPU 都传递其文本特征。
关于复现
基于cnclip框架复现siglip的结果,在小批量公开数据集(10M)上做消融实验,复现siglipLoss的效果
评测: 在MUGE+Flickr30K-CN数据集上做Text-to-Image Retrieval的测试, 指标为MR(mean-recall),R@1/5/10
- 预训练【视觉-文本模型】的权重组合方式【vit_so400m_patch14_siglip_224+cnclip-vit-l-14-bert-base】,[指标对标ViT-L-14]
- 文本侧数据增强:使用大语言模型,对公开数据集重新打标;结合原始文本标签进行文本aug(以较大的概率选择原始标签)
- 大视觉模型+大分辨率的指标收益
- clip范式中,效果较优时,视觉模型与语言模型参数量的大小
参数量gap不宜过大(大视觉模型+大语言模型+大输入分辨率)
大语言模型(长输入文本)