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

    文章

    3604

    浏览量

    134252
  • 模型
    +关注

    关注

    1

    文章

    3183

    浏览量

    48761
  • OpenAI
    +关注

    关注

    9

    文章

    1051

    浏览量

    6424

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

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

收藏 人收藏

    评论

    相关推荐

    一文理解模态大语言模型——上

    /understanding-multimodal-llms 在过去几个月中, OpenVINO™ 架构师 Yury阅读了众多有关模态大语言模型的论文和博客,在此基础上,推荐了一篇解读
    的头像 发表于 12-02 18:29 137次阅读
    一文理解<b class='flag-5'>多</b><b class='flag-5'>模态</b>大语言<b class='flag-5'>模型</b>——上

    利用OpenVINO部署Qwen2模态模型

    模态模型的核心思想是将不同媒体数据(如文本、图像、音频和视频等)进行融合,通过学习不同模态之间的关联,实现更加智能化的信息处理。简单来说
    的头像 发表于 10-18 09:39 349次阅读

    直播预约 |数据智能系列讲座第4期:训练的基础模型下的持续学习

    鹭岛论坛数据智能系列讲座第4期「训练的基础模型下的持续学习」10月30日(周三)20:00精彩开播期待与您云相聚,共襄学术盛宴!|直播信息报告题目
    的头像 发表于 10-18 08:09 181次阅读
    直播预约 |数据智能系列讲座第4期:<b class='flag-5'>预</b><b class='flag-5'>训练</b>的基础<b class='flag-5'>模型</b>下的持续<b class='flag-5'>学习</b>

    云知声推出山海模态模型

    在人工智能技术的浩瀚星海中,模态交互技术正成为引领未来的新航标。继OpenAI的GPT-4o掀起滔天巨浪后,云知声以创新之姿,推出了其匠心独运的山海模态
    的头像 发表于 08-27 15:20 368次阅读

    训练和迁移学习的区别和联系

    训练和迁移学习是深度学习和机器学习领域中的两个重要概念,它们在提高模型性能、减少
    的头像 发表于 07-11 10:12 868次阅读

    大语言模型训练

    能力,逐渐成为NLP领域的研究热点。大语言模型训练是这一技术发展的关键步骤,它通过在海量无标签数据上进行训练,使模型
    的头像 发表于 07-11 10:11 397次阅读

    训练模型的基本原理和应用

    训练模型(Pre-trained Model)是深度学习和机器学习领域中的一个重要概念,尤其是在自然语言处理(NLP)和计算机视觉(CV)
    的头像 发表于 07-03 18:20 2490次阅读

    深度学习模型训练过程详解

    深度学习模型训练是一个复杂且关键的过程,它涉及大量的数据、计算资源和精心设计的算法。训练一个深度学习模型
    的头像 发表于 07-01 16:13 1151次阅读

    大语言模型:原理与工程时间+小白初识大语言模型

    解锁 我理解的是基于深度学习,需要训练各种数据知识最后生成自己的的语言理解和能力的交互模型。 对于常说的RNN是处理短序列的数据时表现出色,耳真正厉害的是Transformer,此框架被推出后直接
    发表于 05-12 23:57

    【大语言模型:原理与工程实践】大语言模型训练

    大语言模型的核心特点在于其庞大的参数量,这赋予了模型强大的学习容量,使其无需依赖微调即可适应各种下游任务,而更倾向于培养通用的处理能力。然而,随着学习容量的增加,对
    发表于 05-07 17:10

    李未可科技正式推出WAKE-AI模态AI大模型

    李未可科技模态 AI 大模型正式发布,积极推进 AI 在终端的场景应用   4月18日,2024中国生成式AI大会上李未可科技正式发布为眼镜等未来终端定向优化等自研WAKE-AI
    发表于 04-18 17:01 570次阅读
    李未可科技正式推出WAKE-AI<b class='flag-5'>多</b><b class='flag-5'>模态</b>AI大<b class='flag-5'>模型</b>

    蚂蚁推出20亿参数模态遥感模型SkySense

    据了解,负责开发的百灵团队利用自身拥有的19亿遥感影像数据集进行了训练,从而生成了具有20.6亿参数的SkySense大模型。官方称其为全球范围内参数规模最大、任务覆盖最全且识别精度最高的
    的头像 发表于 02-28 15:53 634次阅读

    机器人基于开源的模态语言视觉大模型

    ByteDance Research 基于开源的模态语言视觉大模型 OpenFlamingo 开发了开源、易用的 RoboFlamingo 机器人操作模型,只用单机就可以
    发表于 01-19 11:43 370次阅读
    机器人基于开源的<b class='flag-5'>多</b><b class='flag-5'>模态</b>语言视觉大<b class='flag-5'>模型</b>

    从Google模态模型看后续大模型应该具备哪些能力

    前段时间Google推出Gemini模态模型,展示了不凡的对话能力和模态能力,其表现究竟如何呢?
    的头像 发表于 12-28 11:19 1218次阅读
    从Google<b class='flag-5'>多</b><b class='flag-5'>模态</b>大<b class='flag-5'>模型</b>看后续大<b class='flag-5'>模型</b>应该具备哪些能力

    模型+模态的3种实现方法

    我们知道,训练LLM已经取得了诸多惊人的成就, 然而其明显的劣势是不支持其他模态(包括图像、语音、视频模态)的输入和输出,那么如何在
    的头像 发表于 12-13 13:55 1640次阅读
    大<b class='flag-5'>模型</b>+<b class='flag-5'>多</b><b class='flag-5'>模态</b>的3种实现方法