904 字
5 分钟
从零开始深度学习 Day 1 MLP 多层感知机

多层感知机的训练#

多层感知机和传统计算流程#

计算机通过输入 \rarr 计算 \rarr 输出实现功能。
多层感知机同样是一层层地计算函数,通过训练集优化权重,得出难以人力编程的函数。
当我们无法精确描述某些规律时,可以建立包含可调参数的模型来逼近其行为。

线性的局限性#

若数据不是线性可分(如 XOR),单一线性分类器无法划分。
解决方法:使用多个线性分类器来划分由单一直线无法分离的数据。

并行与模糊的计算方式#

传统计算机严格串行、确定,而大脑则以并行、模糊的方式处理信号。
神经元可以进行非线性、带不确定性的计算。

激活函数的引入#

神经元具有阈值特性:输入未达阈值不会激活输出。
类似“杯中水溢出”——输入足够强才产生输出,从而过滤微小噪声信号。

阶跃函数#

模拟阈值触发,不连续,不利于梯度计算。

Sigmoid 函数#

y=11+exy = \frac{1}{1+e^{-x}}
  • 将输入映射到 (0,1)(0,1) 区间
  • 计算简便、连续可导,是早期常用的激活函数(缺点:梯度消失)
  • Softmax 的二分类特例

矩阵简化思维负担与加速运算#

矩阵可以压缩大量计算,减少人工错误并提升计算效率。
多层感知机前向传播可表示为矩阵乘法:

(w1,1w2,1w2,1w2,2)(input1input2)=((w1,1+w2,1)input1(w1,2+w2,2)input2)\begin{pmatrix} w_{1,1} & w_{2,1}\\ w_{2,1} & w_{2,2} \end{pmatrix} \cdot \begin{pmatrix} input_1 \\ input_2 \end{pmatrix} = \begin{pmatrix} (w_{1,1} + w_{2,1})input_1 \\ (w_{1,2} + w_{2,2})input_2 \end{pmatrix}

组合信号:

X=WIX = W I

输出信号:

O=sigmoid(X)O = \text{sigmoid}(X)

这个两层网络可以无限叠加。
Sigmoid 的导数简单,便于反向传播,因此成为早期主流激活函数。

神经元

多个输出节点的误差反向传播#

若输出层有多个节点,误差应按权重比例分配至前一层:

e1=w1,1w1,1+w1,2e,e2=w1,2w1,1+w1,2ee_1 = \frac{w_{1,1}}{w_{1,1} + w_{1,2}} \cdot e,\quad e_2 = \frac{w_{1,2}}{w_{1,1} + w_{1,2}} \cdot e

若前层节点连接多个输出节点,可将所有误差相加:

e1=e1,1+e1,2e_1 = e_{1,1} + e_{1,2}

矩阵形式:

ehidden=(w1,1w1,1+w1,2w1,2w1,1+w1,2w2,1w2,1+w2,2w2,2w2,1+w2,2)(e1e2)e_{hidden} = \begin{pmatrix} \frac{w_{1,1}}{w_{1,1} + w_{1,2}} & \frac{w_{1,2}}{w_{1,1} + w_{1,2}}\\ \frac{w_{2,1}}{w_{2,1} + w_{2,2}} & \frac{w_{2,2}}{w_{2,1} + w_{2,2}} \end{pmatrix} \begin{pmatrix} e_1\\ e_2 \end{pmatrix}

若忽略归一化因子,可简化为:

ehidden=(w1,1w1,2w2,1w2,2)(e1e2)e_{hidden} = \begin{pmatrix} w_{1,1} & w_{1,2}\\ w_{2,1} & w_{2,2} \end{pmatrix} \begin{pmatrix} e_1\\ e_2 \end{pmatrix}

即:

ehidden=WTeoutpute_{hidden} = W^T e_{output}

简化后的反向传播在实践中依然有效。

权重更新与梯度下降#

目标是最小化误差平方和:

E=(tioi)2E = \sum (t_i - o_i)^2

梯度:

Ewjk=(tkok)sigmoid(jtjkoj)(1sigmoid(jtjkoj))oj\frac{\partial E}{\partial w_{jk}} = -(t_k - o_k)\,\text{sigmoid}(\sum_j t_{jk}o_j)(1-\text{sigmoid}(\sum_j t_{jk}o_j))\,o_j

更新规则:

wjk=wjkαEwjkw'_{jk} = w_{jk} - \alpha \frac{\partial E}{\partial w_{jk}}

权重变化方向与梯度相反,学习率 α\alpha 控制步长:

Δwjk=αEkOk(1Ok)OjT\Delta w_{jk} = \alpha E_k O_k(1 - O_k) O_j^T

权重

为防止陷入局部最小值,可多次随机初始化权重并重新训练。

多层感知机的数据准备#

初始权重#

过大的权重会使激活函数饱和,应控制初始范围。
经验法则:若节点有 nn 个输入,则权重应初始化于

[1n,1n][-\frac{1}{\sqrt{n}}, \frac{1}{\sqrt{n}}]

或从均值为 0、方差为 1n\frac{1}{\sqrt{n}} 的正态分布采样。

经验法则

将初始权重设为相同或 0 都是错误的,网络将失去学习能力。

实践:手搓多层感知机#

从输入 \rarr 矩阵乘法 \rarr 激活函数 \rarr 误差 \rarr 反向传播 \rarr 权重更新
完整实现多层感知机的训练循环。

详见 mini_neural.

相关学习资料#

  • Python神经网络编程(异步图书) (塔里克·拉希德(Tariq Rashid))
从零开始深度学习 Day 1 MLP 多层感知机
https://blog.candlest.cc/posts/ai/mini_neural/
作者
candlest
发布于
2025-10-17
许可协议
CC BY-NC-SA 4.0