打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

CLIP 是由 OpenAI 提出的一种多模态对比学习方法,原模型使用了 4 亿个图文对进行对比学习训练,在下游的各种任务上均取得了不错的效果,并且在 Zero-Shot 任务上效果也令人惊艳。模型论文可参考 CLIP 论文: Learning Transferable Visual Models From Natural Language Supervision。

  • 论文地址:
    https://arxiv.org/abs/2103.00020

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

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

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

  • 项目地址:
    https://github.com/yangjianxin1/CLIP-Chinese
预训练模型预训练权重名称权重地址
BertCLIP 整体权重YeungNLP/clip-vit-bert-chinese-1Mhttps://huggingface.co/YeungNLP/clip-vit-bert-chinese-1M
单独提取出来的 Bert 权重YeungNLP/bert-from-clip-chinese-1Mhttps://huggingface.co/YeungNLP/bert-from-clip-chinese-1M

模型简介

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

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

然后使用我们熟悉的对比损失 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 足够大的时候,上述误差对模型的优化方向的影响是有限的。在预训练时代,我们要相信大力是能够出奇迹的,只要堆足够多优质的数据,很多问题都可以迎刃而解。

项目介绍

训练细节

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 变化如下图所示。

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

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

使用方法

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

git clone https://github.com/yangjianxin1/CLIP-Chinese.git
pip install -r requirements.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,以及相似度计算的脚本,更多细节可参考项目代码。

模型效果

图文相似度

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

文本相似度

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

图片相似度

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

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

结语

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

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

不足之处在于,对于预训练而言,140 万的数据稍显不足,读者可以使用自身域内数据进行二次预训练。项目代码以及使用方法,可以访问项目 Github 地址:
https://github.com/yangjianxin1/CLIP-Chinese

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
OpenAI CLIP模型袖珍版,24MB实现文本图像匹配,iPhone上可运行
一个既能做CV任务,也能做NLP任务的Transformer模型!谷歌&UCLA提出统一的基础模型
神器CLIP是如何炼成的!
Elasticsearch 8.X “图搜图”实战
ImageNet零样本准确率首次超过80%,地表最强开源CLIP模型更新
站在BERT肩膀上的NLP新秀们(PART III)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服