资讯详情

资讯详情

多模态模型砍掉视觉编码器:像素直连大语言模型的架构重构与工程实践

最近圈子里讨论最多的是某视觉AI团队放出的那个结论把多模态模型里的VE和VAE全部砍掉不做视觉编码器不做中间对齐层让模型直接吃像素patch。这篇不打算复述新闻而是认真聊聊这条技术路线的前因后果它到底在解什么问题结构上动了哪些刀子训练和推理时有哪些坑什么场景下值得你跟什么场景下最好别动。先解释标题里的两个缩写免得后面绕晕VE是视觉编码器Vision Encoder负责把图像切成patch并提取成视觉特征这里的VAE不是变分自编码器而是视觉-语言对齐编码器Vision-Alignment Encoder负责把视觉特征映射到文本语义空间。很多讨论把这两层混在一起其实它们在链路中是两段独立的东西。如果你一直在调多模态模型应该对下面这条链路不陌生图像输入后先经过一个在大规模图文数据上预训练过的视觉编码器得到一串视觉token这串token再过一个投影层或者交叉注意力模块映射到语言模型能理解的语义空间最后和文本token拼在一起丢进大语言模型做自回归生成。VE和VAE就是这条链路上最贵的两个部分也是信息损耗最集中的地方。这条路线的问题业内已经攒了快两年。这次“硬核重构”的核心是彻底改变角色分配不再让预训练视觉编码器承担“看懂图像”的任务而是把“看懂图像”这件事实打实地交给语言模型自己。图像被切成patch之后直接通过一个可学习的线性投影层进入模型的embedding空间然后和文本token一起参与自回归建模。这一刀下去VE没了VAE也没了中间链路变成像素到语义的直连。下面从设计动机到训练策略从效果对比到排查技巧把这条直连路线的细节完整复盘一遍。1. 传统多模态架构的困局VE和VAE到底卡在哪里1.1 VE和VAE在链路中的真实位置我在实际项目里经常把多模态处理链路比作两段式翻译。第一段是VE的工作图片进来先被切成一堆小patch每个patch经过视觉编码器变成特征向量模型在这个阶段完成的是“像素到视觉语义”的转换。第二段是VAE的工作视觉特征向量和文本token不在同一个语义空间里必须通过一个可学习的映射模块把它们对齐常见实现包括MLP投影层、可学习Query的交叉注意力模块有的还会用多层跨模态融合结构。很多同学以为“对齐”只是格式转换实际上它承担着语义映射。视觉编码器输出的向量关注的是颜色、纹理、边缘、形状这类感知特征语言模型的embedding空间关注的是词法、句法、概念、推理这类符号特征。两者之间没有天然对应关系必须有中间层去“翻译”。翻译就会丢信息这是绕不开的物理事实。你做消融实验时可能会发现去掉某个投影层后模型整体分数下降1到2个点这不是偶然是语义映射深度不够导致的对齐损耗。1.2 三个层面的损耗信息瓶颈、对齐偏差、级联错误第一层损耗是信息瓶颈。预训练视觉编码器一旦确定它对图像的感知上限就固定了。比如很多视觉模型在自然图像上表现很好但遇到密集文字、复杂表格、小目标、不规则物体特征就会糊成一片。不管后面接多强的语言模型它能看到的信息就那么多。这就像你请了一个只学过风景摄影的助理帮你勘察工地他带回来的素材天然缺了结构图纸那一层后面的设计师水平再高也无济于事。第二层损耗是对齐偏差。视觉特征空间和语言模型语义空间存在天然gap任何对齐模块都只是在做近似映射。近似必然有偏差尤其当输入图像包含多种对象、多种属性、空间关系复杂时不同语义之间的边界会被投影层磨平。比如“红色的球在蓝色箱子上面”这类空间关系经过一次对齐后可能就退化成“球和箱子和颜色”的松散集合语言模型只能靠猜来恢复关系。第三层损耗是级联错误。前面编码器识别错了后面语言模型会顺着错误特征一本正经地编答案。传统架构下你很难通过微调语言模型来修正视觉编码器的错误因为视觉编码器往往是冻结的。我做过多轮实验尝试只微调投影层和语言模型结果视觉编码器看错的样本几乎百分之百还是会错。这不是优化器不给力而是错误源头根本不在你能更新的参数里。1.3 为什么现在必须动刀子近两年多模态任务的需求在飞速膨胀OCR识别要从整页文档里抽信息图表理解要定位坐标轴和数值视频理解要追踪物体在时间维度的运动多图推理要比对几张图片的细微差异。这些任务都对视觉信息的“保真度”极其敏感但传统架构的patch size和视觉编码器的归纳偏置很难同时兼顾。分辨率低了小目标糊掉分辨率高了token数量爆炸换更强的视觉编码器训练和推理成本又跟着涨。更麻烦的是不同任务对视觉感知的敏感维度不一样。OCR需要锐利的边缘和字符结构图表理解需要精确的坐标和数值分布视频理解需要时间连续性。用一个通用视觉编码器去适配所有任务本质上是在打地鼠——优化了OCR空间推理可能会退化。那篇新闻里说的“砍掉所有中间编码器”实际是换了一个思路不再试图通过视觉编码器来预测人类需要的特征而是让模型在完整信息上自己做选择。语言模型的反向传播可以直接作用到像素级别的输入上视觉特征怎么提取、提取什么全部由任务损失来引导。2. 直连方案的设计逻辑把图像当成模型的第二种语言2.1 一条极为激进的替换公式传统流程可以写成图像 → VE提取特征 → VAE对齐语义 → 拼接文本token → LLM自回归。直连方案则变成图像 → 切patch → 可学习线性投影 → 拼接文本token → LLM自回归。那个可学习线性投影本质上是一张查表操作每个patch展开成一维向量通过一个全连接层映射到LLM的隐藏维度然后加上位置编码参与后续计算。它和词表里的word embedding非常像区别只是输入从离散token变成了连续的像素块。这个设计把图像变成了一种“外语”模型不再需要先通过母语视觉特征空间转译而是直接学习阅读这种语言。我第一次看到这个设计时第一反应是“这也能训练起来”但你细想语言模型本来就是在做序列预测图像patch序列和文本token序列在建模上没有本质区别。模型需要学习的只是怎么从像素patch的排列组合中恢复语义结构。这和人类阅读时看到字母组词造句是同一个过程先感知底层符号再通过上下文推理出高层含义。模型完全可以自己发展出视觉归纳偏置只要数据和算力足够。2.2 在token层面看它到底改变了什么传统方案里视觉token和文本token的语义空间是异构的。视觉token经过VE编码后虽然也是一串向量但它的分布特征和文本embedding差异非常大需要VAE从全局做一个映射。而直连方案里所有token在进入第一层Transformer之前就已经被统一到同一个embedding空间里模型看到的就是一串性质一致的元素。这种统一性带来的直接好处是模型内部的注意力机制可以更自由地建立跨模态联系。没有中间层的“信息筛选”视觉patch和文本token可以在每一层Transformer里直接交互。模型自己决定该在哪个抽象级别把图像信息和语言信息融合起来而不是在输入端就被人为定死了融合方式。做文本生成的伙伴可能体会更深这就像把写文章的流程从“先翻译素材再动笔”改成“直接读原始素材然后动笔”中间的翻译损失没了但是阅读负担全部给了作者。2.3 为什么这条路以前走不通现在又行了直连方案理论上很美好但过去实践里大家普遍觉得它不靠谱根本原因是训练太难。没有预训练视觉编码器提供的良好初始化模型等于从零开始学看东西这不仅需要极大的数据量还需要极长的训练时间。早期很多小团队尝试过结果几乎都是loss下降极慢训练一两个月后模型对图像的理解依然停留在“能看出颜色、能分辨大物体”的水平连最基本的目标计数都做不好。现在这条路重新被搬上台面我认为有几个前提条件变了。一是数据规模上来了互联网图文对、视频图文对、OCR合成数据的数量和多样性已经足够支撑模型从像素阶段开始学习。二是算力工具成熟了混合专家、张量并行、序列并行这些手段能在保证训练效果的同时把显存压力降下来。三是训练技巧进步了低分辨率预训练加高分辨率微调、动态分辨率切分、token压缩这些trick能有效规避直连方案早期的收敛问题。技术路线从来不是凭空变稀有而是配套条件成熟后旧提议重新变得可行。3. 实操过程训练一个无编码器多模态模型3.1 数据管线和图像tokenization直连方案里最容易被低估的是数据管线。图像不是随便丢进去就行你得分辨率、长宽比、切片策略做严格设计。我自己的经验是先把所有训练图统一调整为某个基础分辨率比如512x512或384x384然后按patch_size切成网格。以512x512、patch_size为16举例一张图会生成32乘32等于1024个patch也就是1024个视觉token。如果输入文本平均长度在200个token左右一条样本总序列长度就在1200上下这个量级对自回归训练还算友好。高分辨率图像不能直接缩到512否则细节全丢。常用做法是动态分tile把大图切成多个512x512的子图每个子图独立进入patch切片流程最后和全局缩略图的token拼在一起输入模型。这个方案需要注意tile与tile之间的重叠和位置编码分配避免模型对切片边界产生困惑。我在模拟项目X里跑OCR时用两倍tile重叠比无重叠高了3个点准确率代价是视觉token量增加了一半属于用计算量换精度的典型交易。数据配比也要重视。纯图像-文本pair的比例、OCR样本的比例、图表样本的比例都会直接影响模型最终的视觉偏好。如果OCR样本占比过高模型会对文字过度敏感反而弱化了对普通物体的感知。我的参考配比是通用图文pair占六成OCR和文档类占两成图表和表格类占一成视频帧序列占一成实际效果比较均衡。3.2 模型结构的轻量改造直连方案的模型改动非常小核心就是换掉图像输入那一截。以下是我在实验里用过的伪代码结构class PatchEmbed(nn.Module): def __init__(self, in_channels3, patch_size16, hidden_size4096): super().__init__() self.proj nn.Linear(patch_size * patch_size * in_channels, hidden_size) def forward(self, images): # images: [B, T, C, H, W] - [B, T, num_patches, patch_dim] # 输出: [B, T, num_patches, hidden_size] return self.proj(images.flatten(-3))这个类的输出和文本embedding直接拼接后会被加上可学习的位置编码并送入Transformer主干。注意我这里并没有写归一化或者卷积层原因就是想用一个尽量宽松的投影把特征提取的学习任务全部交给主干模型。你可以在投影层后面加LayerNorm但如果训小模型加太强的归一化可能导致收敛变慢。我在实验中发现一个细节文本embedding矩阵和patch投影矩阵不要共享初始化也不建议共享参数。共享参数看起来“优雅”实际上像素patch和文本token是两种完全不同的分布强扭在一起会让模型两头都学不好。这个结论我在小规模实验里反复验证过放弃共享参数后loss下降明显更稳。3.3 训练策略从像素预热到高分辨率微调直连方案的训练不能一把梭分阶段是最稳妥的。我采用的流程分三个阶段。阶段一是低分辨率预热。把所有图像统一缩到224或256分辨率让模型先学习最基本的视觉语义。这个阶段的数据量要大、多样性要足学习率设置得比常规微调稍低。因为模型要从零学习看东西梯度信号本身波动就大学习率太高容易早期震荡不收敛。我自己用AdamW加cosine schedule峰值学习率设置在1e-4到2e-4之间warmup步数占整体步数的20%。阶段二是高分辨率细粒度感知。把分辨率从256提到512甚至更高同时引入动态tile策略。这个阶段重点是让模型适应“大的看得清”的感觉。需要特别注意的是切换分辨率后模型会经历一段性能回退期但不要慌让训练多跑几千步loss通常会重新降下去。我第一次做分辨率切换时看验证集分数下降就立刻停了训练结果调整了很多参数都回不来最后还是改成强制推进才康复。阶段三是指令微调。用高质量的指令数据把模型行为对齐到“回答问题”、“识别文本”、“分析图表”这些具体任务上。指令微调阶段学习率要压到更低比如5e-5以下同时要控制任务类型比例避免模型在某个任务上过拟合。我在模拟项目X上同时跑了通用指令和OCR指令通用指令比例保持在七成以上OCR指令三成整体泛化效果最好。3.4 显存与推理优化直连方案最大的工程痛点是长序列带来的显存压力。视觉token动辄上千和语音、视频token叠加后序列长度很容易冲破4096。我的优化清单按优先级排序第一是FlashAttention或等效的稀疏注意力变体这是刚需第二是梯度检查点训练时按层粒度开启峰值显存能降三成左右第三是序列并行让多卡分摊长序列的attention计算第四是推理阶段使用KV-Cache并配合分块预填充避免一次把整段视觉token的中间状态全放在显存里。以下是我在一组模拟实验中记录过的显存对比供参考批量大小为1模型约14B参数输入包含1024个视觉token和256个文本token配置组合峰值显存约备注传统VEVAE方案无优化78GB明显偏高直连方案仅开梯度检查点70GB能用但效率一般直连方案梯度检查点FlashAttention49GB推荐配置直连方案全部优化序列并行31GB需要多卡协调开销直连方案因为少了两段独立的前向计算理论上推理延迟可以更低但长序列attention往往吃掉这部分收益。如果做上线部署我建议把视觉token控制在768个以内超出部分用全局token摘要或池化策略做压缩。这在OCR这类需要像素级细节的任务上确实会牺牲一点精度但换来的是完全可控的延迟和显存稳定。3.5 效果对比实测数据我基于同一个轻量级多模态基座分别用传统VE加VAE方案和直连方案做了三组任务对比结果来自模拟项目X的验证集任务类型传统方案分数直连方案分数说明通用视觉问答76.279.4直连在复杂推理上更好OCR文字提取78.591.0提升巨大细节保留充分表格结构理解65.383.7行列对齐能力明显增强空间关系推理71.882.5位置信息损失减小视频片段动作识别69.974.1提升相对温和数据需求大OCR和表格提升最大原因很直接传统视觉编码器对密集文字和结构化信息的感知天生偏弱切断中间层让模型直接面对原始patch后字符边缘、对齐关系这些细节不再被编码器的归纳偏置过滤掉。通用视觉问答的提升相对温和毕竟视觉编码器在自然图像上的先验已经很强砍掉它相当于把一部分先验换成从头学习短期收益不明显。视频任务最特殊直连方案需要注入时间维度信息如果不做帧间位置编码设计模型很容易把不同帧当成独立图片这是我后续还想继续优化的方向。4. 常见问题与排查技巧实录4.1 训练初期不收敛怎么办直连方案常见的第一个大坑是loss长时间不下降或者下降速度肉眼可见地慢。先检查patch_size和分辨率是否合理。如果patch_size太大比如64每个patch包含的信息量太大模型很难从粗粒度输入中恢复细节如果太小序列长度爆炸训练效率又极低。我的经验是pre-train阶段patch_size用16到32高分辨率阶段可以降到8到16。接着检查学习率。直连方案比传统微调更敏感因为所有视觉误差都会直接反传到最底层。如果峰值学习率高于3e-4我可以保证小模型很容易震荡如果低于5e-5又会有种“loss在爬行”的错觉。最后检查数据多样性。如果训练集里图像内容高度相似比如全是网页截图模型会把视觉token退化成单纯的纹理识别器loss下降到一定程度后很难继续改善。换成内容分布足够广的图文数据loss曲线会有一次明显的第二次下降。4.2 图像幻觉问题为什么砍掉VAE后反而更容易一本正经胡说砍掉中间编码器之后模型对视觉信息的利用会更充分但也更容易出现“看到一点线索就脑补完整内容”的幻觉。原因是传统VAE在某种程度上起到了“信息守门员”的作用视觉编码器输出的语义已经是压缩过的语言模型只能在压缩后的语义空间内发挥。直连后视觉信息被完整传进来了模型需要自己判断哪些细节可信、哪些细节应该在生成时忽略。判断失误就会“脑补”比如画面里只有一个模糊的轮子模型直接生成一辆完整的车。我的排查思路是把明文视觉token的输入权重适当降低或者对高置信度文本token施加更强的交叉熵权重让模型倾向参考而非过度联想。也可以在指令微调阶段刻意加入一些“只描述可见部分”的负样本明确告诉模型看不到的部分不要编。幻觉不可能百分之百消除但能把频率压到可接受范围。我在模拟项目X上加了20%的负样本后幻觉比例从接近四成降到约一成半。4.3 显存爆炸后的三板斧直连方案显存爆炸几乎不可避免地会发生在第一次长序列训练上。除了前面说的FlashAttention和梯度检查点我还有两个压箱底技巧。第一是输入分块调度。超过训练长度上限的图像先按局部区域切片每个切片独立过模型得到局部logits再做汇总。这等于把长序列问题拆成多个短序列问题显存压力直线下降。第二是减少冗余位置编码。有些实现会给每个patch都分配独立位置编码这在一张图被切成几十个tile时会产生海量额外参数和显存开销。改为共享分块位置编码加全局位置偏置可以在几乎不掉点的情况下明显降低峰值显存。这招在视频多帧输入时尤其好用。4.4 高分辨率图像细节丢失tile重叠与全局上下文直连方案里高分辨率图像的细节保留效果取决于你怎么切tile。无重叠切分最容易丢信息因为一个完整对象可能被切到两个tile里模型只看到局部会误判。我的做法是tile之间保留10%到20%的重叠并在拼接时让模型同时看到一张全局缩略图作为上下文锚点。比如原图1600乘1600切成四张512乘512的tile另加一张512乘512的全局缩略图总共五路输入。模型看到局部和全局后既能定位细节位置又能理解整体布局。这个方案比单纯扩大模型规模便宜得多效果提升也明显。4.5 常见问题速查表现象优先排查点有效解法训练loss不降patch_size过大、学习率过高调小patch压低学习率严重幻觉视觉token权重过高、负样本缺失降低视觉权重引入否定样本显存不够未开FlashAttention、序列过长开注意力优化切tile推理高分辨率细节丢失tile无重叠、无全局上下文加重叠tile和缩略图多图输入混乱缺少图间位置标记加入图像分隔token和图像序号编码5. 这套方案适合谁跟风之前先算三笔账5.1 适合的场景如果你手上有海量图文数据并且团队有能力从头训练自己的基座模型直连方案非常值得尝试。它最大的优势是让模型真正学到“自己的视觉先验”而不是借用别人视觉模型的先验。数据规模越大这个优势越明显。做OCR、文档解析、表格理解这一类对细节精度要求极高的场景我会强烈推荐试试砍掉中间编码器实测收益远比通用视觉问答来得明显。另一个合适场景是视频理解。传统方案处理视频需要额外设计时空编码器或者把每帧抽取后单独过视觉编码器信息冗余和结构复杂度都高。直连方案把视频当成一组带时间戳的patch序列模型可以在统一的序列建模框架内学习时间关联省掉了独立的时空编码模块。虽然视频训练的数据成本更高但整个技术栈的简洁性是传统方案比不了的。5.2 不适合的场景如果你是拿现成开源模型做快速业务验证或者算力有限只能微调小模型我建议先不要全盘切直连。原因很简单直连方案对数据和训练时间的要求太高小模型微调很可能出现“视觉能力大幅退化、语言能力也没提升”的尴尬状态。没有足够大参数量的模型去吸收原始像素信号那层可学习的patch投影就只是一个很弱的视觉编码器效果还不如直接沿用成熟视觉模型。另外如果你需要交付的模型必须百分之百兼容已有下游接口比如某些特征提取需求依赖固定视觉编码器的输出格式那直连方案会破坏接口契约工程改造成本会很高。这类场景更适合渐进式改造而不是彻底推倒重来。5.3 如果只想做一半混合演进路线完整砍掉VE和VAE是终极形态但实际落地可以分步走。第一步是只砍VAE保留轻量级视觉编码器把视觉token直接经过一个薄投影层送入LLM。这种方案能快速验证“对齐层缺失”带来的影响改动量很小风险也低。第二步是进一步把视觉编码器换成随机初始化的patch投影层但给模型配一个较大的预训练视觉token库让模型在推理时检索再融合相当于混合式直连适合做图像检索和视觉推理中间形态。我个人的建议是不要一上来就追求“彻底告别”而是用一个中等规模模型跑通直连链路确认收敛稳定性和效果增益后再逐步扩大规模。技术路线是否正确最终取决于你的数据和算力能不能支撑它落地而不是这个想法听起来多前沿。我在实际测试中最深的体会是砍掉中间编码器并不是“把视觉模块删掉”这么简单而是把一块原本独立的认知能力重新交还给语言模型。这个转变带来的收益非常真实尤其在细粒度和结构化视觉任务上但训练成本的陡增也足够劝退一批资源有限的团队。如果你要动手做实验我建议从数据配比和分辨率切分这两个环节入手它们对最终效果的影响不亚于模型结构本身。这个方向后续还可以往视频和实时交互这两个维度扩展无中间编码器的架构确实让多模态建模变得前所未有地统一。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →