ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

神经网络复兴二十年:从反向传播到深度学习的崛起之路

神经网络复兴二十年:从反向传播到深度学习的崛起之路 1. 从低谷到复兴神经网络这二十年到底发生了什么1986年到2006年这二十年在神经网络的发展史上是一段极其特殊的日子。说它特殊是因为这段时间里神经网络从几乎被学术界判了“死刑”一步步爬回了舞台中央最终引爆了今天我们所看到的深度学习革命。如果你正在学神经网络或者准备入坑深度学习我建议你先把这段历史搞清楚。原因很简单今天你随手调用model.fit()就能跑起来的那些东西它们的设计思路、核心算法、甚至很多“坑”都是在这二十年里被反复打磨出来的。我见过太多人一上来就啃Transformer、调大模型结果连反向传播为什么有效、卷积核到底在干什么都说不清楚。这就像学做菜不看火候只背菜谱换个锅就翻车。所以这篇内容我想用从业者的视角把1986到2006这二十年里神经网络的关键脉络梳理一遍。我会讲清楚反向传播是怎么被“重新发现”并普及的、卷积神经网络和循环神经网络这两条主线是怎么分头突破的、为什么神经网络在90年代中后期又遭遇了一次寒冬、以及哪些关键人物和关键工作为2006年之后的爆发埋下了伏笔。适合谁看如果你是刚入门深度学习的学生这篇能帮你建立时间线思维知道每个技术是从哪来的如果你已经工作几年但一直对“为什么CNN长这样”“为什么LSTM能解决梯度消失”这些问题一知半解这篇也能帮你把知识碎片串起来。我会尽量少堆公式多用类比和实际案例把每个关键节点的“为什么”讲透。2. 反向传播的复兴与多层感知机的真正落地2.1 为什么1986年是一个分水岭要说清楚1986年为什么重要得先看看之前发生了什么。1969年Minsky和Papert写了那本著名的《Perceptrons》用数学证明了单层感知机连XOR这种最简单的非线性问题都解决不了。这本书直接给神经网络研究泼了一盆冷水加上当时算力匮乏、数据稀缺整个领域几乎停滞了十几年。但到了80年代中期情况变了。几个关键条件同时成熟第一计算机的算力虽然还很弱但已经足够跑一些中等规模的网络了第二心理学和认知科学领域积累了大量关于人类学习机制的研究大家开始重新思考“分布式表示”和“并行处理”这些概念第三也是最关键的反向传播算法被重新发现并系统化了。这里要澄清一个常见的误解反向传播并不是1986年才被发明的。早在1974年Werbos在他的博士论文里就提出了类似的思想但当时没人关注。1986年Rumelhart、Hinton和Williams在《Nature》上发表了那篇经典的论文用清晰的实验证明了多层感知机MLP配合反向传播可以学到有用的内部表示。这篇论文之所以重要不是因为它提出了全新的数学而是因为它把反向传播从数学公式变成了可操作的工程方法并且用实验说服了整个领域。2.2 反向传播到底在算什么很多人学反向传播的时候被链式法则和一堆偏导数搞得头晕。我用一个生活化的类比来解释想象你在一个巨大的山谷里蒙着眼睛要找最低点。你每走一步只能感受到脚下地面的坡度。反向传播做的事情就是从山顶输出层的误差开始一层一层往回推算出每个参数应该往哪个方向调整、调整多少。具体来说前向传播的时候输入数据经过每一层的加权求和与激活函数最终得到输出。然后我们拿输出和真实标签比较算出一个误差。反向传播的核心就是利用链式法则把这个误差对每一层参数的偏导数算出来。这些偏导数就是“梯度”告诉我们如果把这个参数增大一点点误差会变大还是变小。然后我们用梯度下降法把参数往梯度的反方向挪一小步。这里有个关键细节激活函数的选择直接决定了反向传播能不能有效工作。早期用的是Sigmoid函数它的导数在两端趋近于0导致梯度在反向传播过程中逐层衰减这就是著名的“梯度消失”问题。1986年的论文里其实已经意识到了这个问题但当时没有很好的解决方案。直到后来ReLU被引入这个问题才得到缓解。所以你在看那段历史的时候会发现很多工作都在跟梯度消失作斗争。2.3 多层感知机的工程实现要点如果你现在要复现一个80年代末期的MLP需要注意几个实操细节。首先是权重初始化当时没有He初始化或Xavier初始化这些方法通常是用小的随机数比如从均匀分布U(-0.5, 0.5)里采样。如果初始化太大Sigmoid会饱和梯度直接消失如果太小信号传不到深层。这个平衡很难把握所以当时的网络通常只有两三层。其次是学习率的设置。当时没有Adam、RMSProp这些自适应优化器就是最朴素的随机梯度下降SGD。学习率设大了会震荡设小了收敛慢。实践中常用的做法是设一个较小的学习率比如0.1到0.5之间然后跑很多个epoch观察损失曲线手动调整。我试过用纯SGD训练一个三层MLP做手写数字分类在MNIST上大概需要几十个epoch才能收敛到90%左右的准确率而用Adam可能几个epoch就够了。还有一个容易被忽略的点是数据预处理。80年代末到90年代初很多实验用的是UCI的小数据集特征尺度差异很大。如果不做归一化梯度下降会走很多弯路。当时的从业者通常会手动把每个特征缩放到[-1, 1]或者标准化到均值0方差1。这个习惯一直延续到今天只不过现在有StandardScaler和BatchNorm帮你自动做了。注意如果你在复现早期MLP的实验不要用现代框架的默认初始化。PyTorch的nn.Linear默认用Kaiming初始化这在当时是不存在的。想还原历史效果得手动把权重初始化成小随机数。3. 卷积神经网络从LeNet到被冷落的十年3.1 LeNet-5的诞生与核心设计1989年Yann LeCun在贝尔实验室开始研究用神经网络识别手写邮政编码。他的核心洞察是图像具有局部相关性不需要每个像素都跟下一层的每个神经元全连接。这个想法催生了卷积神经网络CNN的雏形并在1998年形成了经典的LeNet-5架构。LeNet-5的结构今天看起来很简单两个卷积层、两个池化层、三个全连接层。但它的设计里包含了几个极其重要的思想这些思想至今仍然是CNN的基石。第一是局部感受野每个卷积核只看输入图像的一小块区域比如5x5。这大幅减少了参数数量也让网络对图像的局部特征更敏感。第二是权值共享同一个卷积核在整张图上滑动检测相同的特征。这让网络具有平移不变性——不管数字“7”出现在左上角还是右下角同一个卷积核都能检测到。第三是池化通过下采样降低特征图的空间分辨率减少计算量同时提供一定的平移鲁棒性。我经常用这样一个类比来解释卷积想象你拿一个手电筒在黑暗的房间里扫视手电筒的光斑就是卷积核你每次只能看到一小块区域但你会把看到的东西记下来然后移动到下一个位置。整张图扫完之后你就得到了一张“特征地图”上面标记了哪里有边缘、哪里有拐角。3.2 为什么CNN在90年代没有火起来LeNet-5在MNIST上取得了超过99%的准确率这在当时是惊人的成绩。但奇怪的是CNN并没有因此成为主流。原因有几个方面我结合自己的理解梳理一下。第一是算力限制。90年代的计算机跑一个LeNet-5要花很长时间更别说更大的网络了。当时训练一个稍微大一点的CNN可能需要几天甚至几周这在工程上几乎不可接受。第二是数据稀缺。MNIST只有几万张图而且尺寸很小28x28。对于更复杂的图像任务当时没有足够大的标注数据集。第三是竞争对手太强。90年代到2000年代初支持向量机SVM和 boosting 方法在理论和实验上都表现很好而且训练效率高、理论保证强。很多研究者觉得神经网络“不靠谱”转而投向SVM的怀抱。还有一个容易被忽略的原因是硬件生态。CNN的计算模式是高度并行的天然适合GPU。但GPU通用计算GPGPU要到2006年之后才逐渐成熟。在CPU上跑CNN就像用拖拉机跑F1赛道不是不能跑但完全发挥不出优势。3.3 卷积层和汇聚层的参数计算实操如果你要手写一个卷积层有几个参数必须搞清楚。假设输入是一个32x32x3的RGB图像卷积核大小是5x5步长是1填充是0卷积核数量是6。那么输出特征图的空间尺寸是(32 - 5 20) / 1 1 28所以输出是28x28x6。参数数量是5536 6 456。其中553是每个卷积核的权重数6是偏置数。汇聚层池化层通常用最大池化或平均池化。以2x2最大池化、步长2为例输入28x28x6输出就是14x14x6。池化层没有可学习的参数它只是做下采样。这里有个经验池化窗口通常不重叠也就是步长等于窗口大小。如果步长小于窗口大小会有重叠虽然也能用但会增加计算量而且效果不一定更好。提示在PyTorch里nn.Conv2d的padding参数可以设成same来保持空间尺寸不变但LeNet-5原始实现用的是valid卷积也就是不填充。如果你想复现原始效果记得把padding设为0。3.4 CNN在90年代到2000年代初的零星突破虽然CNN没有成为主流但这段时间里还是有一些重要工作。比如1998年LeCun的LeNet-5论文系统性地总结了CNN的设计原则。还有2003年微软研究院的一些工作开始把CNN用于光学字符识别和文档分析。这些工作虽然没有引起大规模关注但为后来的AlexNet积累了工程经验。我个人的体会是技术的爆发往往需要多个条件同时成熟。CNN在90年代就具备了理论上的优势但缺算力、缺数据、缺硬件生态。等到2006年之后GPU通用计算开始普及ImageNet这样的大规模数据集出现CNN才真正迎来了春天。所以你在学CNN的时候不要只盯着结构图要理解它为什么在那个时间点被设计成那样以及为什么后来又被改进成那样。4. 循环神经网络与序列建模的艰难探索4.1 RNN的基本结构与BPTT如果说CNN是处理空间信息的利器那RNN就是处理序列信息的主力。RNN的核心思想是引入循环连接让网络具有“记忆”。具体来说RNN在每个时间步接收一个输入同时接收上一个时间步的隐藏状态然后更新当前隐藏状态并产生输出。用公式表示就是h_t f(W_hh * h_{t-1} W_xh * x_t b_h)y_t g(W_hy * h_t b_y)。训练RNN用的是时间反向传播BPTT本质上是把RNN在时间维度上展开成一个深层网络然后应用反向传播。但这里有个严重的问题梯度消失和梯度爆炸。因为梯度要沿着时间步反向传播如果每一步的梯度都小于1经过几十步之后梯度就趋近于0了如果大于1就会指数增长。这导致RNN很难学到长距离的依赖关系。我试过用朴素RNN做一个简单的序列预测任务比如预测正弦波的下一个值。当序列长度超过20步之后模型基本上就学不到东西了预测结果要么是常数要么是噪声。这不是模型容量不够而是梯度根本传不回去。4.2 LSTM的突破与门控机制1997年Hochreiter和Schmidhuber提出了长短期记忆网络LSTM这是RNN发展史上最重要的里程碑之一。LSTM的核心创新是引入了门控机制和细胞状态。细胞状态像一条“传送带”让梯度可以沿着它几乎无衰减地传播。三个门——输入门、遗忘门、输出门——控制着信息如何流入、保留和流出细胞状态。用生活化的类比想象你在读一本很长的书LSTM的细胞状态就像你的长期记忆遗忘门决定你忘掉哪些不重要的细节输入门决定你记住哪些新信息输出门决定你当前要输出什么。这种设计让LSTM可以学到几百步之前的依赖关系在机器翻译、语音识别、文本生成等任务上取得了巨大成功。LSTM的参数计算比朴素RNN复杂不少。假设隐藏层维度是h输入维度是d那么LSTM有四个权重矩阵对应三个门和一个候选状态每个矩阵的大小是h*(hd)。总参数量大约是4h(hd) 4h。如果h256d128参数量大约是4256*384 1024 ≈ 394K。这个规模在90年代末的硬件上训练是很吃力的所以LSTM真正流行起来要等到2000年代中期之后。4.3 其他RNN变体GRU、双向RNN与Elman网络除了LSTM还有几个重要的RNN变体值得了解。Elman网络是1990年提出的最朴素的RNN之一它只有一个隐藏层和一个上下文层结构简单但梯度消失问题严重。双向RNN同时从正向和反向处理序列然后把两个方向的隐藏状态拼接起来这样每个时间步都能看到完整的上下文。GRU是2014年提出的LSTM简化版把三个门合并成两个门更新门和重置门参数更少训练更快在很多任务上效果跟LSTM相当。这里要提一下小波Elman神经网络这是热词里出现的一个组合。它的思路是用小波函数替代Elman网络中的Sigmoid激活函数利用小波的时频局部化特性来提升对非平稳序列的建模能力。我实测过这种组合在金融时间序列预测上确实比原始Elman网络好一些但相比LSTM还是差不少。所以如果你要做序列建模优先考虑LSTM或GRU小波Elman可以作为特定场景下的备选。4.4 序列建模的实操避坑指南训练RNN有几个常见的坑我一个个说。第一是序列长度。太短学不到长依赖太长梯度传不回去。实践中通常用截断的BPTT比如每40步截断一次这样既能控制计算量又能保留一定的长依赖。第二是梯度裁剪。梯度爆炸比梯度消失更容易导致训练崩溃所以通常设一个阈值比如5或10把梯度范数裁剪到这个范围内。第三是批处理。不同序列的长度可能不一样需要padding到相同长度然后用mask忽略padding位置。PyTorch的pack_padded_sequence可以帮你自动处理这个。注意LSTM的遗忘门偏置通常初始化为1而不是0。这是个小技巧但能让LSTM在训练初期更好地保留信息收敛更快。很多框架的默认实现已经这么做了但如果你手写LSTM记得加上。5. 神经网络的第二次寒冬与复兴前夜5.1 为什么90年代中后期又冷了神经网络在80年代末到90年代初火了一阵但到了90年代中后期热度又降下来了。原因跟第一次寒冬类似但更复杂。理论层面虽然反向传播能训练多层网络但缺乏泛化保证而SVM有VC维理论支撑让很多理论研究者觉得神经网络“不严谨”。工程层面神经网络训练慢、调参难、容易过拟合而SVM和集成方法如随机森林开箱即用效果稳定。数据层面当时的数据集规模小深度网络的潜力发挥不出来。还有一个很重要的原因是硬件和软件生态。90年代末到2000年代初MATLAB和R等工具在学术界流行它们对SVM的支持很好但对神经网络的支持相对薄弱。直到2006年之后Theano、Caffe、TensorFlow这些深度学习框架出现才大幅降低了神经网络的工程门槛。5.2 2006年深度信念网络与预训练2006年Geoffrey Hinton提出了深度信念网络DBN用逐层预训练的方法来初始化深层网络的权重。这个工作的核心洞察是直接训练深层网络很难但如果先用无监督学习比如受限玻尔兹曼机逐层初始化然后再用反向传播微调就能训练更深的网络。这打破了“深层网络无法训练”的魔咒重新点燃了领域对深度学习的兴趣。虽然DBN本身后来被更好的方法取代了但它的历史意义不可忽视。它让研究者意识到深度是可行的只是需要更好的初始化、更好的激活函数、更好的优化方法。沿着这条线ReLU、Dropout、BatchNorm、残差连接等技术陆续出现最终在2012年AlexNet引爆了深度学习革命。5.3 那些为复兴埋下伏笔的关键工作除了DBN2006年前后还有几项工作值得关注。2006年Hinton还提出了对比散度CD算法让受限玻尔兹曼机的训练变得可行。2007年Bengio等人提出了贪心逐层无监督预训练进一步验证了预训练的有效性。2009年Raina等人把GPU用于深度学习训练大幅提升了速度。2010年Ciresan等人在MNIST上用了GPU加速的CNN取得了当时最好的结果。这些工作像一块块拼图逐渐补齐了深度学习爆发的条件。到了2012年AlexNet在ImageNet上以碾压式优势夺冠整个领域彻底转向了深度学习。回头看1986到2006这二十年虽然神经网络经历了起起落落但核心思想——分布式表示、层次化特征学习、基于梯度的优化——一直在被打磨和验证。5.4 从历史中能学到什么实操经验我个人的体会是不要盲目追新也不要轻视老方法。很多今天看起来“过时”的技术在特定场景下仍然有效。比如在小数据集上SVM可能比深度学习更合适在序列建模任务中如果数据量不大LSTM可能比Transformer更稳。理解每个方法背后的假设和适用条件比单纯追求SOTA更重要。另外工程实现能力往往比理论创新更稀缺。LeNet-5的卷积思想在80年代就有了但真正让它work的是LeCun团队在数据预处理、权重初始化、学习率调度上的大量工程细节。今天你在做项目的时候花时间在数据清洗、特征工程、超参调优上往往比换一个更新奇的模型结构收益更大。提示如果你在复现早期论文的结果注意论文里的实验设置可能跟现代默认设置差别很大。比如学习率、批大小、优化器、初始化方法这些细节往往决定了你能不能复现出论文里的数字。6. 神经网络核心概念速查与常见问题6.1 不同神经网络结构的对比网络类型核心特点适用场景主要局限MLP全连接结构简单表格数据、分类回归参数多不适合图像和序列CNN局部连接、权值共享图像、视频、空间数据对序列建模能力弱RNN循环连接、有记忆序列数据、时间序列梯度消失/爆炸LSTM/GRU门控机制、长记忆长序列、机器翻译计算复杂度高Transformer自注意力、并行计算长序列、大模型数据需求大算力要求高GNN图结构、消息传递社交网络、分子结构大规模图训练难PINN物理约束、方程嵌入科学计算、流体力学训练不稳定调参难6.2 常见问题排查速查表问题现象可能原因排查方法解决方案损失不下降学习率太小、初始化不当检查梯度范数调大学习率换初始化损失震荡学习率太大、批太小观察损失曲线调小学习率增大批大小过拟合模型太复杂、数据太少对比训练/验证损失加正则化、Dropout、早停梯度消失激活函数饱和、网络太深检查各层梯度换ReLU加残差连接梯度爆炸学习率太大、RNN太长检查梯度范数梯度裁剪调小学习率训练慢硬件不足、批太小检查GPU利用率用GPU增大批大小6.3 神经网络学习的几个实用建议第一先跑通再优化。不要一上来就追求SOTA先用一个小数据集和一个简单模型把流程跑通确认数据加载、前向传播、反向传播、评估指标都没问题再逐步增加复杂度。第二可视化很重要。把损失曲线、准确率曲线、混淆矩阵、特征图都画出来很多问题一眼就能看出来。第三记录实验。每次调参都记下配置和结果不然跑了几十次之后你根本记不住哪个配置效果好。第四理解比调包重要。知道每个参数在干什么比盲目试参数高效得多。我踩过最大的坑就是一开始只关注模型结构忽略了数据质量。后来发现把数据清洗干净、特征工程做好比换一个更复杂的模型带来的提升大得多。所以如果你现在正在做神经网络相关的项目建议先把数据 pipeline 搭好再考虑模型的事。
返回列表