type
Post
status
Published
date
Jan 10, 2026
slug
llm-23
summary
tags
碎笔
category
LLM
icon
password
对多模态的知识分散又模糊,想系统性的学习一下,做下记录。
以下的例子为 qwen3-vl
第一部分:视觉编码器 (Vision Encoder) —— “眼睛”
其核心任务是将高维度的像素流(Image/Video)压缩为低维度的语义特征向量(Feature Embeddings)。
1. visual.patch_embed (图像块嵌入层)
- 功能: 这是视觉处理的第一步(预处理)。它将输入的二维图像(比如 的像素矩阵)“切”成一个个小的正方形块(Patch)。
- 【技术细节与实例】:
- 动态分辨率机制(Naive Dynamic Resolution): Qwen-VL 系列通常不强制将图片缩放为固定的 。假设输入一张 的高清图,Patch Size 为 。
- 操作: 使用步长(stride)为 14,卷积核大小(kernel)为 14 的
Conv3d或Conv2d。 - 张量变化: 输入
[B, 3, 1120, 1120]输出[B, N_patches, Embed_Dim]。这里 个 Token。
2. visual.blocks (视觉 Transformer 块)
- 功能: 这是视觉编码器的主体(Backbone),通常由多个 Transformer Encoder 层堆叠而成。
- 作业:
- 自注意力机制(Self-Attention): 让图片中的不同 Patch 之间进行交互。
- 特征提取: 从底层的线条、颜色逐渐提取出高层的语义特征。
- 旋转位置编码(RoPE): 加入位置编码,确保模型知道每个 Patch 的相对位置。
- 【技术细节与实例】:
- 3D-RoPE (mRoPE): Qwen3-VL 极大概率延续了 Qwen2-VL 的设计,使用 3D 旋转位置编码。它不仅编码 空间坐标,还编码时间 (如果是视频输入)。
- 内部计算: 输入是
[6400, 1280](假设 hidden_size=1280)。经过 LayerNorm -> QKV Projection -> Window Attention (为了降低计算量,通常不是全局 Attention) -> MLP,输出形状保持[6400, 1280]不变,但不仅包含了像素信息,还包含了上下文关系(例如:知道白色的块是“云”而不是“棉花”)。
3. visual.deepstack_merger_list (深度堆叠合并器)
- 功能: 这是一个专门用于特征降维和压缩的组件。
- 作业:
- 空间池化/合并(Spatial Pooling): 将相邻的视觉 Token 合并。
- 降低计算量: 减少视觉 Token 的总数量,减轻后续语言模型的计算压力。
- 【技术细节与实例】:
- C-Abstractor / 2x2 Pooling: 假设前面的 Vision Block 输出了 个 Token。如果直接进 LLM,序列太长,显存会爆。
- 操作: 执行 的池化操作。将相邻的 (即 4 个)Token 的特征向量进行拼接或平均。
- 张量变化: Token 数量减少 4 倍。 个 Token。特征维度可能会暂时增加(如果是拼接)然后通过 MLP 降维。这使得模型能处理更高分辨率的图像而不会导致 LLM 的上下文窗口溢出。.
数据集构成:
- 海量图像-文本对(Image-Text Pairs): 视觉编码器主要基于类似 LAION-5B 的大规模数据集进行预训练,但经过了严格的清洗(Filtering),剔除了低质量、水印严重或描述不符的样本。
- 交错图文数据(Interleaved Image-Text): 为了支持多图推理,训练数据包含了类似 MMMC4 的交错网页数据。
- 视频-文本对(Video-Text Pairs): 用于训练时序感知能力,数据来源包括 YouTube 等平台的视频片段及其自动生成的详细描述(Caption)。
训练策略:
- NaFlex 训练: 并非使用固定 Batch Size,而是使用固定 Token 数量的 Batch。这意味着一个 Batch 里可能包含 5 张大图,也可能包含 100 张小图,通过 Packing 技术填满显存,极大提高了训练效率。
- Sigmoid Loss 优化: 采用了 Sigmoid 损失代替 Softmax,解决了多标签分类问题(一张图可能对应多个文本描述),并允许更大的 Batch Size 以加速收敛。
第二部分:多模态投影器 (Multi-modal Projector) —— “视神经/桥梁”
核心任务为模态对齐(Modality Alignment)。将视觉特征的“方言”翻译成语言模型能听懂的“通用语”。
1. visual.merger (视觉-语言映射层)
- 功能: 连接 Vision Encoder 和 Language Model 的桥梁。
- 作业:
- 维度转换: 视觉编码器输出的特征维度与语言模型的输入维度不一致,负责投影对齐。
- 语义对齐: 迫使视觉特征在数学空间上与相关的文本特征靠得更近。
- 【技术细节与实例】:
- MLP 结构: 这通常是一个两层或三层的多层感知机(MLP),中间夹带 GELU 激活函数。
- 维度变换: 假设 Vision Encoder 输出维度是 1280,而 Qwen 语言模型的 Hidden Size 是 3584。
- 操作: 。
- 最终输出: 得到
[B, 1600, 3584]的张量。这些向量现在被称为 "Visual Embeddings",在数值分布上已经模拟了文本 Embedding 的分布。
3.4 DeepStack 部分的训练细节
数据集构成: DeepStack 的参数是与 LLM 联合训练的。其训练数据严重依赖于高精度对齐数据,例如:
- OCR 坐标数据(OCR Grounding): 文本内容及其对应的 Bounding Box 坐标。
- 细粒度图像描述(Fine-grained Captioning): 对图像中微小物体(如手表表盘的数字、背景中的文字)的描述。
训练策略:
- 联合优化: DeepStack 的投影层参数(Projector Weights)在训练的早期阶段(Stage 1)就开始更新。
- 梯度流引导: 为了让 ViT 的中间层特征能适应 LLM 的语义空间,训练过程中使用了辅助损失(Auxiliary Loss)来强制 ViT 的中间层输出具有语义可解释性。
第三部分:语言模型 (Language Model) —— “大脑”
核心任务为接收视觉 Token 和文本 Token,进行推理、理解并生成回答。
1. language_model (语言模型主体)
- 功能: 理解上下文并进行推理。
- 作业:
- 接收输入: 它接收混合序列:
[视觉Token序列, 用户文本Prompt序列]。 - 注意力处理: 文本 Token 关注前面的视觉 Token。
- 推理: 计算出应该回答什么内容。
- 【技术细节与实例】:
- 输入拼接 (Concatenation):
- 用户文本:"描述这张图。" Tokenize 得到
[15164, 102, ...](假设 10 个 Token)。 - 视觉特征:1600 个 Visual Tokens。
- LLM 实际输入长度: 个 Token。
- Attention Mask 策略:
- 视觉部分: 通常采用双向注意力(Bidirectional Attention),因为看图时,像素之间是全图关联的(左上角的像素应该能看见右下角的像素)。
- 文本部分: 采用因果掩码(Causal Mask),即 Token $t$ 只能看 $t$ 之前的 Token,不能看未来。
- 这是 Qwen-VL 架构的一个关键特性,混合了双向和单向注意力。
2. lm_head (语言模型输出头)
- 功能: 生成最终的文本输出。
- 作业:
- 线性层(Linear Layer),映射到词表大小。
- 概率预测: 计算下一个字是词表中每一个词的概率(Logits)。
- 【技术细节与实例】:
- 张量变化:
[B, Sequence_Length, 3584]lm_head[B, Sequence_Length, 152064](Qwen 的词表通常很大,约 15万)。 - 采样(Sampling): 最后一帧的 Logits 经过 Softmax,配合 Temperature(温度)参数进行采样,选出 ID 为
8921的 Token(假设对应汉字“猫”),然后将“猫”加回输入序列,继续预测下一个字。
- 作者:SimonSun
- 链接:https://blog.simonsun.cc//article/llm-23
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章
.png?table=collection&id=cb472e47-cf59-4081-bd5f-899a844344db&t=cb472e47-cf59-4081-bd5f-899a844344db)




