一站式解讀多模態——Transformer、Embedding、主流模型與通用任務實戰(下)

本文章由飛槳星河社區開發者高宏偉貢獻。高宏偉,飛槳開發者技術專家(PPDE),飛槳領航團團長,長期在自媒體領域分享 AI 技術知識,博客粉絲 9w+,飛槳星河社區 ID 爲 GoAI 。分享分爲上下兩期,本期分享從主流多模態模型和多模態實戰項目等方面介紹多模態。

上篇文章主要從時間線對多模態模型進行總結,在文章最後引入模態對齊概念,本篇文章將針對經典的多模態模型展開詳細介紹,圍繞多模態模型如何進行模態對齊,最後以多模態框架 PaddleMIX 進行項目實戰,歡迎大家討論交流。

主流多模態模型介紹

本篇首先將圍繞多模態模型的基本思想、模型結構、損失設計及訓練數據集情況,對 CLIP、BLIP、BLIP2 等經典多模態模型展開詳細介紹,總結如下:

CLIP

論文:Learning Transferable Visual Models From Natural Language Supervision

CLIP 採用雙塔結構,其核心思想是通過海量的弱監督文本對,通過對比學習,將圖片和文本通過各自的預訓練模型獲得編碼向量,通過映射到統一空間計算特徵相似度,通過對角線上的標籤引導編碼器對齊,加速模型收斂。CLIP 是一種弱對齊,可應用於圖文相似度計算和文本分類等任務!

CLIP 具體步驟如下:

1.CLIP 將圖像和文本先分別輸入一個圖像編碼器 image_encoder 和一個文本編碼器 text_encoder,得到圖像和文本的向量表示 I_f 和 T_f 。其中 Image Encoder 是 ResNet 或 Vision Transformer,Text Encoder 爲 GPT-2。

2.將圖像和文本的向量表示映射到一個多模態空間(不同類型的數據整合到一個統一的空間),得到新的可直接進行比較的圖像和文本的向量表示 I_e 和 T_e 。

3.計算圖像向量和文本向量之間的 cosine 相似度。上述得到 n x n 矩陣,對角線爲正樣本爲 1,其他爲負樣本 0。有了 n 個圖像的特徵和 n 個文本的特徵之後,計算 cosine similarity,得到的相似度用來做分類的 logits。

4.對比學習的目標函數就是讓正樣本對的相似度較高,負樣本對的相似度較低。logits 和 ground truth 的 labels 計算交叉熵損失,loss_i,loss_t 分別是 Image 和 Text 的 loss,最後求平均就得到 loss。CLIP 代碼示例:

 
I_f = image_encoder(I) #[n, d_i]T_f = text_encoder(T) #[n, d_t]# joint multimodal embedding [n, d_e]I_e = l2_normalize(np.dot(I_f, W_i), axis=1)T_e = l2_normalize(np.dot(T_f, W_t), axis=1)# scaled pairwise cosine similarities [n, n]logits = np.dot(I_e, T_e.T) * np.exp(t)# symmetric loss functionlabels = np.arange(n)loss_i = cross_entropy_loss(logits, labels, axis=0)loss_t = cross_entropy_loss(logits, labels, axis=1)loss = (loss_i + loss_t)/2

論文:BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation (統一視覺語言理解和生成的引導語言圖像預訓練)

代碼地址:https://github.com/salesforce/BLIP

BLIP 既可以做內容理解,還可以做文本生成,是一個大一統的多模態預訓練框架。(理解+生成)

引用來源:論文《BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation》

模型組成

BLIP 由四個模塊組成,分別是 image encoder、text encoder(和 image encoder 統一稱爲 unimodal encoder)、image-grounded text encoder、image-grounded text decoder。

  1. Image encoder:visual transformer,VIT

  2. text encoder:BERT(雙向自注意力機制+FFN),加一個 cls_token 放在 text input 前面總結整句話

  3. image-grounded text encoder:將 image encoder 的輸出一起輸入 cross attention 中(image embedding 作爲 key,value,text embedding 作爲 query),輸入端加一個任務特定的 encoder token,採用雙向自注意力機制,使得 text 全部可見。

  4. image-grounded text decoder:將 image encoder 的輸出一起輸入 cross attention 中(image embedding 作爲 key,value,text embedding 作爲 query),輸入端加一個任務特定的 decoder token,attention 採用 causal self-attention,使得 text 只能見到當前和歷史的文本。

損失構成

BLIP 由三個損失函數監督,前兩個是 understanding-based ,另一個是 generation-based。具體損失如下:

Image-Text Contrastive Loss (ITC)

ITC 通過對比學習,鼓勵正向的圖像-文本對在特徵空間內靠近,與負向對相遠離,對齊視覺和文本轉換器的特徵空間。研究表明,ITC 有效地促進了視覺和語言理解的提升。爲了強化這一過程,ITC 引入了動態編碼器以產生特徵,並利用軟標籤作爲訓練目標,以識別負對中潛在的正對。

Image-Text Matching Loss (ITM)

ITM 專注於學習精細的視覺-語言對齊多模態表示。作爲一個二分類任務,ITM 用於預測圖像-文本對是否匹配,通過線性層(ITM 頭)和它們的多模態特徵。採用硬負採樣策略,選擇批次中對比相似度較高的負對參與損失計算,以獲得更信息豐富的負樣本。與 ITC 不同,ITM 直接處理圖像輸入,能更精確地判斷圖像與文本的一致性。

Language Modeling Loss (LM)

LM 旨在基於給定圖像生成文本描述。LM 通過交叉熵損失優化,以自迴歸形式訓練模型,最大化文本可能性。在計算損失時,採用了 0.1 的標籤平滑策略。不同於 VLP 中廣泛使用的 Masked Language Modeling 損失,LM 賦予模型根據視覺信息生成連貫文本描述的泛化能力。

數據生產

BLIP 的關鍵創新在於引入了預訓練部分的 Filter 和 Captioner 模塊。儘管 CLIP 使用了超過 4 億個未經篩選的網絡數據進行訓練,但由於數據中包含大量噪聲,模型的準確性受到了影響。在此基礎上,BLIP 引入了以下兩個模塊:Filter 和 Captioner。

Filter 用於清除不匹配的文本信息(去除噪聲圖像-文本對),而 Captioner 用於生成高質量文本信息(生成給定 web 圖像的標題),進而提升圖像-文本對訓練數據集質量。兩種都是通過相同的預訓練 MED 模型進行初始化,並在 COCO 數據集上分別進行微調,調優是一個輕量級的過程。

引用來源:論文《BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation》

具體來說,首先,BLIP 使用從網絡爬取到的可能不匹配的數據和部分人工標註的匹配數據(如 COCO 數據集)組成的數據集 D 進行預訓練。BLIP 利用人工標註的數據和內部的 ITC&ITM 模塊微調 Filter,篩選出不匹配的圖像-文本對。其次,使用同樣的標註數據和 BLIP 的 Decoder 微調 Captioner,使其能根據圖像生成匹配的文本。這些新文本再通過 Filter 判斷其與原圖像的匹配程度。

注:Captioner 生成的文本並非始終比網絡數據更匹配,但提供了更多選擇,以實現更優的匹配結果。通過這種方法,BLIP 能構建一個高質量的新數據集 D。

BLIP-2

論文:Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models (節約多模態訓練成本:凍結預訓練好的視覺語言模型參數 )

代碼:https://github.com/salesforce/LAVIS/tree/main/projects/blip2

爲減少計算成本並避免災難性遺忘的問題,BLIP-2 在預訓練時凍結預訓練圖像模型和語言模型,但簡單地凍結預訓練模型參數會導致視覺特徵和文本特徵難以對齊。論文中,作者提出了一種預訓練框架,利用 “預訓練 frozen 凍結的圖像編碼器 + 可學習的 Q-Former” 和 “預訓練 frozen 凍結的 LLM 大規模語言模型” 來進行圖像和語言的聯合預訓練。

引用來源:論文《Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models》

1)Image Encoder:負責從輸入圖片中提取視覺特徵,本文試驗 CLIP 訓練的 ViT-L/14 和 EVA-CLIP 訓練的 ViT-g/14 兩種網絡結構。

2)Large Language Model:負責文本生成,本文試驗 decoder-based LLM and encoder-decoder-based LLM。

3)Q-Former:爲 BLIP2 核心使用,用兩階段預訓練 Q-Former 來彌補模態差距,共分爲表示學習和生成學習兩個階段。

第一階段:表徵學習

引用來源:論文《Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models》

學習階段:Q-Former 作爲橋樑,來銜接圖像編碼器和 LLM,並縮小兩者表徵上的 GAP。Q-Former 整體訓練目標沿用 BLIP(即圖文匹配,圖生文,圖文對比學習),但在框架上更加精簡,使用 UniLM 風格的統一自編碼和自迴歸,使得由 BERT 隨機初始化的 32 個 Learned Queries 將圖像編碼器的表示在語言空間中壓縮對齊(其中,CA 爲每兩層插入一次,用於融合圖片視覺表徵)。

第二階段:從大規模語言模型學習視覺到語言生成

生成學習階段:將 Q-Former 連接到凍結的 LLM,以利用 LLM 的語言生成能力。這裏使用全連接層(FC,可視爲 Q-Former 到 LLM 的適配器)將輸出的 Query 嵌入線性投影到與 LLM 的文本嵌入相同的維度,然後將投影的 Query 嵌入添加到輸入文本嵌入前面,實現替換 LLM 的部分文本嵌入(即軟提示)。

由於 Q-Former 已經過預訓練,可以提取包含語言信息的視覺表示,因此它可以有效地充當信息瓶頸,將最有用的信息提供給 LLM,同時刪除不相關的視覺信息,減輕了 LLM 學習視覺語言對齊的負擔。BLIP2 在 Decoder-only 和 Encoder-Decoder 架構的模型上均進行了實驗。

引用來源:論文《Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models》

多模態實戰項目

實戰平臺:本次實戰平臺環境推薦採用飛槳星河社區,平臺項目展示頁面如下。

飛槳星河社區提供強大易用的環境,包括上傳自己的數據集及訓練可視化,還可以加載多任務套件(PaddleNLP、PaddleOCR、PaddleDetection、PaddleClas 任等),更大的亮點在於輕量代碼實現,共同助力開發者輕鬆進行深度學習。相比個人環境,飛槳平臺已預配環境,用戶無需自行安裝 GPU 環境可直接編程、運行實驗,用戶註冊後進入 BML Code Lab 享受編程樂趣,可快速搭建模型,降低門檻。

PaddleMIX 介紹

官網 Github:PaddleMIX PaddleMIX 是基於飛槳的跨模態大模型開發套件,聚合圖像、文本、視頻等多種模態,覆蓋視覺語言預訓練、文生圖、文生視頻等豐富的跨模態任務。提供開箱即用的開發體驗,同時滿足開發者靈活定製需求,探索通用人工智能。目前支持的多模態預訓練模型:

1. 使用教程

克隆 PaddleMIX 項目:

 
git clone https://github.com/PaddlePaddle/PaddleMIX
 

安裝 PaddleMIX 和 ppdiffusers 環境

 
cd PaddleMIXpip install -e .cd ppdiffuserspip install -e .
 

安裝 appflow 依賴環境

 
pip install -r paddlemix/appflow/requirements.txt
 

2. 一鍵預測

PaddleMIX 提供一鍵預測功能,無需訓練,覆蓋圖文預訓練,文生圖,跨模態視覺任務,實現圖像編輯、圖像描述、數據標註等多十幾種種跨模態應用(可自行更開預訓練任務模型)。以開放世界檢測分割爲例,在安裝環境後新建如下.py 腳本直接運行即可。

 
from paddlemix.appflow import Appflowfrom ppdiffusers.utils import load_image
task = Appflow(app="openset_det_sam",   #更改應用名稱                   models=["GroundingDino/groundingdino-swint-ogc","Sam/SamVitH-1024"],  #更換模型任務,可組合                   static_mode=False) #如果開啓靜態圖推理,設置爲True,默認動態圖url = "https://paddlenlp.bj.bcebos.com/models/community/CompVis/stable-diffusion-v1-4/overture-creations.png"image_pil = load_image(url)result = task(image=image_pil,prompt="dog")
 
 

注:以上部分模型支持 SFT 和 Lora 微調,由於篇幅原因,大家可以訪問 Readme 文檔自行查看。具體任務效果大家可以自行嘗試,非常方便!下面作者將主要以 PaddleMIX 庫中的 BLIP2 模型展開介紹。

基於 PaddleMIX 的多模態模型 VQA 和 Caption 任務--以 BLIP2 爲例

  1. 環境準備

 
cd PaddleMIXpip install -r requirements.txt
 

2.數據準備

(1)coco 數據 數據部分,默認使用 coco_karpathy 數據,使用該數據不需另外配置,會自動下載。目前已支持 "coco_caption","vg_caption"等數據集訓練。數據標註示例:

 
    {'caption': 'A woman wearing a net on her head cutting a cake. ', 'image': 'val2014/COCO_val2014_000000522418.jpg', 'image_id': 'coco_522418'}
 

(2)自定義數據 如果需要自定義數據,推薦沿用上述數據格式處理自己的數據。更多可參考數據集中的 annotations/coco_karpathy_train.json 文件。在準備好自定義數據集以後, 可以使用 load_dataset() 來加載數據.

(3)模型介紹 PaddleMix 支持 BLIP-2 系列模型,目前包括 BLIP-2-OPT、BLIP-2-FlanT5

  • blip2-stage1 :對應上述 blip2 的第一階段預訓練模型,可用於開啓第二階段預訓練;

  • blip2-stage2 :使用論文中數據訓練好的第一階段模型,可用於開啓第二階段預訓練;

  • blip2-pretrained-opt :對應論文精度 Blip2 第二階段訓練完成的模型,語言模型使用 opt,可用於模型微調任務或進行 zeroshot vqa 推理;

  • blip2-caption-opt :對應論文精度 Blip2 第二階段訓練完成並在 caption 數據集進行微調的模型,語言模型使用 opt,可用於 image caption 推理;

3.BLIP2 訓練配置

BLIP2 訓練無需更改參數即可開始訓練,參考代碼如下:

 
MODEL_NAME="paddlemix/blip2-stage2"fleetrun --master '127.0.0.1' --nnodes 1 --nproc_per_node 8 --ips '127.0.0.1:8080' run_pretrain_stage2.py \    --per_device_train_batch_size 128 \         --model_name_or_path ${MODEL_NAME}  \    --warmup_steps 2000 \    --eta_min 1e-5 \    --learning_rate 0.0001 \    --weight_decay 0.05 \    --num_train_epochs 10 \    --tensor_parallel_degree 1 \  #設置張量模型的並行數。    --sharding_parallel_degree 1 \ #設置分片數量,啓用分片並行。    --output_dir "./output" \     --logging_steps 50 \    --do_train \    --save_strategy epoch \
 
 

注:其中 #MODEL_NAME 路徑配置爲 paddlemix/ + 已支持的 model name(如 blip2-pretrained-opt2.7b,paddlemix/blip2-stage1 等) 可配置參數說明(具體請參考 paddlemix/examples/blip2/run_pretrain_stage2.py)

第一階段訓練

單卡訓練

 
CUDA_VISIBLE_DEVICES=0 python paddlemix/examples/blip2/run_pretrain_stage1.py
 

多卡訓練

 
fleetrun --gpus=0,1,2,3 paddlemix/examples/blip2/run_pretrain_stage1.py
 

第二階段訓練

單卡訓練

 
CUDA_VISIBLE_DEVICES=0 python paddlemix/examples/blip2/run_pretrain_stage2.py
 

多卡訓練

 
fleetrun --gpus=0,1,2,3 paddlemix/examples/blip2/run_pretrain_stage2.py
 

4.評估

問答任務評估

 
fleetrun --gpus=0,1,2,3 paddlemix/examples/blip2/run_eval_vqav2_zeroshot.py
 

生成任務評估

 
fleetrun --gpus=0,1,2,3 paddlemix/examples/blip2/run_eval_caption.py
 

5.預測

 
CUDA_VISIBLE_DEVICES=0 python paddlemix/examples/blip2/run_predict.py
 

多模態模型趨勢總結

思想:圖文特徵對齊、指令微調、多任務;

結構:圖像編碼器 Image Encoder+-大語言模型 LLM+對齊模塊 Loss;

設計:參考對比學習探索不同的圖文特徵對齊方式,同時增加指令微調能力;

多模態任務學習項目推薦:PaddleMIX

Github: https://github.com/PaddlePaddle/PaddleMIX

跨模態檢索相關項目:多模態 CLIP 以文搜圖注:更多完整的多模態項目可訪問飛槳官方查閱!

地址:https://aistudio.baidu.com/index

全文總結

本文主要對多模態模型的概念、下游任務類型、數據集、發展時間線的基礎理論進行介紹,着重講解經典多模態大模型(CLIP、BLIP、BLIP2 等)原理及結構,最後對飛槳多模態框架 PaddleMIX 進行介紹,對多模態通用任務基礎項目實戰,感興趣的同學可訪問官方 Github 進行學習,最後歡迎大家相互交流學習!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章