0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CLIP-Chinese:中文多模态对比学习预训练模型

深度学习自然语言处理 来源:YeungNLP 作者:YeungNLP 2022-12-06 14:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

笔者最近尝试在业务中引入多模态,基于CLIP论文的思想,实现了基于Vit-Bert的CLIP模型,下面将其称为BertCLIP模型。笔者用140万的中文图文数据,基于LiT-tuning的方式,训了一版BertCLIP模型。BertCLIP模型在中文图文相似度、文本相似度、图片相似度等任务上都有着不错的表现。

本文将对该工作进行详细的介绍并且分享笔者使用的中文训练语料、BertCLIP预训练权重、模型代码和训练pipeline等。

首先展示一下BertCLIP预训练模型在图文相似度上的效果

baaf4848-751e-11ed-8abf-dac502259ad0.png

项目地址:

https://github.com/yangjianxin1/CLIP-Chinese

预训练权重(使用方法,详见下文):

预训练模型 预训练权重名称 权重地址
BertCLIP整体权重

YeungNLP/clip-vit-bert-chinese-1M

https://huggingface.co/YeungNLP/clip-vit-bert-chinese-1M

单独提取出来的Bert权重

YeungNLP/bert-from-clip-chinese-1M

https://huggingface.co/YeungNLP/bert-from-clip-chinese-1M

论文标题:

Learning Transferable Visual Models From Natural Language Supervision

01

模型简介

CLIP是由OpenAI提出的一种多模态对比学习模型,OpenAI使用了4亿对图文数据,基于对比学习的方法对CLIP模型进行训练。

CLIP模型主要由文编码器和图片编码器两部分组成,训练过程如下图所示。对于batch size为N的图文对数据,将N个图片与N个文本分别使用图片编码器和文本编码器进行编码,并且映射到同一个向量空间。然后分别计算两两图文对编码的点乘相似度,这样就能得到一个N*N的相似度矩阵。

bb017028-751e-11ed-8abf-dac502259ad0.png

然后使用我们熟悉的对比损失InfoNCE Loss来计算该batch的训练损失,更新模型权重。对InfoNCE Loss不熟悉的小伙伴,可以回顾笔者往期的文章:SimCSE:简单有效的句向量对比学习方法。

举个例子,对于图片I1,分别计算I1与文本T1~TN的相似度,T1是I1的正样本,而T2~TN均视为I1的负样本,我们希望I1与T1的相似度尽可能大,而I1与其他文本的相似度尽可能小。

在计算T1的InfoNCE Loss时,首先将T1与所有文本的相似度进行softmax归一化,得到相似度的分布,然后计算相似度分布与label的交叉熵损失,而T1的label为1。由此可以将这个loss的计算方式推广到整个batch。

有小伙伴可能会觉得,对于图片l1,文本T2~TN中可能存在它的正样本,若T2~TN均视为I1的负样本,会对模型的训练带来很大的影响。对于该问题,我们可以认为,当数据量足够大,并且batch size足够大的时候,上述误差对模型的优化方向的影响是有限的。在预训练时代,我们要相信大力是能够出奇迹的,只要堆足够多优质的数据,很多问题都可以迎刃而解。

02

项目介绍

训练细节

BertCLIP主要由Vit和Bert组成,在预训练时,笔者分别使用不同的预训练权重来初始化Vit和Bert的权重。使用OpenAI开源的CLIP模型来初始化Vit权重,使用孟子中文预训练权重来初始化Bert权重。

我们基于LiT-tuning的方法来训练BertCLIP模型,也就是将Vit部分的模型参数进行冻结,只训练BertCLIP的其他部分的参数。LiT-tuning是多模态模型训练的一种范式,它旨在让文本编码空间向图像编码空间靠近,并且可以加快模型的收敛速度。

笔者使用了140万条中文图文数据对,batchsize为768,warmup step为1000步,学习率为5e-5,使用cosine衰减策略,混合精度训练了50个epoch,总共73100步,训练loss最终降为0.23左右。模型的训练loss变化如下图所示。

bb250222-751e-11ed-8abf-dac502259ad0.png

由于训练资源的限制,以及训练数据的获取需要耗费较多时间,目前笔者仅使用了140万的训练数据。对于预训练而言,140万的训练数据量略微少了些,笔者训练50轮,模型也许会过分拟合训练数据。若条允许,读者可以共享的模型权重的基础上,使用更多域内数据进行二次预训练。

笔者曾使用实际业务中1700万的图文数据训练BertCLIP模型,训练10轮,大概22万步,训练损失大约降为0.7。在域内的图文匹配、同义词挖掘等任务中有不错的效果。

使用方法

BertCLIP模型的使用方法非常简单,首先将项目clone到本地机器上,并且安装相关依赖包。

git clone https://github.com/yangjianxin1/CLIP-Chinese.git
pipinstall-rrequirements.txt

使用如下代码,即可加载预训练权重和processor,对图片和文本进行预处理,并且得到模型的输出。

from transformers import CLIPProcessor
from component.model import BertCLIPModel
from PIL import Image
import requests


model_name_or_path = 'YeungNLP/clip-vit-bert-chinese-1M'
# 加载预训练模型权重
model = BertCLIPModel.from_pretrained(model_name_or_path)
# 初始化processor
CLIPProcessor.tokenizer_class='BertTokenizerFast'
processor = CLIPProcessor.from_pretrained(model_name_or_path)
# 预处理输入
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
inputs = processor(text=["一只小狗在摇尾巴", "一只小猪在吃饭"], images=image, return_tensors="pt", padding=True)
inputs.pop('token_type_ids')    # 输入中不包含token_type_ids


outputs = model(**inputs)


# 对于每张图片,计算其与所有文本的相似度
logits_per_image = outputs.logits_per_image  # image-text的相似度得分
probs = logits_per_image.softmax(dim=1)  # 对分数进行归一化


# 对于每个文本,计算其与所有图片的相似度
logits_per_text = outputs.logits_per_text  # text-image的相似度得分
probs = logits_per_text.softmax(dim=1)  # 对分数进行归一化


# 获得文本编码
text_embeds = outputs.text_embeds
# 获得图像编码
image_embeds = outputs.image_embeds

单独加载图像编码器,进行下游任务。

from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPVisionModel


model_name_or_path = 'YeungNLP/clip-vit-bert-chinese-1M'
model = CLIPVisionModel.from_pretrained(model_name_or_path)
CLIPProcessor.tokenizer_class = 'BertTokenizerFast'
processor = CLIPProcessor.from_pretrained(model_name_or_path)


url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)


inputs = processor(images=image, return_tensors="pt")


outputs = model(**inputs)
last_hidden_state = outputs.last_hidden_state
pooled_output = outputs.pooler_output

单独加载文本编码器,进行下游任务。

from component.model import BertCLIPTextModel
from transformers import BertTokenizerFast


model_name_or_path = 'YeungNLP/clip-vit-bert-chinese-1M'
model = BertCLIPTextModel.from_pretrained(model_name_or_path)
tokenizer = BertTokenizerFast.from_pretrained(model_name_or_path)


inputs = tokenizer(["一只小狗在摇尾巴", "一只小猪在吃饭"], padding=True, return_tensors="pt")
inputs.pop('token_type_ids')  # 输入中不包含token_type_ids


outputs = model(**inputs)
last_hidden_state = outputs.last_hidden_state
pooled_output = outputs.pooler_output

笔者也将BertCLIP中Bert的预训练权重单独拎出来,可以使用BertModel直接加载,进行下游任务。

from transformers import BertTokenizer, BertModel


model_name_or_path = 'YeungNLP/bert-from-clip-chinese-1M'
tokenizer = BertTokenizer.from_pretrained(model_name_or_path)
model = BertModel.from_pretrained(model_name_or_path)

在项目中,笔者上传了多线程下载训练图片、训练pipeline,以及相似度计算的脚本,更多细节可参考项目代码。

03

模型效果

图文相似度

在计算图文相似的时候,首先计算两两图文向量之间的点乘相似度。对于每张图,将其与所有文本的相似度进行softmax归一化,得到最终的分数。

bb40dec0-751e-11ed-8abf-dac502259ad0.png

bb6a8716-751e-11ed-8abf-dac502259ad0.png

文本相似度

在计算文本相似度的时候,首先计算两两文本之间的点乘相似度。对于每个文本,将其与自身的相似度置为-10000(否则对于每个文本,其与自身的相似度永远为最大),然后将其与所有文本的相似度进行softmax归一化,得到最终的分数。

bba9ce62-751e-11ed-8abf-dac502259ad0.png

bc0194b2-751e-11ed-8abf-dac502259ad0.png

bc258566-751e-11ed-8abf-dac502259ad0.png

bf4c3a28-751e-11ed-8abf-dac502259ad0.png

图片相似度

图片相似度的计算方式与文本相似度的方式一致。为方便展示,仅选出top1的图片及其相似度分数。

注:由于在训练BertCLIP时,将图像编码器的权重冻结,所以该部分的能力,主要归功于OpenAIclip预训练权重。如想要优化模型在域内数据的图片相似度计算能力,图像编码器需要一起参与训练。

bf6f2132-751e-11ed-8abf-dac502259ad0.png

bfa43bec-751e-11ed-8abf-dac502259ad0.png

04

结语

在本文中,笔者基于CLIP的思想,设计了Vit-Bert结构的BertCLIP模型,并且使用140万中文图文数据对,对模型进行预训练。在图文相似度、文本相似度、图片相似度任务上做了尝试,取得了不错的效果。

该预训练模型,能够在中文图文检索、文本相似度计算、同义词挖掘、相似图召回等任务上发挥作用。并且在下游的一些多模态任务中,可以凭借该模型同时引入图片和文本信息,扩充模型的信息域。由于Bert需要将文本空间向图片空间对齐,所以Bert必然能够学到了丰富的语义信息,这能够对下游的NLP任务带来增益。读者也可以基于笔者分享的Bert预训练权重,进行下游NLP任务的finetune,相信会有所帮助。

不足之处在于,对于预训练而言,140万的数据稍显不足,读者可以使用自身域内数据进行二次预训练。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    45

    文章

    4011

    浏览量

    143336
  • 模型
    +关注

    关注

    1

    文章

    3818

    浏览量

    52265
  • OpenAI
    +关注

    关注

    9

    文章

    1249

    浏览量

    10279

原文标题:CLIP-Chinese:中文多模态对比学习预训练模型

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    人工智能模态与视觉大模型开发实战 - 2026必会

    训练模型可以逐渐提升对图像的理解能力,实现对各种视觉任务的精准处理。 此外,视觉大模型的发展还得益于大规模数据集和强大计算资源的支持。海量标注数据为模型提供了丰富的
    发表于 04-15 16:06

    海光DCU完成Qwen3.5模态MoE模型全量适配

    近日,海光DCU完成Qwen3.5-397B MoE旗舰模态模型、Qwen3.5-35B-A3B MoE模态
    的头像 发表于 03-26 09:35 696次阅读

    格灵深瞳模态模型荣登InfoQ 2025中国技术力量年度榜单

    灵感实验室联合LLaVA社区发布的模态模型LLaVA-OneVision-1.5,实现了训练数据、代码和模型权重的全链路开源,在多项公开
    的头像 发表于 01-05 10:05 674次阅读

    模态感知大模型驱动的密闭空间自主勘探系统的应用与未来发展

        模态感知大模型驱动的密闭空间自主勘探系统    北京华盛恒辉模态感知大模型驱动的密闭
    的头像 发表于 12-29 11:27 451次阅读

    模态模型驱动的复杂环境精准导航避障系统平台的应用

    模态模型驱动的复杂环境精准导航避障系统平台的应用
    的头像 发表于 12-22 13:15 396次阅读
    <b class='flag-5'>多</b><b class='flag-5'>模态</b>大<b class='flag-5'>模型</b>驱动的复杂环境精准导航避障系统平台的应用

    商汤科技正式发布并开源全新模态模型架构NEO

    商汤科技正式发布并开源了与南洋理工大学S-Lab合作研发的全新模态模型架构 —— NEO,为日日新SenseNova 模态
    的头像 发表于 12-08 11:19 1157次阅读
    商汤科技正式发布并开源全新<b class='flag-5'>多</b><b class='flag-5'>模态</b><b class='flag-5'>模型</b>架构NEO

    格灵深瞳模态模型Glint-ME让图文互搜更精准

    在电商、安防等场景下,图文互搜应用广泛。随着以CLIP为代表的模态表征方法相继提出,过去单一模态搜索(文搜文、图搜图)被突破,模型可以同时
    的头像 发表于 11-02 15:56 1854次阅读
    格灵深瞳<b class='flag-5'>多</b><b class='flag-5'>模态</b>大<b class='flag-5'>模型</b>Glint-ME让图文互搜更精准

    亚马逊云科技上线Amazon Nova模态嵌入模型

    Embeddings模态嵌入模型现已在Amazon Bedrock上线,这是一款专为Agentic RAG与语义搜索应用打造的顶尖模态
    的头像 发表于 10-29 17:15 369次阅读
    亚马逊云科技上线Amazon Nova<b class='flag-5'>多</b><b class='flag-5'>模态</b>嵌入<b class='flag-5'>模型</b>

    1688 模态搜索从 0 到 1:逆向接口解析与 CLIP 特征匹配实践

    本文分享基于CLIP模型与逆向工程实现1688图片搜同款的实战方案。通过抓包分析破解接口签名,结合CLIP模态特征提取与Faiss向量检索
    的头像 发表于 10-17 10:00 1289次阅读

    格灵深瞳三项成果获得国际顶级学术会议认可

    以OpenAI CLIP为代表的模态训练模型,为安防、电商等应用场景提供了强大的跨
    的头像 发表于 09-15 14:43 1473次阅读

    商汤日日新V6.5模态模型登顶全球权威榜单

    根据权威评测平台OpenCompass模态模型学术榜单(Multi-modal Academic Leaderboard)最新数据显示,商汤「日日新 V6.5」(SenseNova-V6.5
    的头像 发表于 09-10 09:55 943次阅读

    米尔RK3576部署端侧模态轮对话,6TOPS算力驱动30亿参数LLM

    话:基于历史回答图中女孩头发和衣服分别是什么颜色 上一次我们详细讲解在RK3576上部署模态模型的案例,这次将继续讲解轮对话的部署流程。整体流程基于 rknn-llm 里的
    发表于 09-05 17:25

    浅析模态标注对大模型应用落地的重要性与标注实例

    ”的关键工序——模态标注重要性日益凸显。 一、什么是模态标注? 模态标注是指对文本、图像、
    的头像 发表于 09-05 13:49 2752次阅读

    龙芯中科与文心系列模型开展深度技术合作

    ”解决方案。 强强联合!自主架构赋能大模型训练 文心大模型 文心4.5系列模型均使用飞桨深度学习框架进行高效
    的头像 发表于 07-02 16:53 1473次阅读

    商汤日日新SenseNova融合模态模型 国内首家获得最高评级的大模型

    近日,中国信息通信研究院(以下简称“中国信通院”)完成可信AI模态模型首轮评估。 商汤日日新SenseNova融合模态模型在所有
    的头像 发表于 06-11 11:57 1563次阅读