从文本走到融合:AI多模态笔记
去年做智能客服,用户习惯一边上传截图一边语音描述问题。我们最初拆成三条线:OCR 抠字、ASR 转文本、再丢给 LLM——能跑,但图片里的布局和红点、语音里的语速情绪,转纯文本后丢了一大截。
多模态要解决的是:不同编码器怎么映射到同一个语义空间,别把特征向量简单拼起来就完事。
为什么要搞多模态
上面那套拆线方案能跑,但丢信息——截图里的布局、红点,语音里的语速和情绪,转成纯文本后全没了。多模态得让模型把"图里的红点"和"语音里的愤怒语调"对上号,做法上就是找合适的编码器,映射到同一个语义空间。
从 CLIP 开始理解视觉-语言
CLIP 是个很好的切入点:它用对比学习的方式,把图像和文本编码到一个公共空间里。如果你喂给它一张猫图和"猫"这个字,模型会学到一个对应的向量表示。
import clip
import torch
from PIL import Image
# 加载模型
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
# 准备图像和文本
image = preprocess(Image.open("cat.jpg")).unsqueeze(0).to(device)
text = clip.tokenize(["cat", "dog", "car"]).to(device)
# 计算相似度
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text)
logits_per_image, logits_per_text = model(image, text)
probs = logits_per_image.softmax(dim=-1).cpu().numpy()
print("标签概率:", probs)
这套东西的核心思路很简单:让图像编码器和文本编码器在同一个空间里工作,通过对比学习拉近匹配样本的距离,推开不匹配的。实际操作中,模型能很快学会"猫"这个概念对应的是猫图的特征,而不是狗图。
多模态融合的几种路子
理解了 CLIP 之后,发现多模态融合主要有几种套路:
早期融合
把原始数据或低级特征拼在一起。比如图像用 CNN 提取特征,语音用 wav2vec 提取特征,文本用 BERT 提取特征,然后直接拼接喂给分类器。
优点是简单,缺点是模态差异太大时很难学到有效的联合表示。
晚期融合
各模态分别处理,最后再做决策融合。比如视觉模型给一个预测,语言模型给一个预测,然后投票或加权。
这在我们项目里试过:先用 OCR 提取文字,再让大模型读文本,最后跟图像分类器的结果结合。效果一般,但解释性比较好。
中期融合
中间层就做特征融合。比如在 Transformer 的注意力层里加入跨模态注意力,让视觉特征影响语言特征的计算。现在主流的多模态大模型基本都在走这条路。
踩坑实录
多模态这个概念听起来美好,实际做起来坑不少。记录几个印象深的:
数据对齐问题
图像和文本经常不在同一个时间尺度上。比如视频里的某一帧可能跟上一句或下一句的文本对应,标注的时候很容易对错。我们项目里发现 20% 的标注对齐有问题,最后只好重新标注。
算力紧张导致不得不缩减数据集,又引入了更多噪声。最后选择用弱监督的方式,用预训练模型生成伪标签,再人工修正。
模态不平衡
视觉和语言的信息密度差异很大。一张图可能包含上千个物体,但对应的描述往往只有十几句话。模型很容易被主导模态带偏。
我们试过几种方法:调整不同模态损失的权重,用dropout随机丢弃部分模态,还试了对抗训练让模型不能太依赖某一个。最后发现简单的随机丢弃效果最好,强制模型学会"当没有图的时候也能工作"。
评估指标
多模态任务的评价本身就很麻烦。你说模型"看懂了"一张图,这个"懂"怎么量化?传统的 BLEU、ROUGE 指标只能衡量文本生成质量,没法捕捉视觉信息。
最后我们混合了几种方式:人类专家标注的"理解正确率"、传统文本指标、还有一些语义相似度指标。算下来人类评价还是最可靠的,但成本也最高。
实际用起来的经验
折腾了几个月,多模态系统总算能用了。总结几点实用的:
别从零开始
预训练模型是你的朋友。视觉用 CLIP 或 ViT,语音用 Whisper,语言用大模型,先把它们接起来跑通,再考虑微调。我们的项目几乎都是这样开始的。
先验证"把现有模型连起来能不能解决问题",再考虑从头训练。这样能节省大量的时间和算力。
关注边界情况
多模态系统最容易在边缘场景翻车。比如光线不好的图片、口音很重的语音、或者模糊的描述。我们的测试集里加了这些边界情况,发现模型在极端条件下性能直接掉到随机水平。
解决方案也很朴实:数据增强、对抗训练,以及在部署时做异常检测,遇到置信度低的样本就转人工处理。
可解释性很重要
多模态模型的黑盒程度比单模态还要高。你需要知道模型是根据什么做的决策,是视觉特征还是语言信息占主导。
我们加了一个简单的可视化层:输出预测时会标明"这个判断主要来自视觉特征(85%)“或"语言特征(70%)",帮助人类理解模型的推理过程。
结果怎么样
最后系统的准确率比纯文本方案提升了 18%,用户满意度从 65% 涨到 82%。不算惊艳,但解决了最开始的问题:用户上传截图时系统能真正理解图片里的内容,语音里的情绪也能被捕捉到。
更重要的是,团队从零开始建立起了一套多模态的工作流程:数据标注、模型选择、融合策略、评估体系。下一次再做类似项目时,就不用从头摸索了。
多模态选型我倾向从简单方案起步,碰到真实问题再往上叠——用户要的是问题被解决,没人关心你堆了几个 SOTA 模型。
回头看,难的是把图、声、文揉进同一份理解里。人靠多看多听慢慢拼图景,AI 还远,但至少知道该往融合表示这条路走了。
版权声明: 本文首发于 指尖魔法屋-从文本走到融合:AI多模态笔记(https://blog.thinkmoon.cn/post/264-ai-multimodal-text-fusion-practice/) 转载或引用必须申明原指尖魔法屋来源及源地址!
评论
使用 GitHub 账号登录后即可留言,支持 Markdown。