多层感知机的训练#
多层感知机和传统计算流程#
计算机通过输入 → 计算 → 输出实现功能。
多层感知机同样是一层层地计算函数,通过训练集优化权重,得出难以人力编程的函数。
当我们无法精确描述某些规律时,可以建立包含可调参数的模型来逼近其行为。
线性的局限性#
若数据不是线性可分(如 XOR),单一线性分类器无法划分。
解决方法:使用多个线性分类器来划分由单一直线无法分离的数据。
并行与模糊的计算方式#
传统计算机严格串行、确定,而大脑则以并行、模糊的方式处理信号。
神经元可以进行非线性、带不确定性的计算。
激活函数的引入#
神经元具有阈值特性:输入未达阈值不会激活输出。
类似“杯中水溢出”——输入足够强才产生输出,从而过滤微小噪声信号。
Sigmoid 函数#
y=1+e−x1
- 将输入映射到 (0,1) 区间
- 计算简便、连续可导,是早期常用的激活函数(缺点:梯度消失)
- Softmax 的二分类特例
矩阵简化思维负担与加速运算#
矩阵可以压缩大量计算,减少人工错误并提升计算效率。
多层感知机前向传播可表示为矩阵乘法:
(w1,1w2,1w2,1w2,2)⋅(input1input2)=((w1,1+w2,1)input1(w1,2+w2,2)input2)组合信号:
X=WI输出信号:
O=sigmoid(X)这个两层网络可以无限叠加。
Sigmoid 的导数简单,便于反向传播,因此成为早期主流激活函数。

多个输出节点的误差反向传播#
若输出层有多个节点,误差应按权重比例分配至前一层:
e1=w1,1+w1,2w1,1⋅e,e2=w1,1+w1,2w1,2⋅e若前层节点连接多个输出节点,可将所有误差相加:
e1=e1,1+e1,2矩阵形式:
ehidden=(w1,1+w1,2w1,1w2,1+w2,2w2,1w1,1+w1,2w1,2w2,1+w2,2w2,2)(e1e2)若忽略归一化因子,可简化为:
ehidden=(w1,1w2,1w1,2w2,2)(e1e2)即:
ehidden=WTeoutput简化后的反向传播在实践中依然有效。
权重更新与梯度下降#
目标是最小化误差平方和:
E=∑(ti−oi)2梯度:
∂wjk∂E=−(tk−ok)sigmoid(j∑tjkoj)(1−sigmoid(j∑tjkoj))oj更新规则:
wjk′=wjk−α∂wjk∂E权重变化方向与梯度相反,学习率 α 控制步长:
Δwjk=αEkOk(1−Ok)OjT
为防止陷入局部最小值,可多次随机初始化权重并重新训练。
多层感知机的数据准备#
初始权重#
过大的权重会使激活函数饱和,应控制初始范围。
经验法则:若节点有 n 个输入,则权重应初始化于
[−n1,n1]或从均值为 0、方差为 n1 的正态分布采样。

将初始权重设为相同或 0 都是错误的,网络将失去学习能力。
实践:手搓多层感知机#
从输入 → 矩阵乘法 → 激活函数 → 误差 → 反向传播 → 权重更新
完整实现多层感知机的训练循环。
详见 mini_neural.
相关学习资料#
- Python神经网络编程(异步图书) (塔里克·拉希德(Tariq Rashid))