手搓多模态-01 对比损失的优化
对比损失
对比损失用来给模型提供一个输出与标签的距离参照,在这一点上它与其他损失函数没有差别。对比损失的独特之处在于,不像其他损失函数只给模型提供正向的参照:“即所谓教模型什么是对的”,它同时让模型学习到什么是错的。
多模态上的对比损失
多模态模型的训练数据集上主要由 [图像,文本] 对组成,这些图像可以是专门的数据集中获取,也可以是维基百科上面进行爬取,文本则通常是爬取图像的附带信息。
多模态模型通常会使用一个编码器来将图像和文本编码成一个个独特的向量
图像 ----> 向量 (维度在config中设置)
文本 ----> 向量 (维度在config中设置)
如下图所示:
在这里,蓝色的高亮代表image需要对应其text描述,这里通过将T向量和I向量做点积得到他们的相似度得分。于是对比损失要求蓝色区域的得分应该为高分,而白色区域的得分应该为低分。由此,对比损失既让模型知道哪些是对的,又让模型知道哪些是错的。
传统做法
将每一行或者每一列看成是一个分布,比如对于每一行,给定一个image,不同列的得分表示的是输出对应text的概率,所以我希望蓝色区域的概率要高,白色区域的概率要低,即蓝色的标签概率是1,白色的标签概率是0,由此再通过KL散度或者交叉熵来计算概率分布之间的差异。
问题所在
模型的输出是不确定的,而要将相似度得分转换成概率的分布需要满足一行的所有相似度得分加起来等于1,那么此时需要对每一个相似度得分进行softmax归一化。
softmax归一化,是一种在机器学习尤其是神经网络中广泛应用的数学方法。它将输入的向量转换为概率分布形式,使得每个元素的值都在0到1之间,且所有元素之和为1。这一特性让模型能清晰地输出各类别的预测概率,从而便于比较与决策,在分类任务里发挥着关键作用,助力模型更精准地做出判断。
softmax归一化的公式是:
其中, 在此处就是每一行中每一个text 与 image的相似度得分
但现在有一个潜在的问题:
由于相似度得分是由两个向量点积得到的,其值在计算过程中不确定,如果相似度得分的值非常之高,那么由于指数爆炸, 的值会非常之大,而计算机保存数值数据的位数是固定的,所以这里会对计算结果产生影响。
保证数值稳定性
公式转换:

令
便可让指数数值最大值为1
引申问题
这样做虽然数值的稳定性保证了,但是训练的速度又下降了,因为c的确定需要先把每一个相似度得分计算出来,然后才能找到最大值,这就导致了数据依赖问题,从而无法并行地计算不同相似度得分归一化之后的值。
解决办法
将传统的概率分布建模转换为分类建模,每一个image-text对的标签要么为1(相似),要么为0(不相似),那么由于不涉及到概率分布,就不需要进行softmax归一化,但是仍然需要将相似度得分转换为0-1之间的标准化的值用于指示相似程度。这里使用的归一化方法是:sigmoid归一化:
由于指数部分是负的,所以这里不存在数值稳定性的问题,其次每个text-image对的归一化计算是独立的,这样就保证了并行性,各个设备并行的记录出每一个样本对的相似度得分,并基于标签的0或者1计算损失函数。
蓝色部分的标签为1,白色部分的标签为0.
这便是siglip对clip的优化