2026/4/13 4:36:10
网站建设
项目流程
单网页网站 企业,工资8000以上的工作,微信app下载安装2024最新版,备案网站电子照幕布这篇文章介绍多模态模型-CLIP
多模态基础知识点可以看#xff1a;多模态-1 基础理论
ViT的相关介绍可以看#xff1a;计算机视觉Transformer-1 基础结构 CLIP原论文#xff1a;《Learning Transferable Visual Models From Natural Language Supervision》-2021-OpenAI
一…这篇文章介绍多模态模型-CLIP多模态基础知识点可以看多模态-1 基础理论ViT的相关介绍可以看计算机视觉Transformer-1 基础结构CLIP原论文《Learning Transferable Visual Models From Natural Language Supervision》-2021-OpenAI一 为什么提出CLIP做过视觉模型的一定会有以下痛苦经历本来最初的要求是让模型识别20种类别你收集数据-标记数据-构建模型-调参炼丹-输出能识别20种类别的模型你开心地进行交付时突然需求跟你说又加了一个新类别你又需要重新做重走整个流程即使有数据平台、标记外包等随着需求的变动如此循环也是很烦的。之所以要进行循环的根源是传统判别式模型外推能力有限它只认识你在训练数据集中标记过、教给它让它学习的类别如果你的训练数据集中根本就没有“猫”这种类别的数据然后突然输入一张“猫”的图片让模型识别它大概率会不产生任何识别结果或者给出置信度很低的其它相似类别标签输出比如输出了“狗”。工业模型落地一直强调的“数据先于模型”就是这个道理再牛的模型没有数据做燃料也是废物。我们希望有这样一种模型它经过训练后对于未在训练集中出现的类别也能做出准确的判断学术上称这种能力为“Zero-Shot”CLIP就是这种模型。二 结构传统判别式模型是从特征映射的角度处理识别问题也就是“特征-识别结果”而CLIP是从语义相似性的角度来处理识别问题也就是“(特征识别结果)-最相似的是正确结果”。举例来说输入一张“猫”的图片传统判别式模型会对图片进行特征提取根据提取到的特征进行判断说“我认为这张图片90%是猫”而CLIP会分别对图片、所有类别“猫”、“狗”......都进行特征提取然后判断每个图片特征类别特征相似度是多少选相似度最大的作为当前图片的类别。CLIP的Zero-Shot能力就体现在如果‘所有类别’哪天突然变了传统判别式模型需要重新构建数据集-进行训练......但是CLIP只需要对新类别进行一次特征提取就可以然后还是通过相似度比对就可以进行判断识别CLIP整体结构如下左侧是CLIP的训练过程CLIP包含两个关键组件Image Encoder(图像编码器)、Text Encoder(文本编码器)最后就是通过数据集训练这两个编码器让它们提取到的特征具有语义相似性也就是图像编码器对‘猫图片’的特征编码输出和文本编码器对文本“猫”的特征编码输出具有最大的相似性。右侧是CLIP的推理过程输入一张待进行识别的图片利用训练完毕的图像编码器对其进行特征提取利用文本编码器对所有类别标签文本进行特征提取然后判断图像特征和类别标签文本特征的相似性具有最大相似性的就是图像对应的类别。CLIP训练时的输入是多个图像图像文本描述对比如猫的图片“A photo of a cat”利用图像编码器对输入图像进行特征提取论文中尝试了ResNet和ViT作为图像编码器利用文本编码器对于图像文本描述进行特征提取论文中尝试了类似BERT结构的文本编码器对于图像编码器和文本编码器提取到的特征利用对比学习最大化正确匹配图像图像文本描述相关特征的余弦相似度最小化错误匹配图像图像文本描述相关特征的余弦相似度强迫模型学习出图像特征和文本特征之间的语义相关性。三 数据集构建CLIP作者通过不同主题的搜索关键词在网络上进行图片数据搜索构建了一个包含4亿图像图像文本描述对的数据集为了保持数据集的均衡性每个主题的搜索关键词大约包含20000个数据这个数据集命名为WIT(WebImageText)其包含的文本token数量接近于GPT-2的训练数据集。四 训练过程CLIP训练过程的核心目标是将图像和文本映射到一个共享的语义向量空间中使得语义相近的图文对特征在该空间中距离更近而无关的图文对特征距离更远。具体过程1)从训练数据集中获取一个batch的图像图像文本描述训练数据论文中使用的batch size高达327682)获取图像编码器、文本编码器对于batch数据的特征编码表示对特征编码表示进行归一化3)计算当前batch所有图像编码表示、文本编码表示的余弦相似度矩阵4)计算当前batch的损失对于第i个图像和第i个图像文本描述直观上就是最大化相似度矩阵对角线上的值最小化其它的值所以论文里会像下图所示进行示意5)根据损失反向梯度传播训练CLIP所有非对角线元素其实是作为负样本负样本越多效果越好这也是为什么CLIP要采取那么大的batch size这也提醒我们如果我们的资源没办法支撑这么大的batch size时不要轻易尝试在我们的数据集上训练CLIP效果肯定差。训练的一些其它细节如下整体训练过程的伪代码如下训练伪代码解释如下# image_encoder - ResNet /Vision Transformer图像编码器 # text_encoder - CBOW /Text Transformer 文本编码器 # I[n, h, w, c] - 包含n张图像的训练图像 # T[n, L] - 包含n个长度为L的图像文本描述 # W_i[d_i, d_e] - 图像编码结果线性变换层可学习矩阵 # W_t[d_t, d_e] - 文本编码结果线性变换层可学习矩阵 # t - Logits计算中的可学习温度控制参数 # 利用图像编码器和文本编码器获取输入训练图像文本对的特征 I_f image_encoder(I) #[n, d_i] T_f text_encoder(T) #[n, d_t] # 先利用线性变换层(对应可学习的W_i、W_t参数)对编码器提取到的特征进行维度变换 # 然后进行L2正则化 axis1表示操作每一行 也就是对每一行进行正则化 I_e l2_normalize(np.dot(I_f, W_i), axis1) T_e l2_normalize(np.dot(T_f, W_t), axis1) # 因为已经进行过正则化所以利用dot计算内积就是余弦相似度的结果然后利用可学习的温度参数t对结果进行平滑得到logits logits np.dot(I_e, T_e.T) * np.exp(t) # arange(n)得到[0,1,...n]的标签也就是第i张图片的标签是i,训练目标是最大化对角线上图像-文本对的匹配,也就是最大化对角线上的余弦相似值,最小化其它的值 labels np.arange(n) # 分别计算logits每行每列的交叉熵损失对应图像-文本的匹配损失和文本-图像的匹配损失 loss_i cross_entropy_loss(logits, labels, axis0) loss_t cross_entropy_loss(logits, labels, axis1) # 整体损失是图像到文本的匹配损失和文本到图像的匹配损失的平均值 loss (loss_i loss_t)/2五 实验结果CLIP的论文一共48页实验部分页数就占了32页这里列出部分实验部分的页面感受一下数据的震撼^_^感兴趣的可以细读原论文的实验部分可以称作是论文实验部分的撰写教科书了CLIP的实验主要涵盖了零样本(Zero-Shot)能力的验证、模型鲁棒性、模型可拓展性、消融实验、失败案例分析环节六 细节问题1)可以把图片对应的文本描述看做是语言大模型中的prompt越详细的prompt训练效果会越好这也是为什么后续的多模态模型直接用next token的文本生成方式进行训练2)CLIP在人工合成的小型公开评测数据集CIFAR-10、CIFAR-100上效果不如以往的传统模型3)要想针对特定领域重新训练CLIP所需的数据量非常大4)CLIP图像特征编码表示来自哪里5)CLIP的文本特征编码表示来自哪里七 如何使用CLIPCLIP的使用记住一点永远不要轻易地尝试重新开始训练(微调)CLIPCLIP具体应用中常使用的是Linear Probe(线性探针)的方法八 拓展1 文本描述拓展3 现代多模态模型中的img标签2 中文CLIPCLIP是在英文数据集上进行训练的中文效果不好阿里达摩研究院在大规模中文数据集上训练了一个对中文友好的CLIP模型具体工作可以查看《Chinese CLIP: Contrastive Vision-Language Pretraining in Chinese》整体先冻结预训练CLIP的图像编码器只训练文本编码器然后在联合训练。论文整体工作如下数据集构建策略如下