多模态大模型轻量化探索-开源SmolVLM模型架构、数据策略及其衍生物PDF解析模型SmolDocling

在《多模态大模型轻量化探索-视觉大模型SAM的视觉编码器》介绍到,缩小视觉编码器的尺寸,能够有效的降低多模态大模型的参数量。再来看一个整体的工作,从视觉侧和语言模型侧综合考量模型参数量的平衡模式,进一步降低参数量,甚至最小达256M参数量,推理时显存占用<1GB。下面来看看,仅供参考。

模型架构

 SmolVLM 架构。图像被分割成子图像,从视频中采样帧,然后编码成视觉特征。这些特征首先通过像素重排,然后通过MLP投影映射到LLM输入空间作为视觉标记。然后,视觉标记与文本嵌入(橙色/红色)连接/交错。这个组合序列被传递给LLM进行文本输出。

那么,如何设计一个高效的小型多模态模型架构?

Q1: 如何在视觉和语言模型之间分配计算?

传统大型VLMs(如Flamingo)将90%以上参数分配给语言模型(LM),但SmolVLM发现:小规模LM需重新平衡视觉与语言的计算资源。

研究方法:将三种不同规模的SmolLM2变体(135M、360M和1.7B参数)与两种SigLIP编码器(一个紧凑的93M SigLIP-B/16和一个较大的428M SigLIP-SO400M)进行配对。

发现:通常情况下,较大的VLM会不均衡地将参数分配给语言模型,但在小型模型中,这种分配方式不再适用。当使用大型编码器与最小的LM(135M)时,性能显著下降,表明这种配置效率低下。在中等规模的LM(360M)中,较大的编码器可以提高性能,但会增加66%的参数。只有在最大的LM(1.7B)中,较大的编码器仅增加10%的参数。

结论:紧凑的多模态模型受益于平衡的编码器-LM参数分配,使得较小的视觉编码器在效率上更具优势。即:模型越小,视觉编码器应更轻量,避免“头重脚轻”。当使用具有最小LM(135M)的大编码器时,性能显著下降,突显了编码器-LM平衡效率低下。在中等LM规模(360M)时,较大的编码器将性能提高了11.6%,但这也伴随着参数增加了66%,使得紧凑型编码器更可取。只有在最大的LM规模(1.7B)时,较大的编码器仅代表参数增加了10%。

Q2: 如何有效地将图像传递给语言模型?

如何支持长上下文与对视觉token进行压缩?为了提高模型的上下文处理能力,采用了自注意力架构,其中视觉Token与文本token连接,并由语言模型共同处理。这种方法需要比SmolLM2的2ktoken限制更多的上下文。

研究方法:通过增加RoPE基数从10k到273k来扩展上下文容量,并在长上下文数据(如Dolma书籍和The Stack)和短上下文数据(如FineWeb-Edu、DCLM和SmolLM2的数学数据)上进行微调。

发现:扩展上下文窗口对紧凑VLM有显著的好处。对于1.7B的LM,微调在16ktoken时表现稳定,但对于较小的模型(135M和360M),在超过8k token时表现不佳。因此,研究者们为SmolVLM采用了16k token的上下文,并为较小的变体设定了8k token的限制。

像素重排:重新排列编码图像,以增加通道深度为代价换取空间分辨率。这减少了视觉标记数量,同时保持信息密度。


原理:将2×2空间区域重组为通道维度(上图),token数减少4倍(r=2时)。

较小的VLMs从更激进的压缩(r = 4)中受益,因为减少的token数减轻了注意力开销并改善了长上下文建模

对比基线:InternVL等使用r=2,但SmolVLM证明小模型需更激进压缩。

结论:小型VLM显著受益于扩展的上下文长度。

Q3: 如何有效地编码图像和视频?

在多模态建模中,平衡图像和视频之间的token分配至关重要。图像通常需要更高的分辨率和更多的token来保持质量,而视频则需要更少的token来高效处理长序列。

研究方法:采用了一种图像分割策略,灵感来自UReader和SPHINX,将高分辨率图像分割成多个子图像,并保留原始图像的缩小版本。这种方法在不增加过多计算开销的情况下保持了图像质量。

视频处理:对于视频,研究者们发现帧平均策略会负面影响性能(下图)。因此,选择不采用帧平均策略,而是将视频帧重新缩放到图像编码器的分辨率。

结论:对于小型模型,图像分割增强了视觉任务的表现,而视频帧平均则不适用。

数据策略

数据配比:最终训练集含14%文本、33%视频、53%图像

视觉(左侧)和视频(右侧)的训练数据集详情,按模态和子类别细分

性能

衍生模型-端到端的PDF解析多模态模型SmolDocling

模型结构:就是SmolVLM

训练数据(该模型核心):训练数据构造上,引入了一种新的文档标记格式DocTags,用于标准化文档转换,这个是核心意义。DocTags定义了一个明确的标签和规则集,以分离文本内容和文档结构,从而提高图像到序列模型的性能,如下图:

对应的语法

从上面类XML标签语法看来,感觉设计的非常冗余。整体上结合模型架构也没什么特殊的创新点,并且,之前被自媒体吹得性能很强,实际上,该模型还是demo玩具。个人使用后观点。

参考文献:SmolVLM: Redefining small and efficient multimodal models,https://arxiv.org/pdf/2504.05299

开源地址:https://github.com/huggingface/smollm

### SmolVLM 的微调方法教程 SmolVLM 是一种多模态预训练模型,能够处理图像到文本的任务。为了实现特定应用场景下的性能优化,通常需要对其进行微调。以下是关于如何对 SmolVLM 进行微调的相关说明。 #### 数据准备 在开始微调之前,需准备好用于训练的数据集。数据应包含配对的输入(如图片)和目标输出(如对应的描述文字)。确保数据质量高且具有代表性,以便模型能更好地学习目标任务中的模式[^1]。 #### 加载预训练模型与配置量化参数 可以利用 Hugging Face 提供的工具来加载已有的 SmolVLM 预训练权重,并通过设置合适的量化策略减少内存占用并加速计算过程。例如: ```python from transformers import AutoModelForVision2Seq, BitsAndBytesConfig import torch quantization_config = BitsAndBytesConfig(load_in_8bit=True) model = AutoModelForVision2Seq.from_pretrained( "HuggingFaceTB/SmolVLM-Instruct", quantization_config=quantization_config, ) ``` 上述代码片段展示了如何以 8-bit 量化的方式加载 SmolVLM 模型实例[^2]。 #### 定义适配器层 (Adapter Layers) 对于资源有限的情况或者仅希望调整部分网络结构时,推荐引入轻量级模块——即 Adapter 层。这种方式允许冻结大部分原有参数而只更新新增加的小规模可训练组件,从而显著降低所需存储空间及运算成本的同时保持较高精度水平。 #### 训练流程设计 构建自定义 Trainer 类继承 PyTorch Lightning 或者直接基于原始框架编写循环逻辑完成整个端到端的学习周期管理;期间记得监控验证集合上的表现指标变化趋势作为早停条件依据之一防止过拟合现象发生。 #### 示例脚本概览 下面给出一段简化版伪代码帮助理解整体思路: ```python trainer = CustomTrainer(model=model, train_dataset=train_set, val_dataset=val_set) for epoch in range(num_epochs): trainer.train() if should_stop(): break evaluate_on_validation_set() save_final_model_checkpoint() ``` 以上步骤综合考虑了效率与效果之间的平衡点,在实际操作过程中可能还需要针对具体需求做进一步定制化修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值