Qwen_2.5_1.5B_Instruct_Vision

基于 DINOv2 与 NSD (Normalized State Decomposition) 的视觉语言模型,通过超球面归一化实现视觉-语言特征对齐。

方法

NSD 定义

给定向量 v ∈ R^D,NSD 将其投影到单位超球面 S^{D-1}:

NSD(v)=vv2 \text{NSD}(\mathbf{v}) = \frac{\mathbf{v}}{\|\mathbf{v}\|_2}

归一化后,内积等价于余弦相似度:

NSD(v1),NSD(v2)=cos(θ) \langle \text{NSD}(\mathbf{v}_1), \text{NSD}(\mathbf{v}_2) \rangle = \cos(\theta)

视觉-语言对齐

DINOv2 输出 h ∈ R^{384},经投影层映射到 Qwen 的 1536 维嵌入空间,再通过 NSD 归一化到 S^{1535}:

z=NSD(W2ReLU(W1h+b1)+b2) \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} 同样归一化:

E^=NSD(E) \hat{\mathbf{E}} = \text{NSD}(\mathbf{E})

每个视觉 token 在词表中检索最近邻:

t=argmaxtV ze^t t^* = \arg\max_{t \in \mathcal{V}} \ \mathbf{z}^\top \hat{\mathbf{e}}_t

训练

投影层与 DINOv2 后 4 层使用 InfoNCE 对比损失微调:

L=logexp(ziyi/τ)j=1Bexp(ziyj/τ) \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%

使用

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

Downloads last month
53
Safetensors
Model size
2B params
Tensor type
F32
·
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support