Qwen3VL源碼側(cè)改進點及DeepStack核心思想概述 原創(chuàng)
首先從源碼角度看Qwen3VL的改進,核心圍繞增強多模態(tài)融合深度(DeepStack)、優(yōu)化視覺特征處理、提升時序建模精度(視頻時間戳編碼)以及精細化歸一化設(shè)計(文本專用RMSNorm),整體更注重多模態(tài)任務(wù)中的特征對齊與深層交互。然后概述DeepStack用于多模態(tài)大模型的核心思想。
Qwen3VL源碼側(cè)改進點
代碼側(cè)改動如下:
1.??hidden_act="silu"??? -> ??hidden_act="gelu_pytorch_tanh"??

2.Qwen3VLProcessor引入??Qwen3VLVideoProcessor??,更加適配視頻處理

3.視覺塊歸一化層調(diào)整

- Qwen2.5VL:視覺塊(?
?Qwen2_5_VLVisionBlock???)使用??Qwen2RMSNorm??作為歸一化層(一種RMSNorm變體)。 - Qwen3VL:視覺塊(?
?Qwen3VLVisionBlock???)改用??nn.LayerNorm??(標準層歸一化)。這一調(diào)整可能是為了更好地適配視覺特征的分布特性,提升訓練穩(wěn)定性或特征表達能力。
4.引入DeepStack多模態(tài)融合機制
- Qwen3VL在文本模型(?
?Qwen3VLTextModel??)中新增了DeepStack機制(DeepStack機制能讓視覺信息更深度地參與文本解碼過程,提升多模態(tài)理解的連貫性。),通過??_deepstack_process???方法將視覺特征(??deepstack_visual_embeds??)融入解碼器的多個隱藏層。在解碼器層的前向傳播中,會在指定層將視覺特征疊加到對應(yīng)位置的文本隱藏狀態(tài)上:
# Qwen3VLTextModel.forward
if deepstack_visual_embeds is not None and layer_idx in range(len(deepstack_visual_embeds)):
hidden_states = self._deepstack_process(
hidden_states, visual_pos_masks, deepstack_visual_embeds[layer_idx]
)- Qwen2.5VL視覺特征僅在輸入嵌入階段替換占位符 token,未在解碼器深層進行融合。
5.視頻時序位置編碼優(yōu)化
- Qwen2.5VL:在?
?get_rope_index???中,視頻的時序位置編碼基于絕對時間間隔(如??second_per_grid_t * tokens_per_second??),直接計算時序索引。 - Qwen3VL:修改了視頻時序處理邏輯,通過時間戳(而非絕對時間位置)區(qū)分視頻幀,將?
?video_grid_thw???重復展開并強制時序維度為1(??video_grid_thw[:, 0] = 1??),時序信息通過外部時間戳 token 傳遞:
# Qwen3VLModel.get_rope_index
if video_grid_thw is not None:
video_grid_thw = torch.repeat_interleave(video_grid_thw, video_grid_thw[:, 0], dim=0)
video_grid_thw[:, 0] = 1 # 時序維度固定為1,依賴時間戳區(qū)分6.視覺特征分層輸出與融合
- Qwen3VL:視覺模型(?
?Qwen3VLVisionModel???)的??get_image_features???和??get_video_features??不僅返回最終視覺嵌入,還返回分層視覺特征(??deepstack_image_embeds/deepstack_video_embeds??),用于DeepStack機制在解碼器多層融合:
# Qwen3VLModel.get_image_features
image_embeds, deepstack_image_embeds = self.visual(pixel_values, grid_thw=image_grid_thw)- Qwen2.5VL:僅返回單一視覺嵌入,無分層特征輸出。分層特征融合能讓不同層級的視覺信息(如低級紋理、高級語義)分別參與文本解碼,提升多模態(tài)對齊精度。
7.文本RMSNorm的獨立優(yōu)化
- Qwen3VL:新增?
?Qwen3VLTextRMSNorm???類,專門針對文本部分優(yōu)化??RMSNorm???,明確注釋其與T5LayerNorm等效,并通過??@use_kernel_forward_from_hub("RMSNorm")??引入可能的 kernel 優(yōu)化:
@use_kernel_forward_from_hub("RMSNorm")
class Qwen3VLTextRMSNorm(nn.Module):
def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
input_dtype = hidden_states.dtype
hidden_states = hidden_states.to(torch.float32)
variance = hidden_states.pow(2).mean(-1, keepdim=True)
hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
return self.weight * hidden_states.to(input_dtype)- Qwen2.5VL:文本和視覺共享?
?Qwen2RMSNorm???,未針對文本單獨優(yōu)化。文本??RMSNorm??的獨立設(shè)計可更精細地適配文本特征分布,提升語言建模能力。
DeepStack
大多數(shù)多模態(tài)模型通過將視覺 token 作為序列輸入到LLM的第一層來實現(xiàn)。這種架構(gòu)雖然簡單,但顯著增加了計算 和內(nèi)存成本,因為其輸入層需要處理大量額外的 token。DeepStack考慮到 LMMs 中語言和視覺 Transformer 的 N 層,將視覺 token 堆疊成 N 組,并將每組從下到上依次輸入到其對應(yīng)的 Transformer 層.

- 如上左圖:傳統(tǒng)的大型多模態(tài)模型將所有視覺 token 串接成一個序列,適用 于高分辨率和低分辨率圖像。
- 中間圖: DeepStack LMMs 將 token 堆疊成網(wǎng)格,并自下而上地將其注入到 Transformer 的前幾層和中間層,僅通過殘差連接實現(xiàn)。
- 右圖:將 DeepStack 應(yīng)用于 Vicuna-7B(DeepStack-L)和 CLIP ViT-L(DeepStack-V),模型能夠接受 4× 倍的視覺 token,在相同的上下文長度下顯著超 越序列式 LMM,并在廣泛的基準測試中與使用更長上下文的模型相媲美。
架構(gòu)

主要創(chuàng)新在于 DeepStack 策略(通過將圖像特征抽取分為兩個流來實現(xiàn)這一點:一個全局視圖流用于捕捉全局信息,另一個高分辨率流通過在不同層的大模型中堆疊擴張的高分辨率圖像特征來增強全局信息。),該策略將視覺 token 注入到不同的層中。大白話:DeepStack 的本質(zhì)是利用 Transformer 的分層架構(gòu)特性,將視覺 token 的 “整合過程” 分散到 LLM 的多層中。
- 左圖:用于大模型的 DeepStack :給定輸入圖像,將從低分辨率版本中提取的 token 輸入到大模型的輸入層。考慮到圖像的二維特性,從高分辨率版本中提取相鄰區(qū)域,并將其重新組織為DeepStack ,然后將其輸入到大模型的后續(xù)層中。
- 右圖:用于 ViTs 的 DeepStack :采用類似的采樣策略,但將視覺 token 輸入到視覺編碼器的 ViT 層中。DeepStack-V 的適配邏輯:利用 ViTs 的編碼器分層結(jié)構(gòu),將高分辨率視覺 token 注入 ViTs 的中間層,而非僅在輸入層(PatchEmbed)處理,增強 ViTs 的細粒度特征提取能力。
多模態(tài)大模型基于投影的連接模塊獲得了視覺標記,DeepStack策略就是如何在保持多模態(tài)處理有效的同時提供信息豐富的視覺標記。
DeepStack PyTorch偽代碼:

def forward(H0, Xstack, lstart, n, vis_pos):
H = H0 # LLM初始隱藏態(tài)(含全局視覺token+文本token)
for (idx, TransformerLayer) in enumerate(self.layers):
# 滿足條件時,注入高分辨率堆疊token(殘差連接)
if idx >= lstart and (idx - lstart) % n == 0:
stack_idx = (idx - lstart) // n # 對應(yīng)Xstack的索引
H[vis_pos] += Xstack[stack_idx] # vis_pos:視覺token在隱藏態(tài)中的位置
# 正常執(zhí)行LLM的Transformer層計算
H = TransformerLayer(H)
return H參考文獻
- ??https://github.com/huggingface/transformers/blob/cbb290ec23ccd9b5c1d1ff4d333477449891debb/src/transformers/models/qwen3_vl/processing_qwen3_vl.py???#L37??
- DeepStack: Deeply Stacking Visual Tokens is Surprisingly Simple and Effective for LMMs,https://arxiv.org/pdf/2406.04334
本文轉(zhuǎn)載自??大模型自然語言處理?? 作者:余俊輝

















