多层感知机(MLP)与反向传播:generative-ai-for-beginners 课程中的机器学习形式化、梯度下降与反向传播原理
【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners
本文基于 generative-ai-for-beginners 仓库中的神经网络专题文档data/own_framework.md(阿拉伯语译文 与其内容一致)展开。读完后,你将掌握三个核心能力:把分类/回归问题形式化为“可调参数 + 损失函数”的优化问题、用梯度下降与随机梯度下降(SGD)训练神经网络、以及理解多层感知机(Multi-Layered Perceptron, MLP)为何能分类线性不可分数据——即反向传播的链式求导原理。
文档在课程中的位置
own_framework.md是第 15 课 Retrieval Augmented Generation (RAG) and Vector Databases 配套知识库文档之一。该课程为了演示 RAG,把三篇神经网络教学文档作为“私有数据”注入知识库:
- perceptron.md:感知机(Perceptron),二分类线性模型(上一节);
- own_framework.md:本文档,多层感知机与反向传播(本节);
- frameworks.md:现有主流框架(TensorFlow / PyTorch / Keras 等)的对比(下一节)。
在配套的 notebook-rag-vector-databases.ipynb 中,data/own_framework.md与另外两篇文档一起被读取、分块(chunking)、向量化(embedding),并写入本地索引与 Azure AI Search 供语义检索。也就是说,本文档既是“教学内容”,也是本课程 RAG 演示的“语料”——关于它如何被分块和检索的实操细节,见本文最后一节“仓库中的落地用法”。
从单层感知机出发:为什么要扩展到 MLP
在上一节(perceptron.md)中,课程介绍了最简单的神经网络模型——单层感知机。它是一个线性二分类模型:给定输入向量 x,输出 y(x) = f(wᵀx),其中 f 是阶跃激活函数,w 是需要通过训练求得的权重向量。单层感知机只能处理线性可分的分类问题。
本文档(own_framework.md)将这一模型扩展为更灵活的框架,允许我们:
- 在二分类之外进行多类别分类(multi-class classification);
- 在分类之外解决回归问题(regression);
- 分离线性不可分的类别。
同时,文档的目标是用 Python 开发一个自己的模块化框架(own modular framework),能够构建不同的神经网络架构——这解释了文件名 “own framework” 的由来。
机器学习问题的形式化
文档首先把机器学习问题做严格的形式化表述:
假设有训练数据集X与标签Y,需要构建一个模型f使其预测尽可能准确。预测质量由损失函数(Loss function)ℒ度量。
文档给出的常用损失函数分为两类:
| 问题类型 | 常用损失函数 | 数学表达 |
|---|---|---|
| 回归(预测一个数值) | 绝对误差(absolute error) | ∑ᵢ|f(x⁽ⁱ⁾) − y⁽ⁱ⁾| |
| 回归 | 平方误差(squared error) | ∑ᵢ(f(x⁽ⁱ⁾) − y⁽ⁱ⁾)² |
| 分类 | 0-1 损失 | 本质上等价于模型的准确率(accuracy) |
| 分类 | 逻辑损失(logistic loss) | 对数形式的连续可微损失 |
对于单层感知机,模型函数f被定义为线性函数:
f(x) = wx + b其中w是权重矩阵,x是输入特征向量,b是偏置向量。而对于不同的神经网络架构,f可以取更复杂的形态。
softmax:把网络输出变成类别概率
文档特别指出:分类场景下,我们往往希望网络的输出是各类别对应的概率。为了把任意实数向量转换为概率(即对输出做归一化),通常引入softmax 函数 σ,于是模型变为:
f(x) = σ(wx + b)softmax 将每个类别的“原始得分(logits)”归一化为和为 1 的非负概率,这正是多分类任务的标准输出层。
训练目标
在上述f的定义中,w和b合称为参数θ = ⟨w,b⟩。给定数据集 ⟨X,Y⟩,我们可以把整个数据集上的总误差计算为参数 θ 的函数。由此得出全文的核心结论:
✅神经网络训练的目标,就是通过不断调整参数 θ 来最小化误差。
这一句话把“神经网络训练”归结为一个纯粹的数值优化问题——后续的梯度下降与反向传播,都是为了解决这个问题。
梯度下降优化(Gradient Descent)
文档介绍了函数优化的经典方法——梯度下降。核心思想是:计算损失函数关于参数的导数(多维情况下称为梯度),然后沿梯度反方向调整参数,使误差下降。形式化表述如下:
- 用随机值初始化参数 w⁽⁰⁾、b⁽⁰⁾;
- 反复执行以下更新步骤多次:
w⁽ⁱ⁺¹⁾ = w⁽ⁱ⁾ − η · ∂ℒ/∂w b⁽ⁱ⁺¹⁾ = b⁽ⁱ⁾ − η · ∂ℒ/∂b其中η(eta)是学习率(learning rate),控制每一步参数更新的幅度;∂ℒ/∂w、∂ℒ/∂b 是损失函数对相应参数的偏导数。
从批量到随机:Minibatch 与 SGD
文档进一步区分了理想与现实:
- 理论上,每一步优化都应考虑整个数据集(因为损失被定义为对所有训练样本求和);
- 实际中,我们每次只取数据集的一小部分——称为minibatch(小批量)——基于这个数据子集计算梯度。由于每次被选中的子集都是随机的,这种方法被称为随机梯度下降(stochastic gradient descent, SGD)。
这解释了现代深度学习训练循环的典型形态:循环遍历多个 epoch,每个 epoch 内把数据切成若干随机 minibatch,逐批计算梯度并更新参数。SGD 的随机性反而带来了计算效率提升和一定程度的正则化效果(可结合 frameworks.md 中关于计算图与 GPU 并行的讨论理解其工程意义)。
多层感知机(MLP):前向传播结构
单层网络的表达能力有限——它只能分类线性可分的类别。要构建更丰富的模型,就把网络的若干层串联起来。文档给出的两层 MLP 前向传播公式为:
z₁ = w₁x + b₁ z₂ = w₂α(z₁) + b₂ f = σ(z₂)各符号含义:
| 符号 | 含义 |
|---|---|
| α | 非线性激活函数(non-linear activation function),这是打破线性叠加、获得非线性表达力的关键 |
| σ | softmax 函数 |
| θ = ⟨w₁, b₁, w₂, b₂⟩ | 整个网络的参数集合(每层各自持有一组权重与偏置) |
直观理解:输入 x 先经第一层线性变换得到 z₁,α 引入非线性“弯折”,第二层再做线性变换得到 z₂,最后 softmax 输出类别概率。只要 α 是非线性的,多层叠加后f就不再是输入的线性函数,理论上可以逼近复杂的非线性决策边界——这就是 MLP 能处理线性不可分类别的数学依据。
反向传播(Backpropagation):链式法则如何工作
有了多层结构后,梯度下降算法本身不变,但梯度怎么算变得更复杂。文档利用**链式求导法则(chain differentiation rule)**给出各层权重的导数:
∂ℒ/∂w₂ = (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂w₂) ∂ℒ/∂w₁ = (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂α)(∂α/∂z₁)(∂z₁/∂w₁)✅ 链式求导法则用于计算损失函数关于各参数的导数。
文档随后点出了反向传播命名的本质原因:
注意上面所有表达式最左侧的部分都是相同的(即 ∂ℒ/∂σ 这一项)。因此我们可以从损失函数出发,沿着计算图“由后往前”逐层高效地计算导数,避免重复计算公共子表达式。
正是这种“从损失出发、沿计算图反向逐层传递”的求导方式,得名backpropagation(反向传播)或简称 backprop。可以这样理解其工程价值:若逐参数独立求导,公共因子会被反复计算;而反向传播把中间结果(如 ∂ℒ/∂σ、∂σ/∂z₂)复用给更早的层,使得训练成本与参数量近似线性相关,而非指数膨胀。
文档原文在此处留有 “TODO: image citation” 占位(即仓库中未附带该示意图),并声明反向传播将在配套 notebook 中更详细地展开。
课程实战任务:Challenge 与 Assignment
文档结尾给出了三层递进的实践安排,完整继承如下:
- Challenge(挑战):在配套 notebook 中,自己动手实现一个用于构建和训练多层感知机的框架——从源码层面看清现代神经网络是如何运转的。课程原文指向 “OwnFramework notebook”;在本仓库的当前形态中,该课程第 15 课配套的 notebook 是 notebook-rag-vector-databases.ipynb,它把本文档作为 RAG 知识库语料,展示了“文本 → 分块 → embedding → 检索 → 增强生成”的完整链路(适用前提:需配置
AZURE_OPENAI_ENDPOINT、AZURE_OPENAI_API_KEY、AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT、AZURE_OPENAI_DEPLOYMENT等环境变量,notebook 中通过os.getenv读取)。 - Assignment(作业):使用本课自己构建的框架,完成MNIST 手写数字分类——这正是“多类别分类 + 线性不可分”两个能力的综合检验(10 个数字类别,单个像素值无法线性分离)。
- Review & Self Study(复习与自研):文档明确建议对反向传播做更深入的学习——它是 AI 与机器学习中最通用的算法之一。
仓库中的落地用法:本文档如何成为 RAG 语料
这一节把文档内容与仓库源码串联起来,说明own_framework.md在本仓库中的真实用途——它是 RAG 演示的被检索对象。
在 notebook-rag-vector-databases.ipynb 中,可以确认以下处理链路:
- 加载语料:notebook 将
data/frameworks.md、data/own_framework.md、data/perceptron.md三个文件读入 pandas DataFrame,每行记录{path, text}; - 分块(chunking):对全文调用
split_text(x, 400, 300)——即把每篇文档按词切分为长度介于 300 与 400 字符之间的文本块,再用explode('chunks')把块展开为独立行。这正是 README 所述“因 LLM 存在输入 token 上限,需把长文档拆成 chunk 并附带上下文”策略的具体实现; - 向量化:分块文本经 Azure OpenAI 的 embedding 部署(
AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT)转换为向量; - 检索与重排:用
sklearn.neighbors.NearestNeighbors(n_neighbors=5, algorithm='ball_tree')在本地构建最近邻索引,对查询向量执行kneighbors找出语义最接近的块,再把这些块拼进 prompt 交给 LLM(gpt-4o-mini,temperature=0.7)生成基于私有数据的回答; - 评估维度:README 同时给出了 RAG 应用的评估标准——回答质量、groundedness(回答是否来自提供的文档)、相关性与流畅度。
也就是说,本文档讲解的“多层感知机 / 梯度下降 / 反向传播”知识点,恰好会被课程的 RAG 演示以“what is a perceptron?”这类问题检索到并返回给用户——教学内容与工程演示在此形成了闭环。
小结
- 形式化:任何机器学习任务 = 模型f(θ) + 数据集 ⟨X, Y⟩ + 损失函数 ℒ;分类常用 0-1 损失或逻辑损失,回归常用绝对/平方误差;softmax 把输出归一化为类别概率。
- 优化:训练目标是最小化总误差;梯度下降按 w⁽ⁱ⁺¹⁾ = w⁽ⁱ⁾ − η∂ℒ/∂w 迭代更新参数;实际训练用随机 minibatch,即 SGD。
- 表达力:多层感知机通过“线性层 + 非线性激活 α + 线性层 + softmax”叠加,获得处理线性不可分问题的能力。
- 反向传播:利用链式法则,从损失出发沿计算图反向逐层求导,公共子表达式天然复用,因此高效。
- 仓库佐证:data/own_framework.md 既是教学正文,也是 RAG notebook 的知识库语料(分块参数 400/300),完整链路可参考 第 15 课 README。
继续学习的自然路径是 frameworks.md:在掌握“手写框架”的原理之后,理解 TensorFlow / PyTorch 等主流框架的 low-level API(计算图、GPU 并行)与 high-level API(Keras 等)如何把本文档中的原理产品化。
【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考