多层感知机与反向传播深度解析:在 generative-ai-for-beginners 中从零构建自己的神经网络框架

发布时间:2026/9/8 23:57:34
多层感知机与反向传播深度解析:在 generative-ai-for-beginners 中从零构建自己的神经网络框架 多层感知机与反向传播深度解析在 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 仓库中的神经网络讲义《Introduction to Neural Networks. Multi-Layered Perceptron》即 translations/da/15-rag-and-vector-databases/data/own_framework.md展开系统梳理机器学习问题形式化、损失函数、梯度下降与随机梯度下降、多层感知机前向传播以及反向传播背后的链式法则。读完本文你将能够理解现代神经网络训练的核心数学机制并具备动手实现一个最小化自有神经网络框架并完成 MNIST 手写数字分类的完整思路。文档定位一份被 RAG 用作知识库的神经网络讲义先厘清这份文档在仓库中的角色避免误读。在课程的第 15 课 15-rag-and-vector-databases/README.md 的实战场景中作者希望把AI 初学者的神经网络讲义作为私有语料注入教育类聊天机器人用于生成练习测验、复习卡片与要点摘要。为此仓库在 15-rag-and-vector-databases/data 目录下放置了三篇完整的讲义正文data/perceptron.md单层感知机——最朴素的二元线性分类模型data/own_framework.md本文的主体——把感知机推广为多层结构并讲解其训练算法反向传播data/frameworks.md把上述手写思想落到 TensorFlow/PyTorch 等工业框架并引入过拟合Overfitting概念。配套的 RAG 实操 notebook notebook-rag-vector-databases.ipynb 会直接以data/frameworks.md、data/own_framework.md、data/perceptron.md三个路径作为知识库语料进行分块、嵌入与索引——也就是说当你在该 notebook 里向检索系统提问什么是感知机之类的问题时命中的正是本文讨论的这些讲义文本。从学习序列上看own_framework 是承上启下的关键一章感知机只能处理线性可分的二分类问题本文把它扩展为一种更灵活的框架使其能够做到三件事在二分类之外支持多分类、在分类之外求解回归问题、能够切分线性不可分的类别。同时课程目标是用 Python 开发一个模块化的自有框架用来搭建不同结构的神经网络从底层理解隐藏层与误差回传的运作机理。机器学习问题的形式化数据集、模型与损失函数讲义首先把机器学习问题严格地形式化。假设我们有带标签的训练数据集X特征与Y标签需要构建一个模型f做出尽可能准确的预测。预测质量的度量标准就是**损失函数loss function**ℒ不同的任务类型选用不同的损失函数任务类型损失函数数学形式直觉含义回归预测一个连续数值绝对误差∑ᵢ |f(x⁽ⁱ⁾) − y⁽ⁱ⁾|预测值与真值距离之和对离群点不如平方误差敏感回归平方误差∑ᵢ (f(x⁽ⁱ⁾) − y⁽ⁱ⁾)²对较大误差施加更强惩罚数学上处处可导分类0-1 损失分类错误记为 1正确记为 0实质上等价于模型的准确率accuracy分类逻辑损失logistic loss基于对数似然的逐样本损失平滑可导配合梯度下降使用对单层感知机而言模型f是一个线性函数 f(x)wxb其中w是权重矩阵、x是输入特征向量、b是偏置向量。对不同的神经网络架构这个函数会呈现更复杂的形式。值得注意的是分类任务中一个常用技巧为了让输出表现为各类别的概率需要把网络的任意实数输出归一化到 (0,1) 且总和为 1这就要用到softmax 函数σ于是模型变为f(x)σ(wxb)在上面的定义里w与b被统称为模型的参数θ⟨w,b⟩。给定数据集 ⟨X,Y⟩ 后整个数据集上的总误差就是参数 θ 的函数。于是神经网络的训练目标被浓缩为一句话✅ 训练神经网络的目标就是通过调整参数 θ 使总误差最小化。梯度下降优化沿着误差下降最快的方向更新参数函数优化有一个经典方法叫梯度下降gradient descent。核心思想是计算损失函数对参数的导数在多维情形下称为梯度 gradient然后沿令误差减小的方向调整参数。用数学语言可形式化为两步初始化用一些随机值初始化参数 w⁽⁰⁾、b⁽⁰⁾迭代更新反复执行以下更新直到收敛——w⁽ⁱ⁺¹⁾ w⁽ⁱ⁾ − η ∂ℒ/∂wb⁽ⁱ⁺¹⁾ b⁽ⁱ⁾ − η ∂ℒ/∂b其中 η 是学习率learning rate决定每步沿梯度反方向迈出的步长∂ℒ/∂w、∂ℒ/∂b 分别是损失对权重和偏置的偏导。η 过大容易震荡甚至发散η 过小则收敛极慢是训练中最需要调参的维度之一。讲义特别强调了一个理想与现实的落差理论上上述优化步应当基于整个数据集计算因为损失是所有训练样本误差之和但实践中数据集可能非常大逐次全量扫描计算量不可接受因此我们每次只取数据集的一小部分称为小批量minibatches仅根据这一子集上的梯度来更新参数。由于每次选取的子集是随机的这种算法被称为随机梯度下降stochastic gradient descentSGD。现代深度学习训练中批量大小batch size与学习率调度共同决定了训练的稳定程度与收敛速度。值得一提的是上一章感知机讲义 data/perceptron.md 中给出了同一思想的单层雏形通过感知机准则 E(w)−∑wᵀxᵢtᵢ 定义误差用梯度下降得到权重更新式 w⁽ᵗ⁺¹⁾w⁽ᵗ⁾∑ηxᵢtᵢ。单层时偏导可以手推解析式直接得到一旦网络加深梯度解析式变得极其繁琐这正是下一节反向传播要解决的问题。多层感知机从线性边界到非线性表达前文反复提到单层网络只能分类线性可分的类别表达能力有限。要构建更强的模型需要把多个层堆叠起来stack several layers。数学上这意味着函数f变得更复杂需要分步计算z₁ w₁x b₁第一层线性变换得到隐藏层净输入z₂ w₂α(z₁) b₂对隐藏层输出施加非线性激活 α 后再做第二层线性变换f σ(z₂)最后一层用 softmax 归一化输出各类别概率其中 α 是非线性激活函数non-linear activation functionσ 是 softmax 函数整体参数记为 θ⟨w₁, b₁, w₂, b₂⟩。这里的非线性激活是关键设计如果层与层之间只有线性变换无论堆多少层复合函数在数学上仍等价于单个线性变换模型表达能力不会增强只有插入类似 sigmoid、tanh、ReLU 这样的非线性函数网络才能拟合非线性边界从而具备多分类、回归与切分非线性可分类别这三项第 1 节承诺的能力。常见激活函数中ReLU 计算简单、梯度不易饱和是隐藏层的主流选择softmax 则专门用于输出层的多分类概率化。这一段推导与 data/frameworks.md 中把网络视为层的序列的高层视角正好衔接。反向传播用链式法则让误差梯度向后流动网络加深后梯度下降算法本身没变——我们依旧沿损失梯度的反方向更新 θ——但计算梯度变得困难得多。对一个两层网络利用微积分中的链式法则chain rule可以逐层把偏导拆开∂ℒ/∂w₂ (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂w₂)∂ℒ/∂w₁ (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂α)(∂α/∂z₁)(∂z₁/∂w₁)✅ 链式法则正是用来计算损失函数对每一层参数偏导的工具。观察这两个式子可以发现一个关键规律每个表达式的最左端因子完全相同都是从损失 ℒ 出发的那一串公因子。这意味着我们不需要为每一层独立重新求导而是可以从损失函数出发沿着计算图computational graph自后向前逐层复用已经算好的梯度项一次性高效算出所有层参数的梯度。这套先前向传播算出每层输出再从输出层把误差梯度一层层传回输入层的方法就是多层感知机的标准训练算法——反向传播backpropagation常简称为 backprop。讲义在此处提示反向传播的细节会在 notebook 示例中逐步展开原文标注了 TODO 配图占位。对希望亲手验证的读者这里给出一个遵循上述公式结构的最小两层 MLP 实现示意演示用聚焦前向/反向两条计算链import numpy as np def softmax(z): e np.exp(z - z.max(axis-1, keepdimsTrue)) return e / e.sum(axis-1, keepdimsTrue) def forward(x, W1, b1, W2, b2): # 第 1 层线性变换 - 非线性激活 z1 x W1 b1 a1 np.maximum(0, z1) # ReLU 作为非线性激活 α(z1) # 第 2 层线性变换 - softmax 输出概率 z2 a1 W2 b2 return softmax(z2), (z1, a1, z2) def backward(x, y_onehot, W2, cache): z1, a1, z2 cache # softmax 与交叉熵组合损失的梯度可化简为 (p - y) dz2 softmax(z2) - y_onehot # ∂L/∂z2 dW2 a1.T dz2 # ∂L/∂W2 (∂L/∂σ)(∂σ/∂z2)(∂z2/∂W2) db2 dz2.sum(axis0) # ∂L/∂b2 da1 dz2 W2.T # 误差回传到隐藏层输出 dz1 da1 * (z1 0) # ∂L/∂z1ReLU 的导数为分段常数 dW1 x.T dz1 # ∂L/∂W1 db1 dz1.sum(axis0) # ∂L/∂b1 return dW1, db1, dW2, db2这段代码里的dz2、da1、dz1分别对应链式法则展开式中的中间因子自输出层向输入层依次复用、层层回传正是 backprop 高效性的直观体现。更新参数时只需执行 w ← w − η·dw、b ← b − η·db可配合任意批大小的 SGD 循环。动手挑战与作业从自有框架到 MNIST讲义在本章末尾安排了完整的实践闭环这与仓库课程一贯的先手写再上框架路线一致挑战Challenge在配套 notebook 中自己实现一个用于构建并训练多层感知机的框架。通过逐层设计线性变换、激活函数与前向/反向方法可以近距离观察现代神经网络的工作方式。复习与自学Review Self Studybackprop 是 AI/ML 领域的基础算法值得深入研究。作业Assignment利用本课构建的自有框架解决MNIST 手写数字分类问题——把 28×28 的灰度图像展平为 784 维输入向量隐藏层使用非线性激活输出层用 softmax 输出 10 个数字类别的概率并用训练集上的交叉熵损失驱动梯度下降。需要说明的是本文所依据的讲义文本在仓库中主要以RAG 知识库语料的形式存在其配套的 OwnFramework notebook 并不在当前仓库中讲义原文由英文版 translations/en/15-rag-and-vector-databases/data/own_framework.md 经机器翻译为丹麦语等多语言版本详见原文末尾免责声明因此上面给出的代码为遵循讲义公式的示意实现读者可按同一思路自行完成框架搭建。若想观察这三篇讲义如何被真正索引并检索可直接运行 notebook-rag-vector-databases.ipynb它会依次加载data/*.md、分块并向量化后存入索引随后对讲义内容进行语义问答。符号速查与核心要点回顾记号含义X / Y训练特征集 / 标签集f模型对单层为线性 f(x)wxbℒ损失函数衡量预测质量σsoftmax 函数把任意实值归一化为概率α非线性激活函数θ⟨w,b⟩模型参数权重与偏置η学习率控制梯度下降步长w⁽ⁱ⁺¹⁾w⁽ⁱ⁾−η∂ℒ/∂w梯度下降的迭代更新公式z₁→α→z₂→σ两层 MLP 的前向计算链回顾全文可以得到五条贯穿始终的结论其一所有监督学习都可抽象为以损失函数度量的参数寻优问题其二梯度下降及其小批量变体 SGD 是参数寻优的基本引擎其三多层结构的价值在于非线性激活带来的表达能力跃升其四链式法则是推导深层梯度、进而实现反向传播的数学基础其五反向传播的本质是在计算图上自输出层向输入层高效复用梯度因子。理解了这五条主线就掌握了理解 PyTorch、TensorFlow 等现代框架见 data/frameworks.md以及后续 embedding、向量检索等上层应用的基石——因为文本嵌入embedding的底层正是这些神经网络在无监督目标下学到的向量表示。【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考