注:從CLIP到多語言視覺語言對齊實(shí)戰(zhàn))
1. 從“看圖說話”到“跨語言看圖說話”一個被低估的挑戰(zhàn)如果你做過圖像檢索或者圖像標(biāo)注Image Tagging那你肯定熟悉一個經(jīng)典流程用預(yù)訓(xùn)練的視覺模型比如ResNet、ViT提取圖像特征再用一個文本編碼器比如BERT處理文本查詢最后在同一個向量空間里計(jì)算相似度。這個“圖文匹配”的范式在單一語言比如英語下已經(jīng)相當(dāng)成熟了。但今天我想聊一個更“野”的場景跨語言零樣本圖像檢索與標(biāo)注。簡單說就是訓(xùn)練時只用英語的圖文數(shù)據(jù)但測試時用戶可以用中文、法語、日語等任意語言來搜索圖片或者給一張新圖片自動生成多語言的標(biāo)簽。這聽起來像是把兩個難題跨語言、零樣本揉在了一起。為什么說它被低估了因?yàn)榇蠖鄶?shù)研究者和工程師的直覺是既然CLIP這樣的模型已經(jīng)證明了強(qiáng)大的零樣本能力那跨語言無非就是把文本編碼器換成多語言BERTmBERT或者XLM-R問題不就解決了嗎我最初也是這么想的直到在實(shí)際項(xiàng)目中碰了壁。你會發(fā)現(xiàn)直接拼接一個英語視覺編碼器和一個多語言文本編碼器效果往往差強(qiáng)人意。模型似乎很難理解一張“狗”的圖片其語義應(yīng)該與“dog”、“犬”、“chien”、“perro”這些詞在向量空間里都靠得很近。這背后是視覺-語言模態(tài)對齊與語言間語義對齊這兩個目標(biāo)之間的深層沖突與耦合。“Towards Zero-shot Cross-lingual Image Retrieval and Tagging”這個研究方向正是要系統(tǒng)性地解決這個沖突。它的核心價值在于打破數(shù)據(jù)與語言的壁壘讓一個模型真正具備“視覺世界通用翻譯官”的潛力。無論是為全球化的電商平臺構(gòu)建多語言搜圖系統(tǒng)還是為內(nèi)容管理平臺實(shí)現(xiàn)自動化多語言打標(biāo)這個技術(shù)都能顯著降低數(shù)據(jù)收集和模型維護(hù)的成本。接下來我將結(jié)合最新的研究思路和實(shí)戰(zhàn)經(jīng)驗(yàn)拆解實(shí)現(xiàn)這一目標(biāo)的幾個關(guān)鍵層級和具體策略。2. 問題本質(zhì)視覺-語言對齊中的“語言鴻溝”在深入技術(shù)方案前我們必須先厘清問題的根源。在標(biāo)準(zhǔn)的英語圖文模型中視覺編碼器V和文本編碼器T在一個共享的向量空間里學(xué)習(xí)對齊。損失函數(shù)如對比學(xué)習(xí)損失的目標(biāo)是讓匹配的圖文對I, T_en的向量表示盡可能接近不匹配的盡可能遠(yuǎn)離。這里隱含了一個強(qiáng)假設(shè)文本側(cè)的語言分布是單一且一致的。當(dāng)我們引入多語言文本編碼器時這個假設(shè)被打破了。假設(shè)我們有一個英語圖文對I, “a dog playing in the park”和一個對應(yīng)的中文翻譯文本“一只在公園里玩耍的狗”。對于一個在英語圖文數(shù)據(jù)上訓(xùn)練、但使用多語言文本編碼器的模型它需要同時滿足兩個約束跨模態(tài)對齊圖像I的向量應(yīng)靠近其英語描述“a dog playing in the park”的向量。跨語言對齊英語描述“a dog playing in the park”的向量應(yīng)靠近其中文翻譯“一只在公園里玩耍的狗”的向量。理想情況下通過多語言編碼器內(nèi)部的跨語言表示能力約束2可以部分得到滿足。但關(guān)鍵在于模型訓(xùn)練的主信號圖文對比損失只來自于英語文本。多語言編碼器雖然“見過”各種語言但在與視覺模態(tài)對齊的過程中它可能會為了優(yōu)化英語的圖文匹配任務(wù)而“遺忘”或“扭曲”其他語言的語義空間結(jié)構(gòu)。這就導(dǎo)致了“語言鴻溝”模型學(xué)會了一個完美的英語視覺-語言聯(lián)合空間但其他語言在這個空間中的分布是混亂或偏置的無法與圖像正確對齊。一個更隱蔽的問題是詞匯覆蓋度與粒度。英語數(shù)據(jù)集中可能用“dog”泛指所有犬類但中文里可能有更細(xì)致的“狗”、“犬”、“汪星人”等表達(dá)其情感和語境色彩不同。模型如何理解這些細(xì)粒度差異此外一些語言特有的概念如中文的“江湖”在沒有對應(yīng)視覺示例的情況下模型根本無法建立其視覺關(guān)聯(lián)。3. 核心架構(gòu)演進(jìn)從簡單拼接到深度耦合早期的嘗試確實(shí)如我們直覺所想是一種“拼接式”架構(gòu)。但效果不佳促使研究者們發(fā)展出更精細(xì)的架構(gòu)設(shè)計(jì)。我們來梳理一下演進(jìn)路徑。3.1 基線方法多語言編碼器直接替換及為何失敗最直接的基線是取一個預(yù)訓(xùn)練的CLIPViT-B/32 English Transformer將其文本編碼器替換為預(yù)訓(xùn)練的多語言Transformer如XLM-Roberta-base。然后在英語圖文數(shù)據(jù)集如COCO-Captions, Flickr30k-EN上用圖文對比損失進(jìn)行微調(diào)。實(shí)戰(zhàn)踩坑記錄我最初在Flickr30k-EN上嘗試了這個方案文本編碼器用xlm-roberta-base。評估時我用MSCOCO的5K張圖片分別用英語和中文查詢進(jìn)行零樣本檢索。結(jié)果英語檢索的Recall1還能保持CLIP原模型約70%的性能但中文檢索的Recall1直接掉到了個位數(shù)甚至不如隨機(jī)猜測。分析可視化向量空間發(fā)現(xiàn)所有語言的文本向量都緊密地簇?fù)碓谝黄鸬c圖像向量群之間存在一個明顯的“斷層”。模型似乎把所有語言的文本都編碼到了一個相似的子空間但這個子空間與視覺空間的對齊非常弱。這是因?yàn)橛?xùn)練時對比損失只拉近圖像和英語文本而多語言編碼器自身的參數(shù)更新會傾向于將所有語言的表示向英語錨點(diǎn)靠攏但這個過程是粗糙的破壞了其他語言內(nèi)部的語義結(jié)構(gòu)。3.2 改進(jìn)方向一引入跨語言對齊輔助任務(wù)為了顯式地建立語言間的橋梁一個主流思路是在訓(xùn)練時加入輔助損失強(qiáng)制不同語言對同一語義的表達(dá)盡可能接近。1. 翻譯對對比損失Translation Pair Contrastive Loss除了原始的圖像-文本對I, T_en我們利用機(jī)器翻譯系統(tǒng)為每個英語句子T_en生成一個或多個目標(biāo)語言如中文的翻譯T_zh。然后構(gòu)建額外的損失項(xiàng)讓T_en和T_zh的文本向量盡可能相似同時與其他不匹配的翻譯文本向量遠(yuǎn)離。L_text_crosslingual -log[exp(sim(T_en, T_zh)/τ) / Σ_{T} exp(sim(T_en, T)/τ)]其中T‘ 是同一個batch內(nèi)其他句子的翻譯文本。這個損失與原始的圖文對比損失Image-Text Contrastive Loss加權(quán)求和共同指導(dǎo)模型優(yōu)化。2. 多語言文本編碼器的參數(shù)共享與解耦直接使用完整的XLM-R作為文本編碼器可能過于龐大且其底層參數(shù)更關(guān)注通用語言理解高層參數(shù)才更關(guān)注與任務(wù)及視覺模態(tài)的交互。一種策略是凍結(jié)多語言編碼器的底層Transformer層只微調(diào)頂部的幾層例如最后3層。這樣可以在保留強(qiáng)大跨語言表示的同時讓頂層網(wǎng)絡(luò)專門學(xué)習(xí)與視覺模態(tài)的對齊。另一種更激進(jìn)的思路是使用雙塔結(jié)構(gòu)一個輕量級的、與視覺編碼器共同訓(xùn)練的“對齊投影頭”負(fù)責(zé)將不同語言的文本表示映射到與圖像對齊的共享空間。而笨重的多語言編碼器本身被凍結(jié)僅作為特征提取器。我的實(shí)操心得輔助損失的效果高度依賴于翻譯質(zhì)量。如果使用現(xiàn)成的公共翻譯API如Google Translate需要警惕翻譯噪聲特別是對于長尾或領(lǐng)域特定詞匯。在項(xiàng)目中我們對關(guān)鍵的實(shí)體名詞如產(chǎn)品型號、專業(yè)術(shù)語進(jìn)行了人工翻譯校驗(yàn)確保了種子翻譯對的質(zhì)量這對最終效果提升明顯。此外輔助損失的權(quán)重需要仔細(xì)調(diào)優(yōu)權(quán)重太大會削弱圖文對齊太小則作用有限。我們通過一個簡單的網(wǎng)格搜索將其設(shè)置在0.3到0.5之間找到了一個平衡點(diǎn)。3.3 改進(jìn)方向二視覺引導(dǎo)的跨語言表示學(xué)習(xí)這代表了更前沿的思考不讓視覺和文本兩條線各自為政而是讓視覺信息主動參與到文本的跨語言表示學(xué)習(xí)中。1. 視覺感知的跨語言掩碼語言建模Vision-Aware MLM傳統(tǒng)的MLM任務(wù)讓模型根據(jù)上下文預(yù)測被掩碼的詞。在這里我們將其升級為“視覺感知”版本給定一個圖像I和其對應(yīng)的多語言描述其中一個詞被掩碼模型需要利用圖像信息I和文本的跨語言上下文來預(yù)測被掩碼的詞。例如給一張狗的照片和句子“A [MASK] is running”模型需要預(yù)測“dog”同時給中文句子“一只[MASK]在跑”模型需要預(yù)測“狗”。這個任務(wù)迫使文本編碼器在理解語言時必須參考視覺上下文從而學(xué)習(xí)到視覺基礎(chǔ)化Grounded的多語言表示。2. 跨語言視覺語義嵌入Cross-lingual Visual Semantic Embedding這個方法試圖構(gòu)建一個語言無關(guān)的“概念空間”。首先利用知識圖譜如WordNet或大型語言模型將每種語言的詞匯映射到一組共享的、抽象的概念節(jié)點(diǎn)上。然后訓(xùn)練模型將圖像和任何語言的文本都映射到這個概念空間。例如圖像、英文“dog”、中文“狗”、法文“chien”都被映射到概念節(jié)點(diǎn)“Canine”。在推理時無論輸入何種語言查詢都先將其映射到概念空間再與圖像的概念表示進(jìn)行匹配。這種方法對資源稀缺的語言尤其友好但構(gòu)建高質(zhì)量的概念對齊體系本身是一個挑戰(zhàn)。技術(shù)選型對比方法核心思想優(yōu)點(diǎn)缺點(diǎn)適用場景翻譯對對比損失顯式拉近不同語言文本的距離實(shí)現(xiàn)簡單直觀有效能直接利用現(xiàn)有翻譯工具依賴翻譯質(zhì)量可能引入噪聲對非平行語料無效擁有高質(zhì)量種子翻譯對的場景如主流語言互譯視覺感知MLM讓視覺信息指導(dǎo)文本表示學(xué)習(xí)學(xué)習(xí)到的表示視覺基礎(chǔ)化程度高理論更優(yōu)雅訓(xùn)練更復(fù)雜計(jì)算開銷大需要構(gòu)造掩碼樣本對模型跨模態(tài)理解能力要求極高的場景概念空間映射通過中間概念層解耦語言對低資源語言友好可擴(kuò)展性強(qiáng)依賴外部知識源概念對齊的精度是關(guān)鍵瓶頸涉及大量低資源語言或需要高度可解釋性的場景在我們的項(xiàng)目中由于主要涉及中、英、日、西四種語言且擁有部分人工校驗(yàn)的平行語料我們選擇了“翻譯對對比損失”作為核心輔助任務(wù)并結(jié)合了“凍結(jié)底層文本編碼器”的策略在效果和工程復(fù)雜度之間取得了良好平衡。4. 數(shù)據(jù)策略如何“無中生有”跨語言訓(xùn)練信號對于零樣本跨語言學(xué)習(xí)訓(xùn)練數(shù)據(jù)只有英語圖文對。如何從中挖掘或生成跨語言信號是工程上的重中之重。4.1 構(gòu)建高質(zhì)量平行文本語料這是最直接有效的方法。對于每個英語句子利用機(jī)器翻譯MT生成目標(biāo)語言的句子。這里有幾個關(guān)鍵點(diǎn)翻譯引擎的選擇商用API如Google, DeepL在通用領(lǐng)域效果很好但對于專業(yè)領(lǐng)域如醫(yī)療、科技可能需要微調(diào)過的翻譯模型或領(lǐng)域詞典。回譯Back-Translation為了增加數(shù)據(jù)多樣性和魯棒性可以將翻譯成目標(biāo)語言的文本再翻譯回英語形成一個“英語-外語-英語”的循環(huán)。用回譯后的英語文本和原英語文本可以構(gòu)造額外的文本對齊損失增強(qiáng)模型對語義等價性的理解。多翻譯版本為一個英語句子生成多個不同風(fēng)格或措辭的翻譯版本可以模擬語言表達(dá)的多樣性讓模型學(xué)習(xí)到更魯棒的語義映射。4.2 利用多語言詞典進(jìn)行詞匯級對齊對于圖像標(biāo)注Tagging任務(wù)標(biāo)簽往往是單詞或短語。我們可以利用開源的多語言詞典如Wiktionary或雙語詞向量建立核心名詞、動詞的跨語言映射。在訓(xùn)練時對于圖像-標(biāo)簽對我們可以將英語標(biāo)簽替換為其在其他語言中的對應(yīng)詞并賦予相同的圖像作為正樣本。這相當(dāng)于在詞匯級別進(jìn)行了數(shù)據(jù)增強(qiáng)。4.3 合成跨語言圖文數(shù)據(jù)這是一個更富想象力的方向。利用強(qiáng)大的文本到圖像生成模型如Stable Diffusion可以根據(jù)非英語的描述生成圖像。例如給定中文描述“一座覆蓋白雪的山峰”生成對應(yīng)的圖片。然后將這張合成圖片與其中文描述、以及翻譯后的英文描述“a snow-covered mountain peak”組成一個訓(xùn)練三元組。這種方法可以極大地擴(kuò)充跨語言數(shù)據(jù)但需要謹(jǐn)慎處理生成圖像的質(zhì)量和多樣性問題避免引入偏差。注意合成數(shù)據(jù)是一把雙刃劍。在初期實(shí)驗(yàn)中我們使用了大量Stable Diffusion生成的跨語言圖文對發(fā)現(xiàn)雖然檢索性能在已知類別上有所提升但模型對于生成圖像中常見的藝術(shù)化、不真實(shí)的細(xì)節(jié)產(chǎn)生了過擬合導(dǎo)致在真實(shí)照片上的泛化能力下降。建議將合成數(shù)據(jù)作為真實(shí)數(shù)據(jù)的補(bǔ)充比例不超過20%并經(jīng)過嚴(yán)格過濾。5. 評估與調(diào)優(yōu)超越單一指標(biāo)的全面審視模型訓(xùn)練好了如何評估其真正的“零樣本跨語言”能力不能只看一個RecallK就下結(jié)論。5.1 建立多維評估基準(zhǔn)一個可靠的評估體系應(yīng)包含以下維度跨語言檢索精度在標(biāo)準(zhǔn)圖像檢索數(shù)據(jù)集如Flickr30k, MSCOCO上分別用英語和各種目標(biāo)語言查詢計(jì)算Recall1, 5, 10。這是核心指標(biāo)。語言一致性給定一張圖片和其在不同語言中的正確描述計(jì)算這些描述在模型共享空間中的向量相似度。相似度越高說明模型對不同語言語義等價性的保持越好。詞匯覆蓋度測試構(gòu)建一個測試集包含不同語言中相同概念但不同表達(dá)方式的查詢?nèi)缰形牡摹巴粜侨恕薄ⅰ肮饭贰薄ⅰ叭睂?yīng)英文的“dog”檢查模型是否能將它們映射到相似的圖像集合。領(lǐng)域外泛化在訓(xùn)練數(shù)據(jù)未覆蓋的新領(lǐng)域如醫(yī)學(xué)影像、衛(wèi)星圖片上用多語言查詢進(jìn)行測試評估模型的遷移能力。5.2 訓(xùn)練過程中的關(guān)鍵超參數(shù)調(diào)優(yōu)對比損失溫度系數(shù)τ這個參數(shù)控制著相似度分布的平滑程度。在跨語言場景下由于文本表示的來源更復(fù)雜τ需要精細(xì)調(diào)整。我們通常從一個較小的值如0.05開始根據(jù)驗(yàn)證集上跨語言檢索的性能進(jìn)行微調(diào)。學(xué)習(xí)率與預(yù)熱文本編碼器通常使用比視覺編碼器更小的學(xué)習(xí)率例如1e-5 vs 5e-5特別是當(dāng)其大部分層被凍結(jié)時。使用線性學(xué)習(xí)率預(yù)熱Warmup對于對比學(xué)習(xí)訓(xùn)練的穩(wěn)定性至關(guān)重要預(yù)熱步數(shù)建議設(shè)為總訓(xùn)練步數(shù)的10%。批次大小Batch Size對比學(xué)習(xí)受益于大的批次大小因?yàn)樗芴峁└嗟呢?fù)樣本。但考慮到多語言文本編碼器的顯存占用需要在硬件限制和性能之間權(quán)衡。梯度累積是一個有效的折中方案。5.3 可視化調(diào)試洞察模型學(xué)到了什么定期使用t-SNE或UMAP對圖像和多種語言文本的向量進(jìn)行降維可視化是極其有效的調(diào)試手段。你可以直觀地看到圖像和文本的集群是否清晰分離不同語言對同一語義的描述是否聚集在一起是否存在某些語言的文本向量整體偏離了視覺集群 這些洞察能直接指導(dǎo)你調(diào)整數(shù)據(jù)策略或損失函數(shù)。6. 實(shí)戰(zhàn)構(gòu)建一個簡易的跨語言圖像檢索系統(tǒng)理論說了這么多我們來動手搭建一個最簡單的可運(yùn)行原型。這里我們以使用Hugging Facetransformers和clip庫為例。6.1 環(huán)境準(zhǔn)備與數(shù)據(jù)假設(shè)我們使用Flickr30k-EN數(shù)據(jù)集作為訓(xùn)練數(shù)據(jù)并準(zhǔn)備一些中文翻譯作為輔助。# 安裝核心庫 pip install torch torchvision transformers clip pip install sentence-transformers # 可選用于便捷的文本編碼 pip install googletrans4.0.0-rc1 # 用于翻譯注意版本API可能變動數(shù)據(jù)目錄結(jié)構(gòu)設(shè)想如下flickr30k/ images/ 00001.jpg 00002.jpg ... captions/ train_en.txt # 每行: 圖片ID\t英文描述 train_zh.txt # 每行: 圖片ID\t中文描述 (可通過腳本生成)6.2 模型定義關(guān)鍵部分我們采用“凍結(jié)多語言文本編碼器底層 輔助翻譯損失”的方案。import torch import torch.nn as nn import torch.nn.functional as F from transformers import XLMRobertaModel, XLMRobertaTokenizer import clip class ZeroShotCrossLingualCLIP(nn.Module): def __init__(self, model_namexlm-roberta-base, projection_dim512, freeze_layers9): super().__init__() # 加載預(yù)訓(xùn)練的CLIP視覺編碼器 self.visual_encoder, _ clip.load(ViT-B/32, devicecpu) # 先加載到CPU self.visual_projection nn.Linear(512, projection_dim) # CLIP視覺特征維度是512 # 加載多語言文本編碼器 self.text_encoder XLMRobertaModel.from_pretrained(model_name) self.text_tokenizer XLMRobertaTokenizer.from_pretrained(model_name) text_hidden_size self.text_encoder.config.hidden_size self.text_projection nn.Linear(text_hidden_size, projection_dim) # 凍結(jié)文本編碼器的底層 for i in range(freeze_layers): for param in self.text_encoder.encoder.layer[i].parameters(): param.requires_grad False # 溫度參數(shù)可學(xué)習(xí) self.logit_scale nn.Parameter(torch.ones([]) * torch.log(torch.tensor(1/0.07))) def encode_image(self, images): with torch.no_grad(): # CLIP視覺編碼器在初期也可以考慮微調(diào)這里先凍結(jié) visual_features self.visual_encoder.encode_image(images) visual_features F.normalize(self.visual_projection(visual_features), dim-1) return visual_features def encode_text(self, input_ids, attention_mask, languageen): # 通過文本編碼器 text_outputs self.text_encoder(input_idsinput_ids, attention_maskattention_mask) # 取[CLS] token的表示作為句子表示 text_features text_outputs.last_hidden_state[:, 0, :] text_features F.normalize(self.text_projection(text_features), dim-1) return text_features6.3 損失函數(shù)實(shí)現(xiàn)結(jié)合圖文對比損失和文本跨語言對齊損失。def combined_loss(image_features, text_features_en, text_features_zh, logit_scale, lambda_lang0.4): image_features: 圖像特征 [batch, dim] text_features_en: 英文文本特征 [batch, dim] text_features_zh: 中文文本特征 [batch, dim] logit_scale: 可學(xué)習(xí)的尺度參數(shù) lambda_lang: 跨語言對齊損失的權(quán)重 # 計(jì)算圖像-文本對比損失 (針對英文) logits_per_image logit_scale.exp() * image_features text_features_en.t() logits_per_text logits_per_image.t() labels torch.arange(len(logits_per_image), deviceimage_features.device) loss_i2t F.cross_entropy(logits_per_image, labels) loss_t2i F.cross_entropy(logits_per_text, labels) loss_itc (loss_i2t loss_t2i) / 2 # 計(jì)算文本跨語言對齊損失 (英文 vs 中文) logits_lang logit_scale.exp() * text_features_en text_features_zh.t() loss_lang F.cross_entropy(logits_lang, labels) # 假設(shè)英文和中文句子一一對應(yīng) # 總損失 total_loss loss_itc lambda_lang * loss_lang return total_loss, loss_itc, loss_lang6.4 訓(xùn)練循環(huán)核心片段# 假設(shè) dataloader 每次返回 (images, input_ids_en, attn_mask_en, input_ids_zh, attn_mask_zh) model ZeroShotCrossLingualCLIP().cuda() optimizer torch.optim.AdamW([ {params: model.visual_projection.parameters(), lr: 5e-5}, {params: model.text_projection.parameters(), lr: 1e-5}, {params: model.text_encoder.encoder.layer[9:].parameters(), lr: 1e-5}, # 僅微調(diào)頂層 {params: model.logit_scale, lr: 1e-5} ]) model.train() for epoch in range(num_epochs): for batch in dataloader: images, ids_en, mask_en, ids_zh, mask_zh batch images images.cuda() ids_en, mask_en ids_en.cuda(), mask_en.cuda() ids_zh, mask_zh ids_zh.cuda(), mask_zh.cuda() # 前向傳播 img_feats model.encode_image(images) txt_feats_en model.encode_text(ids_en, mask_en) txt_feats_zh model.encode_text(ids_zh, mask_zh) # 計(jì)算損失 loss, loss_itc, loss_lang combined_loss(img_feats, txt_feats_en, txt_feats_zh, model.logit_scale) # 反向傳播 optimizer.zero_grad() loss.backward() optimizer.step() # 監(jiān)控日志 if step % 100 0: print(fEpoch {epoch}, Step {step}, Loss: {loss.item():.4f}, ITC: {loss_itc.item():.4f}, Lang: {loss_lang.item():.4f})6.5 推理與部署訓(xùn)練完成后推理過程非常直接。對于檢索model.eval() # 1. 預(yù)計(jì)算并存儲所有圖像的特征向量庫 image_features_list [] image_paths [] with torch.no_grad(): for img_path in all_image_paths: image preprocess(Image.open(img_path)).unsqueeze(0).cuda() feat model.encode_image(image).cpu() image_features_list.append(feat) image_paths.append(img_path) image_features torch.cat(image_features_list, dim0) # [N, dim] # 2. 處理用戶查詢支持任意語言 def search(query_text, langzh, top_k5): tokenizer model.text_tokenizer inputs tokenizer(query_text, return_tensorspt, paddingTrue, truncationTrue).to(cuda) with torch.no_grad(): query_feat model.encode_text(inputs[input_ids], inputs[attention_mask]).cpu() # 計(jì)算相似度 similarities (query_feat image_features.T).squeeze(0) # [N] top_indices similarities.argsort(descendingTrue)[:top_k] return [image_paths[i] for i in top_indices]對于圖像標(biāo)注Tagging可以預(yù)先定義一個多語言標(biāo)簽詞表計(jì)算圖像與每個標(biāo)簽的相似度取閾值以上的作為預(yù)測標(biāo)簽。7. 避坑指南與進(jìn)階思考在實(shí)現(xiàn)過程中有幾個坑是幾乎一定會遇到的。7.1 語言標(biāo)識符Language Token的濫用與處理像XLM-R這類模型在分詞時會在句首添加特殊的語言標(biāo)識符如s。在計(jì)算對比損失時需要確保參與對比的文本特征都來自相同的上下文。一個常見的錯誤是在構(gòu)建批次時不同語言的文本因?yàn)殚L度不同而被padding到不同長度導(dǎo)致語言標(biāo)識符的位置或注意力掩碼出現(xiàn)問題從而影響特征提取的穩(wěn)定性。務(wù)必確保文本編碼器的輸入是經(jīng)過正確批處理batch和填充padding的。7.2 負(fù)樣本的構(gòu)建策略對比學(xué)習(xí)的性能嚴(yán)重依賴于負(fù)樣本的質(zhì)量。在跨語言場景下負(fù)樣本可以來自同一圖像的其他不相關(guān)描述圖像內(nèi)負(fù)例。同一批次內(nèi)其他圖像的描述批次內(nèi)負(fù)例。其他語言的不相關(guān)描述跨語言負(fù)例。 如何混合這些負(fù)例一種有效的策略是跨模態(tài)和跨語言混合負(fù)采樣對于一個圖像I其負(fù)文本樣本池包括所有其他圖像的英文描述和中文描述。這能最大程度地增加負(fù)樣本的難度和多樣性幫助模型學(xué)習(xí)更精細(xì)的判別特征。7.3 長尾分布與低資源語言的挑戰(zhàn)即使使用了多語言模型資源豐富語言如英語、中文和資源稀缺語言如冰島語、斯瓦希里語的性能差距依然巨大。這是因?yàn)轭A(yù)訓(xùn)練語料本身就不平衡。對于低資源語言除了前面提到的概念空間映射方法還可以考慮詞匯遷移利用與高資源語言如英語的詞典映射將低資源語言的詞“錨定”到高資源語言的語義空間中。數(shù)據(jù)增強(qiáng)對低資源語言的文本進(jìn)行回譯、同義詞替換、隨機(jī)刪除等操作雖然原始數(shù)據(jù)少但可以增強(qiáng)其魯棒性。7.4 從檢索到標(biāo)注生成式模型的潛力我們討論的主要是基于匹配雙編碼器的檢索和標(biāo)注。另一個有潛力的方向是生成式模型。例如基于多語言圖像-文本對訓(xùn)練的視覺語言模型如BLIP-2、Flamingo可以直接接受圖像和一種語言的提示詞生成另一種語言的描述或標(biāo)簽。這類模型在開放性、創(chuàng)造性方面更有優(yōu)勢但在精確檢索和效率上可能不如雙編碼器模型。未來的系統(tǒng)很可能是“檢索生成”的混合架構(gòu)先用高效的檢索模型縮小范圍再用生成模型進(jìn)行精煉和多樣化輸出。實(shí)現(xiàn)真正的零樣本跨語言圖像理解我們還在路上。它不僅僅是換一個文本編碼器那么簡單而是要求我們在模型架構(gòu)、損失設(shè)計(jì)、數(shù)據(jù)策略和訓(xùn)練技巧等多個層面進(jìn)行協(xié)同創(chuàng)新。每一次嘗試無論是成功的性能提升還是失敗后的根因分析都讓我們離“視覺巴別塔”的建成更近一步。從我個人的經(jīng)驗(yàn)來看耐心地做可視化分析細(xì)致地調(diào)整數(shù)據(jù)管道往往比盲目調(diào)整模型結(jié)構(gòu)帶來更穩(wěn)定的收益。這個領(lǐng)域沒有銀彈但正是這些需要不斷摸索和調(diào)優(yōu)的細(xì)節(jié)構(gòu)成了技術(shù)工作的真正魅力。