一步到位!圖像文本多模態(tài)理解模型,讓你秒懂視覺問答、圖文匹配
VLE基于預(yù)訓(xùn)練文本和圖像編碼器的圖像-文本多模態(tài)理解模型:支持視覺問答、圖文匹配、圖片分類、常識(shí)推理等

多模態(tài)預(yù)訓(xùn)練模型通過(guò)在多種模態(tài)的大規(guī)模數(shù)據(jù)上的預(yù)訓(xùn)練,可以綜合利用來(lái)自不同模態(tài)的信息,執(zhí)行各種跨模態(tài)任務(wù)。在本項(xiàng)目中,我們推出了VLE (Vision-Language Encoder),一種基于預(yù)訓(xùn)練文本和圖像編碼器的圖像-文本多模態(tài)理解模型,可應(yīng)用于如視覺問答、圖像-文本檢索等多模態(tài)判別任務(wù)。特別地,在對(duì)語(yǔ)言理解和推理能力有更強(qiáng)要求的視覺常識(shí)推理(VCR)任務(wù)中,VLE取得了公開模型中的最佳效果。
最近,大型語(yǔ)言模型(LLM)取得了巨大成功,并被用于翻譯、問答、摘要等文本任務(wù)。雖然LLM是單模態(tài)模型,但它們的能力也可用于輔助多模態(tài)理解任務(wù)。借助LLM的zero-shot能力,我們?cè)O(shè)計(jì)了一種VQA+LLM方案,將大型語(yǔ)言模型集成到視覺問答任務(wù)中,實(shí)現(xiàn)了幫助視覺問答模型生成更準(zhǔn)確和流暢的答案。
開源VLE相關(guān)資源以供學(xué)術(shù)研究參考。
查看更多哈工大訊飛聯(lián)合實(shí)驗(yàn)室(HFL)發(fā)布的資源:https://github.com/iflytek/HFL-Anthology
1.模型結(jié)構(gòu)
VLE模型采用雙流結(jié)構(gòu),與METER模型結(jié)構(gòu)類似,由兩個(gè)單模態(tài)編碼器(圖像編碼器和文本編碼器)和一個(gè)跨模態(tài)融合模塊構(gòu)成。VLE與METER的結(jié)構(gòu)上的差異在于:
VLE使用DeBERTa-v3作為文本編碼器,其性能優(yōu)于METER中使用的RoBERTa-base。
在VLE-large中,跨模態(tài)融合模塊的隱層維度增加至1024,以增加模型的容量。
在精調(diào)階段,VLE引入了額外的token類型向量表示。
2.預(yù)訓(xùn)練
VLE使用圖文對(duì)數(shù)據(jù)進(jìn)行預(yù)訓(xùn)練。在預(yù)訓(xùn)練階段,VLE采用了四個(gè)預(yù)訓(xùn)練任務(wù):
MLM (Masked Language Modeling):掩碼預(yù)測(cè)任務(wù)。給定圖文對(duì),隨機(jī)遮掩文本中的部分單詞,訓(xùn)練模型還原遮掩的文本。
ITM (Image-Text Matching):圖文匹配預(yù)測(cè)任務(wù)。給定圖文對(duì),訓(xùn)練模型判斷圖像和文本是否匹配。
MPC (Masked Patch-box Classification):遮掩Patch分類任務(wù),給定圖文對(duì),并遮掩掉圖片中包含具體對(duì)象的patch,訓(xùn)練模型預(yù)測(cè)被遮掩的對(duì)象種類。
PBC (Patch-box classification):Patch分類任務(wù)。給定圖文對(duì),預(yù)測(cè)圖片中的哪些patch與文本描述相關(guān)。
VLE在14M的英文圖文對(duì)數(shù)據(jù)上進(jìn)行了25000步的預(yù)訓(xùn)練,batch大小為2048。下圖展示了VLE的模型結(jié)構(gòu)和部分預(yù)訓(xùn)練任務(wù)(MLM、ITM和MPC)。

3.下游任務(wù)適配
3.1視覺問答 (VQA)
我們遵循標(biāo)準(zhǔn)做法,使用VQA的訓(xùn)練集(training set)和驗(yàn)證集(validation set)訓(xùn)練模型,在test-dev集上進(jìn)行驗(yàn)證。我們采用模型的融合層的pooler的輸出進(jìn)行分類任務(wù)的訓(xùn)練。
3.2 視覺常識(shí)推理 (VCR)
我們將VCR格式化為一個(gè)類似于RACE的選擇題任務(wù),并對(duì)于每張圖像中的對(duì)象,將覆蓋該對(duì)象的patch的表示的平均池化值添加到融合模塊之前的圖像特征序列中。我們還為圖像和文本中的對(duì)象添加額外的tokentypeids,以注入不同模態(tài)之間的對(duì)齊信息,提升模型的對(duì)齊性能。
3.3 模型下載
本次發(fā)布了VLE-base和VLE-large兩個(gè)版本的預(yù)訓(xùn)練模型,模型權(quán)重為PyTorch格式,可以選擇手動(dòng)從?? transformers模型庫(kù)下載權(quán)重和配置文件,或者在代碼中使用 from_pretrained(model_name) 以自動(dòng)加載模型。詳細(xì)方法參加模型使用。
3.4 預(yù)訓(xùn)練權(quán)重
3.5 精調(diào)權(quán)重
3.6 模型對(duì)比
在下表中,我們比較了VLE、METER以及其他多模態(tài)模型的參數(shù)量、預(yù)訓(xùn)練數(shù)據(jù)和下游任務(wù)效果。其中VQA展示的的是test-dev集上的效果;VCR展示的是dev集上的效果。
觀察上表可以發(fā)現(xiàn):
VLE的預(yù)訓(xùn)練更高效:與大小相近的模型相比,VLE使用了更少的預(yù)訓(xùn)練數(shù)據(jù),并在視覺問答上取得了相當(dāng)甚至更好的效果。
VLE有更強(qiáng)的推理能力: 特別地,在對(duì)推理能力要求更高的視覺常識(shí)推理(VCR)任務(wù)上,VLE顯著地超過(guò)了具有相似結(jié)構(gòu)的METER。
4.結(jié)合大模型的視覺問答
最近,隨著指令微調(diào)、RLHF等技術(shù)的發(fā)展,LLM在多種文本任務(wù)中取得了巨大的成功。盡管LLM是單模態(tài)模型,但它們的能力也可用于輔助多模態(tài)理解任務(wù)。具體而言,我們提出一種VQA + LLM方案,將多模態(tài)模型與LLM集成到視覺問答任務(wù)中,從而幫助VQA模型生成更準(zhǔn)確和流暢的答案。下圖展示了系統(tǒng)流程。

(a) VQA: 這是使用判別模型執(zhí)行VQA任務(wù)的標(biāo)準(zhǔn)方式。輸入問題和圖像到多模態(tài)模型中,訓(xùn)練模型預(yù)測(cè)正確的答案標(biāo)簽。
(b) VQA + LLM: 首先利用captioning模型生成圖片的描述;將圖片描述、問題以及VQA模型的詳細(xì)預(yù)測(cè)結(jié)果拼接,組合成合適的prompt的形式送入LLM,最后要求LLM模型回復(fù)最合理的答案。
VQA+LLM生成的答案更準(zhǔn)確,也有更高的可讀性。下面是一些例子:


Demo地址(僅供學(xué)術(shù)研究):https://huggingface.co/spaces/hfl/VQAVLELLM
4.1 模型使用
環(huán)境要求
PIL
Transformers >= 4.25
PyTorch Lightning (僅用于運(yùn)行精調(diào)腳本)
模型相關(guān)代碼位于models/VLE目錄下的*py文件中。因此,要使用VLE模型,僅需把models目錄復(fù)制到你的項(xiàng)目代碼目錄即可。
要運(yùn)行以下演示代碼,請(qǐng)使用git clone命令下載本倉(cāng)庫(kù)至本地,并進(jìn)入倉(cāng)庫(kù)的根目錄。
4.2 加載VLEModel
from models.VLE import VLEModel, VLEProcessor
from PIL import Image
import torch
model_name="hfl/vle-large"
images = [Image.open('pics/dogs.png')]
text = ["There are dogs on the grass."]
model = VLEModel.from_pretrained(model_name)
vle_processor = VLEProcessor.from_pretrained(model_name)
multimodal_inputs = vle_processor(text=text,images=images, return_tensors='pt',padding=True)
#forward
vle_output = model(**multimodal_inputs)
5.推理
5.1 視覺問答 (VQA)
from models.VLE import VLEForVQA, VLEProcessor, VLEForVQAPipeline
from PIL import Image
model_name="hfl/vle-base-for-vqa"
text= "What is the color of the floor?"
image = Image.open("pics/door.png")
model = VLEForVQA.from_pretrained(model_name)
vle_processor = VLEProcessor.from_pretrained(model_name)
vqa_pipeline = VLEForVQAPipeline(model=model, device='cpu', vle_processor=vle_processor)
vqa_answers = vqa_pipeline(image=image, question=text, top_k=5)
print(f"Question: {text}. Answers: {vqa_answers}")
5.2 圖文匹配(ITM)
from models.VLE import VLEForITM, VLEProcessor, VLEForITMPipeline
from PIL import Image
model_dir = 'hfl/vle-base'
itm_text = ["a photo of a cat.", "a photo of dogs."]
itm_images = Image.open("pics/dogs.png")
print("Init ITM model")
model = VLEForITM.from_pretrained(model_dir)
vle_processor = VLEProcessor.from_pretrained(model_dir)
print("init ITM pipeline")
itm_pipeline = VLEForITMPipeline(model=model, device='cpu', vle_processor=vle_processor)
itm_pred = itm_pipeline([{"image": itm_images, "text": itm_text[0]},
? ? ? ? ? ? ? ? ? ? ? ? {"image": itm_images, "text": itm_text[1]}])
for t, pred in zip(itm_text,itm_pred):
? ?print(t,pred)
5.3 Patch分類(PBC)
from models.VLE import VLEForPBC, VLEProcessor, VLEForPBCPipeline
from PIL import Image
model_dir = 'hfl/vle-base'
pbc_text = "pink tongues"
pbc_image = Image.open("pics/dogs.png")
print("Init PBC model")
model = VLEForPBC.from_pretrained(model_dir)
vle_processor = VLEProcessor.from_pretrained(model_dir)
print("init PBC pipeline")
pbc_pipeline = VLEForPBCPipeline(model=model, device='cpu', vle_processor=vle_processor)
pbc_pred = pbc_pipeline(image=pbc_image,text=pbc_text)
print(pbc_text)
pbc_pred['image'].save('pics/pink_tongues.png')
更多優(yōu)質(zhì)內(nèi)容請(qǐng)關(guān)注:汀丶人工智能;會(huì)提供一些相關(guān)的資源和優(yōu)質(zhì)文章,免費(fèi)獲取閱讀。