图像描述(Image Captioning)的技术演进:从编码器-解码器到视觉语言大模型

我一直觉得,图像描述(Image Captioning)是计算机视觉领域最浪漫的任务:给一张照片生成自然语言描述,让机器 "说出它看到了什么"。但研究越久我越发现,这个任务一点也不浪漫,它其实是所有多模态难题的缩影。还记得 2014 年我第一次看到 Google 的模型给一张照片生成 "A woman is throwing a frisbee in a park" 时,我愣了很久。不是因为句子多精确,而是因为模型怎么知道那是公园?它从来没见过那棵树,也没去过那个公园。后来我才慢慢想通:图像描述的本质不是看图说话,而是让机器在两个完全不同的信号空间之间做翻译——一边是像素,一边是语言。

AI technology illustration

早期的图像描述其实是一个填空题

在深度学习之前,图像描述基本是 "目标检测 + 模板填充"。系统先用检测器找出场景里的物体:猫、狗、草地、人,然后套进预设模板:"一只猫在草地上"。这种方法的局限是你想象得到的:模板是死的,场景稍微换个样式就崩了。更关键的是,它脱离了语法和上下文,所以永远写不出 "猫在草地上晒太阳,而且看起来心情不错" 这种句子。整个领域其实都在等一个能自己组织语言的东西,等到了深度学习时代。

2014 年,编码器-解码器第一次把图像和文本端到端连起来

2014 年,Google 的 Vinyals 等人在 Show and Tell 中提出 NIC 模型,结构简单得惊人:一个 CNN 编码器把图片压成一个固定维度的向量,一个 LSTM 解码器把这个向量一步步翻译成句子。没有模板,没有规则,从像素到单词是一条可微的计算图。用公式说,模型就是最大化条件概率 p(S|I) = Π p(w_t | w_1...w_{t-1}, I)。这句话听起来抽象,说人话就是:模型在每个时间步从词表里挑一个最可能的词,把已经生成的词当成上下文,然后再挑下一个。整个过程跟机器翻译里的 seq2seq 几乎一模一样。

我最早以为 CNN 输出的那个向量储存了 "图片里有什么" 的全部信息。后来自己搭了一个模型试了试才发现,一个几十到几百维的向量根本装不下完整的视觉内容,你硬塞,它就损失细节。这是编码器-解码器架构的根本瓶颈:信息瓶颈。也正是因为这个瓶颈,2015 年那篇 Show, Attend and Tell 让视觉注意力机制变成了标配。

注意力机制:模型学会了看哪里,而不是只看一眼

注意力并不复杂。解码器生成第 t 个单词时,不再盯着那个固定的全局向量,而是握着编码器输出的 L 个局部特征(通常来自 CNN 的某一层卷积特征图),给每个位置算一个权重。权重最大的区域,就是模型当前认为跟自己要说的词最相关的地方。用伪代码看,soft attention 的核心就是这么几步:

scores = torch.matmul(query, image_features.T)  # (1, L)
weights = torch.softmax(scores, dim=-1) # (1, L)
context = torch.matmul(weights, image_features) # (1, D)

这里的 query 就是解码器当前的隐藏状态,image_features 是图片各区域的视觉特征。模型生成 "猫" 之前,query 会倾向于跟猫所在区域的特征产生更高内积,于是权重集中到那里。这也是注意力机制最吸引人的地方:你可以把权重画成热力图,亲眼看到模型 "在看哪"。但注意,这个 "注意力" 和人类视觉中的注意力根本不是一回事。人类是主动扫描,模型是根据训练数据里的统计相关性去被动加权。我一度以为注意力权重可视化能解释模型行为,后来才发现,高权重不代表模型 "理解" 了那个物体,它可能只是恰好需要那个特征来预测下一个词。

注意力机制虽然缓解了信息瓶颈,但整套架构还是 RNN 步进式的,训练也慢。真正的范式转移发生在 Transformer 出现之后。

Transformer 和预训练:图像描述开始变成 "对齐" 问题

2017 年,Attention Is All You Need 让注意力直接取代了 RNN。图像描述也顺理成章地转向 Transformer:图像特征被切成视觉 token,和文本 token 一起丢进解码器做自回归。到这一步,问题已经不是 "该怎么说",而是 "视觉和语言之间如何对齐"。

最影响后续发展的不是 Transformer 本身,而是预训练范式。2021 年,OpenAI 放出 CLIP:4 亿图文对,通过对比学习把图像和文本映射到同一个向量空间。CLIP 本身不生成描述,但它让视觉和语言第一次可以直接比较相似度。这直接催生了一大批视觉语言预训练模型。我记得当时最大的震撼是 CLIP 的 zero-shot 能力:它没有专门训练图像分类,却能在 ImageNet 分类任务上做到不错的精度。这说明什么?说明 "图像特征" 和 "语义标签" 之间的鸿沟,可以用海量图文对的数据抹平。图像描述不再只是视觉问题,它变成了一个多模态对齐问题。

不过,CLIP 只能对齐,不能生成。要得到自然语言描述,还需要一个解码器。于是出现了两条技术路线:

  • 路线一:用 CLIP 这种预训练编码器提取特征,再接一个文本生成解码器,微调生成任务;
  • 路线二:把图像特征通过某种 "适配器" 注入到大语言模型中,直接让 LLM 来做条件文本生成,这就是视觉语言大模型。

视觉语言大模型:图像描述这个任务 "消失" 了

2022 年的 Flamingo 和 2023 年的 BLIP-2 是视觉语言大模型的代表作。它们的思想都是:图像编码器负责提取视觉特征,大语言模型负责语言生成,中间用一个轻量模块来 "翻译" 两边。比如 BLIP-2 的 Q-Former,用一组可学习的查询向量从视觉特征里 "提炼" 出 LLM 能理解的表示。

为什么说图像描述 "消失" 了?因为在这个框架里,图像描述只是视觉语言大模型最简单的一个能力。你问 GPT-4V "这张图里发生了什么",它给你的已经不是一个句子,而是一段带有推理和上下文的描述。你还可以追问 "那人手里的东西是什么",它也能回答。描述、问答、推理全部变成了同一个架构里的不同任务。这让我想起自己早年的困惑:图像描述到底算计算机视觉还是自然语言处理?现在答案已经不重要了。它属于一个更大的领域:视觉语言模型。技术演进走到这里,边界已经模糊。

一张表总结各阶段的核心变化

时期 代表方法 关键结构 语言生成方式 主要局限
2014前 模板填充 检测器+规则 模板拼接 只能表达固定场景
2014-2015 Show and Tell CNN+LSTM 端到端逐词生成 信息瓶颈,易生成重复词
2015-2017 Show, Attend and Tell CNN+LSTM+注意力 注意力加权生成 训练慢,误差传播
2017-2021 Transformer Captioning 视觉特征+Transformer 并行训练,自回归生成 需要大量标注数据
2021后 CLIP 等预训练对齐 双塔编码器 对比学习,不生成 缺少生成能力,需要额外解码
2022后 Flamingo / BLIP-2 / GPT-4V 冻结编码器+LLM LLM 条件生成 幻觉,空间/常识推理不稳

现在的能力边界:它真的 "懂" 图片吗?

我先说结论:今天的视觉语言模型比我 2014 年见到的模型强太多,但它仍然不是在 "看" 图,而是在 "猜" 图。一个典型问题是空间关系。你给它一张 "椅子上放着一顶帽子" 的图,它往往能说 "椅子" "帽子",但你把帽子移到椅子旁边,它依旧可能说 "帽子上有一把椅子"。这不是个别现象,而是普遍的空间关系建模缺陷。

另一个问题是幻觉。你让 VLM 描述并不存在的细节,它依然会给出一个语法正确但完全错误的句子。原因在于,生成过程是基于概率分布采样,它优先选择在语义上最合理的下一个词,而不是最贴合真实图像的下一个词。

但反过来看,图像描述演化的思路——端到端训练、注意力、预训练对齐、LLM 注入——这些方法论已经渗入到多模态研究的每个角落。下一个突破口很可能不是更深的网络,而是更强的空间推理能力和更可靠的符号验证。

几个常见误区

CLIP 能生成图片描述吗?

不能。CLIP 只能判断图像和文本的匹配程度。你需要再接一个文本解码器才能生成描述。

视觉语言大模型和传统图像描述的区别是什么?

传统模型是被训练来做单一任务的 "专用工人",视觉语言大模型则是把视觉理解嵌入到通用的语言推理能力里。前者是技能,后者是能力。

为什么图像描述还要单独研究?

因为它是多模态理解的地基。即使今天的 VLM 看起来什么都能做,图像描述这项基础任务的表现仍然是衡量模型视觉理解程度的试金石。

这几十年的演进,本质上是把 "视觉块" 和 "语言块" 之间的距离一步步拉近。最早是模板,后来是向量,再后来是注意力权重,现在是共享语义空间。每一步都朝着同一个方向:让机器学会两种符号系统之间的关系。图像描述没有被解决,它只是被吸收了。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/519.html

(0)
上一篇 2天前
下一篇 2天前

相关推荐