type
status
date
slug
summary
tags
category
icon
password
该工作个人主观打分:9.0
打分理由:作为follow CLIP的一篇工作,和大多数其他peer work拉开了差距,利用sigmoid loss替换掉了cross-entropy loss。极大的工程上的完成度带来的是更深的认知,比如无脑增多batch-size的效果的ablation study。该文章逻辑结构清晰,容易阅读,示意图清晰明了,代码实现容易阅读。
SigLIP
为了方便阐述,符号定义如下:
ㅤName | 符号 |
image encoder | |
text encoder | |
image | I |
text | T |
mini-batch |
论文提出了一种简单的配对 Sigmoid 损失函数(SigLIP),用于语言图像预训练。与传统的基于 softmax 归一化的对比学习方法不同,sigmoid 损失仅在图像-文本对上操作,不需要全局视图对成对相似性进行归一化。这种损失函数允许进一步扩大批次大小,同时在较小的批次大小下也表现更好。结合锁定图像调整,使用仅有的四个 TPUv4 芯片,研究者们训练了一个 SigLiT 模型,在两天内达到了 84.5% 的 ImageNet 零样本准确率。通过将批次大小从损失中解耦,研究者们还研究了示例与对的比例以及负样本与正样本的比例的影响。最后,研究者们将批次大小推至极致,高达一百万,发现增加批次大小的好处迅速减少,一个更合理的批次大小为 32k 就足够了。研究者们发布了他们的模型,并希望他们的研究能激发对提高语言图像预训练质量和效率的进一步探索。
理论
对于经典的softmax-based优化目标
InfoNCE,其核心思路是让positive的图文对的距离越近越好,让negative图文对的距离越远越好,计算公式如下:
InfoNCE的缺点:- softmax的计算存在数值不稳定的问题,需要引入额外的trick保证softmax的计算稳定性。详情见附录。
- 计算量大。softmax loss的非对称(asymmetry),需要做了两次normalization,即

- 显存占用大,由于要计算normalize,需要维护一个很大的概率分布矩阵。假定batch size为,那么这个概率分布矩阵的大小为
下面来看文本提出的
sigmoid loss 。其定义如下
从上式可见,Sigmoild loss将每对图文对独立看待。即分别将每对图文对做二分类。
- 当时为正例。
- 当()时为负例。
式子中, 为图文对的标签,1表示是正例,-1表示是负例。直观来看,式(2)明显存在正负样本不均衡的问题,batch size为 时,正例数为,负例数为 。为了缓解正负样本不均衡,作者引入两个learnable parameter , 来调节正负例的梯度
初始时 。附录对这两个参数的作用机理进行了浅要分析。
pseudo code

训练细节
Setting
(一) 模型
作者将基于sigmoid loss训练的
CLIP称为SigLIP(Sigmoid loss for Language-Image Pre-training), 将sigmoid loss和LiT[2]架构训练的CLIP称为SigLIT (sigmoid LiT)(二) 评估指标
作者主要从以下2个指标来评估模型的性能
Imagenet的zero shot准确率
XM3600多语言数据集的zero shot跨模态搜索准确率。
(三)训练数据集
webLi[9]The influence of positive and negative pairs ratio
- 发现 pretrain-backbone 的时候,不用 weight-decay 效果还好些 (个人推测可能是因为 batch 够大)
- 发现在 batch-size 的调整中,对于这个目标函数下的训练结果而言,并不是越大越好

类别平衡处理
在 SigLIP 的训练中,针对每个 batch 的正负样本的不同配比做了尝试。

We run experiments in the SigLiT setup at batch-size 16 k for 900 M steps and vary the composition of the batch by masking out (i.e. ignoring) enough negative examples to reach a target “positive : negative” ratio, masking in the following ways:
- Random
: Randomly choose negative pairs to mask. 随机屏蔽掉一部分负例
- Hard
: Keep hardest negative pairs (highest loss). 保留最难的负例
- Easy
: Keep easiest negatives pairs (lowest loss). 保留最简单的负例
- Hard + matching total pairs seen
: Masking examples while training for a fixed number of steps does decrease the total number of pairs seen during training. Hence in the matched pairs setting, we increase the number of training steps by the masking ratio in order to keep the number of pairs seen constant. 由于在每个批次中masking掉一些负例会减少模型在训练过程中看到的总对数(pairs seen),这可能会影响模型的学习效果。为了补偿这种减少,研究者们提出增加训练的步数(training steps)。具体来说,如果通过masking减少了一定比例的负例,那么他们会增加相应的训练步数,以确保模型在整个训练过程中看到的正例和负例的总对数保持不变。这种方法的目的是,在减少负例数量以平衡正负例比例的同时,通过增加训练步数来保持模型接触到的总数据量不变,从而尽可能地减少由于masking导致的信息损失。这样可以帮助模型更有效地从难区分的负例中学习,同时保持训练数据的丰富性。
多卡场景下,可以用式(3)的通信策略实现高效训练。
Contrastive loss 的训练很明显用到了数据并行的策略,由于要搜集所有设备上的 embedding 结果,很明显通信开销会很大,而且要做 Contrastive loss 这样的计算,要有 针对相似度的计算量。

然而 sigmoid loss 的内存效率较高,每个 device 上,分到的b=BD的数据,loss 函数可以被重写为:

每个pairs就是独立的,不用看别的pairs,通信开销大大降低,有以下
- (每个 device)
- (要交换复例)
- 本地的正例 + 其他的 device 的负例
也就是正例本地算,负例从其他 device 来。
使用方法
References
附录
附录一:softmax的溢出问题

这些其实都已经在现有的softmax中就是这么实现的了。上溢出的解决方法就是减去x_max,防止数太大,log(0)的解决主要就是防止分母为0,所以进行了第二行到第三行的变换。
附录2: sigmoid loss梯度分析


画图代码:

- Author:Yixin Huang
- URL:https://yixinhuang.cn/article/clip_siglip
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts








