前向传播和反向传播是什么?神经网络是怎么训练的?

神经网络是怎么学习的?前向与反向的舞蹈
上回我们聊了激活函数,知道了节点输出的数值要"掰弯"一下才有意义。但光有激活函数还不够,数据在网络里到底是怎么跑的?跑完之后错了又怎么改回来?
今天就来解答这两个问题。说白了就两件事:先猜答案,再找问题。
神经网络长什么样?先搭好积木
在说传播之前,得先看看神经网络的结构长什么样。
可以把它想象成一座工厂流水线。数据从入口进去,经过一层层车间的加工,最后从出口出来。
这座"工厂"的结构:

- 输入层:负责接收原始数据。比如要识别一张28×28的图片,那输入层就有784个节点。
- 隐藏层:中间加工的环节。可以有一层,也可以有上百层——这就是"深度"学习的"深度"。在图片识别任务里,隐藏层负责提取边缘、纹理、形状等特征。
- 输出层:最终吐出结果。分类任务里,几个类别就几个输出节点。
每一层里有很多圆圈,这些圆圈叫节点。相邻层的节点之间有线条连着,这些线条就是权重。
数据就是顺着这些线条,一层一层往前"流"的。
同一层内的节点互不往来。它们只跟下一层的节点说话。
前向传播:数据是怎么往前跑的
数据从输入层到输出层的流动,就是前向传播。
过程很直接,每个节点只做两件事。
第一步:加权求和
节点收到上一层发来的信号,把它们加起来——但不是简单相加,是加权。
数学表达式是:z = Wx + b
- x 是上一层的输出
- W 是权重矩阵(可以理解成每个输入的重要程度)
- b 是偏置(基础偏移量)
- z 是求和结果
第二步:激活函数
算出 z 之后,要过一下激活函数:a = σ(z)
这就是上篇文章讲的内容了。激活函数把线性的数值"掰弯",让网络能处理非线性问题。
单个节点的完整计算过程:

两层之间的计算可以写成矩阵形式:a¹ = σ(W¹a⁰ + b¹)
看起来符号有点多,但本质就是批量做加权求和再激活。
为什么要用激活函数?
做个实验。如果不用激活函数,把两个线性层叠起来会怎样?
假设第一层是 y1 = w1·x + b1,第二层是 y2 = w2·y1 + b2。
代入一下:y2 = w2·(w1·x + b1) + b2 = (w2·w1)·x + (w2·b1 + b2)
两个线性层叠起来,还是一个线性变换!等效于 y = w·x + b。
那网络学来学去,只能表达线性关系。连"与或非"这种最基本的逻辑都学不会。
所以激活函数必须是非线性的。没有它,神经网络就是一堆废铁。
反向传播:怎么知道自己错了
前向传播给出了预测,但预测不一定对。网络怎么知道自己错了?
这就需要反向传播出场了。
先算损失
用损失函数衡量预测和真实答案之间的差距。预测越差,损失越大。
常用的是均方误差:Loss = (预测值 - 真实值)²
分类任务常用交叉熵,名字不一样,本质上都是同一个意思:给错误打个分。
链式法则:倒着找原因
算出损失后,问题来了:这个错误该怪谁?
是输入层判断失误?是中间某个隐藏层学歪了?还是输出层的权重设错了?
反向传播就是来干这个的。它从结果往前推,算出每个参数对错误的"贡献度"。
这个"贡献度"在数学上叫梯度,表示参数变化对损失的影响有多大。
用到的数学工具是链式法则。高中学过,复合函数求导要把每一步的导数乘起来。
反向传播的链式法则:

比如要算 ∂Loss/∂W,链式法则告诉我们:
∂Loss/∂W = ∂Loss/∂a · ∂a/∂z · ∂z/∂W
从后往前,一层一层乘过去。这就是"反向"的意思——跟数据流动的方向相反。
梯度是什么?
梯度说白了就是:往这个方向走,损失会增加多少。
- 梯度为正,说明参数增大会让损失变大,所以要减小参数
- 梯度为负,说明参数减小会让损失变大,所以要增大参数
每个参数都算一遍,就知道整个网络该怎么调整了。
梯度下降:怎么改正错误
知道了错误在哪,接下来就是改正。
公式超简单:
参数 = 参数 - 学习率 × 梯度
这就是梯度下降法。
学习率是什么?
学习率控制每次调整的步伐大小。

想象你在黑夜里下山。脚底下有坡度,你能感觉到往哪边走会往下。
- 学习率太大:一步迈太大,直接迈过了山坳,可能越迈越高
- 学习率太小:一步迈很小,虽然能往下走,但磨磨蹭蹭,可能要走几万步才能到谷底
一般设个0.001、0.01之类的数,在实践中慢慢调。
参数初始化
有个小细节:参数一开始怎么设?
必须随机初始化,不能全设成0。
如果所有权重都是0,那第一层所有节点算出来的结果完全一样。不管有多少个节点,每个节点都在做同样的事。
这叫"对称性"问题。随机初始化打破对称,让每个节点学不同的东西。
完整训练循环:前向与反向的协作
单个前向+反向只是一次尝试。神经网络的训练要重复这个过程,成千上万次。
完整流程:

- 数据进来:从训练集拿一批样本
- 前向传播:算预测值
- 算损失:比较预测和真实答案
- 反向传播:算每个参数的梯度
- 更新参数:沿着梯度的反方向走一步
- 回到步骤1:重复
每完整走一遍叫一个epoch。通常要跑几十上百个epoch,损失才会降到一个较低水平。
训练和预测的区别:训练更耗内存。因为要保留前向传播的中间变量(比如每层的z和a),供反向传播使用。预测的时候不需要,直接算就行。
类比学骑自行车
整个过程就像学骑自行车:
- 前向传播:你试着骑
- 算损失:摔倒了,疼
- 反向传播:分析哪里出了问题——是龙头没扶稳?还是重心太靠前?
- 更新参数:下次骑的时候,刻意调整这些地方
摔多了就学会了。网络也是,数据喂多了就"学会"了。
下山之路:理解学习的本质
现在你明白了,神经网络没有真正的"思考"。
它靠的是两件事:前向传播计算当前答案,反向传播找出问题,梯度下降修正方向。
然后重复这个循环,百万次、千万次。
每重复一次,网络的预测就准一点点。这些一点点积累起来,就从"分不清猫和狗"变成了"人脸识别解锁"。
但这条路并不总是一帆风顺。深层网络在反向传播时,梯度可能会越来越小,小到几乎消失。也可能越来越大,大到失控。
这就是下一篇文章要聊的——梯度消失和梯度爆炸。
深层网络为什么更难训练?根本原因就在这。
