前言
本節課我們聚焦多模態大模型最核心的問題:文本、圖像、語音這些“不同語言”的信息,是怎么被模型“翻譯”并互相理解的?我們從“差異”入手,一步步搞懂其中的邏輯。
一、先搞懂:什么是“模態差異”?
生活中,我們描述同一件事(比如“一只貓”)可以用多種方式:
- 文本:“一只黑色的貓坐在沙發上”(一串有順序的文字符號);
- 圖像:一張貓的照片(二維像素矩陣,每個點是顏色值);
- 語音:“喵~”(一段聲波信號,隨時間變化的頻率/振幅)。
這些不同的“信息載體”就是“模態”,而它們的“差異”是多模態模型最頭疼的問題。具體來說,差異體現在三個方面:
-
結構差異:
文本是“序列結構”(像排隊的人,有先后順序);
圖像是“二維網格結構”(像棋盤,有行和列);
語音是“時間序列結構”(像流水,隨時間連續變化)。
模型處理序列和網格的“思路”完全不同,就像用漢語語法去分析英語句子,肯定行不通。 -
語義密度差異:
文本的語義很“精準”:“貓”這個詞直接指向特定動物;
圖像的語義很“模糊”:一張貓的照片里,除了貓還有沙發、地板,模型需要“過濾噪音”才能抓住核心;
語音的語義可能“依賴上下文”:同樣的“喵”,可能是撒嬌也可能是警告,需要結合語氣判斷。 -
數據規模差異:
文本數據(如書籍、網頁)容易獲取且規模極大;
高質量圖像/視頻數據(如標注清晰的照片)獲取成本高;
語音數據(尤其是多語言/方言)規模相對較小。
模型“學”得多少不一樣,也會導致不同模態的“表達能力”有差距。
二、第一步:把“原始信息”變成模型能懂的“特征”
模型無法直接處理原始數據(比如文本的文字、圖像的像素),必須先把它們“翻譯”成統一的“數字語言”——這就是“單模態特征提取”。
簡單說,“特征”就是原始數據的“濃縮版”:比如一張貓的照片,原始數據是幾百萬個像素值(無用信息多),特征提取后會變成一串數字(比如768個數字組成的“向量”),這串數字只保留“貓的關鍵信息”(比如耳朵形狀、毛色、姿態)。
不同模態的特征提取工具(舉例):
-
文本特征提取:
用“詞向量”或“Transformer模型”(如BERT)。
例:“貓”這個詞,會被變成一串數字(比如[0.2, -0.5, 1.3, ...]
,這串數字能代表“貓”的語義——和“狗”的向量距離遠,和“ kitten(小貓)”的向量距離近。 -
圖像特征提取:
用“卷積神經網絡(CNN)”或“視覺Transformer(ViT)”。
例:一張貓的照片,通過CNN處理后,會變成一串數字(比如[0.8, 0.1, -0.3, ...]
),這串數字能代表“貓的視覺特征”(比如“有尾巴”“耳朵尖”)。 -
語音特征提取:
用“梅爾頻譜”+“語音模型(如Wav2Vec)”。
例:“喵”的叫聲,會被轉化為代表“頻率變化”的向量,保留“貓叫”的聲音特征。
三、核心難題:如何讓不同模態的“特征”能“對話”?
即便我們把文本、圖像都變成了向量,它們仍然可能“不在一個頻道”:比如“貓”的文本向量和貓的圖像向量,可能在模型眼里毫無關系——這就需要“模態對齊”。
“模態對齊”的目標:讓同一語義的不同模態特征,在“向量空間”里靠得近;不同語義的特征離得遠。
打個比方:假設我們把所有特征向量想象成“地圖上的點”,“貓”的文本向量和貓的圖像向量應該在地圖上“挨在一起”,而和“狗”的向量離得遠。
模態對齊的兩種主流方式:
-
早期對齊(Early Fusion):“先統一,再處理”
思路:在特征提取階段就把不同模態“拉到同一空間”。
例:CLIP模型(我們后面會詳細講)就是典型的早期對齊:- 文本用“文本編碼器”提取特征,圖像用“圖像編碼器”提取特征;
- 兩個編碼器在訓練時被“強迫”學習同一套“向量規則”——比如“貓”的文本向量和貓的圖像向量,計算“相似度”時得分必須高。
-
晚期對齊(Late Fusion):“先各自處理,再融合”
思路:先分別提取文本、圖像的特征(可能在不同空間),最后在模型的“后期層”通過“交叉注意力”等方式融合。
例:視覺問答模型(VQA):- 先單獨提取圖像特征(“圖里有什么”)和問題文本特征(“圖中有幾只貓?”);
- 最后一層用交叉注意力:讓文本特征“關注”圖像中“貓”的區域,圖像特征“回應”文本中的“數量”問題,最終融合出答案。
四、代碼示例:用CLIP直觀感受“模態對齊”
我們用最簡單的代碼,看看經過“早期對齊”的模型,如何讓文本和圖像“對話”。
目標:輸入一張貓的圖片和3個文本描述(“a cat”“a dog”“a bird”),模型會計算圖片與每個文本的“相似度”,相似度最高的就是匹配結果。
步驟1:安裝工具庫
# 安裝Hugging Face的transformers庫(模型工具)和pytorch(計算框架)
pip install transformers torch pillow
步驟2:加載模型和處理器
CLIP是經過“早期對齊”訓練的模型,它的文本編碼器和圖像編碼器已經“懂同一種語言”:
from transformers import CLIPModel, CLIPProcessor
import torch
from PIL import Image # 加載預訓練模型和處理器(處理器負責把原始數據轉成模型能讀的格式)
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
步驟3:準備輸入(圖像+文本)
# 準備一張貓的圖片(可以用自己的圖片,路徑替換成實際地址)
image = Image.open("cat.jpg") # 假設當前文件夾有一張貓的照片 # 準備3個候選文本描述
texts = ["a cat", "a dog", "a bird"]
步驟4:提取特征并計算相似度
# 用處理器處理輸入(自動轉成模型需要的格式)
inputs = processor(text=texts, images=image, return_tensors="pt", padding=True) # 模型輸出文本特征和圖像特征
outputs = model(**inputs)
text_features = outputs.text_embeds # 文本特征(3個向量,對應3個文本)
image_features = outputs.image_embeds # 圖像特征(1個向量,對應貓的圖片) # 計算圖像特征與每個文本特征的相似度(余弦相似度,值越高越匹配)
similarity = torch.nn.functional.cosine_similarity(image_features, text_features) # 打印結果
print("文本描述:", texts)
print("相似度:", similarity.detach().numpy())
預期結果:
文本描述: ['a cat', 'a dog', 'a bird']
相似度: [0.85, 0.32, 0.21]
可以看到,“a cat”與貓的圖片相似度最高——這就是“模態對齊”的效果:模型知道“貓的圖像”和“a cat”指的是同一個東西。
總結
這節課我們搞懂了:
- 不同模態(文本、圖像等)因為結構、語義密度、數據規模不同,天生“難溝通”;
- 必須先把原始數據轉成“特征向量”(模型的“數字語言”);
- 核心是“模態對齊”——讓同一語義的不同模態特征在向量空間里“靠近”,早期對齊(如CLIP)和晚期對齊(如VQA)是兩種主要方式。
下節課,我們會具體看這些“對齊”思路是如何被用到實際模型中的。