0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CLIP-Chinese:中文多模態(tài)對比學(xué)習(xí)預(yù)訓(xùn)練模型

深度學(xué)習(xí)自然語言處理 ? 來源:YeungNLP ? 作者:YeungNLP ? 2022-12-06 14:49 ? 次閱讀

筆者最近嘗試在業(yè)務(wù)中引入多模態(tài),基于CLIP論文的思想,實(shí)現(xiàn)了基于Vit-Bert的CLIP模型,下面將其稱為BertCLIP模型。筆者用140萬的中文圖文數(shù)據(jù),基于LiT-tuning的方式,訓(xùn)了一版BertCLIP模型。BertCLIP模型在中文圖文相似度、文本相似度、圖片相似度等任務(wù)上都有著不錯的表現(xiàn)。

本文將對該工作進(jìn)行詳細(xì)的介紹并且分享筆者使用的中文訓(xùn)練語料、BertCLIP預(yù)訓(xùn)練權(quán)重、模型代碼和訓(xùn)練pipeline等。

首先展示一下BertCLIP預(yù)訓(xùn)練模型在圖文相似度上的效果

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

項(xiàng)目地址:

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

預(yù)訓(xùn)練權(quán)重(使用方法,詳見下文):

預(yù)訓(xùn)練模型 預(yù)訓(xùn)練權(quán)重名稱 權(quán)重地址
BertCLIP整體權(quán)重

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

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

單獨(dú)提取出來的Bert權(quán)重

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

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

論文標(biāo)題:

Learning Transferable Visual Models From Natural Language Supervision

01

模型簡介

CLIP是由OpenAI提出的一種多模態(tài)對比學(xué)習(xí)模型,OpenAI使用了4億對圖文數(shù)據(jù),基于對比學(xué)習(xí)的方法對CLIP模型進(jìn)行訓(xùn)練。

CLIP模型主要由文編碼器和圖片編碼器兩部分組成,訓(xùn)練過程如下圖所示。對于batch size為N的圖文對數(shù)據(jù),將N個圖片與N個文本分別使用圖片編碼器和文本編碼器進(jìn)行編碼,并且映射到同一個向量空間。然后分別計(jì)算兩兩圖文對編碼的點(diǎn)乘相似度,這樣就能得到一個N*N的相似度矩陣。

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

然后使用我們熟悉的對比損失InfoNCE Loss來計(jì)算該batch的訓(xùn)練損失,更新模型權(quán)重。對InfoNCE Loss不熟悉的小伙伴,可以回顧筆者往期的文章:SimCSE:簡單有效的句向量對比學(xué)習(xí)方法。

舉個例子,對于圖片I1,分別計(jì)算I1與文本T1~TN的相似度,T1是I1的正樣本,而T2~TN均視為I1的負(fù)樣本,我們希望I1與T1的相似度盡可能大,而I1與其他文本的相似度盡可能小。

在計(jì)算T1的InfoNCE Loss時,首先將T1與所有文本的相似度進(jìn)行softmax歸一化,得到相似度的分布,然后計(jì)算相似度分布與label的交叉熵?fù)p失,而T1的label為1。由此可以將這個loss的計(jì)算方式推廣到整個batch。

有小伙伴可能會覺得,對于圖片l1,文本T2~TN中可能存在它的正樣本,若T2~TN均視為I1的負(fù)樣本,會對模型的訓(xùn)練帶來很大的影響。對于該問題,我們可以認(rèn)為,當(dāng)數(shù)據(jù)量足夠大,并且batch size足夠大的時候,上述誤差對模型的優(yōu)化方向的影響是有限的。在預(yù)訓(xùn)練時代,我們要相信大力是能夠出奇跡的,只要堆足夠多優(yōu)質(zhì)的數(shù)據(jù),很多問題都可以迎刃而解。

02

項(xiàng)目介紹

訓(xùn)練細(xì)節(jié)

BertCLIP主要由Vit和Bert組成,在預(yù)訓(xùn)練時,筆者分別使用不同的預(yù)訓(xùn)練權(quán)重來初始化Vit和Bert的權(quán)重。使用OpenAI開源的CLIP模型來初始化Vit權(quán)重,使用孟子中文預(yù)訓(xùn)練權(quán)重來初始化Bert權(quán)重。

我們基于LiT-tuning的方法來訓(xùn)練BertCLIP模型,也就是將Vit部分的模型參數(shù)進(jìn)行凍結(jié),只訓(xùn)練BertCLIP的其他部分的參數(shù)。LiT-tuning是多模態(tài)模型訓(xùn)練的一種范式,它旨在讓文本編碼空間向圖像編碼空間靠近,并且可以加快模型的收斂速度。

筆者使用了140萬條中文圖文數(shù)據(jù)對,batchsize為768,warmup step為1000步,學(xué)習(xí)率為5e-5,使用cosine衰減策略,混合精度訓(xùn)練了50個epoch,總共73100步,訓(xùn)練loss最終降為0.23左右。模型的訓(xùn)練loss變化如下圖所示。

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

由于訓(xùn)練資源的限制,以及訓(xùn)練數(shù)據(jù)的獲取需要耗費(fèi)較多時間,目前筆者僅使用了140萬的訓(xùn)練數(shù)據(jù)。對于預(yù)訓(xùn)練而言,140萬的訓(xùn)練數(shù)據(jù)量略微少了些,筆者訓(xùn)練50輪,模型也許會過分?jǐn)M合訓(xùn)練數(shù)據(jù)。若條允許,讀者可以共享的模型權(quán)重的基礎(chǔ)上,使用更多域內(nèi)數(shù)據(jù)進(jìn)行二次預(yù)訓(xùn)練。

筆者曾使用實(shí)際業(yè)務(wù)中1700萬的圖文數(shù)據(jù)訓(xùn)練BertCLIP模型,訓(xùn)練10輪,大概22萬步,訓(xùn)練損失大約降為0.7。在域內(nèi)的圖文匹配、同義詞挖掘等任務(wù)中有不錯的效果。

使用方法

BertCLIP模型的使用方法非常簡單,首先將項(xiàng)目clone到本地機(jī)器上,并且安裝相關(guān)依賴包。

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

使用如下代碼,即可加載預(yù)訓(xùn)練權(quán)重和processor對圖片和文本進(jìn)行預(yù)處理,并且得到模型的輸出。

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'
# 加載預(yù)訓(xùn)練模型權(quán)重
model = BertCLIPModel.from_pretrained(model_name_or_path)
# 初始化processor
CLIPProcessor.tokenizer_class='BertTokenizerFast'
processor = CLIPProcessor.from_pretrained(model_name_or_path)
# 預(yù)處理輸入
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)


# 對于每張圖片,計(jì)算其與所有文本的相似度
logits_per_image = outputs.logits_per_image  # image-text的相似度得分
probs = logits_per_image.softmax(dim=1)  # 對分?jǐn)?shù)進(jìn)行歸一化


# 對于每個文本,計(jì)算其與所有圖片的相似度
logits_per_text = outputs.logits_per_text  # text-image的相似度得分
probs = logits_per_text.softmax(dim=1)  # 對分?jǐn)?shù)進(jìn)行歸一化


# 獲得文本編碼
text_embeds = outputs.text_embeds
# 獲得圖像編碼
image_embeds = outputs.image_embeds

單獨(dú)加載圖像編碼器,進(jìn)行下游任務(wù)。

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

單獨(dú)加載文本編碼器,進(jìn)行下游任務(wù)。

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的預(yù)訓(xùn)練權(quán)重單獨(dú)拎出來,可以使用BertModel直接加載,進(jìn)行下游任務(wù)。

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)

在項(xiàng)目中,筆者上傳了多線程下載訓(xùn)練圖片、訓(xùn)練pipeline,以及相似度計(jì)算的腳本,更多細(xì)節(jié)可參考項(xiàng)目代碼。

03

模型效果

圖文相似度

在計(jì)算圖文相似的時候,首先計(jì)算兩兩圖文向量之間的點(diǎn)乘相似度。對于每張圖,將其與所有文本的相似度進(jìn)行softmax歸一化,得到最終的分?jǐn)?shù)。

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

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

文本相似度

在計(jì)算文本相似度的時候,首先計(jì)算兩兩文本之間的點(diǎn)乘相似度。對于每個文本,將其與自身的相似度置為-10000(否則對于每個文本,其與自身的相似度永遠(yuǎn)為最大),然后將其與所有文本的相似度進(jìn)行softmax歸一化,得到最終的分?jǐn)?shù)。

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

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

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

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

圖片相似度

圖片相似度的計(jì)算方式與文本相似度的方式一致。為方便展示,僅選出top1的圖片及其相似度分?jǐn)?shù)。

注:由于在訓(xùn)練BertCLIP時,將圖像編碼器的權(quán)重凍結(jié),所以該部分的能力,主要?dú)w功于OpenAIclip預(yù)訓(xùn)練權(quán)重。如想要優(yōu)化模型在域內(nèi)數(shù)據(jù)的圖片相似度計(jì)算能力,圖像編碼器需要一起參與訓(xùn)練。

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

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

04

結(jié)語

在本文中,筆者基于CLIP的思想,設(shè)計(jì)了Vit-Bert結(jié)構(gòu)的BertCLIP模型,并且使用140萬中文圖文數(shù)據(jù)對,對模型進(jìn)行預(yù)訓(xùn)練。在圖文相似度、文本相似度、圖片相似度任務(wù)上做了嘗試,取得了不錯的效果。

該預(yù)訓(xùn)練模型,能夠在中文圖文檢索、文本相似度計(jì)算、同義詞挖掘、相似圖召回等任務(wù)上發(fā)揮作用。并且在下游的一些多模態(tài)任務(wù)中,可以憑借該模型同時引入圖片和文本信息,擴(kuò)充模型的信息域。由于Bert需要將文本空間向圖片空間對齊,所以Bert必然能夠?qū)W到了豐富的語義信息,這能夠?qū)ο掠蔚腘LP任務(wù)帶來增益。讀者也可以基于筆者分享的Bert預(yù)訓(xùn)練權(quán)重,進(jìn)行下游NLP任務(wù)的finetune,相信會有所幫助。

不足之處在于,對于預(yù)訓(xùn)練而言,140萬的數(shù)據(jù)稍顯不足,讀者可以使用自身域內(nèi)數(shù)據(jù)進(jìn)行二次預(yù)訓(xùn)練。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    45

    文章

    3576

    瀏覽量

    134021
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3123

    瀏覽量

    48664
  • OpenAI
    +關(guān)注

    關(guān)注

    9

    文章

    1035

    瀏覽量

    6379

原文標(biāo)題:CLIP-Chinese:中文多模態(tài)對比學(xué)習(xí)預(yù)訓(xùn)練模型

文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    利用OpenVINO部署Qwen2模態(tài)模型

    模態(tài)模型的核心思想是將不同媒體數(shù)據(jù)(如文本、圖像、音頻和視頻等)進(jìn)行融合,通過學(xué)習(xí)不同模態(tài)之間的關(guān)聯(lián),實(shí)現(xiàn)更加智能化的信息處理。簡單來說
    的頭像 發(fā)表于 10-18 09:39 ?269次閱讀

    直播預(yù)約 |數(shù)據(jù)智能系列講座第4期:預(yù)訓(xùn)練的基礎(chǔ)模型下的持續(xù)學(xué)習(xí)

    鷺島論壇數(shù)據(jù)智能系列講座第4期「預(yù)訓(xùn)練的基礎(chǔ)模型下的持續(xù)學(xué)習(xí)」10月30日(周三)20:00精彩開播期待與您云相聚,共襄學(xué)術(shù)盛宴!|直播信息報(bào)告題目
    的頭像 發(fā)表于 10-18 08:09 ?138次閱讀
    直播預(yù)約 |數(shù)據(jù)智能系列講座第4期:<b class='flag-5'>預(yù)</b><b class='flag-5'>訓(xùn)練</b>的基礎(chǔ)<b class='flag-5'>模型</b>下的持續(xù)<b class='flag-5'>學(xué)習(xí)</b>

    云知聲推出山海模態(tài)模型

    在人工智能技術(shù)的浩瀚星海中,模態(tài)交互技術(shù)正成為引領(lǐng)未來的新航標(biāo)。繼OpenAI的GPT-4o掀起滔天巨浪后,云知聲以創(chuàng)新之姿,推出了其匠心獨(dú)運(yùn)的山海模態(tài)
    的頭像 發(fā)表于 08-27 15:20 ?348次閱讀

    預(yù)訓(xùn)練和遷移學(xué)習(xí)的區(qū)別和聯(lián)系

    預(yù)訓(xùn)練和遷移學(xué)習(xí)是深度學(xué)習(xí)和機(jī)器學(xué)習(xí)領(lǐng)域中的兩個重要概念,它們在提高模型性能、減少
    的頭像 發(fā)表于 07-11 10:12 ?755次閱讀

    大語言模型預(yù)訓(xùn)練

    能力,逐漸成為NLP領(lǐng)域的研究熱點(diǎn)。大語言模型預(yù)訓(xùn)練是這一技術(shù)發(fā)展的關(guān)鍵步驟,它通過在海量無標(biāo)簽數(shù)據(jù)上進(jìn)行訓(xùn)練,使模型
    的頭像 發(fā)表于 07-11 10:11 ?369次閱讀

    預(yù)訓(xùn)練模型的基本原理和應(yīng)用

    預(yù)訓(xùn)練模型(Pre-trained Model)是深度學(xué)習(xí)和機(jī)器學(xué)習(xí)領(lǐng)域中的一個重要概念,尤其是在自然語言處理(NLP)和計(jì)算機(jī)視覺(CV)
    的頭像 發(fā)表于 07-03 18:20 ?2168次閱讀

    深度學(xué)習(xí)模型訓(xùn)練過程詳解

    深度學(xué)習(xí)模型訓(xùn)練是一個復(fù)雜且關(guān)鍵的過程,它涉及大量的數(shù)據(jù)、計(jì)算資源和精心設(shè)計(jì)的算法。訓(xùn)練一個深度學(xué)習(xí)模型
    的頭像 發(fā)表于 07-01 16:13 ?1035次閱讀

    大語言模型:原理與工程時間+小白初識大語言模型

    解鎖 我理解的是基于深度學(xué)習(xí),需要訓(xùn)練各種數(shù)據(jù)知識最后生成自己的的語言理解和能力的交互模型。 對于常說的RNN是處理短序列的數(shù)據(jù)時表現(xiàn)出色,耳真正厲害的是Transformer,此框架被推出后直接
    發(fā)表于 05-12 23:57

    【大語言模型:原理與工程實(shí)踐】大語言模型預(yù)訓(xùn)練

    大語言模型的核心特點(diǎn)在于其龐大的參數(shù)量,這賦予了模型強(qiáng)大的學(xué)習(xí)容量,使其無需依賴微調(diào)即可適應(yīng)各種下游任務(wù),而更傾向于培養(yǎng)通用的處理能力。然而,隨著學(xué)習(xí)容量的增加,對
    發(fā)表于 05-07 17:10

    李未可科技正式推出WAKE-AI模態(tài)AI大模型

    李未可科技模態(tài) AI 大模型正式發(fā)布,積極推進(jìn) AI 在終端的場景應(yīng)用 ? 4月18日,2024中國生成式AI大會上李未可科技正式發(fā)布為眼鏡等未來終端定向優(yōu)化等自研WAKE-AI
    發(fā)表于 04-18 17:01 ?558次閱讀
    李未可科技正式推出WAKE-AI<b class='flag-5'>多</b><b class='flag-5'>模態(tài)</b>AI大<b class='flag-5'>模型</b>

    螞蟻推出20億參數(shù)模態(tài)遙感模型SkySense

    據(jù)了解,負(fù)責(zé)開發(fā)的百靈團(tuán)隊(duì)利用自身擁有的19億遙感影像數(shù)據(jù)集進(jìn)行了預(yù)訓(xùn)練,從而生成了具有20.6億參數(shù)的SkySense大模型。官方稱其為全球范圍內(nèi)參數(shù)規(guī)模最大、任務(wù)覆蓋最全且識別精度最高的
    的頭像 發(fā)表于 02-28 15:53 ?604次閱讀

    機(jī)器人基于開源的模態(tài)語言視覺大模型

    ByteDance Research 基于開源的模態(tài)語言視覺大模型 OpenFlamingo 開發(fā)了開源、易用的 RoboFlamingo 機(jī)器人操作模型,只用單機(jī)就可以
    發(fā)表于 01-19 11:43 ?354次閱讀
    機(jī)器人基于開源的<b class='flag-5'>多</b><b class='flag-5'>模態(tài)</b>語言視覺大<b class='flag-5'>模型</b>

    從Google模態(tài)模型看后續(xù)大模型應(yīng)該具備哪些能力

    前段時間Google推出Gemini模態(tài)模型,展示了不凡的對話能力和模態(tài)能力,其表現(xiàn)究竟如何呢?
    的頭像 發(fā)表于 12-28 11:19 ?1171次閱讀
    從Google<b class='flag-5'>多</b><b class='flag-5'>模態(tài)</b>大<b class='flag-5'>模型</b>看后續(xù)大<b class='flag-5'>模型</b>應(yīng)該具備哪些能力

    模型+模態(tài)的3種實(shí)現(xiàn)方法

    我們知道,預(yù)訓(xùn)練LLM已經(jīng)取得了諸多驚人的成就, 然而其明顯的劣勢是不支持其他模態(tài)(包括圖像、語音、視頻模態(tài))的輸入和輸出,那么如何在預(yù)
    的頭像 發(fā)表于 12-13 13:55 ?1592次閱讀
    大<b class='flag-5'>模型</b>+<b class='flag-5'>多</b><b class='flag-5'>模態(tài)</b>的3種實(shí)現(xiàn)方法

    用語言對齊模態(tài)信息,北大騰訊等提出LanguageBind,刷新多個榜單

    目前的 VL 預(yù)訓(xùn)練方法通常僅適用于視覺和語言模態(tài),而現(xiàn)實(shí)世界中的應(yīng)用場景往往包含更多的模態(tài)信息,如深度圖、熱圖像等。如何整合和分析不同模態(tài)
    的頭像 發(fā)表于 11-23 15:46 ?655次閱讀
    用語言對齊<b class='flag-5'>多</b><b class='flag-5'>模態(tài)</b>信息,北大騰訊等提出LanguageBind,刷新多個榜單