
SmolVLM-256M-Instruct
一、模型结构
- 视觉模型 (Vision Model):
Idefics3VisionTransformer (一个类似 ViT 的结构),负责将输入图像编码成一系列视觉特征向量。 - 连接器 (Connector):
Idefics3Connector (包含一个 Idefics3SimpleMLP),负责将视觉特征向量的维度投影到语言模型所需的维度。 - 文本模型 (Text Model):
LlamaModel (一个 Llama 架构的解码器),负责处理文本信息和融合后的视觉信息,并进行自回归文本生成。 - 语言模型头部 (LM Head):
一个线性层 (Linear),将 Llama 模型的输出转换为词汇表上的概率分布,用于预测下一个词。
参考链接
二、Printf模型
Idefics3ForConditionalGeneration((model): Idefics3Model((vision_model): Idefics3VisionTransformer((embeddings): Idefics3VisionEmbeddings((patch_embedding): Conv2d(3, 768, kernel_size=(16, 16), stride=(16, 16), padding=valid)(position_embedding): Embedding(1024, 768))(encoder): Idefics3Encoder((layers): ModuleList((0-11): 12 x Idefics3EncoderLayer((self_attn): Idefics3VisionAttention((k_proj): Linear(in_features=768, out_features=768, bias=True)(v_proj): Linear(in_features=768, out_features=768, bias=True)(q_proj): Linear(in_features=768, out_features=768, bias=True)(out_proj): Linear(in_features=768, out_features=768, bias=True))(layer_norm1): LayerNorm((768,), eps=1e-06, elementwise_affine=True)(mlp): Idefics3VisionMLP((activation_fn): PytorchGELUTanh()(fc1): Linear(in_features=768, out_features=3072, bias=True)(fc2): Linear(in_features=3072, out_features=768, bias=True))(layer_norm2): LayerNorm((768,), eps=1e-06, elementwise_affine=True))))(post_layernorm): LayerNorm((768,), eps=1e-06, elementwise_affine=True))(connector): Idefics3Connector((modality_projection): Idefics3SimpleMLP((proj): Linear(in_features=12288, out_features=576, bias=False)))(text_model): LlamaModel((embed_tokens): Embedding(49280, 576, padding_idx=2)(layers): ModuleList((0-29): 30 x LlamaDecoderLayer((self_attn): LlamaAttention((q_proj): Linear(in_features=576, out_features=576, bias=False)(k_proj): Linear(in_features=576, out_features=192, bias=False)(v_proj): Linear(in_features=576, out_features=192, bias=False)(o_proj): Linear(in_features=576, out_features=576, bias=False))(mlp): LlamaMLP((gate_proj): Linear(in_features=576, out_features=1536, bias=False)(up_proj): Linear(in_features=576, out_features=1536, bias=False)(down_proj): Linear(in_features=1536, out_features=576, bias=False)(act_fn): SiLU())(input_layernorm): LlamaRMSNorm((576,), eps=1e-05)(post_attention_layernorm): LlamaRMSNorm((576,), eps=1e-05)))(norm): LlamaRMSNorm((576,), eps=1e-05)(rotary_emb): LlamaRotaryEmbedding()))(lm_head): Linear(in_features=576, out_features=49280, bias=False)
)
三、详解模型结构
1、Vision Model
其实就是一个Vit的神经网络,输入图像先经过Embedding层,再经过Transformer的encoder层。Embedding(1024, 768)表示可以为最多1024个图像块添加位置信息。由于patch大小是1616,3232等于1024,所以就是说输入图像最多是512*512分辨率。
2、Connector
Connector(投影层)的任务是把“视觉特征”翻译成“文本 Token”。
(几个不同的Connector)
- (LLaVA)把视觉模型输出的每一个 Patch 特征,直接通过一个简单的线性层(或两层 MLP)映射过去。1 个图像块 = 1 个 Token。缺点是高分辨率图像Tokens过多,推理及其缓慢。
- (BLIP-2 的 Q-Former, Idefics2 的 Perceiver)设计一个小型的 Transformer 结构(带有交叉注意力机制 Cross-Attention)。用一组设定好的“查询向量(Query)”去原图中“捞”出最有用的信息,强制把几千个特征压缩成固定的比如 32 个或 64 个 Token。缺点是计算复杂度高,且打乱了图片原有的 2D 空间排布丢失空间细节。
- (Idefics3 / SmolVLM)把相邻的图像块在空间上“捏”在了一起。在 SmolVLM 中,它把 4 * 4 = 16个相邻的图像块,当成了一个超级大块。每个小图像块的特征是 768 维。当16 个块拼在一起,特征维度就变成了 16 * 768 = 12288 维。最后通过一个极简的无偏置线性层(Linear)强行映射并压缩回语言模型认识的 576 维。
3、Text Model: LlamaModel
输入: 第二阶段的“视觉 Token” + 用户的“文本 Token”。
输出: 融合了图像和文字理解后的综合隐状态向量(维度为 576)。
具体细节:
- 词嵌入与旋转位置编码
(embed_tokens)负责把输入的纯文本(如“你好”)也变成 576 维的向量,确保文字 Token 和前面传过来的视觉 Token 在维度上完全对齐,具备相同的数学格式。
(rotary_emb: LlamaRotaryEmbedding)由于模型是同时处理所有数据的,没有先后顺序的概念。RoPE(旋转位置编码)通过一种复数旋转数学运算,给每一个 Token 打上了一个“绝对位置”和“相对位置”的烙印。明白图片 Token 是排在文字前面的。 - 核心处理单元
(LlamaDecoderLayer)分组查询注意力机制:基本工作原理采用常规的自注意力机制,文字 Token 会去观察图像 Token,图像 Token 也会反过来观察文字 Token。但是Llana采用特殊优化,采用分组查询向量q_proj输出维度576,而键k_proj被压缩到192维。
(门控前馈神经网络 (LlamaMLP / SwiGLU))传统的模型通常用 ReLU 激活函数,但 Llama 使用了由三个线性层组成的门控网络(Gate, Up, Down)配合 SiLU 激活函数。它能更精准地控制哪些信息该被激活,哪些该被过滤,这被证明比传统结构具有更强的表达能力. - 均方根归一化 (LlamaRMSNorm)
传统的 LayerNorm 会计算均值和方差,非常拖慢速度。RMSNorm 直接砍掉了计算均值的步骤,只计算均方根,不仅速度更快,而且效果丝毫不减。
4、Output Head
Linear: 最后一个线性层,将 576 维的隐状态,反向映射回 49280 的词表空间。
5、分组查询注意力机制对话



6、门控前馈神经网络 (LlamaMLP / SwiGLU)对话


