深度学习模型分类全解析:从CNN到Transformer的选型地图

发布时间:2026/11/3 7:51:45
深度学习模型分类全解析:从CNN到Transformer的选型地图

最近在梳理团队内部的模型资产时,我把主流深度学习模型按类别重新过了一遍。起因很简单:手里项目多了以后,每个人都在提“模型”,但这里的“模型”可能是CNN、Transformer、扩散模型,甚至还有人把LightGBM也归进深度学习,沟通成本越来越高。于是就有了这篇“主流深度学习模型类别调研报告(上)”。报告的目的不是罗列SOTA榜单,而是建立一张“模型地图”:每一类模型的思路本质是什么、适合处理什么数据、典型代表有哪些、工程落地时要注意什么。适合正在做技术选型的开发者和刚入门深度学习想搭知识体系的朋友。先说好,这期先覆盖五类核心模型:卷积神经网络、序列模型、Transformer家族、生成式模型和图神经网络(GNN放在下期展开)。

1. 为什么要做模型分类:先搞清楚这张“地图”

1.1 调研的起点:从“会跑模型”到“懂模型”

我先把话说在前面:刚入行那会儿,我也属于“会跑模型但不会选模型”的人。项目里遇到图像任务就找ResNet,遇到文本任务就找BERT,以为把官方仓库里的预训练权重下载下来、改一下分类头、fine-tune几个epoch就算接入了深度学习。直到有一次做工业瑕疵检测,现场数据的图像分辨率和光照条件跟预训练分布差得很远,我用ResNet50怎么调都过拟合,而团队里另一位同事用了一个结构很简单的浅层CNN,配合针对性数据增强反而效果稳定。那次之后我才真正意识到,“模型类别”这四个字不是学术名词,它决定了你在一类问题上的上限。

所以这次调研,我把重心放在“分类认知”上。在做调研之前,我给自己定了三个问题:第一,当前主流深度学习模型在结构上到底分成几大家族?第二,每个家族的核心归纳偏置是什么?第三,当手里拿到一个实际任务时,应该怎么快速定位到某个家族?这三个问题看起来基础,但真要在一次会议里讲清楚,大多数人其实说不周全。这篇报告就是用我自己的方式把答案整理下来。

1.2 分类维度的选择:按结构、按任务还是按范式

模型分类可以按很多维度切。最常用的三个维度是结构、任务和范式。

按结构分,是最符合直觉的方式:CNN擅长处理网格结构数据,RNN/LSTM/GRU和TCN擅长处理序列,Transformer基于注意力机制,GNN处理图结构数据,GAN和扩散模型负责生成。按任务分,则包括分类、回归、目标检测、分割、生成、检索、强化学习控制等。按范式分,有监督学习、无监督学习、自监督学习、半监督学习和强化学习。

我在这份报告里选择“结构为主线、任务和范式为辅”,原因是结构决定了模型能捕捉什么模式,而任务只是这些模式的应用出口。一个BERT模型既可以做文本分类也可以做文本匹配,按结构归入Transformer家族比按任务归入“文本分类模型”更稳定,因为你在调研新论文时,首先看到的也是“某模型属于什么结构”。另外,不少工作是跨任务的,比如用CNN做时间序列分类、用Transformer做图像分类,如果按任务分类,这些模型就会被分到不同地方,很难建立一个统一的知识框架。

同时要澄清一个经常混淆的问题:“模型”这个词在不同语境里指代不同。深度学习领域的“模型”通常指网络结构加参数;工业软件里的“模型”可能是一套训练好的功能模块;而“环境配置”“Ollama下载模型”里的“模型”又变成了可加载的权重文件。这些都是“模型”,但在调研时混在一起就会乱。所以我建议,看模型类别时只看网络结构的本质,不要被包装词带偏。

2. 卷积神经网络:老牌劲旅的演进与落地

2.1 从LeNet到ResNet:CNN的骨架演变

CNN的核心思路可以概括成一句话:用卷积核在输入上滑动,提取局部特征,然后在空间上逐步抽象。它之所以在图像领域如此成功,是因为图像的天然特性是局部相关和平移不变——一个猫耳朵不管出现在图片左上角还是右下角,它还是猫耳朵。卷积层的参数共享机制保证了同一套特征检测器可以在整张图的所有位置复用,这就是CNN的归纳偏置。

在项目调研里,我会按时间线去梳理CNN的进化,这样能理解每个关键改进到底在解决什么问题。LeNet-5(1998)是开山之作,用于手写数字识别,结构很简单:卷积、池化、全连接。AlexNet(2012)让深度学习在ImageNet上夺冠,引入了ReLU、Dropout、数据增强,还验证了GPU并行训练的效果。VGG(2014)证明了“小卷积核堆叠”比“大卷积核一步到位”更好,用连续的3x3卷积替代5x5和7x7,在增加深度的同时控制了参数量。GoogLeNet/Inception(2014)从宽度上做文章,用Inception模块在不同尺度上并行卷积。ResNet(2015)是一个分水岭,它提出了残差连接,把“目标映射”变成“学习残差”,让百层级网络变得可训练。

这里我想多说一句ResNet:在ResNet之前,深层网络并非“过拟合”,而是“退化”。也就是说,网络加深之后训练误差反而更高,这很不符合直觉。残差结构让每一层只需要学习输入和输出之间的差值,等价于给梯度开了一条高速公路,反向传播时梯度可以更容易地流回到浅层。实际操作中,我习惯用“能从自定义残差块里稳定训练到低loss”来判断一个CNN实现是否靠谱,如果连ResNet18都训练不稳定,那问题多半出在数据预处理或学习率上,而不是网络结构本身。

参数量的估算在工程里很有用。一个普通卷积层的参数量公式是:

输出通道数 × 输入通道数 × 卷积核高 × 卷积核宽 + 输出通道数(偏置)

我算过最常见的例子:Conv2d(3, 64, kernel_size=7, stride=2, padding=3),参数量是3×64×7×7+64=9472。这个数字不大,但如果输入分辨率是224×224,中间特征图的激活值会很大,这也是低显存环境下CNN并非永远“省显存”的原因——显存不仅要装参数,还要装中间激活值。图像size越大,activation开销越夸张。

2.2 工程落地:轻量化模型与CNN识别恶意软件案例

要落地到实际项目时,很少有人直接用几百层的ResNet。工业场景通常对延迟和显存都敏感,所以轻量化CNN反而是主力。MobileNet系列用深度可分离卷积把标准卷积拆成两个步骤:逐通道卷积(depthwise conv)和逐点卷积(pointwise conv)。直观感受是,同样做3通道输入、64通道输出的卷积,标准卷积参数量是3×64×3×3=1728,深度可分离卷积大约是3×3×3 + 3×64×1 = 27+192=219,参数少了将近一个数量级。代价是精度会有轻微下降,但大多数任务可以用增加宽度或分辨率来弥补。

还有一个我实际做过的案例,特别能体现CNN的通用性:用CNN识别恶意软件。思路很简单,很多恶意代码的二进制字节流可以被组织成二维矩阵(“伪装”成灰度图),然后用图像分类的思路去做。一个常见流程是:先把PE文件解析出来,取其原始字节;再把字节流按固定宽度(比如256或者512)重排成矩阵,缺失部分补零;最后把矩阵归一化后送入ResNet或浅层CNN做二分类/多分类。

这个案例最有意思的点在于,CNN并不是只认识“自然图像”,它认识的是局部结构。恶意代码在字节层面往往有重复的模式,比如某些恶意家族会使用相同的花指令序列、跳转片段或加密壳特征,这些局部模式在重排后的图像里就表现为纹理特征。CNN的卷积操作天然擅长捕捉这种局部纹理,所以做恶意软件家族分类时效果往往不错。我试过用浅层CNN配合少量数据增强,在公开数据集上能跑出一个可以接受的基线,比纯手工特征要省事得多。

当然这里有几个工程上的坑要提前说。第一,样本长度不一样,重排成矩阵时尺寸不一致,我一般会统一截断或补零到一个固定长度,比如1MB以内按1MB处理,超过就截断;第二,恶意软件数据集类别不平衡非常严重,常见的家族样本量可能差几十倍,这种情况下光用准确率会被带偏,要看混淆矩阵和F1;第三,训练集和测试集不要按文件随机划分,要按恶意软件家族划分,否则同家族的变种会被拆到两边,导致验证结果虚高。这个教训我踩过,当时测试准确率高达98%,换到真实流量样本上直接掉到70%多,后来才发现是数据划分出了问题。

2.3 CNN的边界:哪些场景不该硬上

CNN不是万能的。它的归纳偏置是“局部相关性”,但很多问题的关键恰恰在全局依赖上。比如一个句子中主语和谓语可能隔着几十个词,两个像素虽然距离很远但语义上关联很强,这些场景下标准CNN的感受野覆盖不足,哪怕堆了很深的层,全局信息的传递效率也不高。

另外,CNN对旋转和尺度变化不是天生鲁棒。你可以通过随机旋转、随机缩放等数据增强让它学得更稳,但本质上是“用数据量换不变性”。如果换一个任务,比如医学影像中病灶可能以非常不同的角度和大小出现,数据量又有限,CNN这套方案的成本就会非常高。相比之下,BERT这样的Transformer结构因为使用全局注意力,天然能捕捉长距离依赖,这也是为什么跨领域迁移时很多人优先选Transformer。

所以我的建议是:图像分类、目标检测、视频理解这类局部纹理和空间结构重要的任务,CNN或者CNN+Transformer的混合结构是首选;而长文本、长序列、全局关系建模任务,直接用Transformer家族会更省心。如果显存有限又不确定选什么,可以先拿ResNet18当基线,跑通了再往复杂结构上迁移。

3. 序列模型与时间序列建模:RNN/LSTM/GRU和TCN

3.1 RNN家族的共性思路与“记忆”瓶颈

RNN家族的核心是一个带“记忆”的循环结构。在时间步t时,模型接收当前输入x_t和上一步的隐藏状态h_{t-1},通过公式 h_t = activation(W_h h_{t-1} + W_x x_t + b) 更新隐藏状态。这个隐藏状态理论上记住了之前所有输入的信息,所以RNN天然适合处理序列,比如语音、文本、传感器时间序列。

但RNN有个很经典的问题:长序列时梯度容易消失或爆炸。因为在反向传播时,误差信号要沿着时间步连乘回去,每一步乘以一个小于1的矩阵范数,乘多了梯度就趋近于0,模型根本无法学习到远处信息。LSTM通过引入细胞状态和三个门——遗忘门、输入门、输出门——来解决这个问题。细胞状态像一条“传送带”,门控机制决定哪些信息写入、保留或输出,让梯度能够沿着这条传送带相对无损地反向流动。GRU是LSTM的简化版,把门从三个减到两个:重置门和更新门,参数更少,训练更快,在很多中小规模任务上效果与LSTM接近。

从工程角度看,训练RNN/LSTM有几个常规操作。第一个是梯度裁剪,把梯度的L2范数限制在一个范围(比如1.0),防止梯度爆炸;第二个是合理的初始化,LSTM的遗忘门偏置经常被初始化为接近1的值,让模型在训练早期倾向于“记住”,这个技巧在很多框架里默认实现了;第三个是注意序列长度,因为LSTM串行执行时间步,序列越长训练越慢,显存占用也越高。我实测过,在长序列上LSTM比TCN慢不少,因为TCN可以在时间维度上并行卷积。

3.2 TCN:用卷积做序列建模的另类路线

TCN是我在时间序列项目里用得很顺手的结构。它全称Temporal Convolutional Network,思想很直接:用一维卷积来处理序列。为了让输出只依赖当前和过去的信息,TCN使用因果卷积:卷积核在时间上只向前看,不会“偷看”未来。为了保证建模长距离依赖,TCN使用空洞卷积(dilated convolution),也就是在卷积核的元素之间插入间隔。间隔按1、2、4、8这样指数增长,从第一层到第n层,感受野可以指数级扩大。

TCN的感受野有一个比较常用的计算方式。假设每层卷积核大小为k,空洞系数分别为d_1, d_2, ..., d_n,那么最终感受野R约等于1 + sum_{i=1}^{n} ((k-1) * d_i)。举个实际例子,kernel_size=3,空洞系数分别是1、2、4,那么三层后的感受野就是1 + 21 + 22 + 2*4 = 15。这意味着模型能看到的输入窗口长度大约15个时间步。想要更大的感受野,要么加深网络,要么增大kernel_size或者dilation的倍数,三者在调参时需要结合实际序列长度做权衡。

TCN的优势非常明显:训练可以高度并行(卷积本身就是并行操作),梯度传播路径比LSTM短,很少遇到梯度过快消失的问题,感受野可以通过空洞卷积灵活控制。缺点也不是没有:调参需要一点经验,尤其是dilation倍数和层数的组合;另外如果做在线推理,因果卷积对每个时间步仍然需要保存足够的历史状态或使用带缓存的实现,和RNN推理方式不是一回事。

我这边的经验是,对于中长序列(比如几百到几千个时间步)的分类和回归任务,TCN往往能打得过LSTM,训练还更快。如果你的序列长度超过上万,TCN的感受野和内存开销会变大,这时要么改用Transformer的变体(比如Informer),要么考虑结合下采样。

3.3 滑窗滤波、特征拼接与序列模型预处理实测

提到时间序列建模,绕不开“滑动窗口滤波模型”这个话题。很多刚接触的人会把滑窗本身当成模型类别,其实它不是模型结构,而是一种预处理方式。具体做法是:用固定长度的窗口在序列上滑动,每滑动一步,窗口内的数据就当作一条样本;预测目标可以是窗口之后下一时刻的值(单步预测),也可以是窗口内这段数据的标签(序列分类)。

窗口长度怎么选,是我被问过最多的问题。没有一个万能值,但我有一个已经验证过多次的经验:先用简单统计方法估计序列的主周期。比如对传感器数据做自相关分析,看看滞后多少个时间步相关性最高,那个滞后数基本就是主周期。然后窗口长度建议取主周期的1到2倍。如果没有任何周期线索,就从一个小窗口(比如32)开始,每轮训练记录验证集loss,调大一倍再试,直到验证集loss开始恶化,就说明窗口太长、噪声太多了。这种做法比盲目拍一个值要靠谱得多。

另外,在把窗口数据送入模型之前,我强烈建议拼上一些手工统计特征。比如窗口内的均值、方差、最大值、最小值、一阶差分均值、以及窗口首尾值的差。这些特征本身就能提供很强的判别信息,模型可以先用这些特征“作弊”一把,降低训练难度。我在气象数据预测项目里实测过,同样的LSTM加上这些统计特征后,验证集误差下降了大约10%~15%。原因也好理解:模型不需要完全从原始波形中推断出“最近波动大不大”这类信息,统计特征已经告诉它了。

时间序列预处理还有一个特别容易踩的坑:归一化时使用了未来信息。举个例子,如果整个时间序列的均值和标准差是用全部数据算的,那么在划分训练集、验证集和测试集后,验证集和测试集就提前“看过”了自己分布的信息,叫look-ahead bias。正确做法是只用训练集的历史窗口统计量做归一化,然后把同一组参数应用到后续所有数据集。做滑窗时也要注意不要让相邻窗口的数据在训练集和测试集之间重叠,否则相当于测试集见过训练内容,指标会虚高。这个问题我在多家公司的项目里都见到过,属于典型低级但杀伤力很大的坑。

4. 注意力机制与Transformer家族:当前的主战场

4.1 Transformer核心机制拆解:QKV、自注意力和位置编码

从2020年前后开始,Transformer逐渐成了深度学习的主战场。它的核心是自注意力机制(Self-Attention)。我尽量用最简单的方式解释:对于输入序列中的每个位置,模型生成三个向量——Query(查询)、Key(键)和Value(值)。Query可以理解为“我想在序列里找什么”,Key表示“序列里的每个位置能提供什么”,Value就是“被找到后实际要取出的内容”。注意力分数通过 Query 与 Key 的点积计算,除以 sqrt(d_k) 做缩放,再经过 softmax 变成权重,最后加权求和所有的 Value。

为什么点积之后要除以 sqrt(d_k)?因为当向量维度 d_k 很大时,点积的方差也会变大,导致 softmax 的输入落在两端区域,梯度变得非常小。除以维度开方之后,点积的尺度被压回一个合理的范围,训练初期的稳定性会好很多。我做过对照实验,不除以sqrt(d_k)的时候,Transformer训练初期loss常常疯狂抖动,除以之后就顺了,从工程角度这个细节是不能省的。

多头注意力则是在“不同子空间”上下功夫。把特征维度切成h个头,每个头独立计算自注意力,最后再拼起来。这样可以让模型同时捕捉多种关系——有的头负责邻近词依赖,有的头负责长距离主题依赖。代码实现里常见的坑是维度变换,很多人直接在最后一维split再reshape,结果把头的维度和序列维度搞混。我习惯用 (batch_size, num_heads, seq_len, head_dim) 的中间形状,这样后续计算注意力矩阵时逻辑更清晰。

Transformer本身没有顺序概念,所以需要位置编码。最早的方法是正弦/余弦绝对位置编码,也就是把位置信息加到词向量上,它不需要训练参数,但对长度外推不友好。后来的RoPE(旋转位置编码)把位置信息通过旋转矩阵注入Query和Key,相对位置关系直接被编码在注意力计算里,目前被大量LLM采用;ALiBi则直接在注意力分数上加上一个基于距离的线性偏置,也能实现相对位置感知且外推能力不错。选模型时不妨多看一眼它用的位置编码方式,这会影响模型对长上下文的处理能力。

4.2 从BERT到DeBERTa:编码器结构的演进

BERT是我认为理解“编码器类Transformer”最好的切入点。它由多层双向Transformer Encoder堆叠而成,预训练任务包括掩码语言模型(MLM)和下一句预测(NSP)。[MASK] 随机遮住一部分词,让模型根据左右上下文预测被遮住的词,这种双向建模能力让BERT在下游理解任务上表现远超同时代的单向语言模型。不过这里要说明:BERT从严格意义上说不是百分百“双向”,其实核心就是双向上下文编码。把“双向”两个字理解成“能同时利用左右两侧信息”就够了,别陷入争议。

RoBERTa是一个很关键的工程改进版,它去掉了NSP任务,让模型更专注在MLM上;动态化生成掩码,而不是每次预训练都用同一个掩码;用更大的batch和更多数据来训练。这类“伯仲”之间的对比在调研时很容易被忽略,但工程上影响很大——微调RoBERTa通常比微调原始BERT更稳,特别是长文本理解任务。

DeBERTa则是我在语义理解任务里比较常用到的模型。它的核心创新是解耦注意力机制(Disentangled Attention)和增强式相对位置编码。简单说,它不再把单词内容和位置信息混在一个向量里,而是分成两路:内容向量负责“这个词是什么”,位置向量负责“词和词之间的距离是多少”。注意力的计算也因此变成内容-内容、内容-位置、位置-内容三种分数的组合。这样模型在理解“苹果”和“水果”这种语义关联时,既能利用内容语义,也能感知它们之间的相对距离。实验上,DeBERTa在一系列NLU基准上超过了同尺寸的BERT/RoBERTa。

从结构图角度看,DeBERTa的输入层由词向量加上相对位置编码组成,后面是多次重复的解耦注意力Encoder层,最后根据任务接不同的输出头。现在用HuggingFace加载DeBERTa模型很方便,但有几个小细节要提醒:它的输入tokenizer和BERT差不多,很多预训练权重默认是base/v3版本,直接微调时如果显存不够,建议用LoRA(低秩适配)而不是全量微调。因为DeBERTa-v3-base的参数量在一亿级别,全量微调在16GB显存下虽然能跑,但batch size会被压得很低。

4.3 LLM到底算不算深度学习:一个容易被追问的问题

这个问题的频率非常高,我在做调研时反复被问:“LLM属于深度学习吗?”答案非常明确:属于。而且LLM是目前深度学习中最具代表性的产品形态之一。LLM是“Large Language Model”的缩写,它的底层结构几乎都是Transformer的Decoder或Encoder-Decoder变体。从训练范式来看,它使用自监督预训练加指令微调、人类反馈强化学习等步骤,但核心优化方式仍然是基于梯度下降的深度学习训练。

从机器学习层次结构来看,可以整理成这样一条线:机器学习包括深度学习,深度学习包括基于深度神经网络的各类模型,而Transformer家族则是当前大模型的主流实现框架。所以“LLM是否属于深度学习”背后的疑问,其实是在问“预训练大模型是不是传统意义上的神经网络”。答案是:它就是深度神经网络,只是层数更多、参数更庞大、数据规模更大、训练集群更复杂。模型再大,也没有跳出“神经网络 + 梯度下降 + 表征学习”这个基本盘。

如果从Transformer结构角度看,LLM和传统深度学习模型的一个显著区别在于“涌现能力”——当参数量和训练数据规模跨过某个阈值后,模型会表现出小模型没有的能力,比如上下文学习(in-context learning)、思维链推理等。这并不意味着它变成了另一个物种,而只是规模效应带来了质变。所以在调研报告里,我不建议把LLM单独列成一个“模型类别”,更合理的做法是把它归入“Transformer家族 + 大规模预训练范式”这个复合标签。

4.4 工程部署:显存估算与低显存运行

Transformer虽强,工程部署却是硬骨头。先估算一下模型的显存占用。推理时,模型参数占用的显存大约等于参数量乘以每参数字节数:FP32是4字节,FP16是2字节,INT8是1字节。以7B模型为例,FP16推理仅参数部分就需要14GB,再加上激活值、KV Cache和CUDA上下文,实际占用很容易超过20GB。如果手里只有8GB显存,直接加载7B原模型是不现实的。

低显存运行模型的方案有很多,我比较常用的是这几种。第一是量化,把模型从FP16压到INT8甚至INT4,参数显存能降到原来的1/4甚至1/8,很多本地推理工具(比如Ollama、llama.cpp的GGUF格式)都支持这个能力。第二是KV Cache优化,比如使用PagedAttention或滑窗注意力,降低长上下文推理时的缓存开销。第三是参数高效微调,用LoRA/QLoRA而不是全量微调,因为全量微调的优化器状态(Adam的动量和方差)在训练时非常吃显存,QLoRA把基座模型冻结成NF4格式,只需要给LoRA适配器分配训练显存,能让单卡跑大模型的微调成为可能。

这里必须提醒一句:量化不是白给的。模型量化之后有时会出现输出质量下降,尤其是英文拼写、代码生成这类对精确度要求高的任务。我的习惯是:先跑几个关键case对比量化前后的输出,如果差异不大再用量化部署;如果差异明显,就要考虑混合精度:关键层保持FP16,次要层量化。所谓“低显存运行”从来不是只看显存数字,还要看任务质量是否达标。

5. 生成式模型与自监督范式:从GAN到扩散模型

5.1 GAN、VAE与扩散模型:三种生成路线的差异

生成式模型是近年来热度上升最快的类别,热词里的“照片修复模型”“扩散模型”都在这个范畴。要理解生成模型的差异,可以把它们看成三条不同的“造假”路线。

GAN由生成器和判别器组成。生成器负责把随机噪声变成看起来逼真的样本,判别器负责判断输入是真实样本还是生成的假样本。两者互相博弈,最终生成器能学会欺骗判别器。优点是生成图像细节清晰,缺点是训练极不稳定,容易出现模式崩塌——生成器只学会了生成少数几种“安全”样本,多样性变差。

VAE走的是“压缩还原”的路线。编码器把输入压缩到一个低维隐变量,解码器再从隐变量还原数据。训练目标是让隐变量服从一个先验分布,同时让重建误差尽量小。优点是非常稳定,隐空间有良好的连续性,适合做数据压缩、异常检测和可控生成;缺点是因为使用了均值和方差的采样机制,生成图像往往有些模糊,细节不够锐利。

扩散模型是当前生成质量最高的路线,Stable Diffusion、Midjourney、DALL·E这些产品背后基本都靠它。它的思路可以用一个类比讲明白:先把一张清晰照片不断加噪,直到变成完全随机的噪声图;模型学会做逆过程,从噪声里一步步“去噪”还原出清晰图像。它的优点是生成质量和多样性同时在线,不容易模式崩塌,缺点是推理时通常需要几十步迭代,计算量不小。不过DDIM等采样器可以把步数压缩到20~50步,配合Latent Diffusion在低维空间里操作,实际生成一张512×512图像在消费级显卡上已经可以接受。

5.2 照片修复、Embedding与生成模型的实际用法

“照片修复模型”是我在实际推荐给朋友时用得最多的扩散落地场景之一。老照片修复一般会拆成几个子任务:去噪、去划痕、超分、人脸修复和上色。现在的开源模型往往集成了这几个能力,但直接丢一张老照片进去,效果往往不理想。我的经验是分两步走:先用传统图像处理手段做预清理,比如用中值滤波去掉孤立的脉冲噪声,手动标注并修复大的撕裂区域;再把预清理后的图像交给深度学习生成模型做增强修复。原因是扩散模型会把图像中所有细节都当成自己需要重建的对象,如果原图有一块很大的划痕,它会自由发挥填补,结果可能偏离历史事实,预清理能把这种“自由发挥”的范围限制住。

还有人会把照片修复任务里的模型输出用固定随机种子跑多遍。扩散模型的输出有随机性,同一张图同一prompt,两次生成可能差很多。修复场景下,我建议固定seed并生成4~8个候选,再人工挑一张最自然、最符合原始人脸轮廓的结果。所谓“最符合原始人脸轮廓”,通常需要你在原图上先把关键点标出来对比,否则模型生成的脸可能很好看但不是照片里那个人。

另外要区分一个概念:生成模型里的Embedding和搜索/检索领域的Embedding模型不是一回事。Stable Diffusion里的“文本Embedding”是文本编码器(比如CLIP Text Encoder)输出的高维语义向量,用来作为生成的条件;而热词里“embedding模型排行”里的Embedding模型,通常指BGE、E5、GTE这类文本向量化模型,主要用于相似度检索、语义匹配和RAG。两者都叫Embedding,但一个是中间表示,一个是独立的产品化模型,调研和选型时千万不要混用。

5.3 训练稳定性陷阱与低显存环境下的妥协方案

生成模型最大的问题在训练稳定性。GAN尤其明显:生成器和判别器就像两个对手,如果一方太强,另一方就直接学不动。我刚开始调GAN时,最喜欢把判别器训得很准,结果生成器的梯度消失,loss曲线看起来很低,但生成出来的全是噪声。后来的经验是:不要让判别器收敛太快,可以给它用更小的学习率,或者每训练一次生成器再训练一次判别器,保持两者的节奏接近。与此同时,监控不仅仅是loss,还要定期人工查看生成样本,因为GAN的loss本身并不可靠。

扩散模型训练则不像GAN那样不稳定,但它贵。每一步去噪都相当于训练一个U-Net或DiT,数据量大时训练成本很高。我个人的妥协方案是先在小分辨率上做完整链路验证,比如64×64,等验证集效果和训练稳定性都满意了,再换到256×256或更高分辨率。因为大部分超参数——学习率、batch size、EMA衰减——在小分辨率上调出来的规律,大分辨率下大体仍然适用,但直接在大分辨率上反复试错,时间和电费都扛不住。

低显存环境下跑生成模型,我通常用几种组合拳:使用Gradient Checkpointing减少激活值显存、用混合精度训练、把batch size调到刚好能放进显存再配合梯度累积模拟大batch;如果还要更低,就用Latent Diffusion这类在潜空间里做生成的方案,因为它的U-Net处理的是压缩后的潜在特征图,分辨率压力会小很多。不管哪种方案,都要先看清楚显存瓶颈到底在参数、激活值还是优化器状态,不要一上来就无脑把模型量化,量化有时候会加剧生成质量下降。

6. 调研总结与选型实操:模型类别怎么转化为方案

6.1 一张速查表:不同任务优先看哪类模型

到了调研的最后阶段,我想把内容落成一张速查表,这也是我平时选型时实际会用到的参考。下表只针对“主流任务优先看哪类模型”,不涉及具体的排行榜和SOTA对比,因为SOTA迭代太快,而类别认知相对稳定。

任务类型优先考虑的模型类别代表模型/思路
图像分类CNN / TransformerResNet、EfficientNet、ViT
目标检测CNN / TransformerYOLO系列、DETR、DINO
图像分割CNN / TransformerU-Net、SegFormer、Mask2Former
文本分类/匹配Transformer EncoderBERT、RoBERTa、DeBERTa
文本生成Transformer DecoderGPT系列、LLaMA、Qwen
语音识别CNN+RNN / TransformerConformer、Whisper
通用序列预测RNN / TCN / TransformerLSTM、TCN、Informer
图像生成扩散模型 / GANStable Diffusion、DDIM、StyleGAN
检索/重排/RAGEmbedding模型(Transformer)BGE、E5、GTE
图结构任务GNNGCN、GAT、GraphSAGE

表格里的“优先考虑”不等于“非它不可”。比如目标检测用纯CNN的YOLO系列依然是最稳的工程选择,DETR的Transformer路线虽然端到端更简洁,但收敛速度慢,对训练技巧要求更高。实际项目中要把数据规模、显存预算、时延要求、团队熟悉度都放进来,再做最终决定。这份表格只是帮你把“第一候选”缩短到2~3个模型类别。

6.2 常见问题:调研中最容易踩的几个概念坑

这次调研踩了不少概念坑,我挑几个印象最深的分享。

第一,模型、算法、框架三个词不要混用。模型是数学结构,比如“Transformer编码器”;算法是具体求解方法,比如“AdamW优化器”“梯度裁剪”;框架是工程工具,比如“PyTorch”“HuggingFace Transformers”。很多人说“我用Bert模型”,其实指的是“我用HuggingFace加载了Bert预训练权重,并用PyTorch做微调”,这三层信息混在一句话里,沟通时极易产生误解。

第二,不要把“模型类别”和“模型名称”对立起来。同一个类别里模型的差异往往没有跨类别的差异大。比如BERT和DeBERTa都属于Transformer Encoder家族,它们在很多任务上的行为高度相似;而BERT与LSTM虽然都能做文本分类,但归纳偏置完全不同。理解类别比背SOTA名字更能指导选型。

第三,不要被“万物皆Transformer”的潮流带着走。CNN在图像局部特征提取上的效率和低延迟优势还在,TCN在中等长度时间序列上的效果经常不输Transformer,而且训练成本低很多。选模型不是追星,要回到数据形状和任务约束本身。

第四,像“LightGBM回归模型”这类梯度提升树模型,从技术上不是深度学习模型。它是机器学习范畴里的集成模型,虽然在某些表格数据任务上效果可能比深度学习还好,但算法原理与我们这份报告里讨论的所有模型都不一样。如果调研报告把LightGBM混进深度学习模型类别,读者对“深度学习”边界反而会变得模糊。

6.3 下一步调研方向预告

这篇是“主流深度学习模型类别调研报告(上)”,按计划还有(下)篇要写。我会在(下)篇里重点覆盖几个方向:图神经网络(GNN),包括GCN、GAT、GraphSAGE,它们的应用场景从社交网络分析到分子性质预测都有;深度强化学习模型,包括DQN、PPO、SAC等,它们与监督式深度学习的核心区别在于通过与环境交互学习策略;模型压缩与量化,包括蒸馏、剪枝、量化感知训练,这是我在工程部署里最常用的手段。

另外,我也会把两个在调研中被反复提到的点展开:一个是通过Ollama等工具做本地化大模型部署的常见做法,另一个是模型安全问题,比如模型中毒攻击(数据投毒)的威胁模型和防御思路。这些内容都属于当前深度学习的实际应用边界,一旦你手里的模型真正进入生产环境,它们往往比某些SOTA结构更重要。

最后说点个人感受。这轮调研做下来,我自己最大的收获不是记住了多少新模型,而是把散落在各个项目里的“点”串成了“线”。以前看到一个陌生模型,我会急着去搜它的论文和代码;现在我会先问一句:它属于哪个类别?它改变了哪个归纳偏置?它适合我的数据形态吗?这三个问题想清楚,再去读论文,方向感会强很多。建议你也可以按这个思路整理一份自己的模型类别地图,不一定非要从头写调研报告,只要能在团队里把“模型”这个词聊清楚,就值回时间了。