本文章由飛槳星河社區開發者高宏偉貢獻。高宏偉,飛槳開發者技術專家(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 function
labels = 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。
-
Image encoder:visual transformer,VIT
-
text encoder:BERT(雙向自注意力機制+FFN),加一個 cls_token 放在 text input 前面總結整句話
-
image-grounded text encoder:將 image encoder 的輸出一起輸入 cross attention 中(image embedding 作爲 key,value,text embedding 作爲 query),輸入端加一個任務特定的 encoder token,採用雙向自注意力機制,使得 text 全部可見。
-
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 PaddleMIX
pip install -e .
cd ppdiffusers
pip install -e .
安裝 appflow 依賴環境
pip install -r paddlemix/appflow/requirements.txt
2. 一鍵預測
PaddleMIX 提供一鍵預測功能,無需訓練,覆蓋圖文預訓練,文生圖,跨模態視覺任務,實現圖像編輯、圖像描述、數據標註等多十幾種種跨模態應用(可自行更開預訓練任務模型)。以開放世界檢測分割爲例,在安裝環境後新建如下.py 腳本直接運行即可。
from paddlemix.appflow import Appflow
from 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 爲例
-
環境準備
cd PaddleMIX
pip 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 進行學習,最後歡迎大家相互交流學習!