☰
从LeNet到GAN:一张图看懂神经网络核心组件与模型演进
2026/10/14 1:11:15 网站建设 项目流程

最近带了不少刚入门深度学习的朋友,发现一个很常见的现象:大家都能把卷积层、池化层、全连接层、激活函数这些名词挂在嘴边,也能顺着念出LeNet、AlexNet、VGG、ResNet、GAN这一串名字。但真要对着结构图,把每一层为什么存在、每个模型到底改了什么讲清楚,很多人立刻卡壳。这篇我打算用“看图拆零件”的方式,把神经网络的四个基础组成和五个里程碑模型的演进脉络放在一起说透。看懂结构图,往往是真正理解深度学习的第一步。

如果你是准备入门视觉方向的学生,或者已经在跑模型但总觉得原理像一层窗户纸,这篇应该对你有用。我不会堆公式,更多是讲清楚“它到底是什么、为什么要这么设计、实际使用时的坑在哪里”。

1. 先从一张结构图说起:神经网络里的四类基础零件

1.1 打开一张经典网络结构图,最先看到什么

随便搜一张LeNet或AlexNet的结构图,你会发现画面是从左往右流动的:最左边是一张输入图片,中间是一串由矩形色块组成的“管道”,最右边变成一条细长的向量,最后伸进一个输出框。色块的层叠不是装饰,每一层都在对数据做一次变换。

第一眼值得注意的规律是:图像的空间尺寸(宽和高)越往后越小,而通道数(彩色薄片的数量)越往后越多。这个过程有点像把一张照片一层层拆解——先用低层提取边缘、纹理,再用中层组合成局部形状,最后在高维空间里整理出“这是什么物体”的语义。CNN结构图之所以给人“越来越抽象”的感觉,正是因为特征图在逐层发生这种变化。

1.2 四个基础零件各自负责什么

结构图里反复出现的色块,本质上由四类零件堆叠而成:

组成一句话职责关键参数对张量的影响
卷积层在局部区域提取特征卷积核大小、步长、填充空间尺寸变小或不变,通道数变多
池化层对特征图降采样窗口大小、步长空间尺寸变小,通道数不变
全连接层把特征组合成最终得分输入节点数、输出节点数二维图展平成一维向量
激活函数给网络注入非线性函数类型数值做逐点变换,形状不变

一套典型的CNN流程可以理解为:卷积层负责观察,池化层负责压缩,激活函数负责决定哪些信号能往后传,全连接层负责在最后下结论。下面几节我会把每个零件单独拆开,讲清楚它的计算逻辑和容易被忽略的细节。

2. 卷积层:像拿放大镜一样逐块扫过画面

2.1 卷积核到底在算什么

卷积层是CNN的绝对主力。它的核心动作可以用一句话概括:拿一个带权重的正方形小窗(比如3x3),在输入特征图上按顺序滑动,每停一个位置就把窗口里的像素和窗口权重相乘之后全部加起来,得到一个数;划遍整张图,就得到一张新的特征图。

举个例子,输入是一张32x32的单通道图,用一个3x3的卷积核去滑。第一步,卷积核盖住第1行到第3行、第1列到第3列的9个像素,做一次加权求和,再叠加一个偏置项,结果写到输出图第1行第1列;然后窗口右移一个步长,继续算下一个位置。整个过程像拿一个镂空模板去比对布料花纹,重点不是你看了整块布,而是你在每个局部都记下一个“匹配度评分”。

这里的难点在于理解“匹配度”。卷积核里的权重数值不是手工设计的,而是训练过程中自动学出来的。不同的卷积核对不同的局部纹理敏感:有的核看到横向边缘响应大,有的核看到圆点响应大。这也是为什么说卷积层能“自动提取特征”——它不需要人告诉它什么是边缘,只需要从数据里自己摸索合适的滤波器组合。

2.2 决定输出尺寸的四个旋钮:核大小、步长、填充、通道数

实践中最常调的一组参数就来自卷积层。我习惯把它们想成四个旋钮。

  • 核大小(Kernel Size):窗口多大。常见3x3、5x5、7x7。核越大,一次看到的范围越广,但参数量和计算量也更大。
  • 步长(Stride):窗口每次滑多远。步长1是逐像素滑,输出和输入空间尺寸基本一致;步长2相当于每隔一个像素取一次结果,输出尺寸直接减半。
  • 填充(Padding):在输入四周补零。最直接的作用是防止边缘像素被“扫掉”。如果不想让特征图越缩越小,通常会用padding让卷积前后尺寸保持一致。
  • 通道数(Channels):这一层用多少个卷积核,输出就有多少个通道。每增加一个通道,相当于增加一类特征检测器。

输出尺寸的计算公式并不复杂,我建议自己手算一次:

W_out = (W_in - F + 2P) / S + 1

其中W_in是输入尺寸,F是核大小,P是填充量,S是步长。举个例子:输入32x32,核大小3,填充1,步长1,算出来还是32x32;如果把步长改成2,输出就变成16x16。这个公式我几乎每次搭网络都要用到,因为任何一个尺寸对不上,后续层全乱套。

2.3 局部连接和参数共享:两个被反复验证的设计精髓

卷积层之所以能取代全连接层处理图像,关键在两条设计原则。

第一是局部连接。图像里距离近的像素相关性高,距离远的像素相关性低。如果让每个神经元只看输入的一小片区域,而不是所有像素,既符合图像的天然规律,又大幅减少了连接数。

第二是参数共享。同一个卷积核会在整张图上滑动,也就是说,不管窗口滑到哪个位置,用的都是同一组权重。这背后的假设是:一种特征(比如水平边缘)在图像任何位置都可能出现,没必要为每个位置单独学一套检测器。

可以做个数字对比:输入是一张32x32的图像,如果第一个隐藏层有64个神经元并用全连接连接,那连接数高达32x32x64=65536个参数;而使用3x3卷积、输出64个通道,参数只有3x3x64=576个(不含偏置)。差距不是一星半点。正因如此,卷积层才能大幅降低模型复杂度,同时让网络获得某种程度的平移鲁棒性。

实测经验补充:新手调卷积时最常犯的错误是忘记检查padding和stride组合后的尺寸。我在项目里习惯每层后面先打印一下输出shape,而不是一口气堆完再回头看。尤其当你用步长2做下采样时,输入边长必须是偶数,否则很容易出现维度对不上。

3. 池化层:给特征图“瘦身”的取舍艺术

3.1 为什么需要池化:降维与稳定性一起拿到

池化层没有可学习参数,它的操作非常简单:在一个小窗口内做聚合统计,然后压缩特征图。最常见的配置是2x2窗口、步长2,也就是每2x2的区域被压缩成一个数,特征图宽高直接减半。

为什么要做这种压缩?第一是控制计算量。特征图如果一直保持大尺寸,后续卷积的计算开销会翻倍增长。第二是增强一定程度的位置不变性。物体在画面里偏移几个像素,经过池化后,窗口内的极值或均值往往变化不大,网络对位置抖动更不敏感。打个比方:你眯起眼睛看一张照片,不会因为人物的帽子偏了两厘米就认不出ta是谁——池化模拟的就是这种“容忍微小偏移”的粗粒度观察。

而且池化还有一个隐性收益:它扩大了后续层能看到的“有效视野”。虽然感受野真正变大要靠卷积堆叠,但因为每一层都在压缩分辨率,后续卷积核覆盖的实际范围也在扩大。

3.2 最大池化与平均池化的取舍

池化主要有两类,选谁得看场景:

类型计算方法特点适用场景
最大池化(Max Pooling)取窗口内最大值保留最强烈的响应,忽略弱信号边缘、纹理检测,分类任务更常用
平均池化(Average Pooling)取窗口内平均值保留整体响应,信号更平滑需要抑制噪声、强调整体统计信息时

用最大池化时还有一个细节容易被忽略:反向传播时,梯度只会传给窗口内最大值所在的位置,其他位置梯度为零。也就是说,池化层自己不学参数,但会决定“功劳给谁”。平均池化则把梯度平均分给所有位置。我在解释给同学听的时候常说:“最大池化是激烈淘汰赛,平均池化是民主评分。”

3.3 现代网络里,池化的位置和变体

有了卷积层之后,有人会问:既然卷积步长2也能把特征图尺寸减半,池化是不是可有可无?确实,现在很多网络倾向用步长2的卷积替代池化,因为它把“特征提取”和“降采样”合并到一步,信息损失方式更可学。但池化依然不是过时技术,它零参数、零训练成本,语义清楚,特别适合轻量级模型。

另一个值得认识的做法是全局平均池化(Global Average Pooling,GAP):把整张特征图压缩成一个数,然后直接接全连接层或作为输出。它的价值不止省参数,还能让网络适应不同尺寸的输入。ResNet就在分类头用GAP替代了传统全连接层,实际效果非常好。

我的习惯建议:刚开始学CNN时,先老老实实用最大池化把流程跑通,别一上来全改成步长卷积。等你对维度变化有感觉了,再去尝试替换方案,反而更容易理解两者各自的取舍。

4. 全连接层:把“空间特征”翻译成“最终答案”

4.1 从“全链接层”到“全连接层”,名字里藏着连接方式

不少资料会把这一层写成“全链接层”,业内标准术语其实是“全连接层”。之所以强调连接,是因为这一层的每个神经元都和上一层的所有神经元相连。如果输入是一组特征图,需要先把它拉平成一条一维向量,然后和权重矩阵做乘法。

你可以把全连接层理解为最后的“翻译官”:卷积层和池化层在前面已经把图像变成了高维特征表示,但这些特征还停留在“空间分布”的状态;全连接层把所有这些特征值综合起来,映射到类别得分的空间。比如前面的特征图是6x6x128,展开后就是4608个数,全连接层把这一串数变成10类各自的得分,完成分类的第一版决策。

4.2 它的参数为什么总是最多的

全连接层最大的特点,是参数密度极高。原因很简单:空间上每个位置都和下一个层每个节点相连,只要输入节点数多,权重矩阵就会飞速膨胀。

举一个具体例子:倒数第二层输出了8192个值(比如4x4x512的特征图拉平),最后一层需要分1000类,那这一层就有8192x1000约820万个权重,再加1000个偏置。这个数量往往比前面所有卷积层参数的总和还多。在AlexNet、VGG这些经典模型里,全连接层的参数占比可以超过90%。这也是为什么后来很多网络要砍掉全连接层——它不是计算负担最大的,却是存储负担最大的。

4.3 今天全连接层还有没有必要存在

全连接层在今天的网络里地位有些尴尬。一方面它的参数冗余严重,容易过拟合;另一方面它要求输入尺寸固定,导致整个网络只能处理固定大小的图片。所以很多现代网络用全局平均池化把特征图变成一维向量,再接一层轻量全连接作为输出头,既保留分类能力,又大幅减少参数。

不过这不意味着全连接层该被丢进历史。在目标检测、人脸识别等任务中,最后的分类头或特征嵌入层仍然普遍采用全连接。甚至Transformer里的MLP Block,本质也是一种全连接结构。它没有消失,只是换上更轻量、更聪明的用法。

5. 激活函数:全网唯一的“非线性来源”

5.1 为什么线性层层堆叠等于白堆

如果所有层都只做线性变换,那么不管堆多少层,整个网络本质上还是一个线性模型,这件事值得先摊开来证明一遍。

假设输入是x,第一层的输出是W1x + b1,第二层的输出是W2(W1x + b1) + b2。把括号展开后,W2W1*x仍然是一个线性变换,常数项合在一起是另一个偏置。也就是说,两层线性层的组合完全等价于一层线性层。深层网络如果缺少非线性,加深就失去意义,表达能力跟单层没有本质区别。

激活函数的作用,就是在线性变换之后做一次逐元素的非线性映射,让网络能够逼近复杂的函数关系。没有这一步,网络再深也只是一根直尺,有了这一步,才有可能折出任意复杂的曲线。

5.2 Sengmoid、Tanh、ReLU这几个“老熟人”

激活函数公式输出范围优点主要问题
Sigmoid1/(1+e^(-x))(0,1)输出可解释为概率两端饱和导致梯度消失,输出非零中心
Tanh(e^x-e^(-x))/(e^x+e^(-x))(-1,1)零中心,比Sigmoid更顺滑饱和区仍有梯度消失
ReLUmax(0,x)[0,+∞)计算极快,梯度不饱和负区间导数恒为0,神经元可能死亡
Leaky ReLUx若小于0则取ax全实数保留负值信息,缓解死亡需要额外选斜率a

在实践里,ReLU是绝大多数CNN的默认选择。它之所以流行,一个直观解释是计算成本几乎为零,而且正半区导数恒为1,反向传播时梯度不容易被连乘耗尽。Sigmoid在现代隐藏层里基本退役,只在特殊场景(比如二分类输出)还有用。

ReLU有一个著名的坑叫“Dead ReLU”:某个神经元一旦在负区间激活,它的梯度就变成0,权重再也得不到更新,仿佛彻底“去世”。这种情况多发生在学习率设得太大或者初始化不合适的时候。如果发现网络训练一段时间后大量神经元输出恒为零,可以试试Leaky ReLU或更小的学习率。

5.3 最后一层为什么总用Softmax

激活函数还有一个容易混淆的点:多分类任务最后一层经常用Softmax,但Softmax和前面说的激活函数不完全是一回事。它做的事情是把一组实数得分转换成概率分布,保证所有类别输出都大于0,并且加起来等于1。本质上它是一个归一化层,而不是逐点的非线性映射。

实际项目里常见的组合是:隐藏层用ReLU,最后一层接Softmax,损失函数用交叉熵。新手如果发现loss不降,建议先检查输出层前有没有数值爆炸,再检查标签是否从0开始编号,这两类问题我见过太多回。

6. 历史路径的起点:从LeNet到AlexNet,深度学习是这样“复活”的

6.1 LeNet:九十年代就把骨架立好了

LeNet是卷积神经网络真正意义上的开山之作,训练目标非常朴素:识别手写数字。它的输入是32x32的灰度图,结构是“卷积池化-卷积池化-全连接全连接-输出”。今天看这个结构也许觉得普通,但当时它确立了几条日后被反复验证的原则:局部感受野、权重共享、空间下采样、用多层自动提取特征。

让我觉得厉害的地方在于,LeNet是上世纪九十年代做出来的,那时算力比现在差了几个数量级。它却已经告诉整个领域:图像识别并不一定需要手工设计复杂的特征工程,端到端地让网络自己学特征完全行得通。只是受限于数据和算力,这套思路当时没有立刻席卷整个领域。

6.2 AlexNet:2012年的一次全面爆发

AlexNet是深度学习进入大众视野的转折点。它在一项大规模图像识别挑战赛里拿到远低于第二名的错误率,直接把舆论目光拉回到神经网络。整个模型大约8层,含5个卷积层和3个全连接层,总参数约6000万,放在当时是一个体量很大的网络。

它的突破不能只看结构,更要看三个关键助推器:第一,用GPU并行训练,让大模型训练时间从不可接受变成可以接受;第二,全面采用ReLU,显著加快收敛,配合Dropout抑制过拟合;第三,大量使用数据增强,相当于免费扩充训练数据。以前大家觉得深度学习“不灵”,很大程度是计算能力没跟上,AlexNet把这层窗户纸彻底捅破。

这里有个常被忽略的对比。LeNet输入是32x32灰度小图,AlexNet输入是224x224彩色图,两者处理的数据难度完全不同。AlexNet证明了:只要网络足够宽、足够深,并且配合恰当的训练技巧,复杂自然图像也能被端到端学习。从那之后,研究者开始认真思考一个问题:既然方向对了,是不是只要把网络做得更深更宽,性能就会一直涨?

7. VGG与ResNet:把网络做深的两套思路

7.1 VGG:用3x3小卷积堆出规整的建筑

VGG给出的答案很直接:我们要的就是规整和深。VGG几乎把结构设计变成了一套严格配方——不断重复“3x3卷积、步长1、填充1,加ReLU”,每隔一定次数就接一次2x2最大池化把尺寸减半。VGG16有16层可学习参数,VGG19加到19层,这在当年已经是名副其实的深度网络。

为什么只用3x3小卷积,不用更大的5x5或7x7?核心原因是“用小核堆出大感受野”:两层3x3卷积连起来的感受野等于一层5x5,三层3x3连起来等于一层7x7。但小卷积核的参数更少,而且中间还有激活函数,意味着每隔一小段就引入一次非线性,模型表达能力更强。这个设计理念现在看依然非常清醒。

VGG的缺点是参数和计算量都很大。但它留下了一笔宝贵遗产:规整结构太好用了,后来大量任务直接拿预训练VGG做特征提取器。我也在不少项目里见过“迁移学习首选VGG16”的配置,原因很简单,结构简单,不容易出错。

7.2 ResNet:更深之后撞上“退化”问题

VGG让“越深越强”成为一种直觉,但研究者很快发现真相没那么简单。网络层数增加到十几层或几十层时,训练集上的误差反而可能上升,这跟过拟合还不太一样,因为它连训练数据都拟合不好。这种情况被称为“退化”问题。直觉解释是:深层网络里的恒等映射很难被一组堆叠的非线性层精确表示,每层都学一点小扰动,结果反而破坏了信息。

ResNet的解法只有一个看上去很小的改动:在卷积块旁边加一条跳接(shortcut),让输出等于F(x)+x。这里的F(x)是网络层要学的东西。如果某个残差块根本没学到有用的变换,F(x)可以接近0,那么输出近似等于x,等于这个块被安全跳过。给网络信息多开了一条“直达通道”,深层训练突然稳定了。

这个设计精妙在两点上。第一,恒等跳接不引入额外参数,只是把输入加到输出上,计算增量可以忽略。第二,反向传播时梯度可以沿着跳接线直接传向浅层,极大缓解了梯度消失。ResNet把可训练层次推到了上百层,同时性能与训练稳定性都明显优于VGG。它的核心思想后来渗透到了几乎所有现代网络里,包括Transformer中的残差连接。

7.3 从VGG到ResNet,到底是一次什么层面的进化

如果只看某些结构图,ResNet似乎只是多了一条箭头。但理解深度时要抓住实质:VGG追求的是结构规整带来的“均匀变深”,ResNet解决的是“如何让更深的结构真正受益”。后者思考的重点从“网络能容纳多少层”变成了“信息如何在层间流动”。每次我讲到这里都说一句话:ResNet不是让你硬塞更多层,而是让多余的网络层学会“闭嘴”,没有贡献就安静地走旁路。

对初学者来说,对比VGG和ResNet是绝佳的训练思维素材。VGG是归纳法的产物,把所有变化都压缩进规则的堆叠里;ResNet是问题驱动的产物,先定义清楚“深网络的病根”,再给出针对性手术方案。

8. GAN:从“判断它是什么”转向“凭空创造一张”

8.1 范式切换:判别式模型和生成式模型是两种玩法

前面四个模型都在做同一件事:给定输入,输出标签或特征。这属于判别式模型的范畴。GAN则开启了一个完全不同的方向——它不仅判断图片,还要从随机噪声中生成看起来真实的全新图片。

GAN的核心构造是一组“双人博弈”:生成器(Generator)负责把随机噪声变成图片,判别器(Discriminator)负责分辨一张图是来自真实数据集还是由生成器伪造。训练时,生成器拼命想骗过判别器,判别器拼命想揪出伪造痕迹。两者不断互相升级,最终希望达到一种均衡:生成器造出的图越来越真,判别器的分辨能力越来越强。

形象点说,生成器像一个造假币的工匠,判别器像一个验钞专家。工匠每次改进工艺都能让假币更像真币,验钞专家也会研究新的防伪点。高手过招,双方都在变强,最后出来的产品几乎可以以假乱真。

8.2 对抗训练的现实骨感:不稳定是常态

GAN的损失函数听上去很漂亮:生成器和判别器的目标完全相反,一个要最小化,一个要最大化,形成极小极大博弈。但真训练起来,你会发现它比普通分类模型难伺候得多。

最常见的三个坑是:训练震荡(loss曲线像心电图)、模式坍缩(生成器只输出几种单调图片,假装变花样)、以及判别器太强或太弱导致的失衡。判别器太弱,生成器学不到有效梯度;判别器太强,又直接把生成器“碾压”到梯度消失。理想状态是两者旗鼓相当,但这需要精心调参。

我常用的实操建议包括:

  • 先用小尺寸图片训练,比如把分辨率控制在64x64以内,迭代速度快,方便观察现象。
  • 交替更新,不要一次把判别器训到收敛再训生成器,保持双方梯度在相似量级。
  • 不要只看loss,每隔几步就把生成器采样的图片可视化保存,肉眼判断远比数值靠谱。
  • 如果出现模式坍缩,尝试减小学习率,或给判别器输出做标签平滑。

GAN让“生成”从任务变成了一个框架。后来的风格迁移、图像翻译、超分辨率重建,很多都能看到对抗训练的基因。它和前面四个模型的关系不是替代,而是从“神经网络能识别世界”跨越到“神经网络能创造世界”。

9. 结合实际谈谈怎么学这五个模型

如果让我给一条学习路径,我的建议是不要按名字背,而是按“问题”串起来。

第一步,手画LeNet的结构图,标出每一层的输入输出尺寸,把卷积层、池化层、全连接层和激活函数的配合关系吃透。第二步,对比AlexNet和LeNet,找出多出的部分分别解决了什么,比如ReLU、Dropout、数据增强,都是针对具体痛点。第三步,再看VGG时,注意它如何用一致规则把深度推上去;遇到ResNet时,想清楚残差连接的恒等映射价值。最后再碰GAN,用前面建立的结构感去理解生成器和判别器的角色差异。

我自己带人的时候通常会让对方用大白话写一行“一句话总结”。几个人聊完之后,这套体系会变得特别清晰。比如LeNet是“证明卷积能识别手写数字”,AlexNet是“更大网络+ReLU+GPU让深度学习回归”,VGG是“小而规整的核堆出深度”,ResNet是“跳接让网络学会无损加深”,GAN是“双网络对抗生成新内容”。能用自己的话说出这五句,远比记住一堆参数数字更有用。

最后分享一个我一直在用的土办法:拿一张A4纸,把LeNet一路画到ResNet,每画一个层必须写清楚输入输出尺寸。画完一遍再回头看论文,很多记不住的概念会自动变清晰。这篇就到这里,希望你能顺着结构图的线索,把神经网络从头到尾走通。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询