--- language: - zh tags: - qwen2.5 - vision-language-model - dinov2 - nsd - multimodal library_name: transformers license: mit --- # Qwen_2.5_1.5B_Instruct_Vision 基于 DINOv2 与 NSD (Normalized State Decomposition) 的视觉语言模型,通过超球面归一化实现视觉-语言特征对齐。 ## 方法 ### NSD 定义 给定向量 v ∈ R^D,NSD 将其投影到单位超球面 S^{D-1}: $$ \text{NSD}(\mathbf{v}) = \frac{\mathbf{v}}{\|\mathbf{v}\|_2} $$ 归一化后,内积等价于余弦相似度: $$ \langle \text{NSD}(\mathbf{v}_1), \text{NSD}(\mathbf{v}_2) \rangle = \cos(\theta) $$ ### 视觉-语言对齐 DINOv2 输出 h ∈ R^{384},经投影层映射到 Qwen 的 1536 维嵌入空间,再通过 NSD 归一化到 S^{1535}: $$ \mathbf{z} = \text{NSD}\left(W_2 \cdot \text{ReLU}(W_1 \mathbf{h} + \mathbf{b}_1) + \mathbf{b}_2\right) $$ 其中 W_1 ∈ R^{768×384}, W_2 ∈ R^{1536×768} 为投影层参数。 Qwen 词表嵌入 E ∈ R^{V×1536} 同样归一化: $$ \hat{\mathbf{E}} = \text{NSD}(\mathbf{E}) $$ 每个视觉 token 在词表中检索最近邻: $$ t^* = \arg\max_{t \in \mathcal{V}} \ \mathbf{z}^\top \hat{\mathbf{e}}_t $$ ### 训练 投影层与 DINOv2 后 4 层使用 InfoNCE 对比损失微调: $$ \mathcal{L} = -\log \frac{\exp(\mathbf{z}_i^\top \mathbf{y}_i / \tau)}{\sum_{j=1}^{B} \exp(\mathbf{z}_i^\top \mathbf{y}_j / \tau)} $$ 其中 y_i 为类别 i 的 Qwen 嵌入,τ = 0.07 为温度系数。 ## 架构 | 组件 | 说明 | 参数量 | |------|------|--------| | DINOv2 ViT-S/14 | 视觉编码器 (微调后 4 层) | 22M | | MLP Projection | 384 → 768 → 1536 | 1.18M | | Qwen2.5-1.5B-Instruct | 语言模型 (冻结) | 1543.7M | ## 性能 在 tiny-imagenet-200 验证集 (10000 张) 上的视觉 token 准确率: | Top-K | 命中率 | |-------|--------| | Top-1 | 72.43% | | Top-3 | 80.02% | | Top-5 | 81.18% | | Top-10 | 81.67% | ## 使用 ```python from transformers import AutoModelForCausalLM, AutoTokenizer from PIL import Image # 加载模型 model = AutoModelForCausalLM.from_pretrained( "LinkRur/Qwen_2.5_1.5B_Instruct_Vision", # 替换为你的模型名 trust_remote_code=True, device_map="auto" ) tokenizer = AutoTokenizer.from_pretrained( "LinkRur/Qwen_2.5_1.5B_Instruct_Vision", # 替换为你的模型名 trust_remote_code=True ) # 推理 image = Image.open("photo.jpg").convert("RGB") vis_desc, response = model.generate_with_image(image, "描述这张图片", tokenizer) print(response) ``` ## License MIT