generative-ai-for-beginners 课程解析:多层感知机与反向传播——从线性模型到模块化神经网络框架
本篇基于 generative-ai-for-beginners 仓库中的课程资料 own_framework.md(保加利亚语翻译版,英文原文见 own_framework.md),系统讲解多层感知机(Multi-Layered Perceptron,MLP)的数学形式化:机器学习问题的损失函数定义、基于梯度下降与随机梯度下降(SGD)的参数优化,以及通过链式法则实现反向传播(backpropagation)的核心推导过程。读完后,你将能够理解现代神经网络"训练"的本质——如何通过最小化损失函数来迭代更新参数,并理解课程中自研模块化 Python 神经网络框架的设计动机。
这份文档在课程中的位置
该文档是课程 Lesson 15(RAG 与向量数据库)知识基地料之一,存放于 translations/bg/15-rag-and-vector-databases/data/ 目录下,与 perceptron.md(单层感知机,即本文的"前一节")、frameworks.md(神经网络框架与过拟合,即后续内容)构成一个完整的学习序列:从最简单的单层感知机,扩展到多层感知机,再过渡到 TensorFlow/PyTorch 等工业框架。
值得注意的是,从 notebook-rag-vector-databases.ipynb 中可以看到,课程笔记本的 data_paths 显式引用了 data/own_framework.md,即这份神经网络讲义在本仓库中同时承担着 RAG 实战的"知识库文档"角色——15 课 README 描述的"把 AI for beginners 神经网络课程资料作为数据源来给 LLM 做 grounding"的场景,正是以这几份 Markdown 文档为语料。因此,理解本文的内容,既是在学习神经网络基础,也是在理解该课程 RAG 案例中被检索、被引用的那部分知识本体。
提示:该保加利亚语文档注明由 AI 翻译服务生成,原文档提示自动翻译可能含错漏,英文原版 15-rag-and-vector-databases/data/own_framework.md 应视为权威来源;本文基于两者内容一致的部分进行讲解。
从单层感知机到更灵活的框架
文档开篇指出,在前一节(perceptron.md)中,读者已经学习了最简单的神经网络模型——单层感知机,它本质上是一个二分类的线性模型。本节将其扩展为一个更灵活的框架,使模型能力从三处得到提升:
- 除二分类外,支持多分类(multi-class classification);
- 除分类外,可以解决回归问题;
- 能够分割线性不可分的类别。
扩展的手段是"叠加层数":文档明确提出要开发一个自研的模块化 Python 框架,用来搭建不同架构的神经网络。这也是该节标题 "own framework(自己的框架)" 的由来。作为对照,前一节 perceptron.md 中感知机的输出定义为 y(x) = f(wᵀx),其中 f 是阶跃激活函数;其训练通过最小化感知机判据 E(w) = -Σwᵀxᵢtᵢ 来完成,权重更新式 w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ + Σηxᵢtᵢ 已经初现梯度下降的影子——本文的 MLP 内容正是这一思路向多层、非线性场景的推广。
机器学习问题的形式化
文档首先对机器学习任务做形式化定义:设训练数据集为 X,标签为 Y,需要构建一个模型 f 使预测尽可能准确,预测质量由损失函数(Loss function) ℒ 衡量。文档给出的常用损失函数为:
- 回归问题(预测一个数值):可使用绝对误差
Σᵢ|f(x⁽ⁱ⁾) − y⁽ⁱ⁾|或平方误差Σᵢ(f(x⁽ⁱ⁾) − y⁽ⁱ⁾)²; - 分类问题:使用 0-1 损失(本质上等价于模型的准确率 accuracy)或对数损失(logistic loss)。
对单层感知机而言,函数 f 被定义为线性函数:
f(x) = wx + b
其中 w 是权重矩阵,x 是输入特征向量,b 是偏置向量。而对不同的神经网络架构,f 可以呈现更复杂的形式。
文档还强调了一个分类场景的常见技巧:为了把网络输出转换为各类别的概率(例如对输出做归一化),常引入 softmax 函数 σ,此时 f 变为:
f(x) = σ(wx + b)
在上述定义中,w 与 b 合称为参数 θ = ⟨w, b⟩。给定数据集 ⟨X, Y⟩,就可以把整个数据集上的总误差表示为参数 θ 的函数。由此得到本节的核心命题(文档原文以 ✅ 高亮框强调):
神经网络训练的目标,就是通过改变参数 θ 来最小化误差。
梯度下降优化(Gradient Descent)
文档给出最经典的函数优化方法——梯度下降的形式化描述:计算损失函数对参数的导数(多维情形下称为梯度),并沿使误差减小的方向更新参数。算法步骤为:
- 用随机值初始化参数:w⁽⁰⁾、b⁽⁰⁾;
- 反复迭代以下步骤:
w⁽ⁱ⁺¹⁾ = w⁽ⁱ⁾ − η · ∂ℒ/∂w
b⁽ⁱ⁺¹⁾ = b⁽ⁱ⁾ − η · ∂ℒ/∂b
其中 η 即学习率(learning rate)。
文档随后区分了两个实践要点,值得在动手实现框架时记住:
- 理想情况:每一步优化都基于整个数据集计算(因为损失是对所有训练样本求和);
- 实际情况:每次只取数据集的一小部分——小批量(minibatch)——来估计梯度。由于子集每次都是随机抽取的,该方法被称为随机梯度下降(Stochastic Gradient Descent,SGD)。
这一区分直接决定了自研框架中 train 循环的写法:内层循环应当按 minibatch 采样并更新参数,而不是每个 epoch 只更新一次。
多层感知机与反向传播
单层网络只能分类线性可分的类别。为了构建更丰富的模型,文档的方案是组合多个层,数学上等价于把 f 的计算拆成多步:
z₁ = w₁x + b₁
z₂ = w₂α(z₁) + b₂
f = σ(z₂)
其中:
- α 是非线性激活函数(non-linear activation function),它是打破"多层线性叠加仍等于一层线性"这一退化现象的关键;
- σ 是 softmax 函数(用于把输出转为类别概率);
- 参数为 θ = ⟨w₁, b₁, w₂, b₂⟩。
梯度下降算法本身保持不变,但梯度计算变得复杂。依据复合函数求导的链式法则(chain rule),对各层权重的导数为:
∂ℒ/∂w₂ = (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂w₂)
∂ℒ/∂w₁ = (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂α)(∂α/∂z₁)(∂z₁/∂w₁)
文档用一个关键观察点出了"反向传播"名字的由来:上述所有表达式的"最左侧"因子(∂ℒ/∂σ …)是相同的,因此可以从损失函数出发,沿计算图"从后往前"逐层复用中间结果来计算所有参数梯度。这一"从损失向后穿行的计算图"遍历方式,就是训练多层感知机的 backpropagation(反向传播) 算法。
✅ 文档明确强调:链式法则用于计算损失函数对各参数的导数;而反向传播的更细致实现,课程计划在配套的笔记本示例中展开。从文档本身看,当前仓库中该配套笔记本路径并未随数据文件提供(data 目录下仅有三份 Markdown),因此本文以文档内的公式推导为准,不虚构具体代码文件。
学习路径:从手写 backprop 到框架自动微分
文档中有一句承上启下的话:"我们将开发自己的模块化 Python 框架,以便搭建不同的神经网络架构。"这句话与下一节 frameworks.md 形成呼应:该节指出,像 numpy 这样的库能完成张量运算(乘、加、sigmoid、softmax 等),但梯度需要自己算——"在上一节我们开发的框架中,不得不在 backward 方法里手动编写所有求导函数来实现反向传播";理想的框架应当能对任意表达式自动计算梯度。由此可以推断课程的完整设计意图:
- 本文(own_framework):手写 MLP 的前向计算与
backward求导,吃透反向传播; - frameworks.md:理解计算图(computational graph)、自动微分,以及 TensorFlow/PyTorch 的低级 API 与高级 API(Keras、PyTorch Lightning)的分工;
- GPU 并行:深层网络训练计算量巨大,把计算分布到 GPU/TPU 等专用计算单元上,是工业框架的另一核心能力。
课程挑战与作业
继承原文档的实战安排:
- 挑战(Challenge):在配套的 OwnFramework 笔记本中,实现一个用于构建与训练多层感知机的自有框架,亲手看清现代神经网络如何运转(文档中此笔记本链接为课程外部资源,当前仓库未包含该文件);
- 作业(Assignment):使用你在本节构建的框架,完成 MNIST 手写数字分类任务——这是从"二维简单分类"跃迁到多分类、真实数据集的标志性一步,正好验证本文"扩展为多分类框架"的三条能力;
- 自研学习:反向传播是 AI/ML 中极其常见的算法,文档建议进一步深入钻研。
小结
本文对应的课程文档虽然篇幅不长,但完整覆盖了一条严谨的技术主线:
| 环节 | 核心概念 | 文档位置 |
|---|---|---|
| 问题定义 | 数据集 ⟨X, Y⟩、损失函数 ℒ(绝对/平方误差、0-1 损失、对数损失) | own_framework.md |
| 优化方法 | 梯度下降、学习率 η、minibatch 与 SGD | own_framework.md |
| 模型结构 | 多层线性变换 + 非线性激活 α + softmax σ | own_framework.md |
| 训练算法 | 链式法则 + 从损失向后遍历计算图 = 反向传播 | own_framework.md |
| 实战目标 | 自研模块化框架 + MNIST 多分类作业 | own_framework.md |
结合本仓库的实际用途,这份文档还扮演了 RAG 知识基座中"可被向量检索的领域知识"的角色:当你实现课程中的 notebook-rag-vector-databases.ipynb 并向其中的问答系统提问"什么是反向传播"时,被召回并注入 LLM 上下文的,正是本文讲解的这些段落。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00