ALBEF、BLIP模型中的对比学习损失函数——源码公式演绎
ALBEF与BLIP模型内的对比学习损失函数——深入剖析
在图像与文本(ITC)对比学习过程中,核心环节是基于[CLS]向量的图像与文本表征进行对映。图像与文本的全局表征分别以[公式]和[公式]表示,动量编码器的输出通过[公式]和[公式]体现。起初,动量编码器对图像与文本进行处理,将得到的[CLS]置于对应队列前端,随后计算编码器与动量编码器输出的相似度,如[公式]和[公式]所示。
硬标签制作环节,通过[公式]生成每对图-文的标签,体现它们之间的关系。原始标签队列与生成的硬标签拼接,构成新的对比矩阵。动量蒸馏引入后,计算动量编码器输出与队列的相似度,并生成软标签,如[公式]和[公式]所示。
对比学习ITC损失计算基于交叉熵,通过[公式]变换,考虑了动量蒸馏的情形。不蒸馏时,损失函数可表示为[公式],而引入动量蒸馏的MLM损失则为[公式],通过KL散度的近似公式简化计算,最终得到的源代码计算公式为[公式]。
ITM模块的应用是在每个样本的全局表征上进行分类,通过[公式]计算ITM损失。至于MLM损失,通过掩码处理文本并生成标签,计算方式基于[公式],并在动量蒸馏下调整为[公式]。
模型的参数配置可通过调整num_hidden_layers参数实现,如在Huggingface的bert-base-uncased模型中。总体来看,ALBEF和BLIP的损失函数设计重视全局表征的对比与样本关系的精细处理,通过动量蒸馏优化了模型的训练效果。
多标签分类任务中损失函数的选择
在多标签分类任务中,通常采用sigmoid激活函数激活分类层的输出,随后通过交叉熵损失函数计算损失。具体操作如下:将输出矩阵与绿色标签结合,使用sigmoid激活,进而计算交叉熵损失。此直观方法适用于单一输出的分类。
然而,我们还可以拓宽思路,将标签与预测结果视为两个图像,运用图像分割问题进行优化。在此框架下,可选用dice损失和lovase损失函数进行优化。代码实现中,输出结果一致,因此在训练阶段,使用BCEWithLogitsLoss()和MultiLabelSoftMarginLoss()均可。
针对标签间存在的依赖性,采用序列模型解决。CNN_RNN模型通过在CNN中提取图像特征后,将其与标签嵌入拼接,然后进行预测。此过程根据上一个输出单元的隐藏状态、图像特征和标签嵌入继续预测,一定程度上解决了标签间的依赖关系。
另一种解决依赖性的方法是引入图网络模型(ML_GCN)。通过在普通CNN网络中加入GCN分支,形成一个端到端的网络。GCN利用标签之间的拓扑结构,为不同标签学习不同的分类器(embedding-to-classifiers),将CNN输出的特征与这些分类器相乘。最后使用普通的BCE损失函数计算损失。此方法在CVPR2019上展示了卓越的性能。
以上三种方法在多标签分类任务中提供了不同的解决思路,从简单的交叉熵损失到更复杂的序列模型和图网络模型,旨在优化标签间的依赖关系,提高模型性能。