梯度算法和 BP 前馈神经网络详细入门介绍
罗光宣
训练神经网络,本质上是在调整一堆参数,让某个“损失”尽可能小。怎么知道该把参数往哪边拧?答案几乎总是:顺着梯度指出的最陡方向走一小步——这就是梯度法。反向传播(Backpropagation,BP)则是把这条思路高效地用在多层前馈网络上的一套计算技术。
本文先用看得见的曲面和等高线讲清梯度下降,再说局部极小与学习率等常见坑,最后落到典型前馈网络的公式推导和一个可以手算的数值例子。
1. 找极值:我们在优化什么?
设实值函数 。若在某点附近,函数值都不比这里更小,就称该点为局部极小;若在整个定义域上都最小,则是全局极小。机器学习里的 往往是网络权重, 则是损失函数。
一维时,极值点附近导数为 :
多维时,换成梯度为零:
直接解方程往往很难,尤其当 由神经网络复合而成时。于是改用迭代:从初始点出发,一步步往“更低”的地方挪。
2. 梯度是什么?为什么能指路?
对多元函数 ,梯度是偏导数组成的向量:
它有两个关键性质:
-
方向:梯度指向函数值上升最快的方向;因此 指向下降最快的方向。 -
大小: 越大,该处坡度越陡。
所以最朴素的梯度下降更新公式是:
其中 叫学习率(步长):太大容易迈过谷底甚至发散,太小则爬得很慢。
3. 一维例子:沿切线往下走
取
这是开口向上的抛物线,唯一极小在 , 。导数为
从 出发,取 ,迭代
若干步后会明显靠近 。
可以把每一步想成:在当前点看切线斜率,顺着“下坡”挪一点。对凸的二次函数,合适学习率下会稳定收敛到唯一极小。
4. 二维例子:曲面、等高线与下降轨迹
再看碗状函数
偏导为
全局极小在 ,函数值为 。从 出发做梯度下降,轨迹会沿山坡滑向碗底。
把同一函数画成等高线(函数值相同的点连成的曲线),再叠上负梯度箭头和迭代路径,几何意义更直观:路径大致垂直于等高线,朝数值更低的区域前进。
灰箭头表示 的方向。可以看到:椭圆等高线意味着两个方向“陡峭程度”不同, 方向曲率更大,下降时会先在陡的方向上收敛得更快——这也是后续“动量法、自适应学习率”等方法想进一步改进的地方。
5. 可能存在的问题
5.1 多个局部极小
真实损失面很少像完美的碗。下面这种“多洼地”曲面更接近神经网络损失的 Rough 形态:
从不同起点做梯度下降,可能掉进不同的局部洼地,最终损失并不相同。
启示很实际:
-
初始化很重要; -
一次训练得到的未必是全局最优; -
可用多次随机初始化、或更强的优化器(动量、Adam 等)缓解,但无法在一般非凸问题上保证全局最优。
对深度网络,后来的研究表明:高维空间里“坏的局部极小”往往不如想象中致命,鞍点、平坦区域有时更碍事;但对入门理解而言,“会卡在局部极小”仍是必须建立的直觉。
5.2 学习率过大或过小
仍用 ,同一起点、不同 :
-
偏小:稳步靠近,但步数多; -
适中:又快又稳; -
过大:在谷底两侧来回振荡,甚至发散。
实践中常用学习率衰减、或 Adam 这类自适应方法,让早期步子大、后期细调。
5.3 其他常见现象(知道名字即可)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
6. 从“调一个函数”到“训练一张网络”
把网络所有权重和偏置拼成参数向量 。给定训练样本 ,网络输出 ,常用平方损失
(分类也可用交叉熵,推导结构类似)。批量数据上再对样本取平均。训练目标是
这正是前面的梯度下降:算出 ,再
问题在于:网络是一层层复合函数,参数成千上万,若对每个权重都用数值差分估梯度,慢得不可接受。反向传播用链式法则,一次前向、一次反向,就能得到全部参数的梯度,且计算量与前向同阶。
7. 典型前馈网络长什么样?
最常见的是多层感知器(MLP):信息只从输入流向输出,没有反馈环路,故称前馈。
以一层隐层为例,记号如下。
隐层(第 个神经元):
输出层(第 个神经元):
其中 是激活函数。经典 BP 常用 Sigmoid
今天的深度网络多用 ReLU,但BP 的骨架不变:前向算激活,反向用链式法则传误差。

链式法则的抽象形式:
网络不过是把这条链拉得更长、分支更多。
8. BP 的梯度推导(单输出,便于看清结构)
设单输出、平方损失 ,输出 ,
8.1 输出层
先对输出净输入求导。因为
定义输出层误差信号
于是输出权重与偏置的梯度为
8.2 隐层(误差回传)
依赖 ,而 ,故
再乘上激活导数,得到隐层误差信号
若有多个输出,只需把 换成对各输出求和 。
隐层权重梯度:
8.3 参数更新(经典 BP)
这就是 1980 年代广为人知的误差反向传播算法:
前向算
→ 反向算各层
→ 用
拼出所有
→ 梯度下降更新。
9. 一个可以手算的数值例子(2–2–1)
网络结构与初始权重如下图。
取输入 ,目标 ,学习率 ,激活为 Sigmoid。
9.1 前向传播
隐层净输入与激活:
输出:
当前输出偏小,损失为正,后面更新应推动 增大。
9.2 反向传播
输出误差:
输出层梯度:
隐层误差:
隐层梯度(注意 ):
9.3 更新一步
例如输出权重:
变大,会增大 ,从而增大 ,与“目标是 、当前只有 ”的需求一致。其余参数同理更新。多轮扫描全部训练样本后,损失会逐渐下降。
10. 经典 BP 算法流程(小结)
对每个训练轮次(epoch),通常按样本或小批量重复:
-
初始化权重(小随机数),选定 、激活函数与损失。 -
前向传播:逐层计算 ,得到输出 与损失 。 -
反向传播: -
用损失对输出层求 ; -
对 ,用 与 回传得到 。 -
求梯度: (批量时再对样本平均)。 -
更新: (偏置同理)。 -
重复直到损失足够小或达到最大迭代次数。
用 2–2–1 网络学习逻辑 AND,损失曲线与学成后的输出如下(演示用,非调参最优):
可以看到:梯度下降在参数空间里一步步把损失“推”下去;BP 只是高效提供每一步所需的梯度。
11. 和前文图像的对应关系
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12. 要点回顾
-
梯度指向最陡上升方向,梯度下降沿相反方向迭代求极小。 -
用曲面与等高线可以看见轨迹如何滑向谷底;存在多个局部极小时,起点不同,终点可能不同。 -
学习率控制步长,是最基本也最敏感的超参数之一。 -
前馈网络把输入经加权、激活层层传到输出;训练即最小化损失。 -
BP = 前向算损失 + 反向用链式法则算全体梯度 + 梯度更新;核心公式是各层误差 的回传。 -
手算 2–2–1 例子,是为了把“公式”落到“数字”,建立可靠直觉。
把“在曲面上往下走”和“误差从输出往回传”这两幅图在脑子里叠在一起,梯度算法与 BP 网络的入门图景就立住了。之后再学 Softmax、交叉熵、卷积网络或 Adam,都只是在同一骨架上更换损失、结构或更新规则。

