• OpenAI打破文本和图像次元壁,提出基于对比学习的多模态预训练模型CLIP


    OpenAI 打破了自然语言与视觉的次元壁,推出了一个连接文本与图像的神经网络模型CLIP

    相关资料

    CLIP预训练阶段(对比学习训练)

    对比学习非常灵活,它只需要你一个正样本和负样本的定义,其他都是正常的套路

    对角线上的是正样本,其他的都是负样本。上图共有N个正样本和 N ∗ ( N − 1 ) N*(N-1) N(N1)个负样本。有了正负样本,模型就可以用对比学习的方式训练起来了。完全不需要任何手工的标注。

    OpenAI专门收集了一个数据集,里面有4亿个图片和文本的配对,这也是为什么CLIP这个预训练模型能那么强大的原因之一。作者用4亿对来自网络的图文数据集,将文本作为图像标签,进行训练。这个数据集称为WebImageText(小红书的笔记其实天然有这种图片和文本的配对关系,因为通常来说它里面的笔记图片和文本相关性是比较高的,小红书推荐系统的笔记多样性用到了CLIP模型)

    # image_encoder - 残差网络 或者 ViT
    # text_encoder - CBOW 或者 文本Transformer
    # I[n, h, w, c] - 训练图像
    # T[n, l] - 训练文本
    # W_i[d_i, d_e] - 训练图像生成的特征向量
    # W_t[d_t, d_e]  - 训练文本生成的特征向量
    # t - softmax的温度(temperature)参数
    
    # 提取多模态的特征
    I_f = image_encoder(I) #[n, d_i]
    T_f = text_encoder(T) #[n, d_t]
    
    # 多模态特征向特征空间的映射
    I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
    T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
    
    # 计算余弦相似度
    logits = np.dot(I_e, T_e.T) * np.exp(t)
    
    # 构建损失函数
    labels = np.arange(n)
    loss_i = cross_entropy_loss(logits, labels, axis=0)
    loss_t  = cross_entropy_loss(logits, labels, axis=1)
    loss = (loss_i + loss_t)/2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    CLIP预测阶段

    CLIP如何做zero shot推理?引入Prompt思想。

    在预测时,如果直接用单词作为句子,过文本特征提取器的话,会导致跟训练阶段的模式不一致(训练阶段看到的一般都是一个句子),导致效果下降。

    作者提出的预测过程非常巧妙:

    • 当来一张新图片,先过图片特征提取器,得到图片向量表征 I 1 I_1 I1,然后跟所有的文本向量表征 T 1 , T 2 , . . . , T N T_1, T_2, ..., T_N T1,T2,...,TN去算余弦相似度,然后选择相似度最高的那个句子,把那个句子里面的类别单词,作为分类的结果。

    CLIP彻底摆脱了categorical label的限制

    之前的模型,如ResNet101,需要事先指定要1000个分类标签,然后进行模型训练和预测,并且来一张新的图片,模型只会去预测这种图片最像这1000个类别中的哪一个。

    CLIP彻底摆脱了categorical label的限制,也就是在训练和预测时,我都不需要有提取定好的类别列表(如CIFAR10的10个类别标签)。任何给一张图片,如奥特曼,我只要在Prompt文本里去加入一些自己想的类别(如三轮车、奥特曼、马铃薯),然后模型就能预测这种图片是不是我感兴趣的物品。

    CLIP的迁移效果很强

    CLIP学习到的语义信息非常强大。

  • 相关阅读:
    基于机器学习的课堂自动点名系统
    定义函数(简单介绍)-def
    Linux基础-日志管理
    一文教你如何使用Scan Kit快速生成带有logo的个性化二维码
    Unity 编辑器扩展,获取目录下所有的预制件
    MySql查询某个时间段内的数据(前一周、前三个月、前一年等)
    Science adv | 转录因子SPIC连接胚胎干细胞中的细胞代谢与表观调控
    ElasticSearch-Query DSL(Domain Specific Language)
    springboot解决multi-statement not allow(已部署生产)
    C语言进阶---动态内存管理
  • 原文地址:https://blog.csdn.net/qq_43827595/article/details/127646176