【多模態&LLM】POINTS多模態大模型淺談
NaViT概述
NaViT利用序列打包訓練,處理任意分辨率和長寬比的輸入,在大規模監督和對比圖像文本預訓練中提高了訓練效率,可以用于圖像和視頻分類、目標檢測和語義分割,并在魯棒性和公平性基準測試中取得了改進的結果。
圖片
下面對NaViT在數據處理、模型架構和訓練策略方面的優化總結:
- 數據預處理:如上圖展示了NaViT在處理任意分辨率的方法,將不同分辨率的圖像分割成補丁(patches),然后應用令牌丟棄(token drop)操作,類似于dropout,以加速訓練過程。預處理后,將三張圖像生成的補丁展平為一個序列,不足的部分用填充(padding)補充。
- 模型架構:引入掩碼自注意力(Masked self attention)和掩碼池化(masked pooling),以防止示例之間的信息交換(防止圖片之間存在信息交換),并為每個示例提供單一的向量表示。采用因子化和分數位置嵌入(Factorized & fractional positional embeddings),以支持任意分辨率和寬高比,并便于推斷到未見過的分辨率。
- 訓練策略:
a.實施連續令牌丟棄(Continuous Token dropping),允許根據每張圖像調整丟棄率,從而在保持一定完整圖像的同時提高吞吐量,減少訓練和推理之間的差異。
b.采用分辨率采樣(Resolution sampling),通過在訓練過程中從圖像大小分布中采樣,實現混合分辨率訓練,同時保留每個圖像的原始寬高比。這種方法可以在提高吞吐量的同時,增加對大圖像的曝光,從而在與同等規模的ViT相比時顯著提高性能。
通過上述優化,NaViT在處理任意分辨率和寬高比的圖像方面表現出色,同時在訓練效率和性能上優于傳統的ViT模型。
POINTS
POINTS架構
POINTS1.5采用了傳統的LLaVA(【多模態&LLM】LLaVA系列算法架構演進:LLaVA(1.0->1.5->Next(1.6)->NeXT(Video))風格架構,該架構包括視覺編碼器、MLP投影層和LLM。這種架構通過持續的后期訓練來增強LLM解釋視覺信息的能力。
視覺編碼器
改進點:
- NaViT風格視覺編碼器: POINTS1.5用NaViT風格的視覺編碼器替換了POINTS1.0中的CLIP視覺編碼器。NaViT能夠原生處理任意分辨率的圖像,而無需分割圖像。
- 動態高分辨率支持: NaViT允許模型在不降低性能的情況下處理任意大小的圖像,避免了傳統方法中分割圖像導致的空間關系破壞問題。
批量前向傳播與NaViT
由于NaViT處理的是序列長度不同的圖像,批量前向傳播需要特殊處理。采用了一種類似于LLM的策略,將多個圖像序列打包成一個長序列,并記錄每個圖像序列的起始和結束索引,以確保自注意力機制僅在當前圖像序列的邊界內應用。
MLP投影層
投影層與LLaVA和NVLM-D一致,都是由一個帶有GELU激活函數的兩層MLP組成,用于將視覺編碼器的輸出轉換為LLM可以處理的嵌入表示。
LLM
POINTS1.5使用Qwen2.5-7B-Instruct作為其LLM。
預訓練數據格式:
圖片
預訓練期間的聊天模板,左圖為POINTS1.0,右圖為POINTS1.5
訓練方法
圖片
三階段的訓練方法如下:
第一階段(對齊階段):使用大量數據訓練模態tokenizer和detokenizer。例如,視覺編碼器和解碼器。這個階段的目的是確保tokenizer能夠唯一且準確地編碼任何模態信號到一個壓縮的特征空間,同時detokenizer能夠將這些壓縮特征恢復為原始的模態信號。
第二階段:預熱模態嵌入層,將任何模態信號轉換成LLM的文本空間。在這個階段,數據集的大小不一定需要很大,因為在實驗和之前的工作中發現,較小的數據集也可以達到良好的效果。
第三階段:使用高質量的指令調整數據集來訓練模態嵌入層和LLM,同時保持tokenizer和detokenizer不變。這個階段的目的是賦予LLM理解不同模態的能力。
通過這三個階段的訓練,可以有效地擴展LLM以支持額外的模態。
實驗
圖片
OpenCompass benchmarks
- 發票信息抽取
圖片
- OCR
圖片
- 公式識別
圖片
- etc...
參考文獻
- Patch n' Pack: NaViT, a Vision Transformer for any Aspect Ratio and Resolution,https://arxiv.org/abs/2307.06304
- POINTS1.5: Building a Vision-Language Model towards Real World Applications,https://arxiv.org/pdf/2412.08443
- https://github.com/WePOINTS/WePOINTS