
这三个网络看起来是深度学习的三块积木但说实话很多人学完依然是散的知道MLP是“多层感知机”但不知道它跟“万能逼近”到底什么关系看过CNN的卷积核动图但图像为什么非得用它而不是普通全连接网络说不出个所以然RNN更是被一堆LSTM、GRU的变体绕晕。更麻烦的是学完这三样往大模型那一看Transformer一上来全是注意力机制感觉前面白学了。这篇文章我打算把这三兄弟彻底串成一条线它们各自的“核心思路”是什么、解决了哪个具体问题、又是怎么一步步把接力棒交到如今的大模型手里的。不堆公式用生活化的比喻和工作中的实际取舍来讲透最后落到一条你可以直接照着走的学习路径上。1. 三张底牌为什么说MLP、CNN、RNN是深度学习的基本盘先把话说在前面如今大模型LLM满天飞但翻开任何一个主流大模型的架构图你都能在角落里找到这三张底牌的影子。Transformer里最不起眼的Feed-Forward NetworkFFN本质就是MLP视觉模型里哪怕用ViT早期也要靠卷积做patch嵌入而RNN虽然被自注意力压了一头但在处理长序列的某些任务里它的变体依然好用甚至在端侧部署上还有优势。1.1 一张表格看清三个网络的分工很多初学者最大的困惑就是不知道这三个网络到底分别管什么事。我用一句话概括MLP处理“一张平平无奇的特征表”只管把输入映射到输出不关心数据的顺序和结构。CNN处理“有空间结构的数据”比如图像、音频频谱靠“局部感受野”和“权值共享”来提取局部特征。RNN处理“有时间顺序的数据”比如文本、语音、股票序列靠“记忆”来捕捉前后文关系。把三者放一起对比就更清晰了。特性MLP多层感知机CNN卷积神经网络RNN循环神经网络核心思路逐层非线性变换拟合任意函数局部连接 权值共享提取平移不变特征隐藏状态循环传递建模时间依赖擅长数据表格类、特征向量图像、空间网格数据序列、时间序列、文本关键操作矩阵乘法 激活函数卷积 池化同一权重在不同时间步复用最大瓶颈参数量爆炸无法处理高维原始数据难以直接建模长距离依赖长序列梯度消失、难以并行大模型时代的位置FFN层、输出层仍是MLP视觉模型patch嵌入、下采样仍有用被自注意力替代但LSTM在端侧/流式场景仍活跃这张表建议你收藏后面不管学什么新结构都先拿这张表去对照一下它到底属于哪个流派、改进了哪个瓶颈。1.2 一个容易忽略的事实深度学习的“深度”从哪来理解了分工还得理解“深度”这两个字。为什么三四个隐藏层的网络往往打不过十几个甚至上百层的网络原因不只是一个函数表达能力强弱的问题更关键的是特征层级化。这就好比破案第一层网络可能只能看到边缘、颜色这些零散线索第二层把线索拼成局部图案比如眼睛、轮胎第三层再把图案组装成有意义的整体比如人脸、汽车。层数越深能抽象出的语义层级越高。MLP、CNN、RNN这三者都在干同一件事——通过堆叠层来逐级抽象特征只是抽象的方式不同MLP是全局连接的抽象CNN是局部滑动的抽象RNN是时间推移中的抽象。理解这一层后面看ResNet、Transformer的跳跃连接、注意力机制时思路就会顺畅很多。2. MLP拆解那个被低估的“万能逼近器”MLP听起来最高端实际结构最简单输入层、若干隐藏层、输出层层与层之间全连接。很多教程一句话带过但我建议你认真吃透它因为深度学习中90%的优化技巧在MLP上都能做最小化实验。2.1 从感知机到MLP非线性才是灵魂最早的感知机只有一层只能处理线性可分的问题稍微拐个弯的数据就歇菜了。MLP的关键改进是在每层输出后加了一个非线性激活函数。举个例子如果要判断一个人是否适合买某个保险产品输入是年龄、收入、职业风险等级如果只用线性变换模型学到的只能是一条直线/平面去切分空间。现实数据哪有那么规整年龄和购买意愿往往不是线性关系——年轻人可能兴趣低、中年人兴趣高、老年人兴趣又低这就是一条曲线。激活函数比如ReLU、Sigmoid、Tanh的作用就是让网络有能力“弯曲”决策边界去拟合这种曲线。这就是著名的万能逼近定理只要隐藏层神经元足够多MLP就能以任意精度逼近任意连续函数。注意它说的是“逼近”不是“精确等于”而且需要足够的宽度和深度。这也是为什么深度学习被称为“用足够大的网络去暴力拟合数据分布”。2.2 手推一个最小MLP前向传播和反向传播不手推一遍永远理解不透BP。我拿一个只有1个隐藏层、隐藏层2个神经元的网络举例输入向量为x [x1, x2]比如年龄、收入隐藏层权重为W1偏置为b1输出层权重为W2偏置为b2激活函数用ReLU即数学上max(0,z)。前向传播z1 W1 * x b1 # 隐藏层线性变换 a1 max(0, z1) # 隐藏层激活 z2 W2 * a1 b2 # 输出层线性变换 y_pred sigmoid(z2) # 输出概率损失函数用交叉熵目标是让y_pred贴近真实标签y。反向传播的过程本质上就是在用链式法则算“每个参数对损失的梯度”然后沿梯度反方向更新参数。∂L/∂W2 ∂L/∂y_pred * ∂y_pred/∂z2 * ∂z2/∂W2 ∂L/∂W1 ∂L/∂y_pred * ∂y_pred/∂z2 * ∂z2/∂a1 * ∂a1/∂z1 * ∂z1/∂W1注意ReLU的导数是分段函数z0时为1z0时为0。这就是为什么ReLU容易导致“神经元死亡”——如果某个神经元输出恒为负梯度就是0参数永远不更新了。实际训练时我会用LeakyReLU或控制学习率来规避这个问题。实操心得初学者别一上来就上PyTorch/TensorFlow的封装接口。我强烈建议用NumPy手写一次MLP的前向反向然后用梯度检查gradient check验证数值梯度和解析梯度是否一致。这一步做过之后你会发现后面学CNN、RNN心里特别有底。2.3 MLP的致命短板参数灾难与结构盲区MLP不是万能的它有两个致命短板理解这两个短板就能理解为什么CNN和RNN必须出现。第一个短板是参数灾难。假设输入是一张32x32的彩色图片即3072个像素值如果第一层隐藏层有1024个神经元那么这一层的权重数量就是3072×1024约314万个参数。这才只是第一层做一个低分辨率的任务都已经这么夸张了。如果输入是224x224的图片MLP根本没法落盘。第二个短板是结构盲区。MLP把每个输入特征当成独立维度处理不具备“相邻像素之间可能有关联”的先验知识。一张猫的图片往左平移两个像素MLP看到的就是完全不同的输入向量但语义明明没变。这种平移不变性的缺失让MLP在处理图像时需要海量数据去硬记各种位置的变体效率极低。说白了MLP是个“瞎子摸象”式的学习者它不关心特征从哪里来只关心所有特征拼接后映射成什么结果。而CNN恰恰就是针对这两个短板设计的。3. CNN实战从卷积核到经典结构的完整认知CNN的核心说穿了就是两个词局部感受野和权值共享。这两个词对应着上一节MLP的两个短板一一对症下药。3.1 卷积到底在算什么一个可以手算的例子很多人看卷积动图看得眼花实际上它就是“一个窗口滑过整个图像窗口内做加权求和”。拿一个最简单的边缘检测场景举例。假设图像是5x5的像素矩阵图像中间竖着一条边界左边亮像素值200右边暗像素值50[[200, 200, 200, 50, 50], [200, 200, 200, 50, 50], [200, 200, 200, 50, 50], [200, 200, 200, 50, 50], [200, 200, 200, 50, 50]]用一个Sobel边缘检测用的3x3卷积核[[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]这个核做的事情很直观比较左右两侧的像素差。当窗口滑到中间的边界区域时左边三个像素被乘上负数右边被乘上正数求和后得到一个较大的值当窗口完全落在平坦区域时左右差异小计算结果趋近于0。输出的特征图会在边界位置出现“亮线”这就完成了边缘检测。这跟CNN学习到的卷积核是同一个道理只不过Sobel核是人工设计的CNN里的核是通过训练自动学出来的。训练早期卷积核往往就是边缘、颜色块检测器训练后期深层卷积核会组合出纹理、部件甚至物体的整体模式。一个容易忽略的细节padding填充和stride步长会直接改变输出特征图的尺寸。公式很简单输出尺寸 (输入尺寸 2×padding - 卷积核尺寸) / stride 1。工程上常用padding1、stride1来保持尺寸不变用stride2或池化来下采样。3.2 池化为什么不可或缺不是简单“压缩”而是引入不变性卷积之后通常接池化层Pooling。很多人以为池化就是“压缩图片减少计算量”这没错但只说对了一半。池化更重要的作用是让网络获得一定程度的平移不变性和局部鲁棒性。举个例子最大池化Max Pooling取窗口内最大的值作为输出。当你训练一个猫脸检测器时只要猫眼、猫须在某个局部区域内被卷积捕捉到了哪怕它们在像素级别有几像素的偏移最大池化照样输出很大的激活值。这个特性给了网络一定的“容错空间”不需要对像素级别的精确位置过度敏感。我在实际使用中更倾向于用stride2的卷积来替代池化比如ResNet等现代结构就很少用池化做下采样。原因是最大池化会丢失一部分位置信息而带步长的卷积在减少分辨率的同时还能让网络学习如何取舍信息。但从学习理解的角度池化依然是个非常好的认知起点。3.3 为什么图像处理不用前馈神经网络一个形象的类比这个问题几乎每次入门课都会被问到。我的答案从来都很直接全连接网络在处理高维图像时既算不动也学不好。算不动是参数灾难——之前算过光一层1024个神经元的全连接层就有314万参数。CNN用同一个3x3卷积核把整张图跑一遍权重数量只有9个或者说输出通道×输入通道×9个参数量降了几个数量级。学不好是全连接不会“平移共享”。一只猫在图片左上角还是右下角对全连接来说就是两种完全不同的模式而对CNN来说只要卷积核学到了“猫”这个局部模板它扫到哪里哪里就能被识别出来。这背后的专业术语叫归纳偏置inductive bias——我们预先告诉网络“图像的局部特征具有平移不变性”把它写死在卷积结构里从而让网络用更少的例子学得更好。3.4 从LeNet到ResNet必须掌握的经典结构演进真正理解CNN不能只看原理得看结构演进每一步演进都是在解决上一代模型的痛点。LeNet-51998CNN开山之作用来识别手写数字。结构是“卷积池化卷积池化全连接”这个骨架至今仍是很多轻量模型的原型。AlexNet2012激活函数换成ReLU、加了Dropout防过拟合、用GPU并行训练把深度学习带进主流视野。VGG2014用堆叠的小卷积核3x3代替大卷积核证明“更深”比“更大”更重要。GoogLeNet/Inception2014在同一层用不同尺寸的卷积核并行提取不同尺度特征。ResNet2015加入跳跃连接skip connection让梯度可以跨层回传解决了“越深越难训练”的退化问题。深度一下从十几层跳到上百层。这里的ResNet特别值得展开说一句。在ResNet之前人们发现网络层数堆上去之后训练误差反而上升了这不是过拟合而是优化困难。ResNet的聪明之处是把“学习一个复杂映射”变成“学习一个残差”与其让网络直接拟合H(x)不如让网络学F(x) H(x) - x然后输出H(x) F(x) x。当网络觉得“这一层什么都不做最好”时它只要让F(x)趋近0就够了x的信息通过跳跃连接原样传递。4. RNN循环网络记忆、梯度与序列建模的挣扎处理完空间结构再来处理时间结构。RNN的核心设计是隐藏状态——一个不断往上叠加的“工作记忆”理论上可以把之前所有时间步的信息都浓缩在里面。4.1 循环结构的本质同一权重的跨时间复用普通MLP是每层一套权重RNN是所有时间步共享同一套权重U、W、V。这就是“循环”二字的含义。数学上t时刻的隐藏状态h_t tanh(U * x_t W * h_{t-1} b)也就是“当前输入x_t”和“上一步的隐藏状态h_{t-1}”一起决定当前步的隐藏状态然后h_t影响当前步的预测y_t。这就像读一句话的时候读到“苹果”这个词你脑子里会带着前面“我喜欢吃”的上下文去理解它而不是孤立地看一个词。这种结构的好处很明显与CNN同时处理整张图不同RNN是真正逐字读入的——任意长度的序列都能喂进去而且理论上能建模任意长度的依赖。但问题也随之而来。4.2 梯度消失/梯度爆炸RNN最大的痛不用数学也能理解RNN训练有一个著名的痛点梯度消失/梯度爆炸。网络上把这个概念讲得非常玄乎其实可以用一个类比讲清楚。想象你在传话从第1个时间步传到第100个时间步每个时间步的梯度都要乘一次权重W。如果W中的特征值小于1乘100次之后梯度会指数级缩小到几乎为0——这就是梯度消失网络的前面阶段根本学不到东西远距离依赖根本记不住如果大于1梯度会指数级增大到溢出——梯度爆炸训练直接发散。这也是为什么RNN被诟病“记性差”它理论上能记住长句实际上只能记住十几步以内的信息。解决这个问题的主要方案有两类改进架构LSTM和GRU引入“门控机制”输入门、遗忘门、输出门让网络自己决定该记住什么、该忘掉什么。改进训练技巧梯度裁剪gradient clipping、更小学习率、更好的权重初始化。4.3 看一眼LSTM的“内存管理”思路LSTM长短期记忆网络是在RNN基础上加了两条线主线和记忆线。每条时间步LSTM里的遗忘门决定保留多少旧记忆输入门决定写入多少新信息输出门决定对外输出多少记忆。用最直白的话说RNN只有一块容易乱涂乱画的小黑板而LSTM等于给黑板加了橡皮擦和白板笔还配了个管理员按需决定先擦掉什么、再写上什么。但LSTM也带来了新问题——结构复杂、计算量大、难以并行。因为每个时间步必须等上一个时间步计算完才能继续GPU的优势完全发挥不出来。这就为后面Transformer的登场埋下了伏笔能不能去掉循环用全局注意力一步到位5. 从三大网络到大模型Transformer如何继承与颠覆很多人问大模型时代MLP、CNN、RNN是不是已经过时了我的答案是它们没有过时而是被重构了。Transformer能绵延成大模型正因为它分别吸收了三大网络的长处又解决了各自的痛点。5.1 自注意力CNN的全局版CNN用“局部感受野”提取特征好处是参数少、有平移不变性坏处是感受野有限。深层CNN必须堆叠很多层信息才能传到远处。Transformer的自注意力机制一上来就让每个token可以和序列里的所有token直接交互等于把“感受野”一次性拉满到全局。通俗理解CNN是一个只能看见周围三四个人的人要了解全场情况得一层层往外传话Transformer是个站在高台上的人一眼就能看见全场每个人并且能直接判断自己该重点关注谁。注意力权重就是这种“重点关注谁”的强度分布。5.2 位置编码失去顺序感之后的补救Transformer摒弃了循环结构带来一个隐患它天然不关心单词顺序。“我爱你”和“你爱我”在自注意力眼里如果不加额外信息几乎是等价的。于是有了位置编码Positional Encoding——把每个token的位置信息以向量形式注入嵌入层。就像给每个座位上的人发了一个号码牌让模型在全局交互时也能感知先后顺序。这正好回应了RNN的痛点循环结构本来天然隐含顺序但无法并行Transformer牺牲了天然顺序感用位置编码弥补换来的是完全可并行化。大模型能靠海量数据跑起来并行化是基础。5.3 MLP、CNN、RNN在大模型里分别以什么形态活着很多人学完三大网络后去看GPT的架构图发现满眼都是Multi-Head Attention和Feed-Forward Network很容易自我怀疑。我帮你明确对位MLPTransformer中每个注意力层之后都接一个FFN就是两三层全连接网络作用是给每个位置的特征做非线性变换和通道间信息混合。你甚至可以把Transformer理解成“一层全局特征混合注意力 一层局部特征变换MLP”的交替堆叠。CNN纯文本大模型里没有CNN但多模态大模型的视觉编码器里比如CLIP的ViT早期层常用卷积来做patch embedding很多轻量化大模型也会借鉴卷积的局部建模来降低计算量。CSPNet这类骨干网络还在持续为CNN注入新的生命力用于高效视觉特征提取。RNN在长序列建模上自注意力O(n²)的计算复杂度是个绕不过去的坎。于是出现了很多“RNN复兴”的工作RWKV、Mamba这类新架构用线性注意力或选择扫描机制在保持较好建模能力的同时把复杂度降到O(n)本质上是用RNN的思路做更高效的序列建模。6. 学习路径与实战经验三条建议助你少走弯路基础概念串完之后给正在入门的读者几条实在的建议。这些都是我自己带人、带项目时验证过的方法照着走能少踩很多坑。6.1 先手写再框架最后上大模型任务我接触过太多一上来就PyTorch调用nn.Linear、nn.Conv2d的学员模型是能跑通但问一句“梯度是怎么到Conv层权重的”就卡壳了。这是典型的“只会调包不懂内功”。我的建议分三步走用NumPy手写一次MLP和一次CNN的前向、反向。不用实现得很高效关键是把维度推导和梯度流动搞明白。做完这一步再看PyTorch的自动求导你会觉得它可爱极了。用PyTorch重写一遍经典模型LeNet或ResNet-18在CIFAR-10上训练观察训练曲线、过拟合现象、学习率影响。这一步建立对训练流程的直觉。上大模型任务拿HuggingFace的transformers库跑一个最小的文本分类任务用attention可视化一下模型重点看了哪些词。中间可以借助一些可视化网站辅助理解但千万不能只看不动手。6.2 训练中一定会遇到的三个坑这些坑不是课本上常见的但几乎每个人都会踩第一个坑是学习率设置不当。初期学习率太大会导致Loss曲线震荡甚至NaN太小会让训练慢到怀疑人生。建议做法是先用一个很小的子集跑几个step观察Loss是否能下降再按指数增长扫描出合适的学习率范围最后用Cosine退火或OneCycle策略训练。第二个坑是数据集划分不当导致的“假效果”。尤其是在文本和序列任务中如果随机打乱数据会让模型“偷看”未来信息验证集效果虚高。处理序列任务时必须按时间顺序划分训练集和验证集。图像任务则要注意类别均衡否则模型会学成“样本多的类全对样本少的类全错”。第三个坑是只看Loss不看指标。Loss下降了不代表任务成功。比如类别不平衡时模型只要全预测为多数类Loss也可能不高但召回率就是0。建议每轮训练都记录Accuracy、Precision、Recall、F1的多维指标用小本本记下对比。6.3 从MNIST到中文大模型部署一条可行的完整上手路径纸上谈兵没意思我建议你最好跑一个真实链路用MindSpore或PyTorch在MNIST上训练一个CNN理解全流程然后切换到中文文本分类任务把数据预处理、词嵌入、模型训练、评估全部走一遍最后再尝试部署一次开源大模型到本地——可以先从量化版的较小参数模型开始用vLLM或llama.cpp跑起来体验一下硬件需求和推理速度。这里分享一个我常用的路径先跑通一个7B量级的模型量化后用OpenWebUI搭一个简单的本地问答界面然后再深度微调一个小模型去完成一个具体任务比如文档问答。当你把这条路完整走通之后你会对“大模型”这个词祛魅——它本质上就是“更大的MLP 多头的注意力 海量的数据/参数”组合出来的产物。我自己带团队做项目时的一个持久体会是大模型再凶猛对基础网络的理解深度会直接决定你排查问题的上限。很多时候一个注意力输出维度不对、一个序列长度没对齐导致的报错底层原因就是你对三大网络维度流动的直觉不够强。把MLP、CNN、RNN彻底吃透再去追大模型这不是绕路而是最快的捷径。