
VQA高分是在看圖還是在記答案這個問題不是抬杠。很多視覺問答模型在標準測試集上分數很漂亮可一旦換掉問題分布、遮住關鍵視覺區域、甚至把圖片換成不相關的干擾圖能力立刻縮水。這說明一部分高分本質上是“記住”了訓練數據里的答案分布而不是真正理解圖片。ReKey這個方向給出的對策很直接——不要全量微調不要重新訓練整個多模態模型只更新決定答案的那一小塊參數把模型從“背答案”拉回到“看圖答題”的路徑上。這篇文章不打算復述論文而是拆解三件事VQA評測中的高分為什么可能失真ReKey“只更新那一小塊參數”的思路到底在更新什么以及這套方法在 vqa任務 里怎么做驗證、怎么落地。對多模態模型測評、參數高效微調和數據洞察感興趣的讀者這篇可以直接看下去。1. 核心能力速覽先給一張速覽表把這個問題和方法的關鍵信息列清楚。能力項說明研究對象VQA視覺問答模型的高分來源與推理可靠性核心問題模型是在看圖推理還是依賴訓練集中答案分布的先驗記憶方法思路ReKey只更新與答案預測直接相關的一小部分關鍵參數其余凍結主要收益降低微調成本、提升分布外泛化能力、增強答案決策的可解釋性適配模型多模態大模型如 Qwen3-VL 等支持視覺問答的開源模型更新范圍需要基于模型內部參數重要性分析確定通常遠小于全量參數批量任務支持批量評測和批量微調適合做多組對照實驗API 能力取決于所選基座模型可用于構建自動評測服務落地門檻中等需要理解注意力機制、梯度分析和參數凍結操作先說結論ReKey 這類方法的價值不在刷高分布內分數而在于回答“高分到底怎么來的”。如果模型離開訓練分布就失效那高分就是記憶偽影如果模型在圖片被干擾后仍然能正確回答才說明它真的在“看圖”。2. VQA 評測中的“高分陷阱”2.1 什么是 VQA 任務VQA 任務全稱 Visual Question Answering要求模型輸入一張圖片和一個自然語言問題輸出對應答案。例如給一張“貓在沙發上”的圖片問“貓在哪里”正確答案是“沙發上”。這看起來是典型的視覺語言推理任務但實際評測中有一個長期存在的隱患模型可以通過語言先驗來“猜答案”而不完全依賴視覺內容。早期 VQA 數據集中很多問題的答案分布高度偏斜。例如“球是什么顏色”這類問題答案集中在“白色”“紅色”“黑色”等少數顏色詞問“這是白天還是晚上”絕大多數場景的答案是“白天”。模型不需要仔細看圖片只要根據問題類型從高頻答案里選一個就能拿到不低的分數。2.2 記答案的模型長什么樣“記答案”不是指模型用檢索數據庫的方式記住單個樣本而是指模型學會了利用訓練集中的統計規律完成任務。在訓練階段模型看到大量“問題—答案”對語言解碼器會學到一種捷徑某些問題模式后面往往跟著某類答案。這種捷徑在分布內測試集上依然成立因為測試集和訓練集來自同一數據分布高頻答案仍然高頻。但在真實場景里用戶不會按訓練分布提問。一旦問題變得更具體、圖片中出現罕見組合或者答案分布反轉依賴先驗記憶的模型就會暴露出“不看圖”的本性。2.3 為什么“分布內高分”不能說明模型能看圖這里有一個關鍵邏輯VQA 的高分由視覺理解和語言先驗共同貢獻。要判斷模型是否真正看圖需要拆解這兩個貢獻。一個更嚴格的評測方式是改變訓練集與測試集的答案分布使兩個分布不一致。如果模型仍然依賴訓練分布的先驗分布外分數就會顯著下降如果模型主要依靠視覺推理則分數下降幅度較小。ReKey 這類方法要解決的就是讓模型在答案分布變化時更少依賴先驗、更多依賴圖像證據。而“只更新決定答案的那一小塊參數”本質上是在調整模型的答案預測路徑迫使它把注意力從“記憶中的答案”轉向“圖片中的證據”。3. ReKey 的核心思路只更新決定答案的那一小塊3.1 參數不是一樣重要的現代多模態大模型有幾十億甚至上百億參數。但并非所有參數都參與答案決策。視覺編碼器負責提取圖像特征語言模型負責生成文本跨模態注意力負責將圖像信息注入文本生成過程。真正決定“最終輸出哪個答案 token”的往往是一小部分與解碼路徑直接相關的參數。ReKey 的取名很直觀Re 是重新調整Key 既指 Transformer 注意力中的 Key 矩陣也隱喻“關鍵參數”。從標題和現有公開信息來看ReKey 的核心主張是找到并只更新那些決定答案輸出的一小塊參數其余參數全部凍結。這樣既避免全量微調帶來的災難性遺忘又能精準糾正模型的答案偏置。3.2 “那一小塊”可以從哪里找確定“哪一小塊”是關鍵步驟。常見做法有三類第一類是基于梯度的重要性分析。在驗證集上計算每個參數對答案預測損失的梯度幅值梯度大的參數通常對輸出影響更大。這類方法在剪枝和參數高效微調研究中已經很成熟。第二類是基于注意力權重的分布分析。在 VQA 推理過程中注意力得分高度集中在某些跨模態層上。如果某些注意力頭對“問題詞—圖像區域”的匹配起決定性作用那么這些頭對應的 Key、Query 投影矩陣就是“決定答案的小塊”。第三類是基于 Fisher 信息矩陣。Fisher 信息衡量參數對模型輸出的信息量信息量高的參數更值得更新。通過少量樣本估計 Fisher 信息然后按閾值篩選出關鍵參數子集。從工程角度這三類方法可以結合使用先用梯度或 Fisher 信息做初篩再用注意力分布做精調。篩選出的參數集合大小往往只占模型總參數的很小比例但能顯著改變答案分布。3.3 只更新小塊為什么有效因為 VQA 模型的答案偏置往往集中在最后一層輸出頭、解碼器的部分投影矩陣以及跨模態注意力中負責定位圖像證據的少數頭上。舉一個簡化例子模型被問“圖中有幾個人”它可能已經通過語言先驗學會輸出“2 人”。如果圖片中實際有 4 人模型需要調整的是將“視覺區域計數特征”映射到“答案 4”的那部分參數。這部分參數是跨模態融合后、答案分類前的映射矩陣。更新這一小塊就能讓模型在類似問題上更尊重視覺證據。全量微調當然也能做到但成本高、風險大容易破壞視覺編碼器已經學好的通用表征也可能在訓練數據較少時過擬合。ReKey 選擇的是最小必要修改這符合參數高效微調的整體趨勢。4. 技術拆解ReKey 的更新目標與工作流4.1 整體工作流ReKey 的完整流程可以拆成五個階段基線評估在標準 VQA 數據集上評測原始模型記錄分布內分數和分布外分數。參數定位通過梯度或注意力分析找出對答案預測影響最大的參數子集。凍結與更新凍結其他參數只更新目標參數塊。分布外驗證在答案分布不同于訓練集的測試集上對比更新前后模型的表現。行為分析觀察注意力熱力圖和答案分布變化確認模型從“記答案”轉向“看圖”。4.2 與 Qwen3-VL 這類現代 VQA 模型結合當前開源 VQA 模型例如 Qwen3-VL 這類多模態大模型通常采用視覺編碼器加語言模型的架構。視覺 token 與文本 token 一起輸入 Transformer在每一層進行交叉注意力計算。在這種架構中決定答案的關鍵參數往往位于語言模型中最后幾層的前饋網絡交叉注意力層中負責“視覺 token 聚合”的 Key/Value 投影輸出分類頭。ReKey 應用到這類模型時可以先對最后一層交叉注意力做參數定位再擴展到前饋網絡。得益于 Qwen3-VL 等模型的開源權重和標準化接口用戶可以通過參數凍結操作輕松實現選擇性更新。4.3 為什么只更新而不是重新訓練重新訓練一個 VQA 模型需要大量圖片-問答對成本很高。全量微調一個 70 億參數模型單次訓練顯存需求很大而且容易過擬合到新數據集。只更新關鍵參數塊可以將優化器狀態、梯度計算量控制在很小的范圍內顯存占用明顯低于全量微調。更重要的是凍結大部分參數保留了模型原有的通用視覺理解能力避免“學會了新答案、忘了舊知識”。5. 驗證方案ReKey 是怎么證明“看圖”的5.1 分布內測試先跑一組標準 VQA 評測確認參數更新沒有破壞模型的基礎能力。操作步驟準備標準 VQA 測試集如 VQA v2 val 集。加載 ReKey 更新后的模型使用與基線完全相同的解碼參數。統計整體準確率和按問題類型分組的準確率。預期結果ReKey 更新后分布內分數不應顯著低于基線。如果分數大幅下降說明定位出的參數塊可能不對或者更新步長過大。5.2 分布外/先驗反轉測試這是驗證“記答案”還是“看圖”的核心實驗。思路是構造一個答案分布與訓練集完全不同的測試集。具體可以這樣做從現有訓練集中抽取圖片和問題對每張圖片人工修改答案標簽讓高頻答案變成低頻答案或者使用一個按不同統計規則構建的數據集。更省力的方式是使用現成的 VQA-CP 風格測試集。這類數據集重新劃分了訓練集和測試集確保測試集中每種問題類型的高頻答案與訓練集不一致。如果模型得分從分布內的 60 分掉到分布外的 30 分說明它嚴重依賴先驗如果只從 60 分掉到 50 分說明視覺證據起到了主要作用。5.3 無圖/弱圖測試另一個簡單有效的測試把圖片完全模糊或替換為全灰圖然后提問。如果模型在無圖情況下仍然答對很多題說明它不需要看圖片就能答題也就是在“記答案”。ReKey 更新后無圖分數應顯著低于有圖分數兩者的分差變大才說明模型越來越依賴視覺輸入。也可以用目標遮罩測試將圖片中回答問題的關鍵區域裁剪掉。例如問“桌上有什么”把桌子區域遮住。如果模型仍然能答對多半是在猜如果答案變化明顯則說明它在看圖中對應的區域。5.4 反事實問題測試構造反事實問題是檢驗模型是否理解視覺語義的常用方法。例如圖片顯示一個紅色杯子和一個藍色盤子提問“藍色杯子是什么顏色”。這個問題沒有正確答案因為圖中沒有藍色杯子。一個真正理解圖片的模型應該回答“不存在”或“圖片中沒有藍色杯子”一個在背答案的模型可能按顏色詞頻率給出“藍色”。ReKey 的思路就是讓模型在做出最終答案前更多參考圖片中的目標存在性證據。這一測試可以作為定性驗證的標準用例。6. 代碼與實現思路這里給出一套通用實現思路用于將 ReKey 的選擇性參數更新應用到自己的項目中。需要說明的是如果你的項目已有現成實現請以官方代碼為準下面代碼是用于理解機制的可運行模板。6.1 參數定位用梯度幅值篩選關鍵參數import torch from transformers import AutoModelForVision2Seq, AutoProcessor model AutoModelForVision2Seq.from_pretrained(your-vqa-model) processor AutoProcessor.from_pretrained(your-vqa-model) # 構造少量樣本用于重要性估計 inputs processor(imagesimage_list, textquestion_list, return_tensorspt) # 前向計算loss loss model(**inputs).loss # 計算每個參數的梯度 loss.backward() # 按梯度幅值篩選關鍵參數 param_importance {} for name, param in model.named_parameters(): if param.grad is not None: param_importance[name] param.grad.abs().mean().item() # 選取梯度幅值最大的前 1% 參數 threshold sorted(param_importance.values(), reverseTrue)[len(param_importance) // 100] key_params {name for name, score in param_importance.items() if score threshold} print(Key parameters count:, len(key_params))注意這段代碼只做參數定位不涉及訓練。實際使用時需要根據模型結構調整。6.2 凍結參數并只更新關鍵參數塊# 凍結所有參數 for param in model.parameters(): param.requires_grad False # 僅解鎖關鍵參數 for name, param in model.named_parameters(): if name in key_params: param.requires_grad True optimizer torch.optim.AdamW( [param for name, param in model.named_parameters() if param.requires_grad], lr1e-5 ) # 訓練循環 for batch in dataloader: inputs processor(imagesbatch[image], textbatch[question], return_tensorspt) outputs model(**inputs, labelsbatch[answer]) loss outputs.loss loss.backward() optimizer.step() optimizer.zero_grad()6.3 分布外評測腳本def evaluate(model, dataset): model.eval() correct 0 total 0 with torch.no_grad(): for sample in dataset: inputs processor( imagessample[image], textsample[question], return_tensorspt ) output_ids model.generate(**inputs, max_new_tokens10) pred processor.decode(output_ids[0], skip_special_tokensTrue) if pred.strip().lower() sample[answer].strip().lower(): correct 1 total 1 return correct / total分布外評測需要單獨準備數據集建議把原始 VQA 測試集按問題類型分成多個子集逐個統計準確率這樣能更清楚地看到模型在哪些問題類型上依賴記憶。7. 資源占用與工程觀察7.1 顯存與內存觀察方法ReKey 這類選擇性更新的優勢主要體現在訓練階段。由于只有一小部分參數需要計算梯度和更新優化器狀態顯存占用通常遠低于全量微調。但具體數字取決于基座模型參數量、關鍵參數占比、批量大小和輸入圖像分辨率。觀察方式開啟torch.cuda.set_per_process_memory_fraction限制顯存上限使用nvidia-smi觀察訓練前后顯存占用對比全量微調和只更新關鍵參數塊兩種情況下的顯存峰值。7.2 推理階段的額外開銷ReKey 更新后推理階段的額外開銷幾乎為零。參數凍結不影響模型前向速度關鍵參數塊更新也不改變推理時延。因此該方法很適合部署到實際 VQA 服務中不犧牲線上性能。7.3 如何降低資源占用如果資源緊張可以從幾個方向優化降低訓練圖像的分辨率減小梯度估計使用的樣本數量使用 AdamW 的 8-bit 優化器版本選擇參數量更小的開源 VQA 基座模型將參數定位和訓練分成兩個階段避免同時加載過多數據。7.4 端口沖突與進程殘留如果使用 API 服務方式啟動模型注意端口占用問題。常見排查方法啟動前用lsof -i:port檢查端口或者讓服務自動選擇空閑端口。訓練中斷后及時清理遺留的 Python 進程避免 GPU 顯存被占用不釋放。8. 常見問題與排查方法問題現象可能原因排查方式解決方案參數定位后模型性能大幅下降篩選出的參數塊過大或過小查看被解鎖參數的數量和所在層降低篩選比例或按注意力重要性加權篩選分布外分數沒有提升更新目標沒有命中答案偏置參數檢查答案 token 對應的輸出層是否被更新擴大參數范圍加入最后一層輸出頭訓練后分布內分數下降學習率過大或更新步數過多查看訓練 loss 曲線降低學習率增加早停無圖分數仍然很高模型依賴語言先驗未被糾正檢查是否真正凍結了語言模型的大部分參數增加解碼器關鍵層的更新范圍顯存不足圖像分辨率高或批量過大觀察顯存占用日志降低批量大小或圖像分辨率API 調用超時模型加載慢或單次推理時間長查看服務日志和耗時統計預熱模型增加超時時間批量評測卡住數據加載線程被阻塞檢查數據集路徑和圖片格式改用小批量調試逐步擴展到全量9. 最佳實踐與使用建議第一先跑通基線。所有實驗都要有基線對照。分布內分數、分布外分數、無圖分數三組數據放在同一張表里才能看出 ReKey 是否真正改變模型的推理行為。第二參數篩選比例要克制。從 0.1% 到 1% 的比例開始嘗試觀察測試集表現。如果 0.1% 的參數就能改變分布外分數說明確實定位準確如果無效再逐步擴大范圍。第三驗證集和測試集要分離。參數重要性分析不能直接在最終測試集上做否則相當于把測試集信息泄露進訓練過程。建議從訓練集中再切分一個小的驗證集用于參數定位。第四注意數據合規和隱私邊界。VQA 模型可能需要處理包含人臉、車牌、個人物品的圖片。部署評測服務時要確保數據使用獲得授權避免在未經允許的情況下分析他人圖片內容更不能把真實用戶圖片隨意上傳到外部公開接口。第五面向真實場景時要構建自己的測試集。公開數據集只能說明模型在基準上的表現真實業務場景中的問題分布和圖片來源千差萬別。上線前必須用真實采樣數據做一輪“看圖 vs 記答案”的對照測試。第六關注可解釋性輸出。ReKey 的價值在于揭示模型決策依據部署時可以集成注意力熱力圖展示功能讓使用者直觀看到模型回答問題時重點看了圖片的哪些區域。這既方便效果評估也便于向業務方解釋模型行為。10. 總結與下一步ReKey 最值得嘗試的一點是它提供了一條低成本的模型糾偏路徑。相比重新訓練一個 VQA 模型或者用全量微調來消除答案偏置只更新決定答案的那一小塊參數明顯更輕量、更可控。它把“模型的答案從哪里來”這個問題從不可解釋的端到端黑盒變成了可以定位、可以驗證的參數子集分析。最先應該驗證的功能是分布外測試。不要只盯著標準測試集分數看一定要制作一份答案分布與訓練集不同的測試集對比 ReKey 更新前后的分數變化。這個實驗能直接回答標題里的問題VQA 高分是在看圖還是在記答案。最容易踩的坑是參數定位不準確。如果更新的參數塊沒有覆蓋到答案偏置相關的路徑訓練后大概率沒有任何改善。建議從輸出頭和最后幾層交叉注意力開始定位不要一開始就修改視覺編碼器。后續可以擴展的方向包括把 ReKey 應用于更多多模態任務如圖文檢索、視覺指代理解結合 LoRA 系列方法做組合微調或者把“參數重要性分析 選擇性更新”做成自動化流水線降低使用門檻。對于已經落地 VQA 服務的團隊這套方法論也可以直接轉化為上線前的模型體檢工具。建議收藏備用。下次跑 VQA 模型時先問一句這個高分是看圖看出來的還是背答案背出來的