【多模态模型的工作原理】
多模态模型实现原理适合读者有一点 Python / PyTorch 基础知道张量、nn.Linear、训练五步。阅读目标搞清多模态「输入如何变成统一表示、如何融合、如何训练与推理」而不是死记论文名词。1. 多模态是什么模态Modality 信息的一种形态。常见有模态例子计算机里通常先变成文本句子、问题、字幕token 序列 → 向量序列图像照片、截图像素 / 图像块 → 向量序列音频语音、音乐波形 / 频谱 → 向量序列视频连续帧 可选声音时空特征序列表格 / 数值学习时长、出勤率特征向量你做过的小模型多模态模型 能同时理解并联合使用两种及以上模态的模型。典型任务图文检索「找和这句话最像的图」视觉问答VQA看图回答问题图像描述给图片写一段话语音助手听声音 看屏幕再回答文档理解PDF 里的文字 版面 插图一起读和单模态的本质差别单模态同一种数据 → 一种编码器 → 输出 多模态多种数据 → 各自编码 → 对齐/融合 → 联合推理 → 输出2. 核心原理先建立一张总图多模态实现可以压成一句话把不同模态编码到可比较、可交互的表示空间再在这个空间里融合与推理。总流程图像 / 文本 / 音频 ... │ ▼ 各模态编码器Encoder │ ▼ 投影 / 对齐Projection / Alignment │ ▼ 融合模块Fusion │ ▼ 任务头分类 / 生成 / 检索三个关键词编码每种模态先变成向量或向量序列对齐让「狗的图片」和「狗」这个词在空间里靠近融合让模型在推理时能互相参照看图答题时既看字也看图没有对齐融合只是把两堆无关数字拼在一起没有融合模型很难做「结合两种信息才能回答」的任务。3. 为什么要对齐共享语义空间不同模态原始形态差很远图像像素网格文本离散 token音频时间序列波形直接相加或拼接模型很难知道「左边这堆数」和「右边那堆数」在说同一件事。因此常见做法是学一个共享语义空间图片编码 → 投影 → 向量 v_img 文本编码 → 投影 → 向量 v_txt 训练目标若图文匹配则 v_img 与 v_txt 相似 若不匹配则尽量不相似。相似度常用余弦相似度。训练后会出现「一只猫」的文本向量 ≈ 猫图片的向量「汽车」远离猫图片向量这就是 CLIP 一类模型的核心思想对比学习对齐图文。直觉公式概念层面sim(vimg,vtxt)vimg⋅vtxt∥vimg∥ ∥vtxt∥ \text{sim}(v_{img}, v_{txt}) \frac{v_{img} \cdot v_{txt}}{\|v_{img}\|\,\|v_{txt}\|}sim(vimg​,vtxt​)∥vimg​∥∥vtxt​∥vimg​⋅vtxt​​批量里让正确图文对的相似度相对更高就是在「拉近配对、推远非配对」。4. 各模态怎么变成向量4.1 文本编码器常见路径字符串 → 分词Tokenizer得到 token id → Embedding 查表 → Transformer Encoder → 句向量或 token 序列输出两种常用形态一个向量整句摘要适合检索一串向量每个 token 一个适合生成、细粒度交互4.2 图像编码器现代常见路径Vision Transformer 思路图片 → 切成图像块Patch → 每个块变成向量 → Transformer Encoder → 图像特征序列或再池化成一个向量也可以用 CNNResNet 等提特征再投影。入门理解用 ViT 路径即可。4.3 音频编码器波形 → 分帧 / 梅尔频谱等 → CNN 或 Transformer → 音频特征序列语音识别、语音翻译多模态系统里很常见。4.4 数值 / 表格连接你已学的小模型你做过的「学习时长、出勤、作业」本质也是一种模态只是更简单数值特征 → 可选 MLP/Linear → 向量多模态系统里表格特征同样可以投影后与文本/图像一起融合。5. 融合怎么做四种常见结构「融合」决定模型如何把多路信息合在一起用。5.1 早期融合Early Fusion很早就拼在一起把特征在输入侧拼接 → 一个网络一起处理优点实现简单缺点各模态采样率、长度、噪声差异大时不好训适合强对齐、结构相近的输入5.2 晚期融合Late Fusion各自走完再在决策层合并图像分支 → 分数A 文本分支 → 分数B 最终 融合(A, B) # 如加权平均、再接一层 MLP优点分支独立、好调试缺点模态之间交互弱难做深度跨模态推理适合分类、简单打分5.3 中间融合 / 交叉注意力最常见于强多模态用注意力让一种模态「查询」另一种模态文本特征作为 Query 图像特征作为 Key / Value → Cross-Attention → 文本在「看图」后更新自己的表示这样回答「图里有几只狗」时问题里的词可以去图像特征里找依据。5.4 编码器 大语言模型当前主流工程形态很多「能看图聊天」的模型如 LLaVA 一类思路结构是图像 → 视觉编码器常冻结或少训 → 投影层MLP / Linear把视觉特征映到 LLM 词向量空间 → 与文本 token 拼成一段序列 → 送进大语言模型生成回答伪流程[图像特征1, 图像特征2, ..., 用户问题tokens...] → LLM → 逐词生成答案对工程实现来说这是目前最好懂的一条路视觉侧负责看语言侧负责说投影层负责翻译成 LLM 能读的「外语」。6. 投影层被低估但极关键的零件不同编码器输出的维度、分布往往不同。例如视觉编码器输出维度1024LLM 词嵌入维度4096中间需要Projection投影头# 概念代码不是完整可跑项目vision_featvision_encoder(image)# [B, T, 1024]lang_tokensproj(vision_feat)# [B, T, 4096]# 再与文本 embedding 在序列维拼接送入 LLM投影层可以很简单一层Linear也可以是小型 MLP。它的职责不是「认识世界」而是对齐维度尽量把视觉特征翻译到语言模型习惯的空间很多高效微调方案会冻住视觉编码器冻住大部分 LLM主要训练投影层 少量 LoRA这与「大模型微调」里的参数高效思想一致。7. 训练原理通常分阶段而不是一次到位多模态系统很少「随机初始化后一次训完所有能力」更常见是课程式训练。阶段 A单模态预训练可借用现成模型文本现成 LLM / 文本 Encoder图像现成 ViT / CLIP 视觉塔音频现成语音 Encoder目的先让每个塔自己会提取好特征。阶段 B跨模态对齐Contrastive / 匹配典型目标CLIP 风格一批图文对里识别「谁和谁是一对」拉近正样本对推远负样本对练完后模型具备检索与粗语义对齐能力但未必会流畅答题。阶段 C多模态指令微调SFT数据形态类似输入图片 「请描述这张图」 输出一段标准回答或输入图片 「图中的人在做什么」 输出「他在骑自行车。」训练方式和语言模型微调类似让模型生成的下一个词接近标准答案。差异只是输入序列里混进了视觉或音频特征 token。阶段 D可选偏好对齐 / 安全对齐用更好/更差回答做偏好优化让输出更稳、更符合人类偏好。对入门非必须。8. 推理原理前向怎么走以「看图回答」为例1. 读入图片视觉编码器提取特征序列 2. 投影到语言空间得到「视觉伪 token」 3. 用户问题分词变成文本 token 4. 拼接视觉伪 token 文本 token 5. LLM 自回归生成一次预测下一个词循环直到结束检索任务则不同通常不生成长文本图 → 向量 文 → 向量 算相似度取 Top-K所以实现前先问清任务生成类要解码器 / LLM检索类要共享向量空间 相似度分类类要融合特征 分类头任务不同融合与输出头都不同但「编码 → 对齐 → 融合」骨架不变。9. 用 PyTorch 视角看「内核」是什么结合你已学的小模型知识多模态并没有换一套物理学仍然是层级作用张量图像、文本、音频最终都变成张量nn.Module各编码器、投影、融合、任务头都是模块前向推理 按图计算一遍损失 Autograd Optimizer训练 用损失驱动参数更新变复杂的只是模块变多、数据管道变复杂小模型 x_数值 → Linear → 概率 多模态 x_图 → VisionEnc → Proj ┐ ├→ Fusion / LLM → 输出 x_文 → TextEnc / Tokenizer ┘训练五步仍然成立zero_grad → forward → loss → backward → optimizer.step只是forward里要同时处理多种输入loss可能是对比损失、生成损失或二者组合。10. 三种经典实现路线对照路线代表思想擅长实现要点双塔检索CLIP图文互搜、向量库双编码器 对比学习交叉编码早期 VQA / 融合 Transformer细粒度匹配、分类Cross-Attention 融合视觉语言模型 VLMLLaVA 等看图聊天、复杂问答视觉塔 投影 LLM选型建议只要「以图搜文 / 以文搜图」→ 双塔只要「看图选类别 / 简单问答选项」→ 融合 分类头也可能够要「自由文本回答、多轮对话」→ VLM 路线11. 数据长什么样实现时最容易忽略多模态质量高度依赖配对数据。检索 / 对齐数据image_path, caption cat.jpg, 一只橙色的猫趴在窗台 car.jpg, 一辆红色轿车停在路边视觉问答数据image_path, question, answer shop.jpg, 货架上有几种饮料?, 三种指令数据image_path, instruction, response chart.png, 请总结这张图的趋势, 销售额连续三个月上升...实现时要注意图文是否真对齐错配会直接毒化对齐分辨率、长宽比、文本长度要统一预处理缺失模态只有图没有文要有策略丢弃、掩码或单模态降级12. 一个最小「概念级」模块划分若用 PyTorch 拆项目常见文件/模块是vision_encoder.py # 图像 → 特征 text_encoder.py # 文本 → 特征检索双塔时 projector.py # 维度对齐 / 空间翻译 fusion.py # 拼接、注意力融合等 llm_wrapper.py # 可选接生成式语言模型 loss.py # 对比损失 / 生成损失 dataset.py # 同时读图和文本 train.py # 训练循环 infer.py # 检索或生成推理最小检索模型的前向概念# 概念代码img_vecnormalize(proj_img(vision_encoder(images)))txt_vecnormalize(proj_txt(text_encoder(texts)))logitsimg_vec txt_vec.T# 相似度矩阵# 对比学习对角线位置应是配对样本最小看图对话前向概念# 概念代码vprojector(vision_encoder(images))# [B, T_v, D]tembed_tokens(question_ids)# [B, T_t, D]seqconcat(v,t,dimseq_len)# 序列维拼接outllm(inputs_embedsseq)# 再做语言建模13. 和 RAG、纯微调的关系多模态系统里这三者经常一起出现技术作用多模态编码 / VLM让模型「看得懂」图或音RAG检索外部知识也可检索多模态向量库微调LoRA 等让模型更会按你的格式与领域说话例如企业文档助手用户上传截图 → 多模态模型理解截图内容 → RAG 检索内部知识库 → LLM 组织最终回答不要把「多模态」理解成只有一种训练方式它是输入形态扩展训练仍可用对比、SFT、RAG 增强等组合。14. 实现时常见误区以为拼接就是多模态不对齐语义时拼接只是把两路噪声捆在一起。一上来就端到端猛训所有模块更容易崩。更稳的是强预训练塔 先训投影 / 对齐 再指令微调。忽略序列长度一张图可能变成几十到数百个视觉 token再加长文本上下文很容易爆。用分类准确率衡量一切生成任务要看文本质量检索任务要看 RecallK问答要看是否吃到了图像证据。模态不平衡若文本极强、图像分支几乎不被梯度更新会出现「根本没看图也能靠语言先验瞎答」。需要在数据与损失上强迫模型用图。15. 学习路径接你当前进度你已经走过张量 →nn.Linear→ 单任务小模型。建议这样接多模态步骤学什么验收1复习向量相似度、余弦距离能手算/代码算两向量是否接近2做最小双塔假图特征 假文特征对比学习配对样本相似度高于非配对3读懂「视觉特征投影进 LLM」的数据流能画出 LLaVA 式框图4跑一个现成小 VLM 或 CLIP 推理 demo会调用、会看输入输出5再谈训练冻哪些层、训哪些层能解释为何常冻视觉塔不必先啃完所有论文。先能画出数据流再能改一处模块观察变化就比只记名词扎实。16. 一张最终对照图┌─ Vision Encoder ─┐ Image ──────────►│ │──► Projector ──┐ └──────────────────┘ │ ▼ Shared / Fused Space ▲ ┌─ Text / Audio Enc ─┐ │ Text/Audio ─────►│ │──► Projector ┘ └───────────────────┘ │ ▼ 检索算相似度 分类融合后接分类头 生成送入 LLM 解码17. 总结多模态实现原理可以收束为四句编码各模态先变成向量或向量序列对齐用对比学习等手段让同一语义的不同模态表示靠近融合用拼接、晚期融合或交叉注意力 / LLM 序列拼接做联合推理训练通常「预训练单模态塔 → 对齐 → 指令微调」推理时按任务走检索或生成它和 PyTorch 小模型开发共享同一套内核张量计算 模块化前向 损失驱动的反向更新。多出来的是「多种输入如何被翻译到同一套可计算语言里」。读完本文后若继续动手优先做「双塔相似度」最小实验再看「图像特征如何拼进 LLM 输入」两条线分别对应检索式与生成式多模态的主干。

相关新闻

最新新闻

日新闻

周新闻

月新闻