Interview Lab / 人工智能模型 / 技术演进

从 CNN 到 Transformer:图像与序列两条路线如何走向大模型

这篇解决一个问题:机器怎样从“看局部、记前文”,发展到“按当前问题寻找相关信息”?CNN 是 Convolutional Neural Network(卷积神经网络),用可重复使用的小窗口从图像中提取局部特征;Transformer 是以注意力为核心的网络结构。注意力就是按当前需要给不同位置分配关注权重,再汇总它们的信息。标题中的大模型指参数规模较大、用大量数据训练的网络;“从……到……”表示两条研究路线在时间线上逐渐汇合,并非 CNN 被 Transformer 全面淘汰。

我们先看图像和句子各自难在哪里,再沿代表性论文的时间线理解两条路线如何改进,最后看大语言模型和视觉模型怎样使用这些部件。读完应能自己推演一次“查询、匹配、取值”的计算,而不只背三个字母。

面向初学者按时间线图像与序列并行可运行计算示例
范围与年代:本文选取 1990—2021 年的代表性论文讲架构演进,年份指所引用工作的发表时间,不声称它们是相关思想的首次发明。后面的“大语言模型”讲常见的逐步预测后续文本的生成路线,“视觉模型”以图像分类的视觉 Transformer 为例;不同产品的具体结构会继续变化。
一、先看两个问题:一张图与一句话分别难在哪

图片:东西在哪里?

照片里的猫可能在左上角,也可能在右下角。若每个位置都重新学习“猫耳朵长什么样”,会浪费参数。先用同一个小窗口在各处寻找边缘和形状,比较合适。

句子:前面说过什么?

读到“他把球捡起来”时,“他”指谁要看前文。把每个词孤立处理,就丢了先后顺序和上下文。模型需要把先前信息带到当前词。

图片路线后来形成卷积神经网络;句子等有顺序的数据形成RNN,即 Recurrent Neural Network(循环神经网络):处理当前项时,把上一步留下的状态带过来。它们解决的问题不同,所以本来就是并行路线。机器学习中的“网络”是许多可训练计算单元组成的计算结构,并不是互联网。

先记住:卷积回答“附近有什么”,循环回答“前面发生了什么”;后来的注意力回答“此刻最该看哪里”。
二、时间线:两条路线怎样靠近

下面每个年份是“本文选择的代表性节点”,不是把前人的探索压缩成单一发明日。长短期记忆(Long Short-Term Memory,简称 LSTM)是让循环网络更有选择地保留旧信息的方法;注意力是按当前需要查找相关位置的方法;视觉 Transformer 则把图像分块后送入 Transformer。预训练是先用大量数据学习通用规律,语言模型是预测文本后续内容的模型。先认识这些名字,再沿时间线逐个推导。

时间向右 → 两条路线各解决自己的问题 序列路线 图像路线 1990循环网络 1997长短期记忆 2014按需注意 2017Transformer 1998卷积网络 2012深层卷积 2020视觉 Transformer 注意力结构进入视觉 2018—2020预训练语言模型 虚线表示结构被后续模型采用;不是早期模型被整体替换。
最应记住:2017 年的结构首先改写序列处理,随后进入语言与视觉;易错点是把并行发展的 CNN 和 RNN 说成前后替代。

这些代表性节点来自循环网络、长短期记忆、文档识别卷积网络、大规模图像分类、翻译注意力、原始 Transformer、后续语言模型与视觉 Transformer 的原始论文。对应原文在文末。

三、图像路线:CNN 怎样用同一把“小尺子”扫完整张图

先想象识别一张照片中的边缘。一个 卷积核就是一组很小的可学习数字,在图上逐格滑动;每到一处,用附近像素算出一个结果。同一组数字在所有位置重复使用,叫参数共享。它避免为每个位置单独学习一套“边缘探测器”,代价是单层只能直接看到局部范围,常靠堆叠多层扩大观察范围。

把图片缩成 4 行 × 4 列,每格只有一个数。示例小窗口为 2 行 × 2 列,只取窗口左上和右下相加。这不是训练好的真实卷积核,只用于把滑动计算数出来。

输入 4×4:行、列下标均从 0 开始 小窗口 2×2 输出 3×3:共 9 个位置 列0列1列2列3行0行1行2行3 1010011011000011 1001 首格:1×1+0×0+0×0+1×1=2 211111121 输出行列下标:0、1、2
最应记住:同一个小窗口滑动 9 次,得到 9 个输出;易错点是把“输出共有 3 行”误说成“最后一行下标为 3”。

1998 年的 LeNet-5 展示了卷积网络在文档识别上的完整应用。2012 年的 AlexNet 则展示了深层卷积网络在大规模图像分类上的强大效果。卷积并非只能处理图片,也能用于序列;这里只用图片建立最直观的起点。

四、序列路线:RNN 把上一刻的摘要交给下一刻

对句子“我 喜欢 苹果”,读到“苹果”时必须知道前面是“喜欢”。循环网络让同一套计算在每个时间步重复使用:当前词 xₜ 加上上一步的状态 hₜ₋₁,算出新状态 hₜ。状态就是模型对已经读过内容的压缩记录,不是把原句逐字原样存下来。

句子按顺序读:每一步都要等到前一步的状态 位置0:我位置1:喜欢位置2:苹果 当前词 + 初始状态→ 状态 h₀当前词 + h₀→ 状态 h₁当前词 + h₁→ 状态 h₂ 代价:传递链越长,早期信息越难保留,训练中的影响也可能逐步变弱。
最应记住:当前位置依赖上一步状态,所以顺序是实实在在的计算依赖;易错点是把状态当成完整保存的原文。

如果前面出现了“小明”,中间隔了许多词,最后才出现“他”,普通循环网络可能很难把“小明”保留到那里。训练时还会遇到梯度消失:用于调整早期计算的信号沿许多步传回时变得很弱。时间依赖与长距离记忆由此成为下一步的关键问题。

五、LSTM:给记忆加上“忘、写、读”三个开关

LSTM 是 Long Short-Term Memory(长短期记忆网络),是一类改进的循环网络。它增加一条较易持续传递的记忆单元状态,也就是随时间往后走的内部信息通道;门是由当前输入和上一时刻状态算出的 0 到 1 之间的控制值,用来决定保留、写入或输出多少信息。

例如读“小明把雨伞放在门口。过了一会儿,他……”时,模型若要理解“他”,应尽量保留“小明”这条线索,忽略不相关细节。下图的“保留”和“写入”是帮助理解的业务化标签,不表示门能像符号程序一样精确存储一个姓名。

一次处理:当前词“他”到来时,旧记忆怎样变成新记忆 此前读到“小明”,相关线索进入了旧记忆;中间词省略 旧记忆含“小明”线索 遗忘门旧信息留多少 输入门新信息写多少 当前词+候选信息读到“他” + 新记忆保留+写入 输出门送出部分信息 传给下一步的记忆 当前输出
最应记住:新记忆来自“旧记忆保留部分+当前候选写入部分”,输出又由另一扇门控制;易错点是把 LSTM 说成绝不会遗忘。

1997 年的原始 LSTM 论文针对长距离依赖提出记忆单元。图中按今天常见的 LSTM 形式讲三类门;不同论文和实现的门、偏置与连接细节并不完全相同。它减轻了长距离信息传递难题,但仍按时间步串行处理,长序列训练不易完全并行。

六、2014 年前后:不只靠最后一份摘要,让输出自己回头找

翻译一句长句时,早期的编码器—解码器做法是:编码器把原文压成一份固定长度摘要,解码器再据此逐词译出。编码器负责读入,解码器负责产出;句子越长,单一摘要越可能成为信息瓶颈。

注意力是一种按当前目标给各输入位置分配权重、再汇总信息的方法。译到某个词时,解码器可以重新看原句全部位置,给有关词较高权重。这里尚可与循环网络一起使用;2014 年 Bahdanau 等人的工作并不是原始 Transformer。

只有固定摘要

“小猫 / 追 / 球” → 一份摘要 → 逐词翻译。每一步都主要依赖同一份压缩结果,细节可能丢失。

加上按需查找

翻译动作时重点看“追”;翻译物体时重点看“球”。目标词不同,三处来源的权重也可以不同。

机制与代价:注意力避免只从固定摘要取信息;每次查找都要比较相关位置并汇总,位置多了,计算和内存也会增加。
七、Q、K、V:一次可数清的“找相关信息”过程

在自注意力中,同一段输入的各位置彼此查找信息。每个位置先经可训练的变换,产生三种角色:Q 是 Query(查询向量,表示“我现在想找什么”);K 是 Key(键向量,表示“我有哪些特征可供匹配”);V 是 Value(值向量,表示“如果选中我,拿走什么信息”)。向量就是按顺序排放的一组数字;它们不是字面上的字符串标签。比较分数还要做归一化,也就是转成总和为 1 的权重,才能加权汇总。

做一个一维玩具例子:输入有 3 个位置,编号从 0 起,依次是“猫”“追”“球”。现在只计算位置 1“追”的输出。它的 Q 取 1;全部三个位置各自有一份 K 和 V。真实模型中的这些数由训练得到,这里人为指定,方便把完整链路算完。

目标位置 1:“追”的 Q=1;候选集合共 3 个位置,下标 0~2 候选K / V匹配分数 Q×K归一化权重取回信息 0 猫K=0 / V=101×0 = 0≈ 0.090.09×10 = 0.91 追K=1 / V=201×1 = 1≈ 0.240.24×20 = 4.82 球K=2 / V=301×2 = 2≈ 0.670.67×30 = 20.1 合计 ≈ 25.8
最应记住:先列出全部候选并比较 Q 与每个 K,再把权重乘到对应 V 上求和;易错点是把“最大权重 0.67”误当成只选择“球”,其余两项仍参与。

上图的归一化叫 softmax:把分数 0、1、2 分别取指数,得到约 1、2.72、7.39,再除以总和约 11.11,成为约 0.09、0.24、0.67,三项相加约为 1。真实模型用多维 Q、K,先做点积(对应数字相乘再求和的匹配计算),再按键向量维度的平方根缩放,最后 softmax。多头注意力是并行做多组这种查找,再合并结果,让模型能从不同角度建立关系;它不保证每个头都有可直译的人类语义。

本例:softmax([0, 1, 2]) ≈ [0.09, 0.24, 0.67];输出 ≈ 0.09×10+0.24×20+0.67×30=25.8
八、2017 年 Transformer:让注意力成为主干

原始 Transformer 用注意力代替序列主干中的逐步循环计算,同时保留若干必要部件:每个位置的数值表示、用于标记先后顺序的位置编码、逐位置处理的前馈网络(对每个位置做同样的非线性变换),以及帮助训练的残差连接(把较早的输入加回后面的计算结果)和稳定内部数值的层归一化。原论文是用于机器翻译的编码器—解码器结构,不等于今天所有模型都长这样。

要解决的问题原始 Transformer 的做法引入的代价或边界
远处词的信息难传到当前一个注意力层可直接比较任意两个允许互看的位置普通全连接注意力随序列长度增长,成对比较数量近似按长度平方增长
循环步骤训练时难并行训练阶段同一层多个位置可同时计算自回归生成仍需逐个产生新词,不能把未来答案提前生成
去掉循环后缺少顺序感把位置信息加入输入表示不同位置编码方案的外推能力和实现细节不同

自回归指根据已出现的内容预测下一项,再把它接到后面继续预测。用于自回归生成时,要加因果遮罩:位置 0 只看 0,位置 1 看 0~1,位置 2 看 0~2;未来位置不可见,否则训练会偷看答案。输入序列从 0 编号,共 3 个位置时,允许关系如下:

行=正在预测的位置;列=可读取的位置;下标均从 0 开始 列0列1列2行0行1行2 可看未来禁看未来禁看可看可看未来禁看可看可看可看 行0:1 个可见位置行1:2 个可见位置行2:3 个可见位置
最应记住:因果遮罩只挡未来,当前位置与过去都可看;易错点是把“训练可并行计算各位置”说成“生成也能一次写出所有未来词”。
九、语言路线:Transformer 怎样成为大语言模型的骨架

大语言模型是参数规模较大、在大量文本上训练的语言模型;语言模型负责根据已有文本预测后续内容。GPT 是 Generative Pre-trained Transformer(生成式预训练 Transformer):先从大量文本学习预测后续内容,再按用途调整;2018 年的相关工作展示了这条路线。BERT 是 Bidirectional Encoder Representations from Transformers(来自 Transformer 的双向编码表示),让表示学习时利用左右两侧上下文,主要用于理解类任务。两者都使用 Transformer 思想,但训练目标和读取上下文的方式不同。

以常见的生成式路线看:文本先拆成token(模型处理的文本片段,可能是字、词的一部分或标点),每个片段变为数字表示;层层经过带因果遮罩的注意力和前馈计算,得到下一个 token 的概率分布;选出一个,再重复,直到选到终止标记(模型专用的“该停下”符号)或达到长度限制。2020 年的 GPT-3 展示了大规模自回归模型在少样本任务上的能力。“大”来自参数、数据和计算规模,能力还受训练数据、训练方法与后续调校影响,不能归因于 QKV 三个字母本身。

“今天 天气” → 预测下一个片段 → 例如“好” → “今天 天气 好” → 再预测下一个片段……

下图只设“好、差、晴”三个玩具候选,编号分别为 0、1、2;真实模型的候选范围由它使用的词表决定,通常远不止三个。示例选择概率最高的候选,并画出继续与结束两条出口。

生成一轮:候选共 3 项,本例选分数最高的“好” 输入片段今天 / 天气转成数字附上位置信息带因果遮罩的Transformer 层 下一个片段的概率0 好 0.6 / 1 差 0.32 晴 0.1(共 1.0) 本轮选“好” 判断:是终止标记吗?本轮不是 否:追加并重复 今天 / 天气 / 好 → 下一轮 是:未来某轮可能发生 停止生成
最应记住:本轮选出的“好”会加入输入,下一轮才能继续生成;易错点是以为一次计算就得到所有未来片段。概率只是玩具数字,不代表真实模型输出。
别混为一谈:原始 Transformer 的完整翻译结构、BERT 类双向编码器、常见生成式模型的单向解码器,是同一架构家族的不同用法。“今天的大语言模型”也不是某一个固定实现。
十、视觉路线:把图片分块后,Transformer 也能“读图”

ViT 是 Vision Transformer(视觉 Transformer),把图像切成固定大小的图像块,即互不重叠的小方块,再把每块映射成一项数字表示,加入位置信息,送入 Transformer 编码器。2020 年的 ViT 论文表明,在足够规模的预训练下,这条路线可以取得很强的图像分类效果。

先数一个最小例子:4×4 的图像用 2×2 的块切分,横向 2 块、纵向 2 块,共 2×2=4 块,下标 0~3;每块相当于后续计算中的一个输入位置。真实论文中的常见示例是 224×224 图像配 16×16 图像块,得到 14×14=196 块;这是一个配置示例,不是 ViT 的固定要求。

图像 4×4 → 每块 2×2 → 共 4 块,编号从 0 开始 块 0块 1块 2块 3 4 份数字表示+ 各自的位置信息对应块 0、1、2、3 Transformer四块互相参考编码器 分类结果如“猫” 这里每一格是 2×2 像素块,不是单个像素;输出仍需训练得到。
最应记住:图像先切成有编号的块,才进入注意力计算;易错点是把“4 个图像块”误认为“4 个像素”。

视觉 Transformer 并不意味着卷积网络从此无用。卷积天然强调局部结构,常有合适的计算成本和数据效率;ViT 让远距离图像块交换信息更直接,但注意力成本随块数增长。2021 年的 CLIP(Contrastive Language-Image Pre-training,对比式图文预训练)进一步展示图像表示与文字表示可以通过成对图片和描述建立联系;原论文研究了卷积和视觉 Transformer 等图像编码器,不能把 CLIP 简化为“只有 ViT”。

十一、四种思路放在一起,才看得见各自边界
结构一次主要看哪里主要解决什么典型代价
卷积网络当前位置附近的小区域同一局部图案出现在不同位置要靠层数等设计逐步整合远处信息
普通循环网络当前项与上一步状态处理有先后顺序的数据长距离线索易弱化,步骤串行
长短期记忆网络当前项、上一步状态和记忆更有选择地保留长期线索门增加计算,时间步仍串行
Transformer允许范围内的多个位置按需交换远近信息,训练可并行处理位置普通全连接注意力对长输入较费计算与内存
一句话:它们是不同的信息流设计。具体业务还要看输入、数据量、延迟、内存和模型质量,不能只按“新旧”选型。
十二、面试官常追问什么
问:CNN、RNN、LSTM、Transformer 是一代淘汰一代吗?
答:不是一条线。卷积先解决局部图像模式的共享提取,循环网络解决序列状态传递,LSTM 改善长距离记忆,注意力让当前位置按需找信息。Transformer 把注意力做成主干,但卷积与循环结构仍适合一些场景。
问:有了注意力,为什么还要 Transformer?
答:早期注意力常附着在循环式编码器—解码器上,帮助解码器回看输入。2017 年的 Transformer 将注意力作为主干,并配合位置编码、前馈网络等部件,减少训练阶段沿时间步串行的依赖。
问:Q、K、V 分别做什么?
答:当前位置拿 Q 表示要找什么,所有可见位置拿 K 供比较;分数归一化为权重后,用这些权重加权各位置的 V,形成当前位置的新表示。Q、K、V 都是从输入表示学习出来的数字,不是人为写死的三类词。
问:Transformer 能并行,为什么聊天回答还是一个字一个字出来?
答:训练时,已有整段文本可在因果遮罩约束下并行计算多个位置;生成时下一个片段还未知,要先生成它,才能继续预测后面。并行能力与逐步生成说的是两个阶段。
问:ViT 为什么需要位置?
答:切块后,如果只把块当成无序的数字集合,就难区分“左上角的眼睛”和“右下角的眼睛”。加入位置信息,让模型同时知道块的内容与来源位置。
十三、代码里最容易写错的两条边界

第一,softmax 要沿候选位置计算。如果一次给“追”的 Q 比较 3 个 K,权重应在这 3 个候选之间归一化,总和约为 1。把不同查询的位置混在一起归一化,得到的就不是原本要问的“当前词关注谁”。

第二,自回归训练必须挡住未来。若当前位置能看到后面的标准答案,离线训练指标会虚高,真实逐步生成时却拿不到那份未来信息。下面代码用最小例子复核前面的计算。

十四、可运行示例:亲手算一次权重与遮罩

这段 Python 3 标准库代码只验证第七节的一维数字例子和第八节的可见范围,不模拟训练。运行后应看到权重约为 [0.09, 0.24, 0.67]、输出约为 25.75;前文用两位小数逐项相乘,所以写作约 25.8。

Python 3 · 无需第三方依赖
import math

q = 1                     # 位置 1“追”的查询
keys = [0, 1, 2]        # 候选位置 0、1、2 的键
values = [10, 20, 30]  # 对应位置的值
scores = [q * key for key in keys]
exp_scores = [math.exp(score) for score in scores]
total = sum(exp_scores)
weights = [score / total for score in exp_scores]
output = sum(weight * value for weight, value in zip(weights, values))

print([round(weight, 2) for weight in weights])
print(round(output, 2))
for position in range(3):
    print(position, list(range(position + 1)))

其中 range(position + 1) 恰好得到位置 0 的 [0]、位置 1 的 [0, 1]、位置 2 的 [0, 1, 2]。这个例子是一维,所以缩放因子为 √1=1,代码没有额外除法。

十五、30 秒总结话术
卷积提局部,循环传状态,LSTM 筛记忆,注意力按需找,Transformer 用注意力搭主干。

“图像和序列原本是两条路线。CNN 用共享的小窗口提取局部图像特征;RNN 把状态逐步传给下一项,LSTM 再通过门改善长距离信息保留。翻译任务中的注意力让输出按当前需要回看输入,Transformer 则用注意力承担主要的跨位置交互,并加入位置信息等部件。后来,生成式大语言模型用因果遮罩逐步预测文本,ViT 把图片切块后送进 Transformer。新结构扩大了适用范围,但卷积的局部优势和计算成本仍值得按场景权衡。”

十六、应用场景:什么时候用,为什么适合

设备端实时看图

什么时候:图像识别需低延迟、可用数据有限。为什么:卷积自带局部结构假设,常能有效利用像素邻近关系。注意:最终选型仍看实际模型大小、硬件和精度。

持续到来的传感器序列

什么时候:数据按时刻逐步到达,需要更新内部状态。为什么:循环式模型天然能把前一时刻状态带到下一时刻。注意:极长依赖仍应做实测。

长文本问答或生成

什么时候:某个词需要综合较远处的信息。为什么:注意力可按当前查询汇总可见位置。注意:长输入带来计算与内存压力,还要处理生成时的因果遮罩。

图像分类与图文检索

什么时候:要整合图像远处区域,或把图像与文字表示对齐。为什么:ViT 提供块间信息交换,图文对比训练可学习跨模态联系。注意:ViT 与 CLIP 是不同层次的概念,前者是图像结构,后者主要是一种图文训练方案。

业务化表达:“我先看输入是空间局部结构还是时间序列,再看数据规模、上下文长度、部署延迟与内存预算。图像任务不会因为 Transformer 更新就直接放弃卷积;文本生成也要区分训练并行与推理逐步输出。”
十七、资料依据:代表性原始论文