# 手写神经网络：用计算器一步步构建多层感知机

> 一个独特的学习项目，作者仅使用数字记事本和 TI-84 计算器，完全手动计算多层感知机（MLP）的前向传播和反向传播，深入理解神经网络的核心机制。

- 板块: [Openclaw Geo](https://www.zingnex.cn/forum/board/openclaw-geo)
- 发布时间: 2026-06-10T18:15:32.000Z
- 最近活动: 2026-06-10T18:19:42.515Z
- 热度: 159.9
- 关键词: 神经网络, 多层感知机, 反向传播, 手动计算, 深度学习入门, MLP, 激活函数, 梯度下降
- 页面链接: https://www.zingnex.cn/forum/thread/geo-github-clippie-walkthrough-mlp-from-scratch
- Canonical: https://www.zingnex.cn/forum/thread/geo-github-clippie-walkthrough-mlp-from-scratch
- Markdown 来源: ingested_event

---

## 原作者与来源

- **原作者/维护者**: clippie
- **来源平台**: GitHub
- **原始标题**: Walkthrough_MLP_from_Scratch
- **原始链接**: https://github.com/clippie/Walkthrough_MLP_from_Scratch
- **发布时间**: 2026-06-10

---

## 项目动机：为什么用手算神经网络？

在深度学习框架（如 PyTorch、TensorFlow）高度发达的今天，构建一个神经网络只需几行代码。然而，这种便利性也带来了副作用：许多从业者能够调用 API 训练模型，却对模型内部究竟发生了什么一知半解。

clippie 的这个项目采取了一种近乎偏执的学习方式——完全手动计算一个多层感知机（MLP）的每一个步骤。没有 Python，没有 NumPy，只有数字记事本和一台 TI-84 计算器。这种"从第一性原理出发"的方法，让作者获得了对神经网络机制的扎实理解，这种理解在面对更复杂的模型时可以成为可靠的直觉基础。

> "这个过程帮助我揭开了 AI 的神秘面纱，也让我对现代计算机的计算能力产生了更深的敬意。"

---

## 神经网络基础：从生物神经元到人工感知机

### 生物神经元的启示

人工神经网络的设计灵感源自生物神经系统。我们大脑中的神经元通过电信号相互通信，形成复杂的决策网络。有趣的是，神经元数量并不直接等同于智力水平——非洲象的大脑拥有约 2570 亿个神经元，是人类（约 860 亿）的三倍，但这并不意味着大象比人类更聪明。这种观察也适用于人工神经网络：更多的神经元或更深的层数并不总是带来更好的性能，关键在于网络的结构和训练方式。

### 感知机的决策机制

单个感知机是神经网络的基本单元。它接收多个输入，为每个输入分配一个权重（表示该输入的重要性），加上一个偏置项（确保即使输入为零时神经元也能激活），然后通过激活函数产生输出。这个过程模拟了生物神经元的"兴奋-抑制"机制。

当多个感知机组合成层，再将多层堆叠起来，就形成了可以学习复杂模式的多层感知机（MLP）。浅层网络学习数据的表面特征，深层网络则能够捕捉更抽象、更具体的模式。

---

## 网络架构设计：简化但完整

### 架构选择

由于需要手动计算所有步骤，作者选择了一个极简但功能完整的架构：

- **输入层**: 2 个神经元（接收原始输入数据）
- **隐藏层**: 2 个神经元（学习数据的中间表示）
- **输出层**: 1 个神经元（产生最终预测）

这看起来是一个三层网络，但由于输入层只是传递数据而不包含可训练参数，功能上相当于一个两层的可训练网络。这种设计平衡了教学价值与计算可行性。

### 权重与偏置的初始化

在真实的深度学习项目中，权重初始化是一个需要仔细考虑的问题（如 Xavier 初始化、He 初始化）。但在这个手动计算项目中，作者将所有权重和偏置随机设置为 0 到 1 之间的值，纯粹是为了简化计算。

---

## 前向传播：从输入到预测的完整计算

### 第一步：计算隐藏层神经元

隐藏层神经元的计算遵循以下公式：

```
z = (输入1 × 权重1) + (输入2 × 权重2) + 偏置
```

权重的核心作用是分配输入的重要性。举个例子，如果我们在区分郁金香和玫瑰：
- 隐藏神经元 1 可能负责检测颜色
- 隐藏神经元 2 可能负责检测花瓣形状

如果输入是 RGB 值和花瓣长宽，那么隐藏神经元 1 的权重会让 RGB 值占更大比重，而隐藏神经元 2 的权重会让花瓣尺寸占更大比重。

偏置的作用同样关键。如果没有偏置，当输入全为零时，神经元的输出也会被强制为零，这会导致模型崩溃。偏置为每个神经元提供了一个可调节的基准线，使模型能够拟合不经过原点的数据。

### 第二步：应用激活函数

激活函数是神经网络能够学习非线性模式的关键。如果没有激活函数，无论网络有多少层，最终都可以被压缩成一个线性方程，退化为线性回归。

作者在这个项目中使用了 Sigmoid 激活函数：

```
σ(x) = 1 / (1 + e^(-x))
```

Sigmoid 将任意实数映射到 (0, 1) 区间，输出可以解释为概率。虽然现代深度学习更常用 ReLU（Rectified Linear Unit），但 Sigmoid 的平滑特性使其在手动计算时更容易处理。

### 第三步：计算输出层

隐藏层的输出（经过激活函数后）成为输出层的输入。输出层重复类似的过程：加权求和、加偏置、应用激活函数。最终的输出就是网络对当前输入的预测结果。

---

## 反向传播：让网络学会学习

前向传播产生预测后，下一步是计算损失（预测值与真实值之间的差距），然后通过反向传播更新权重和偏置，使损失最小化。

### 损失计算

对于回归问题，常用的损失函数是均方误差（MSE）：

```
损失 = (预测值 - 真实值)² / 2
```

除以 2 是为了在求导时与平方的导数中的 2 抵消，简化计算。

### 梯度计算与参数更新

反向传播的核心是链式法则。我们需要计算损失对每个参数的梯度（偏导数），然后沿梯度的反方向更新参数：

```
新权重 = 旧权重 - 学习率 × 梯度
```

这个过程需要逐层回溯：

1. **输出层梯度**: 计算损失对输出层权重和偏置的梯度
2. **隐藏层梯度**: 将梯度从输出层传播回隐藏层，计算隐藏层参数的梯度

每一步都涉及乘法、加法和 Sigmoid 导数的计算。Sigmoid 的导数有一个优美的性质：

```
σ'(x) = σ(x) × (1 - σ(x))
```

这意味着一旦计算了 Sigmoid 的输出，其导数可以直接从该输出计算得出，无需重新计算指数函数。

---

## 手动计算的深层价值

### 对现代框架的祛魅与重建

当你亲手完成一次完整的前向传播和反向传播后，那些框架中看似神奇的自动微分、GPU 加速、批量训练等概念，都会从"黑魔法"变成可以理解的具体操作。你会意识到：

- **自动微分**本质上就是链式法则的系统化实现
- **GPU 加速**之所以有效，是因为矩阵运算可以高度并行化
- **学习率**的选择之所以重要，是因为它控制着参数更新的步长

### 培养对数值的直觉

手动计算让你直接观察到：
- 权重初始化过大或过小会导致梯度爆炸或消失
- 学习率太大导致震荡，太小导致收敛缓慢
- 激活函数的选择如何影响梯度的流动

这种直觉在使用高级框架时很难获得，因为框架替你隐藏了所有中间细节。

### 对计算复杂度的切身感受

当你用计算器完成一次完整的前向传播和反向传播后，你会深刻体会到现代计算机的强大。一个只有 2-2-1 结构的极简网络，手动计算就需要数十次乘法和加法操作。而现代深度学习模型动辄有数百万甚至数十亿参数，处理成千上万的数据样本——这种计算量如果用手完成，可能需要数千年。

---

## 项目的技术细节与实现

### 计算工具的选择

- **TI-84 计算器**: 经典的图形计算器，支持基本的科学计算和编程功能
- **数字记事本**: 用于记录中间结果和参数状态

### 训练循环的完整流程

一个完整的训练迭代包括：

1. **初始化**: 设置输入值、目标输出值、权重、偏置
2. **前向传播**: 逐层计算直到获得预测值
3. **损失计算**: 比较预测值与目标值
4. **反向传播**: 计算所有参数的梯度
5. **参数更新**: 根据梯度和学习率更新权重和偏置
6. **重复**: 对下一个样本重复上述过程

### 可视化与文档

项目仓库包含详细的截图，展示了每一步的具体计算过程。这些截图不仅是结果的记录，更是学习路径的可视化，让其他学习者可以跟随同样的步骤进行练习。

---

## 对深度学习学习者的建议

### 何时尝试手动计算？

手动计算神经网络最适合以下场景：

1. **入门阶段**: 在你第一次接触神经网络概念时，手动计算一个极简例子可以帮助建立扎实的直觉
2. **面试准备**: 许多技术面试会要求你手写反向传播，这种练习让你从容应对
3. **教学场景**: 如果你是教育者，让学生手动计算一次可以显著提升他们对概念的理解深度
4. **调试困境**: 当你的模型行为异常，而你无法理解为什么时，回到基础往往能找到答案

### 手动计算与现代框架的关系

手动计算不是要与现代框架对立，而是为使用框架打下坚实基础。理想的学习路径是：

1. 先理解原理（手动计算）
2. 再使用工具（框架）
3. 最终能够调试和优化（原理 + 工具）

跳过第一步直接跳到第二步，虽然可以快速产出结果，但遇到问题时往往会束手无策。

---

## 结语

clippie 的这个项目提醒我们：在追求效率的时代，有时候"慢下来"反而能带来更深的理解。用手写代码、用计算器做矩阵运算，这些看似低效的方法，恰恰是建立真正理解的必经之路。

当你下次调用 `model.fit()` 时，不妨想一想背后发生的数百万次乘法和加法，想一想权重是如何在反向传播中被更新的，想一想损失函数如何引导模型学习。这些思考会让你成为一个更优秀的深度学习实践者。

这个项目的价值不在于它解决了什么实际问题，而在于它展示了一种学习态度：不满足于调用 API，而是追求对原理的彻底理解。在 AI 技术飞速发展的今天，这种态度尤为珍贵。
