神经网络基础像搭乐高。单个积木很小,组合起来能表达复杂形状。人工神经元是最小积木,网络结构是拼出来的城堡。我学这部分时,总在“数学公式”和“直觉画面”之间来回切换。
1.1 生物神经元与人工神经元模型
生物神经元有树突、胞体、轴突和突触。树突像很多根天线,接收其他神经元的信号。胞体整合信号,超过阈值后,轴突传出电脉冲,突触把信号交给下一个神经元。我学生物课时,脑子里出现一个拥挤的微信群:消息不断汇总,某个人觉得消息够多了,就转发给下一个群。
人工神经元把过程简化成数学。输入 x、权重 w、偏置 b,先算加权和 z = Σ(w_i x_i) + b,再过激活函数 f,得到输出 a = f(z)。权重代表连接强度,偏置像调节门槛的小旋钮。缺少激活函数时,多层网络会退化成一个大线性变换,表达能力很有限。我刚写感知机时,把权重和偏置都设成 0,模型完全学不动,换随机初始化才有变化。
我常用一个比喻解释:权重决定“谁的话更重要”,偏置决定“这个人容不容易被说服”。生物神经元有兴奋和抑制,人工神经元用正负权重模拟影响。真实神经元复杂得多,有时间动态、化学环境、不同突触类型,人工模型只抓了核心抽象。
1.2 前向传播、权重、偏置与输出计算
前向传播是数据从输入走向输出的过程。每经过一层,网络做一次线性组合,再加激活函数。矩阵形式很简洁:Z = XW + b,A = f(Z)。X 是输入样本,W 是权重矩阵,b 是偏置向量。单个样本时写成向量点积,批量样本时矩阵运算更高效。
拿手写数字识别举例。输入是一张 28×28 的灰度图,拉平成 784 个像素值。一个隐藏层有 128 个神经元,输出层有 10 个神经元,对应 0 到 9。靠近输入的那层计算会得到 128 维隐藏表示,输出层给出 10 个分数。分数经过 softmax 变成概率,概率最大的那个就是预测数字。
我调试过一个小网络,输入两个特征,隐藏层三个神经元,输出一个值。前向传播代码只有几行,权重矩阵形状错了却让我找了半小时。那次经历让我记住:权重和偏置的维度必须对齐,批量大小、输入维度、输出维度都要心里有数。输出计算看起来只是乘加,网络的能力却来自这些乘加的组合方式。
1.3 网络层、损失函数与学习目标
网络层是神经元按功能分组。输入层接收原始特征,隐藏层做特征变换,输出层给出预测。全连接层里,每个神经元和上一层所有神经元相连。层数、每层宽度、连接方式决定网络容量。我习惯把层看作一组可学习的函数,每层把表示空间扭曲一下。
损失函数告诉网络错得有多离谱。回归常用均方误差,分类常用交叉熵。预测和标签之间的差距变成一个标量,训练目标就是让这个标量变小。学习目标不是记住训练数据,而是在没见过的数据上也表现好。我踩过坑:训练集准确率冲到 99%,验证集却很差,模型把训练样本背下来了。
训练时,网络先做前向传播得到输出,再算损失,再通过反向传播计算梯度,优化器更新权重和偏置。这个循环会重复很多轮。损失曲线往下走,说明参数在往有用的方向移动。损失不降或震荡,可能是学习率、数据、初始化或模型结构出了问题。
1.4 常见网络类型与基础应用场景
常见网络类型有全连接网络(MLP)、卷积神经网络(CNN)、循环神经网络(RNN)和 Transformer。MLP 适合表格数据和小型分类回归。CNN 擅长图像,局部连接和权值共享减少参数。RNN 处理序列,有记忆机制。Transformer 用注意力,处理长距离依赖,在文本、语音、视觉都用得多。基础应用场景包括图像分类、目标检测、情感分析、机器翻译、推荐系统和时序预测。
我在项目里用 MLP 做过用户流失预测。把年龄、使用时长、点击次数等特征输入,输出流失概率。CNN 我用来做过缺陷检测,输入产线图片,输出是否有划痕。RNN 和 Transformer 我更多在文本任务里接触,比如评论分类和摘要生成。不同网络类型像不同工具箱,选哪个要看数据结构和任务目标。
对新手来说,不用一上来就追最复杂的结构。把 MLP 的前向传播、损失函数、梯度更新跑通,理解权重和偏置怎么学,后面学 CNN、RNN、Transformer 会轻松很多。我见过不少人直接调 Transformer,却说不清一层里发生了什么。基础打牢,调参和排错才有方向。
上一章把前向传播走了一遍,激活函数只提了一句。没有它,多层网络会退化成一个大线性变换,深度就失去意义。我做过一个极简实验:两层线性网络拟合异或,损失怎么都不降。给隐藏层加上ReLU,准确率很快冲上去。激活函数是神经网络非线性表达能力的来源,也影响梯度流动、收敛速度和训练效果。
我见过新手把激活函数当成可有可无的装饰,直接堆全连接层。训练结果很差,却找不到原因。激活函数选择不只是调参小事,它决定神经元如何响应输入,也决定反向传播时梯度怎么传。下面从必要性、经典函数、对比维度、选择实践四个角度展开。
2.1 激活函数为什么必要:非线性与表达能力
线性层的叠加还是线性。两个线性变换复合:y = W2(W1x + b1) + b2,展开合并成 Wx + b。不管叠多少层,网络只能画直线或超平面。异或问题、螺旋分类、图像边界都搞不定。我初学感知机时,以为层数多就强,后来发现没有激活函数,一百层也白搭。
激活函数给线性输出加一个非线性弯折。ReLU把负值压成零,正值保留。Sigmoid把整个实数轴压进0到1。每个神经元根据输入落在哪个区间,决定自己是否活跃、活跃多少。多个这样的弯折组合起来,网络就能逼近复杂函数。我喜欢把线性层想成揉面团,激活函数像在面团上切一刀或折一下。折的次数够多,形状就丰富。
表达能力还跟激活函数的平滑性、饱和区、非单调性有关。平滑函数在优化时梯度变化连续,硬折线函数计算简单但局部梯度可能突变。非单调函数比如Swish、GELU,能让小负值也有少量响应。我选激活函数时,会想这个任务需要多复杂的弯折,再决定用哪种非线性。
2.2 经典激活函数:Sigmoid、Tanh、ReLU 及其变体
Sigmoid 的公式是 σ(x)=1/(1+e^{-x}),输出范围(0,1)。它把大负数压到0附近,大正数推到1附近,中间近似线性。早期神经网络用得多,现在隐藏层少用。导数最大只有0.25,两端饱和后导数接近0。深层网络反向传播连乘小梯度,梯度消失很快。我拿Sigmoid搭过三层MLP,训练损失下降像蜗牛爬,换ReLU后快了好几倍。输出层做二分类时,Sigmoid配二元交叉熵仍然常见。
Tanh 输出(-1,1),公式是 (e^x-e^{-x})/(e^x+e^{-x})。它零中心,比Sigmoid少一点偏置问题。导数范围(0,1],饱和区梯度也小。RNN隐藏状态常用Tanh,状态需要正负值。前馈网络里Tanh也逐步让位给ReLU系。我做过情感分类,隐藏层用Tanh,训练比Sigmoid稳,但深层还是慢。
ReLU 是 max(0,x)。正区间导数恒为1,负区间导数为0。计算只要一次比较,速度极快。正区间不饱和,梯度消失缓解很多。负区间硬零带来稀疏激活,也带来“神经元死亡”风险。学习率太大时,一些神经元对任何输入都输出0,梯度永远为零,参数不再更新。我调过一个文本分类网络,学习率0.1,一半ReLU死掉,损失卡住。降到0.001,换Leaky ReLU,才恢复训练。
ReLU变体不少。Leaky ReLU 负区间给一个小斜率,通常0.01,避免完全死亡。PReLU 把负斜率当可学习参数。ELU 负区间平滑到 -α,输出均值接近零。GELU 用高斯累积分布,Transformer前馈层常见。Swish/SiLU 是 x·sigmoid(βx),平滑、非单调。我在BERT类模型里见GELU最多,轻量CNN里ReLU仍是默认。变体不是越新越好,要看任务和算力。
2.3 激活函数对比维度:梯度、饱和、稀疏性与计算开销
梯度行为决定训练能否顺利。Sigmoid和Tanh在饱和区导数很小,深层反向传播时梯度连乘容易消失。ReLU正区间导数恒1,梯度能传得更远。负区间导数0,可能让部分神经元不更新。Leaky ReLU负区间有小导数,梯度不会完全断掉。GELU和Swish平滑,梯度随输入变化,优化曲面更细腻。我看激活函数时,会先看它在常用输入区间的导数曲线。
饱和指输入很大或很小时输出变化极小。Sigmoid两端饱和,Tanh两端饱和,ReLU负端硬饱和。饱和区神经元对输入不敏感,学习停滞。Sigmoid饱和还会让损失曲面出现平坦区,梯度下降慢。Tanh饱和区稍窄,问题类似。ReLU死亡算一种极端饱和。Leaky ReLU和ELU在负区间保留响应,缓解这个问题。
稀疏性方面,ReLU负区间输出零,天然产生稀疏激活。稀疏表示节省计算,也可能增强特征选择性。稀疏过度会损失模型容量。Leaky ReLU、PReLU、ELU、GELU、Swish在负区间有非零输出,稀疏性低一些。我在一个图像分类实验里统计过,ReLU中间层约50%激活为零,Leaky ReLU约20%,GELU更低。稀疏性没有绝对好坏,跟任务和正则化一起看。
计算开销上,ReLU最便宜,一次取最大值。Sigmoid和Tanh要算指数,开销更大。GELU要算误差函数或近似,Swish要算Sigmoid再相乘。边缘设备、移动端、实时推理更偏好ReLU系。训练大模型时,GELU的开销可以接受,算力充足。我部署轻量模型时,优先ReLU或ReLU6。选激活函数要平衡精度、速度、内存。
2.4 按任务与层类型选择激活函数的实践指南
隐藏层默认从ReLU开始。CNN里ReLU是长期基线,轻量网络、移动端模型用ReLU或ReLU6。深层网络可以试GELU、Swish,Transformer前馈层常用GELU。RNN里Tanh和Sigmoid常见,门控单元用Sigmoid,候选状态用Tanh。MLP处理表格数据,ReLU通常够用。分类任务里,隐藏层ReLU加输出层Softmax,是很多项目的起点。
输出层激活函数跟任务绑定。二分类用Sigmoid,多分类用Softmax,多标签分类用Sigmoid,回归用线性输出。输出层激活函数要跟损失函数匹配。Sigmoid配二元交叉熵,Softmax配多类交叉熵,线性配均方误差。我见过多分类网络输出层用Sigmoid,损失用交叉熵,训练很不稳。换成Softmax后正常。输出层不是随便选的,它决定预测如何解释。
选择流程可以这样走。先用ReLU基线跑通,看训练损失和验证损失。梯度消失明显,换Leaky ReLU、ELU或GELU。神经元死亡多,降学习率或换Leaky ReLU。需要平滑、非单调激活,试GELU或Swish。部署资源紧张,ReLU优先。不要频繁更换激活函数,数据、初始化、学习率、批归一化都可能是问题源头。我习惯每次只改一个变量,记录对比。
收尾时我想说,激活函数没有万能答案。ReLU简单快,Sigmoid适合概率输出,Tanh适合零中心状态,GELU适合Transformer。选择依据是任务、层类型、梯度行为、计算预算。下一章进入反向传播,激活函数的导数会反复出现在链式法则里。把它们的形状和导数记熟,梯度消失、梯度爆炸就更容易理解。
上一章聊激活函数时,我提到它们的导数会反复出现在链式法则里。这一章正式进入反向传播。它是神经网络训练的引擎,也是很多人初学时的第一道坎。我刚学的时候盯着公式看了好几天,似懂非懂。后来自己用numpy手写了一遍,跑通一个两层网络,才真正理解梯度是怎么从损失流回权重的。
反向传播不神秘,本质是链式法则加动态规划。前向算输出和损失,反向算每个参数对损失的贡献。贡献大的参数多调整,贡献小的少调整。下面从计算图、前向反向流程、梯度推导、训练难点、实现要点五个方面展开。
3.1 计算图、链式法则与梯度下降基础
计算图把神经网络画成有向图。节点是变量或操作,边传递数据。输入x、权重W、偏置b是叶子节点,中间层z=Wx+b、a=σ(z)是中间节点,损失L是根节点。前向传播就是按拓扑顺序从叶子算到根。我习惯在纸上画三层网络的计算图,标出每个节点的维度。画过几次后,代码里的矩阵维度再也不容易搞错。
链式法则说,复合函数的导数等于各层导数的乘积。L对W的导数,可以通过L对输出的导数、输出对中间变量的导数、中间变量对W的导数连乘得到。反向传播从根开始,把梯度一层层往回传。每到一个节点,接收上游传来的梯度,乘以本节点的局部梯度,再传给下游。这样每个参数只需要算一次梯度,效率很高。
梯度下降用梯度更新参数。公式是 W ← W - η·∂L/∂W。η是学习率,控制每步走多远。梯度指向损失上升最快的方向,取负就是下降方向。我刚开始调学习率老走极端。太大,损失震荡甚至发散;太小,收敛慢得像爬。0.01不灵就试0.001,再试0.0001。后来学会看损失曲线,按曲线形态调。
3.2 反向传播的前向与反向流程
前向流程从输入开始。第一层接收x,算z1=W1x+b1,过激活得a1。第二层算z2=W2a1+b2,过激活得a2。一直到输出层算预测ŷ。损失函数比较ŷ和真实标签y,得到标量损失L。前向过程把中间结果都存下来,反向要用。我在手写代码时,一开始忘了缓存z和a,反向时又重新算一遍,浪费算力。
反向流程从损失开始。先算∂L/∂ŷ,再算∂L/∂z2。∂L/∂z2 = ∂L/∂ŷ ⊙ σ'(z2),⊙是逐元素乘。∂L/∂W2 = ∂L/∂z2 · a1ᵀ,∂L/∂b2 = ∂L/∂z2按列求和。梯度继续往第一层传:∂L/∂a1 = W2ᵀ · ∂L/∂z2,再乘σ'(z1)得∂L/∂z1。然后算∂L/∂W1和∂L/∂b1。整个过程像从根往叶子浇水,每片叶子接到自己该得的那份。
我调试过一个两层网络,损失不降。检查发现反向时把∂L/∂z2算成了∂L/∂a2。激活函数导数忘了乘,梯度完全不对。修正后损失立刻下降。反向传播的每一步都有明确的形态和维度,写代码时对形状会省很多时间。
3.3 权重和偏置的梯度推导与参数更新
以单层线性回归为例。前向z = Wx + b,损失L = ½(z - y)²。∂L/∂z = z - y。∂L/∂W = (z-y)·xᵀ,∂L/∂b = z-y。这是最简单的形式,所有深层网络的梯度都是这个结构的嵌套。我把这一层吃透后,多层网络的反向推导就是重复套用。
多层网络里,第l层的梯度依赖第l+1层传回来的∂L/∂a_l。∂L/∂z_l = ∂L/∂a_l ⊙ σ'(z_l)。∂L/∂W_l = ∂L/∂zl · a{l-1}ᵀ。∂L/∂b_l = ∂L/∂z_l按batch求和。参数更新时,W_l ← W_l - η·∂L/∂W_l,b_l同理。批量训练时,梯度对batch求平均,更新更稳。我试过batch size从1到256,太小噪声大,太大内存吃紧,32到128通常平衡。
参数初始化影响反向传播。全零初始化会让同一层神经元梯度相同,对称性破不掉。我早期图省事用zeros,训练几轮后所有隐藏单元输出一样,模型等于只有一层。改用Xavier或He初始化后正常。反向传播本身没问题,初始化不对会让梯度从一开始就废掉。
3.4 梯度消失、梯度爆炸与缓解策略
梯度消失指反向传播时梯度逐层变小,靠近输入的层几乎收不到更新信号。Sigmoid和Tanh饱和区导数小,深层连乘后指数衰减。我做深层MLP实验,五层以上用Sigmoid,第一层权重几乎不动。换ReLU后缓解,负区间虽然导数为0,正区间恒为1,梯度能传得更远。残差连接给梯度开了条高速公路,输入可以直接跳过几层传到后面。LSTM用门控和记忆单元,让梯度在时间维度上少衰减。
梯度爆炸相反,梯度逐层变大,参数更新步长失控,损失变NaN。RNN里时间步长,连乘大于1的权重矩阵很容易爆炸。梯度裁剪是常用手段,把梯度范数限制在阈值内,超过就缩放。我训练语言模型时设过clip norm为1.0,有效防止了发散。权重正则化、较小学习率、批归一化也能缓解爆炸。批归一化把每层输入拉回稳定分布,梯度尺度更可控。
梯度消失和爆炸本质是连乘效应。缓解思路有几种:换激活函数减少小导数、用残差绕路、加归一化稳定分布、做梯度裁剪设上限、合理初始化控制初始尺度。我处理深层网络时,通常组合使用。ReLU加He初始化加批归一化加残差连接,训练稳定很多。没有哪个方法单独万能。
3.5 自动微分、优化器与反向传播实现要点
自动微分是现代框架的核心。PyTorch的autograd记录前向操作,构建动态计算图,反向调用.backward()自动算梯度。TensorFlow的GradientTape也类似。手动推导能帮你理解,实际项目用自动微分。我在PyTorch里定义好forward,loss.backward()后梯度就存在param.grad里。方便,但也要懂背后发生了什么,出问题才能查。
优化器在梯度基础上改进更新策略。SGD最原始,沿梯度方向走。动量法积累历史梯度,减少震荡,加速收敛。RMSProp按梯度平方的指数平均缩放学习率。Adam结合动量和RMSProp,对每个参数自适应调整学习率,是很多项目的默认。我试过Adam和SGD加动量,小数据集上Adam收敛快,大数据集上调好学习率的SGD泛化有时更好。优化器选择跟数据规模、任务、训练预算有关。
实现要点有几个。梯度清零不能忘,PyTorch里optimizer.zero_grad()要在backward前调用,不然梯度会累加。detach()切断不需要梯度的分支,节省显存。混合精度训练用float16算前向和反向,float32存权重,速度快显存省,但要配梯度缩放防下溢。我在GPU上训练大模型时用amp自动混合精度,训练时间明显缩短。反向传播是工具,用好它要理解原理、熟悉框架、观察训练曲线。
下一章进入训练、调参与进阶衔接。反向传播给出梯度,怎么用这些梯度更稳更快,涉及数据预处理、权重初始化、批归一化、正则化、超参数调优。梯度是原料,训练策略是菜谱。
反向传播算出梯度,梯度交给优化器更新参数。这套流程能跑通,网络未必训得好。我见过太多代码,模型结构没问题,反向传播也正确,损失就是不降。问题出在数据、初始化、正则化、超参数这些环节。这一章聊训练网络的实际功夫,把基础网络和后面要学的 CNN、RNN、Transformer 接上。
4.1 数据预处理、权重初始化与批归一化
数据预处理是我踩坑最多的地方。早期做房价预测,特征有的在几千,有的在零点几。我直接喂进网络,梯度更新被大数值特征带偏,小数值特征几乎不更新。训练慢,效果差。后来把所有特征标准化到均值0方差1,训练立刻稳了。图像数据除以255,文本做分词和ID映射,类别特征做独热或嵌入。预处理没有统一公式,核心是让各特征尺度接近,别让网络把精力花在适应量纲上。
预处理还要防数据泄漏。我用全体数据算均值和方差,再划分训练集验证集,验证集信息就漏进了训练。正确做法是在训练集上算统计量,用到验证集和测试集。时间序列更不能随机打乱,要用过去预测未来。我做过一个销量预测,随机划分后验证集准确率虚高,上线后暴跌。改成按时间切分,指标才真实。
权重初始化决定训练起点。全零初始化会让同一层所有神经元输出相同,反向传播梯度也相同,对称性永远破不掉。我刚开始图省事用 zeros,训练几轮后隐藏层输出一模一样,模型退化成线性。Xavier 初始化根据输入输出维度调整方差,适合 Sigmoid 和 Tanh。He 初始化针对 ReLU 设计,方差更大。PyTorch 里 nn.Linear 默认用 Kaiming 均匀分布,多数情况够用。自己搭网络时,我会显式指定初始化,心里踏实。
批归一化在每层线性输出后、激活函数前,把 batch 内数据拉回均值0方差1。它让每层输入分布稳定,梯度尺度可控,学习率可以调大,收敛更快。我训练深层网络时加 BN,训练轮数减少一半。BN 在训练时用当前 batch 统计量,推理时用全局滑动平均。小 batch 下 BN 统计量不准,效果打折。这时可以换 LayerNorm 或 GroupNorm。BN 不是万能药,加了它网络结构变复杂,推理时要多一步。我通常先不加 BN 跑 baseline,再决定是否引入。
4.2 损失函数、正则化与防止过拟合
损失函数定义学习目标。回归用均方误差,二分类用二元交叉熵,多分类用分类交叉熵。我犯过一个错,多分类任务用 MSE,模型收敛慢,准确率低。换成交叉熵后,梯度形态更适合分类,效果提升明显。交叉熵配合 Softmax,梯度是预测减真实,简洁有效。自定义损失要小心,梯度可能不连续或尺度失衡。我试过加一个正则项,权重没调好,主损失被淹没,模型学偏了。
过拟合是训练集表现好,验证集表现差。模型容量大、数据少、训练久,都容易过拟合。我做过一个小样本图像分类,训练准确率99%,验证准确率60%。加 L2 正则化,权重衰减,验证提升到75%。加 Dropout,随机丢神经元,提升到82%。再做数据增强,旋转、翻转、裁剪,提升到88%。正则化手段叠加使用,效果比单一方法好。
L2 正则化在损失里加权重平方和,让权重趋向小值。L1 正则化加权重绝对值和,产生稀疏权重,可以做特征选择。Dropout 在训练时随机置零一部分神经元,防止 co-adaptation。早停法监控验证损失,连续几轮不降就停。数据增强是最根本的正则化,扩充有效样本。标签平滑把硬标签变成软标签,防止模型过度自信。我调参时先上数据增强和早停,再考虑 Dropout 和权重衰减。正则化太强会欠拟合,训练集都学不好,验证集更差。平衡点靠实验找。
4.3 超参数调优、训练监控与调试方法
超参数决定训练过程。学习率最关键,太大震荡,太小收敛慢。我习惯从 0.001 或 0.0001 开始,看损失曲线调整。批大小影响梯度噪声和内存,32 到 128 常用。网络深度和宽度、Dropout 率、权重衰减系数、优化器选择,都要调。网格搜索穷举组合,计算量大。随机搜索在高维空间更高效。贝叶斯优化用历史结果指导下一步采样,适合昂贵实验。我小项目用随机搜索,大项目用贝叶斯优化或人工调。
学习率调度让训练后期更稳。StepLR 每隔几轮降一次,CosineAnnealing 按余弦曲线降,ReduceLROnPlateau 监控验证损失自动降。我用 CosineAnnealing 配 warmup,前几轮从极小学习率升到设定值,训练更稳。Warmup 在 Transformer 训练里几乎是标配。学习率找对了,训练成功一半。我见过学习率设 1.0 直接发散,也见过 1e-8 训到天亮没动静。
训练监控看损失曲线。训练损失降,验证损失降,正常。训练损失降,验证损失升,过拟合。两条都平,学习率太小或模型容量不够。两条都震荡,学习率太大或批太小。我还在训练中看梯度范数,梯度突然变大,可能遇到 bad batch。权重直方图看分布,权重全挤在零附近,正则化太强。TensorBoard 和 wandb 能记录这些指标,可视化后问题一目了然。
调试从最小可复现单元开始。我习惯先拿一个 batch 过拟合,模型能记住这个 batch,说明前向反向没问题。再逐步加数据、加层、加正则化。检查数据管道,打印输入输出的形状和数值范围。检查损失函数,确认输入 logits 还是概率。检查标签,有没有错位。梯度检查用数值梯度对比反向传播梯度,误差大说明实现有 bug。这些步骤能排除大部分低级错误。我调试过标签和预测错位,模型学反了,损失不降。修正后立刻正常。
4.4 从基础网络到 CNN、RNN 与 Transformer 的衔接
全连接网络处理不了图像的空间结构。一张 224x224x3 的图,展平后 15 万维,第一层权重矩阵巨大,参数爆炸。CNN 用局部连接和权值共享解决这个问题。卷积核在图像上滑动,提取边缘、纹理、形状特征。池化层降维,保留主要信息。我学 CNN 时,把卷积看成一组共享权重的全连接,每个输出只连输入的一小块。反向传播、激活函数、批归一化这些基础概念照常适用。CNN 的梯度推导多了卷积操作,本质还是链式法则。
序列数据有先后依赖。RNN 按时间步展开,隐藏状态传递历史信息。标准 RNN 梯度消失严重,长序列学不到远距离依赖。LSTM 用输入门、遗忘门、输出门控制信息流,梯度能传得更远。GRU 简化版,效果接近。我做过文本分类,LSTM 比 RNN 准确率高不少。RNN 的反向传播叫 BPTT,沿时间维度展开,梯度裁剪防爆炸。基础网络里的梯度消失、梯度爆炸、优化器选择,在 RNN 里同样重要。
Transformer 抛弃循环结构,用自注意力机制捕捉全局依赖。每个位置和所有位置计算注意力权重,并行计算,训练速度快。位置编码补充序列顺序信息。多头注意力让模型从不同子空间关注信息。Transformer 在 NLP 领域成为主流,也扩展到视觉、语音。我读 Transformer 论文时,发现核心还是矩阵乘法、Softmax、残差连接、层归一化。反向传播自动微分搞定,训练技巧如 warmup、Dropout、权重衰减,和基础网络一脉相承。
从全连接到 CNN、RNN、Transformer,网络结构在变,训练范式没变。数据预处理、权重初始化、损失函数、正则化、超参数调优,这些功夫放在哪个模型上都管用。我建议把基础网络手写一遍,跑通训练流程,再学复杂结构。有了反向传播的底子,看 CNN 的卷积梯度、RNN 的时间展开、Transformer 的注意力矩阵,都能找到熟悉的身影。下一章进入 CNN,从卷积核开始,看它怎么从像素里提取特征。