首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
视觉表达SFT:让多模态模型从“看得懂”到“说得好”
📅 2026/10/21 12:00:49
✍️ 爱科研究院
👁 阅读 3,247
开头部分我把这套多模态模型从预训练一路搭到推理能出结果的时候遇到一个非常尴尬的局面输入一张图问模型“这是什么”它能把“猫”“狗”“桌子”这样的名词说对但让它描述画面里的位置关系、颜色细节、动作逻辑它就明显开始胡编。不是模型不会看而是它“看得懂、说不清”。这个系列讲到这里前几节我们把视觉编码、对比学习、模态对齐都拆过一遍这节就专门来聊怎么解决“说得清”的问题——视觉表达SFTVisual Expression SFT。先说结论视觉表达SFT本质上是在预训练多模态模型基础上用高质量图文指令数据做一次有监督微调让模型从“感知图像特征”进一步学会“把感知结果组织成自然语言表达”。它解决的不是“模型看不看得懂图像”而是“模型怎么把看懂的东西有条理地讲出来”。这篇文章我会直接从预训练模型的局限讲起拆解数据构造、训练配置、评测方法中间穿插几个我自己踩过的坑希望能给正在做多模态微调的读者一些实际参考。1. 为什么预训练之后还得再来一轮SFT从“看得出”到“说得出”1.1 预训练模型的两种能力状态我们假设你已经有了一个多模态底座视觉编码器把图像映射成向量序列语言模型部分负责解码生成文本。预训练阶段通常做过对比学习、图文匹配、图像文本联合建模这些任务目标函数设计得也很合理。但这时候你把整个模型直接拿来对话或者做详细图像描述结果往往是——名词对、动词勉强一到长句子就翻车。原因不复杂。预训练阶段的训练目标主要围绕特征对齐和粗粒度语义匹配模型有很强的图像表征能力但文本生成侧并没有专门学过“针对一张图说出一段结构完整、细粒度的描述文字”。换句话说模型知道图像中有一个“人、狗、草地”但它不知道人类在描述一张图时习惯先说场景主体、再说位置关系、接着补充动作和环境线索。语言表达这件事有其自身规律预训练目标不负责教这个。这一阶段我习惯把它叫作“感知饱和、表达欠缺”。感知饱和体现在图像分类、检索这类任务上模型已经能跑出不错的指标表达欠缺体现在开放生成任务里句子短、词汇基础、缺少修饰、空间关系混乱。1.2 视觉表达SFT究竟改变的是什么SFT全称是Supervised Fine-Tuning放在多模态大模型的语境下它和纯文本SFT的核心差异在于输入从文本变成了图文对而目标输出仍然是文本。视觉表达SFT就是要用一批人工精心标注的图文问答数据把模型在预训练阶段学到的那种“图像特征空间”和新增加的自然语言表达空间连通起来。我这里用一个直白的类比预训练阶段相当于给模型看了一万张照片它知道“哦这是山、这是树、这是天空”但你要让它把照片里“山在远处、树在左侧、天空云层很厚”这样的关系组织成一段像人写的描述它没有样本可以参考。SFT就是给模型喂大量这种“看图说话”的范本让它在监督信号下调整语言生成的风格和结构。值得注意的一点是视觉表达SFT不是重新训练模型学图像特征大多数情况下它是在微调语言模型的输出侧同时以较低学习率维持视觉编码器的已有表征。这么设计就是为了防止灾难性遗忘——图像特征本来已经学得很好了不要为了学会说话把看图的底层能力又搞坏。1.3 SFT在整套多模态流程里的位置如果你对整个多模态训练范式有了解可能会知道常见的流程是预训练对比学习、特征对齐→ 指令微调SFT让模型听话→ 偏好对齐RLHF/DPO让模型说得符合人类偏好。视觉表达SFT处于中间位置它既不是最笨重的预训练阶段也不是最后的打磨阶段但它的成败直接影响后面所有环节的上限。前面预训练做得好只是给了你一个“会看图”的模型SFT做得好模型才会“看图说话”后面的偏好优化做得再好也只能在SFT建立的表达空间里做微调。如果SFT阶段生成的语言都是干巴巴的短语偏好优化也变不出长句。所以我把这个阶段看成是“跨越感知与认知鸿沟”的关键工程节点值得单独花一整节来拆解。2. 视觉表达SFT的数据建构一句话讲明白数据就是天花板2.1 三类核心数据描述型、推理型、交互型很多拿到视觉表达SFT的代码仓库就直接用现成数据集开始跑了我也不反对但要说清楚一件事数据质量决定了SFT上限。我把做这类微调常用到的数据分成三类实际项目中要组合着用。描述型数据是最基础的一类样本形态是“一张图 一段整体描述”要求模型做到主体是什么、背景是什么、主体在做什么、颜色/纹理/光影怎么交代。这类数据负责教模型最基本的表达框架。数量占比可以高一些我一般放到60%左右。推理型数据是进阶样本形态是“一张图 一个需要多步推断的问题”比如“图里的人正在做什么从他的穿着推断可能是什么天气”。这类数据迫使模型在视觉信息基础上组织因果逻辑链对激活语言模型的推理能力很有帮助。占比我一般控制在20%~30%。交互型数据指多轮对话前一轮模型说过的话可以作为后一轮的上下文。它更接近真实使用场景比如用户先问“这张图里有什么”再追问“右下角那个红色物体是什么”。如果没有这类数据模型很容易在两轮对话中“失忆”。2.2 数据配比、去重和难度梯度数据不是越多越好配比不对反而会把模型带偏。我在一次实验中做过对比纯描述型数据占比90%的模型描述能力很强但问它“图中有几个人分别穿什么颜色”这种需要细粒度抽取的问题它就开始含糊其辞。原因是分母里就没有足够多需要细粒度定位的样本。建议先定一个大原则通用描述细粒度问答推断逻辑 5:3:2。这个比例适合大多数通用视觉表达需求。如果场景偏向文档理解、图表理解推理型数据可以继续上调如果场景偏向具身智能里的场景描述描述型比例还要再高。去重这步很多人会漏掉。多模态SFT数据经常来自多个来源同一张图的不同描述可能高度相似如果不做清洗模型会反复强化同一种句式导致生成多样性下降。我的做法是算一下图像哈希和图文的embedding相似度超过阈值的样本只留一条。难度梯度这个点更重要。我见过一上来就给模型刷超高难度数据的比如要求回答“画面中三个物体的遮挡关系”如果模型连基本主体描述都不稳这种数据训完只会让生成变乱。合理的策略是简单描述样本在前细粒度问答在后多步推理放在最后。训练过程中模型先建立基础表达能力再逐步接触复杂指令。2.3 数据格式与模板设计现在很多开源底座都采用统一的对话格式视觉表达SFT的数据也基本围绕这个思路组织。下面是一个典型的样本结构我简化过{ image_path: sample_0423.jpg, conversations: [ { role: user, content: 请描述这张图片的主要内容。 }, { role: assistant, content: 画面拍摄于傍晚的街道主体是一位骑自行车的中年人身穿灰色外套车后座上绑着白色纸箱。背景有若干店铺招牌和两棵行道树地面湿漉漉的说明刚下过小雨。整体氛围偏冷色调但店铺灯光提供了暖色点缀。 } ] }这个格式本身不难但里面有两处细节容易被忽略。第一是问题模板的多样性。如果你全部用“请描述这张图片”作为唯一提问SFT会过拟合到这种问法上用户换说“图里有什么”“帮我讲讲这张照片”就失效。我一般会给同样一张图配上多种提问方式比如“详细说说”“图里发生了什么”“用一段话描述画面”。第二是回答的结构一致性。同一批次的数据里回答风格要尽量稳定比如都遵循“整体场景→主体细节→背景环境→氛围总结”的顺序。很多人以为模型会自己总结风格实际不是只有当数据中呈现出高度一致的表达范式时模型才学得会这种叙事结构。需要注意不要图省事把回答写得太长。回答长度和图像内容要匹配。一张简单的图配两百字长描述模型根本学不会从图中抽这么多信息最后只能靠语言模型的幻觉硬编。我的一般经验是简单图60~100字复杂图150~250字。3. 训练配置与收敛控制我最常用的一组参数和判断依据3.1 超参配置与硬件约束视觉表达SFT的训练和纯文本SFT在超参上有些差异。主要原因是输入侧多了图像batch size不能盲目加大梯度更新也要更小心。我给一组自己实测比较稳的起始参数具体还得根据显存和数据量微调超参数推荐值说明学习率1e-5 ~ 3e-5低于纯文本SFT为了保住视觉编码器已有表征batch size64 ~ 128按图像分辨率调整分辨率高就调小训练轮数2 ~ 4不宜过多SFT阶段很容易过拟合图像分辨率224 ~ 336细粒度描述任务建议往高分辨率走优化器AdamW和预训练保持一致更稳妥调度器cosine decay最后阶段warmup比例控制在3%以内LoRA rank32 ~ 64纯LoRA微调时推荐全参微调则不需要需要特别说明学习率的问题。很多第一次做多模态SFT的读者会把纯文本微调的习惯带过来学习率设个5e-5甚至1e-4。在纯文本大模型上这可能没什么问题但多模态底座里视觉编码器在预训练阶段用了大量的对比学习信号这部分特征的脆弱性远超你的预期。高学习率微调语言侧时视觉编码器也会被反向传播波及很容易出现“句子变流畅了但看图的精度掉了”的情况。我通常的做法是如果做全参微调学习率压到1e-5如果做LoRA视觉编码器完全不更新只在语言模型部分挂LoRA学习率可以稍微放宽到2e-5。3.2 选择全参微调还是LoRA全参微调的上限更高语言表达的自然度更好但它有三个问题显存占用大、训练时间长、灾难性遗忘风险高。LoRA的方案则是冻结原来的权重只训练分解出来的低秩矩阵显存占用和过拟合风险都会明显降低。我的建议是看数据量决定。如果你手上高质量表达样本不足5万条优先考虑LoRA。数据量不足时全参微调非常容易把已经训练好的多模态对齐直接冲掉。数据量超过10万条、且你有充足显存做全参可以尝试解冻语言模型部分做全参微调视觉塔继续冻结。这种做法在细粒度描述任务里效果很显著生成句子的信息密度会明显高于纯LoRA方案。另外一个很多人忽视的配置是是否解冻视觉编码器。我见过一部分工作会在SFT阶段让视觉编码器跟着训练理由是让图像特征更适配语言输出。理论上说得通实际用下来风险很高特别是CLIP类的对比学习表征在SFT阶段被更新后模型容易开始“丢细节”明明图像里有三个物体它只愿意描述最大的那个。如果没有充足的实验验证我建议默认冻结视觉编码器。3.3 loss曲线到底应该怎么读训练过程中最常看到的loss变化是前几百步快速下降然后进入平台期。视觉表达SFT的起始loss通常比纯文本SFT高不少因为图像特征经过视觉塔映射后语言模型一开始很难流畅组织这些新输入。看到一个高起始loss不用慌重点是看下降趋势是不是平滑。我自己判断收敛不完全看loss绝对值而是配合生成样例一起看。每500步挑20条没训练过的样本做推理直接看输出文本质量。loss在降但生成文本开始“发飘”——描述内容开始出现图片里根本没有的对象——这基本可以判断已经过拟合了此时即便loss还在降也应该提前停止。反过来如果loss下降缓慢但生成文本一直在变好说明模型正在稳定提取视觉特征可以继续训下去。这里还有一个容易踩的盲区训练loss下降有时不是因为模型学会了看图而是因为它学会了“绕开图像”。比如一个数据集的回答里60%的句子都以“图片展示”开头模型会本能地生成先验句式甚至不看图也能蒙对一部分。判断模型是不是真的在“看”图需要专门构造混淆样本——图像内容和回答语义不匹配的样本如果模型还能答对才说明它真的在用图像特征。4. 三个真实的训练事故排查链路完整复盘4.1 事故一loss一直在降生成却一本正经地胡说八道这个事故是我在早期做拼接式多模态底座时遇到的。训练到第3个epochloss从1.8降到1.3看起来很健康。但我拿验证集的图去测输入一只柯基犬的侧面照模型回答的是“画面中是一只金毛犬毛发呈金黄色趴在草地上”。柯基和金毛的差异那么明显模型为什么输出了空气里的答案排查过程我按三步走。第一步检查是不是数据格式错了我扒了训练样本发现验证的时候我用的图片没有走视觉编码器的预处理通道直接以原始像素分辨率喂了进去而训练时图像过了resize和归一化。特征分布不一致模型等于在拿训练分布里的模糊记忆作答。第二步检查loss是不是被语言模型的先验项主导了我尝试把视觉token整体mask掉只让模型用文本token预测发现loss仍然能降到1.5左右。这个实验非常关键它说明模型很大程度在靠文本的先验语序做预测图像信息并没有真正进入生成路径。第三步回到模型结构上检查视觉塔输出的特征有没有被实际拼接到语言模型的输入embedding里。检查之后发现拼接位置确实加了但视觉特征在进入语言模型前没有做线性映射维度对不上导致大部分特征在计算注意力时被压成了一个弱信号。这个事故给我的教训很直接loss好看什么都说明不了。如果你发现loss正常但生成内容明显与输入图像不符优先做这两个小实验——冻结视觉特征看loss下降幅度、构造图文负样本看模型是否依赖视觉信息。这套排查链路我现在每次训练都会跑一遍。4.2 事故二细粒度描述灾难性遗忘模型突然不会数数了第二次事故出现在我上一轮数据配比调整之后。当时我把推理型数据的占比提到了40%训练后模型的逻辑推断能力确实有提升——至少在某个专门构造的图表推理测试集上是这样的。但一个问题出现了让模型回答“图中有几个人”“几个红球”这样的计数问题时它给出的数字和自己的描述对不上。训练前这部分能力虽然不算强但至少稳定训练完反而崩了。追根溯源我发现新加入的推理型数据中大量样本的答案是“推断出一条结论”而不是“数出精确数量”。语言模型在学习的时候会去抓数据中的统计规律如果大多数样本都不需要精确计数它在生成的时候就会把计数一类token的概率压低。这不是模型学会了错误的知识而是学会了“忽略”这类视觉细粒度信息。修复方案不是把推理型数据砍掉而是引入了足够多的计数类样本并且在回答模板上做了统一处理凡是涉及数量信息的问题回答里必须先用一句“图中一共有X个……”开头。这种模板强约束让模型重新学会了在生成流程中优先提取数量特征。从那以后我的配比里始终保留5%~10%的计数细粒度样本宁可牺牲一点推理泛化也不能丢掉基础的数量感知。4.3 事故三直接复用了纯文本SFT数据流程的教训多模态SFT和纯文本SFT的代码流程看起来很像但有一个细节非常容易翻车——Text Token的padding策略。纯文本SFT中一个batch里的不同样本长度不同通常会在较短序列的右侧做padding让它们对齐成统一长度。但多模态数据里图像特征序列和文本token序列是拼接在一起的右侧padding会导致批量训练时视觉特征的起始位置、序列长度在不同样本之间不一致注意力机制会学到一种非常奇怪的“位置偏移偏好”。这个问题的排查难度很高因为loss曲线看起来一切正常你甚至看不出哪里有bug。我是怎么发现的有一次我单独把某个batch的attention矩阵抽出来可视化发现模型对图像区域token的attention权重极低而对padding位置的attention很高。这显然不对但它又没有完全击垮训练结果只是让模型对图像信息的利用效率一直上不去。解决方案很简单不要把padding放在右侧而是改用左侧padding。这样在拼接图像特征和文本特征时所有样本中图像特征的起始位置是一致的语言模型在计算注意力时不会被padding位置干扰。这个问题我想重点提醒读者因为网上很多开源的训练脚本默认继承纯文本代码的padding策略一不注意就会带进来。5. 评测警察的日常怎么判断SFT到底训没训好5.1 传统指标为什么会失真视觉表达SFT做完之后最麻烦的事情不是训练而是评估。CIDEr、BLEU、ROUGE这类指标在机器翻译和图像描述领域用了很多年但到了开放生成的多模态大模型上它们会严重失真。我用一个例子就能说明白两个回答一个是“一只狗在草地上奔跑”另一个是“一只棕色短毛犬在开阔的草地上高速奔跑四条腿离地瞬间被拍下”从信息量上看后者远优于前者但BLEU算出来的分数两者可能差不多甚至因为前者的n-gram撞上了参考句而拿到更高分。所以在SFT阶段我基本不依赖自动指标做最终决策而是把它们当成“感冒时的体温计”——看个大概趋势而已。真正的评测要靠人工或者更强模型的agent式评价。5.2 我自己用的三层评测法我的评估体系分成三层第一层是要素充分度第二层是结构合理性第三层是事实一致性。三层分开打分每层5分制。要素充分度看的是回答里是否覆盖了图像里最核心的信息项。我会先给自己看图像列出5个必须出现的核心要素——主体、动作、位置关系、颜色、背景然后看模型回答覆盖了几个。覆盖4个及以上算合格低于3个说明模型没在认真看图。结构合理性看语言组织有没有叙事逻辑。好的视觉表达应该遵循一个稳定的信息递进顺序比如主体先行、细节补充、背景收尾。如果回答一会儿说背景、一会儿跳回主体、一会儿又扯出个不存在的物体说明语言组织能力不行。事实一致性是最严格的一关我会标注出回答里有哪些图像中不存在或矛盾的细节。经常出现的情况是模型为了描述更丰富而自己“脑补”新对象比如图里根本没有树它会在回答里写“树下蹲着一只猫”。事实一致性得分低的模型哪怕要素充分度再高也不能用它会严重影响产品体验。5.3 错误分类比总分更重要我后来意识到只给三项打分不够还要把错误类型分门别类记录下来。常见的错误类型包括对象错位图像里的物体被挪到另一个位置、属性错置把颜色、材质等属性套到错误对象上、数量错误、关系颠倒、超图幻觉编造不存在的对象。分类统计做完之后你往往能反过来推断训练数据的缺陷。比如我发现一个阶段的模型频繁出现“属性错置”回头查数据发现很多标注员在写“红衣服的男人”时并不代表图像里真的有一件红衣服有时只是背景里有面红旗。这种标注噪声在训练里被模型捕获并放大了于是生成时它也照着错。数据侧修完错误比例立刻下来不少。6. 视觉表达SFT做完之后还能再往前推一步6.1 和偏好优化的衔接方法SFT做完不等于模型最终可用我提到过后面通常还有偏好优化。视觉表达SFT阶段的模型经常会出现一种表现描述很完整、事实也对但用户就是觉得“有点死板”“像在背课文”。这不是能力问题是表达风格不够顺滑适合用偏好优化来调。衔接的核心是把SFT模型当成偏好优化阶段的初始化。如果你在做DPO这类从离线样本学习的方法负样本应该从SFT模型自己生成而不是拿手工写的错误文本来凑。这样采样的负例更接近模型真实出错的分布偏好学习效率会高很多。6.2 一个常见争议要不要在SFT阶段引入LLM辅助打分有个经常被讨论的问题能不能用更强的语言模型来给视觉表达样本打分然后把这个分值当成训练信号。我的观点是可以辅助筛选数据但不建议把它当成硬性标注。强模型打分有时倾向于语言流畅性而非视觉事实如果图像里有个很冷门但客观存在的物体强模型可能没认出来反而判定模型描述错误引入噪声。我更喜欢把LLM打分放在人工标注之前做粗筛人工再做关键样本的二审。6.3 从“表达”走向“细粒度理解”这节的标题是视觉表达SFT但表达的深层还是理解。当模型的描述能做到要素充分、结构合理、事实一致之后下一步可以做的是迈向细粒度多轮交互——用户指向图上某个区域问“这里是什么”模型需要结合区域坐标和全局语境回答。这个方向对数据的要求又不同更强调视觉定位和文本生成的协同。不过核心方法论和视觉表达SFT是一致的数据质量优先训练配置稳扎稳打评测永远多看错误类型而不是总分。大概就是这些。最后再分享一个我一直在做的小习惯每次SFT训练结束后我会保留最后一轮的checkpoint之外再额外存一份训练中段表现最好的模型权重同时在训练日志里记录下当时生成样例的完整文本。这个习惯帮我解决过不少后续评测阶段的定位问题——因为SFT的loss和效果并不总是同向变化手上有多个候选版本对比评测时就不会被单一checkpoint的表现误导。如果你准备开始做视觉表达SFT我的建议是别急着调模型结构先把数据、模板、评测这三件事理清楚再动手训练你会少走很多弯路。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/21 12:00:49
多用户远程桌面环境下软件打不开?进程残留与会话管理排查指南
2026/10/21 12:00:49
Python Selenium 调用 Firefox 报错?geckodriver 配置与版本匹配指南
2026/10/21 12:00:49
视觉表达SFT实战:多模态大模型从感知到表达的微调关键
2026/10/21 15:03:21
智能写作工具如何辅助硕士开题报告:从框架搭建到研究边界
2026/10/21 15:03:21
Python面向对象实验:从类定义到工程化测试的完整指南
2026/10/21 15:03:21
Python面向对象实验:从类设计到避坑的完整指南
2026/10/21 15:03:21
海思获Tensilica更大授权背后:可配置处理器与SoC集成路线图解析
2026/10/21 15:03:21
Spring Boot数据库密码加密:Jasypt实战详解
2026/10/21 14:58:19
VMware虚拟机Linux密码重置实战:从手工到Python自动化
2026/10/21 0:01:44
ClickHouse实战:从列式存储到亿级数据秒级查询
2026/10/21 0:01:44
高效筛选arXiv机器学习论文:四步法实战指南
2026/10/21 0:01:44
Python爬取百度迁徙数据:接口签名、反爬与SQLite存储实战
2026/10/20 16:07:12
OpenResearch实战:Claude Code、Codex、OpenCode、Cursor 工作流搭建与故障排查
2026/10/21 14:47:26
知识管理核弹:用Obsidian构建第二大脑的工程化方案(TaoToken 统一 Key 接入版)
2026/10/20 16:49:38
金融AI落地指南:从调研报告到技术选型与工程实践
2026/10/20 2:24:03
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/20 2:23:57
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/20 2:23:53
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)