从零构建神经网络框架:多层感知机、梯度下降与反向传播原理精讲(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本篇技术指南以仓库 own_framework.md及其捷克语译本 translations/cs/15-rag-and-vector-databases/data/own_framework.md为骨架系统讲解机器学习的形式化定义、损失函数、梯度下降与随机梯度下降以及多层感知机MLP背后的链式法则与反向传播backprop原理。文中还会结合仓库内同目录的 perceptron.md 与 frameworks.md 两篇姊妹文档还原“单层感知机 → 自研模块化框架 → 业界框架 TensorFlow/PyTorch”的完整进阶路线。读完你将能透彻理解深度学习中“前向计算 反向求导”的运作机制并具备手写一个可训练多层感知机的小型 Python 框架、进而完成 MNIST 手写数字分类任务的全部知识储备。这篇文档在仓库中的定位既是理论讲义又是 RAG 演示语料在阅读正文前有必要说明这份文档在仓库中的物理位置与两种用途这对理解它的写作风格和内容边界很有帮助学习载体文件位于第 15 课 RAG 与向量数据库的知识数据目录下与 perceptron.md、frameworks.md 共同组成一套迷你“神经网络入门”系列资料。三份文档按内容衔接先介绍单层感知机二元分类、感知机训练法则再进入本篇“在感知机基础上扩展出模块化框架、支持多类分类/回归/非线性可分”最后讨论真实深度学习框架与过拟合。中文语境下阅读时应把三篇当作一组连续讲义看待。RAG 示例语料本仓库的第 15 课用 notebook-rag-vector-databases.ipynb 演示“读取一批 Markdown 文档 → 分块 → 向量化入库 → 检索问答”的完整 RAG 流程而这三份data/*.md文件正是 notebook 中实际读取、分块并索引的文档集合该 notebook 内将它们逐一读入 DataFramepath 字段分别为data/frameworks.md、data/own_framework.md、data/perceptron.md。也就是说本篇文章所讲的神经网络理论在本仓库中还承担着“可供检索的知识正文”这一角色。本篇承接的上一讲是单层感知机——一个做二元分类的线性模型。单层感知机的局限性很明显它只能分开“线性可分”的两类数据。本讲将把这个模型推广成一个更灵活的框架使得我们能做到三件事在二分类之外支持多类别分类multi-class classification在分类之外还能求解回归问题regression分离**非线性可分not linearly separable**的类别。同时我们会在 Python 中亲手搭建一个模块化的自研框架用它来拼装不同的神经网络架构。下面从数学形式化讲起。机器学习问题的形式化数据集、模型与损失函数为了让“训练神经网络”这件事可计算、可优化第一步是把它写成严格的形式化问题。设X为训练数据集Y为对应的标签集合目标是从中学到一个模型f使得它的预测尽可能准确。“预测有多准”需要用损失函数loss functionℒ 来度量训练的本质就是在参数空间里找到让损失最小的那个f。针对不同任务仓库讲义给出了最常用的几种损失函数任务类型损失函数说明回归预测一个连续数值绝对误差Σᵢ|f(x⁽ⁱ⁾)−y⁽ⁱ⁾|对每个样本预测值与真实值之差的绝对值求和回归预测一个连续数值平方误差Σᵢ(f(x⁽ⁱ⁾)−y⁽ⁱ⁾)²差的平方求和放大较大误差的惩罚分类0-1 损失预测错了记 1、对了记 0其均值本质上等价于模型的准确率accuracy分类逻辑损失logistic loss相对 0-1 损失是平滑可微的代理损失便于梯度优化在单层感知机中模型f被定义成一个线性函数f(x)wxb其中w是权重矩阵x是输入特征向量b是偏置bias向量。而在更复杂的神经网络架构中这个函数会变成逐层嵌套的复合函数见后文“多层感知机”一节。在分类任务中我们通常希望网络的输出直接就是“属于每个类别的概率”。要把任意实数输出规整成概率值即对输出做归一化最常用的手段是softmax函数 σ。加上 softmax 之后模型函数就写为f(x)σ(wxb)。在上面f的定义里w和b合称为模型的参数θ⟨w,b⟩。给定数据集 ⟨X,Y⟩就可以把“整个数据集上的总误差”写成参数 θ 的函数——误差越小说明当前的参数组合越好。✅神经网络训练的目标就是通过改变参数 θ 来最小化误差。这句话是理解后续所有优化算法的总纲误差是 θ 的函数训练 优化这个函数。梯度下降优化沿着误差曲面最陡的方向下山面对“最小化误差函数”这个优化问题最经典的手段是梯度下降gradient descent。核心思想非常直观损失函数 ℒ 关于参数有导数在多维情况下这个导数被称为梯度gradient它指向误差增长最快的方向想让误差下降就让参数朝梯度的反方向移动一小步反复执行直到误差收敛到局部极小附近。形式上可以写成下面两步先用随机值初始化参数w⁽⁰⁾, b⁽⁰⁾然后反复迭代更新每次移动的方向与梯度相反、步长由学习率η 控制w⁽ⁱ⁺¹⁾ w⁽ⁱ⁾ − η·∂ℒ/∂wb⁽ⁱ⁺¹⁾ b⁽ⁱ⁾ − η·∂ℒ/∂b学习率 η 决定每一次沿反梯度方向迈出的步子有多大是整个训练过程中最关键的调节旋钮之一。这一步更新规则在姊妹文档 perceptron.md 中同样以w⁽ᵗ⁺¹⁾ w⁽ᵗ⁾ − η∇E(w)的形式出现那里 η 被正式命名为学习率、∇E(w) 被称为 E 的梯度——可见感知机训练与深度网络训练共享同一套优化框架。从理论严谨性看每一步更新都应该基于整个数据集来计算梯度毕竟损失是对所有训练样本求和得到的。但在真实世界中一次性遍历全量数据计算梯度代价过高于是实践中普遍的做法是从数据集中取一小部分称为小批量minibatches基于这一子集计算梯度。由于每次抽取的子集都是随机的梯度带上了随机性这种方法也因此被称为随机梯度下降SGDstochastic gradient descent。小批量策略同时带来了工程上的好处每次迭代只处理一小块数据内存开销可控且算法能在更早的迭代步数内看到多个不同子集训练整体上更高效、更常能在损失曲面中“跳出”不利区域。多层感知机用非线性激活堆叠出表达能力更强的模型回到能力边界的问题如上一讲所述单层网络只能对“线性可分”的类别做划分。要想建模更复杂的关系比如异或这种经典非线性可分情形就需要把多层网络组合起来。数学上这意味着函数f不再是一步线性变换而是按多个步骤依次计算z₁ w₁x b₁z₂ w₂α(z₁) b₂f σ(z₂)其中α 是非线性激活函数non-linear activation functionσ 是输出端的 softmax而全部待训练参数收敛为 θ⟨w₁,b₁,w₂,b₂⟩。这里有一个值得展开说明的关键点为什么两层之间必须夹一个非线性的 α如果去掉 α、直接把两个线性变换叠在一起w₂(w₁xb₁)b₂化简后仍然只是一个线性函数——再多层也等价于一层模型表达能力不会有任何提升。正是非线性激活函数的引入才使得复合函数可以拟合弯曲的决策边界从而分离非线性可分的类别。文档把它抽象成“α(z₁)”的嵌套形式就是提醒读者前一层输出要先过激活、再进下一层。链式法则与反向传播误差信息如何逐层“回流”层数增加后梯度下降的目标没变变难的是梯度的计算——损失 ℒ 与深层参数 w₁、w₂ 之间隔着多层复合运算无法直接一步求导。此时要用到微积分里的链式法则chain rule。对上述两隐藏层的结构梯度可以展开为∂ℒ/∂w₂ (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂w₂)∂ℒ/∂w₁ (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂α)(∂α/∂z₁)(∂z₁/∂w₁)✅链式法则是计算损失函数关于各参数导数的核心工具。每一层只需提供“局部导数”把从损失到该参数的路径上的所有局部导数相乘即可。请注意上面两个式子最左端(∂ℒ/∂σ)与(∂σ/∂z₂)是相同的公共因子。这意味着我们完全不必为每个参数各算一遍完整求导而可以采取一个高效得多的策略从损失函数出发沿着计算图从后向前逐层把“误差相对于本层输出的导数”累积下来并复用。这种让梯度从输出端向输入端层层回传、从而高效训练多层感知机的方法正是著名的反向传播backpropagation简称backprop。换个角度理解反向传播的直觉前向阶段每一层都记住了自己的输入输出反向阶段则像在“反向再走一遍网络”——每一层拿到上一层传来的梯度用本地的权重与激活导数把梯度继续向前传同时顺手算出自己参数的梯度供 SGD 更新使用。由于所有共享前缀被复用反向传播的计算开销与前向几乎同量级这是它能撑起现代深度学习的根本原因。关于反向传播更精细的推导包括各层的局部导数到底长什么样、如何组织求导顺序原文档明确提示“在 notebook 示例中会展开更详细讲解”读者在做下面“动手实践”部分时可以边写代码边对照本节公式验证。从公式到代码自研框架的最小模块化骨架光有数学还不够——文档在开篇就承诺“在 Python 中开发一个模块化自研框架允许我们拼装不同架构”。姊妹文档 frameworks.md 把自研框架要解决的两件事讲得很清楚张量运算能对张量做乘法、加法并计算 sigmoid、softmax 等函数——在 Python 里numpy就能胜任梯度计算为所有表达式求出梯度以执行梯度下降——这正是自研框架最费功夫的部分。frameworks.md 里特别强调在“上一节即本讲自研的框架”中我们必须在每一个模块的backward方法里手工编写全部导数函数来执行反向传播。这实际上给了我们一个非常清晰的模块化设计线索把网络拆成一层层对象每层实现“前向”与“反向”两个方法。结合 perceptron.md 给出的感知机训练循环随机抽正负样本、计算输出、按误差方向更新权重可以重构出如下最小骨架示意代码用于说明文档所描述的分层思想class Layer: 网络中的一个层/模块负责前向计算与反向传播 def forward(self, x): 前向记录输入输出返回本层输出 raise NotImplementedError def backward(self, grad_output): 反向接收来自上游的梯度计算并返回对输入的梯度 raise NotImplementedError基于上述约定一个可训练的多层感知机大体需要四部分能力模块容器把若干 Layer 串成序列前向时依次调用forward反向时按逆序调用backward恰好实现“误差从损失函数沿计算图向输入方向回流”可导激活/输出函数把 σ(softmax) 与 α(非线性激活) 封装为 Layer各自在backward中实现自己的局部导数损失模块按任务选用平方误差回归或 0-1/逻辑损失分类并作为反向传播的“起点”输出∂ℒ/∂输出SGD 训练循环随机抽取 minibatch → 前向算损失 → 反向收集每个参数上的梯度 → 按w w − η·∂ℒ/∂w更新所有参数重复直至收敛。这样组织的好处与文档目标完全一致想换网络结构时只需重新组合 Layer 的序列想换任务时只需替换损失与输出模块——这就是“模块化框架”的含义。同时由于每个backward都要手写导数亲手实现一遍会让你对“梯度从何而来”获得远超调库的深刻理解。需要提醒的是本仓库的第 15 课目录里随附的是三份理论 Markdown 讲义原讲义中配套的 OwnFramework 动手 notebook 以“进入该 notebook 逐步实现”为挑战引导在实际练习时可依据上文骨架并结合 perceptron.md 中现成的 Python 训练代码自行搭建与验证。为什么还要学习真实框架从手写 backward 到自动微分理解了自研框架的繁琐之处每个模块的导数都要手写也就自然明白为什么业界会发展出 TensorFlow、PyTorch 这样的成熟框架。frameworks.md 对此做了对照API 层级TensorFlow 系PyTorch 系特点底层 APITensorFlowPyTorch显式构建计算图支持对图自动求导可推到 GPU/TPU 上并行计算高层 APIKerasPyTorch Lightning把网络视为层序列搭模型、调用fit即可训练底层框架帮我们自动完成本讲中手写的“链式求导”并能在 GPU、TPU 等专用计算单元上并行执行海量矩阵运算——这是手写框架难以企及的。高层 API 则进一步把网络抽象为“层的序列”几行代码即可搭出典型网络。文档同时强调两类 API 可以混用例如用底层 API 自定义一个新层再把它放进高层 API 构建的大网络里或用高层 API 定义结构后自写底层训练循环。理解这一点后回头看本讲的自研框架你会意识到它的 Layer 抽象、backward 设计与真实框架的设计哲学是同构的——从零手写一遍是为了之后用框架时心中有数。动手任务与学习闭环本讲在原课程设计里以“构建自己的神经网络库”收尾并配套了完整的练习体系小结本讲完成自研神经网络库并用它求解一个简单的二维分类问题 挑战在 OwnFramework notebook 中亲手实现并训练自己的多层感知机框架近距离观察现代神经网络的运转细节建议从实现一个带forward/backward的两层网络开始逐步扩展复习与自学反向传播是 AI/ML 领域的通用算法值得深入钻研其推导建议结合上一节“链式法则”的公式逐层验算一遍作业Assignment运用本讲构建的框架完成MNIST 手写数字分类——将 28×28 像素的手写数字图展平成输入向量构建输入层→隐藏层→softmax 输出层的多层感知机用 SGD 反向传播训练最终按 0-1 损失即准确率评估模型在 10 个数字类别上的分类能力。这一任务完整覆盖了文档开篇承诺的三项能力多类别分类、非线性决策边界、模块化框架拼装。小结从一条公式到一套自研框架本文围绕 own_framework.md 展开了一条清晰的认知链路用损失函数把学习问题形式化 → 用梯度下降/SGD 做参数优化 → 用多层非线性激活突破表达力上限 → 用链式法则/反向传播高效求解深层梯度 → 用“前向反向”的模块化 Layer 封装成自研框架 → 借 MNIST 作业完成端到端验证。它与 perceptron.md单层起点、frameworks.md真实框架与过拟合首尾相接在仓库第 15 课中还作为 RAG 演示的检索语料被 notebook-rag-vector-databases.ipynb 实际使用。理解多层感知机与反向传播是后续理解更复杂的生成式模型训练机制、乃至任何深度学习框架底层行为的第一块基石。【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →