☰
AI for Beginners 神经网络章节导读:从单神经元模型到多层感知机、PyTorch/TensorFlow 框架与过拟合
2026/10/9 1:36:42 网站建设 项目流程
  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

本篇技术指南围绕 AI for Beginners 课程第 3 周《神经网络》章节(translations/fr/lessons/3-NeuralNetworks/README.md 为法语译本,英文原版为 lessons/3-NeuralNetworks/README.md)展开,系统梳理神经网络在机器学习中的定位、单神经元数学模型、感知机训练算法、多层网络与反向传播原理,以及 PyTorch/TensorFlow 双层 API 与过拟合防治。读完后你将掌握:神经网络的经典定义与符号表示、感知机准则与梯度下降更新公式的推导、用Linear/Softmax类自建迷你框架的思路、两套主流框架高低层 API 的差异,以及过拟合的成因、检测与缓解手段,并可直接按章节内的 Notebook 与 Lab 动手实践。

说明:法语版文档注明其由机器翻译服务 Co-op Translator 生成,可能存在误译,英文原版才是权威来源。本文以两版文档内容一致的技术主体为准,并结合仓库内 Notebook 源码与配套练习进行扩充。

章节定位:神经网络的课程上下文

课程在导论中提出,实现智能的途径之一是训练一个计算机模型(即“人工大脑”)。自 20 世纪中叶以来,研究者尝试了多种数学模型,其中近年来被证明极其成功的一类就是神经网络(Neural Networks),有时也被称为人工神经网络(ANNs, Artificial Neural Networks),以强调它是“模型”而非真正的神经元网络。

神经网络隶属于更大的学科——机器学习(Machine Learning):利用数据训练能够解决问题的计算机模型。机器学习构成了人工智能的绝大部分,但本课程不覆盖“经典机器学习”部分(官方在文档中建议读者参考微软的 Machine Learning for Beginners 姊妹课程,本文不输出外部链接,可自行检索该课程名)。

在机器学习中,基本假设是:

  • 存在一组训练样本X及其对应的输出值Y;
  • 样本X通常是由**特征(features)**组成的 N 维向量;
  • 输出称为标签(labels)。

当把输入与输出表示为张量时,输入数据集是一个大小为M×N的矩阵(M 为样本数,N 为特征数),输出标签Y则是大小为M的向量。

课程重点考察机器学习中最常见的两类问题:

问题类型目标典型损失
分类(Classification)将输入对象归入两个或更多类别0-1 损失(等价于准确率)、对数损失
回归(Regression)为每个输入样本预测一个数值绝对误差 Σ|f(x)-y|、平方误差 Σ(f(x)-y)²

本章节只聚焦神经网络模型,不展开经典机器学习算法。

章节学习路线(In this Section)

原文档给出了本节的完整学习地图,四个子主题层层递进,全部资源均存在于当前仓库中:

  1. 感知机(Perceptron):最早期的两类分类神经网络模型,见 lessons/3-NeuralNetworks/03-Perceptron/README.md,配套可运行练习 Perceptron.ipynb;
  2. 多层网络(Multi-layered networks):并附“如何构建自己的框架”Notebook OwnFramework.ipynb,说明文档见 lessons/3-NeuralNetworks/04-OwnFramework/README.md;
  3. 神经网络框架:配套 PyTorch Notebook IntroPyTorch.ipynb 与 Keras/TensorFlow Notebook IntroKerasTF.ipynb,说明文档见 lessons/3-NeuralNetworks/05-Frameworks/README.md;
  4. 过拟合(Overfitting):在 lessons/3-NeuralNetworks/05-Frameworks/README.md 中专门设节讨论。

每个子目录下的lab/README.md均提供对应实验作业,例如 03-Perceptron/lab、04-OwnFramework/lab、05-Frameworks/lab。

一个神经元模型:从生物结构到数学公式

生物学告诉我们:大脑由神经细胞(神经元)构成,每个神经元拥有多条“输入”(树突 dendrites)和一条“输出”(轴突 axon)。树突与轴突都能传导电信号,而它们之间的连接——突触(synapses)——具有不同的导电程度,并由神经递质调节。这一结构正是人工神经元模型的灵感来源。

真实神经元(结构示意)人工神经元(数学模型)

因此,最简单的神经元数学模型包含若干输入 X₁, …, X_N、一个输出 Y,以及一组权重 W₁, …, W_N,输出按下式计算:

$$ Y = f\left(\sum_{i=1}^{N} X_i W_i\right) $$

其中f是非线性激活函数(activation function)。原文档中的公式图片netout.png(131×53 像素)即表示该式。

文档还给出了两条重要的历史脉络:

  • 最早的神经元模型由 Warren McCullock 与 Walter Pitts 于 1943 年在经典论文《A logical calculus of the ideas immanent in nervous activity》中描述;
  • Donald Hebb 在其著作《The Organization of Behavior: A Neuropsychological Theory》中提出了这类网络可以如何被训练的思想。

感知机:第一个可训练的二分类模型

感知机由 Frank Rosenblatt(Cornell 航空实验室)于 1957 年提出,其硬件实现 “Mark-1” 用于识别三角形、正方形、圆形等基本几何图形(背景与图片见 03-Perceptron/README.md)。工程细节值得注意:

  • 输入图像由20×20 的光电池阵列表示,因此网络有400 个输入、1 个二值输出;
  • 简单网络只含一个神经元,也称为阈值逻辑单元(threshold logic unit);
  • 网络权重在训练阶段需要手动调节(硬件上像电位器那样调整)。

感知机模型与阶跃激活函数

设模型有 N 个特征,输入向量为 N 维。感知机是二分类模型,对每个输入向量 x,其输出为 +1 或 -1:

$$ y(x) = f(w^{T}x) $$

其中 f 为阶跃激活函数:

$$ f(x) = \begin{cases} +1, & x \geq 0 \ -1, & x < 0 \end{cases} $$

训练感知机:感知机准则与梯度下降

训练的目标是找到权重向量 w,使分类错误的样本尽可能少。误差按**感知机准则(perceptron criterion)**定义:

$$ E(w) = -\sum_{i \in \text{misclassified}} w^{T}x_i t_i $$

其中:求和仅覆盖被错误分类的训练点 i;x_i 是输入数据;t_i 取 -1(负例)或 +1(正例)。将 E 视为权重 w 的函数并最小化它,常用的方法是梯度下降(gradient descent):从初始权重 w⁽⁰⁾ 出发,每一步按

$$ w^{(t+1)} = w^{(t)} - \eta \nabla E(w) $$

更新,其中 η 是学习率(learning rate)。求出梯度后得到简洁的更新规则:

$$ w^{(t+1)} = w^{(t)} + \eta \sum_{i} x_i t_i $$

即:对误分类样本,沿x_i · t_i方向按学习率修正权重。03-Perceptron/README.md 中给出了该算法的 Python 参考实现,其核心逻辑可整理为:

def train(positive_examples, negative_examples, num_iterations=100, eta=1): weights = np.zeros(3) # 初始化权重向量 for i in range(num_iterations): pos = random.choice(positive_examples) neg = random.choice(negative_examples) # 正例被误判为负 -> 权重向正例方向修正 if np.dot(pos, weights) < 0: weights = weights + eta * pos # 负例被误判为正 -> 权重向负例反方向修正 if np.dot(neg, weights) >= 0: weights = weights - eta * neg return weights

注:原文档中的示例代码在修正项里误写为eta*weights.shape,属于文档笔误;上面按更新规则w += η·x_i·t_i做了等价整理。可运行的完整版本请以 Perceptron.ipynb 为准。

感知机 Lab:从二分类到多分类

本节实验作业(lab/README.md)要求:在已实现二分类感知机(区分两个手写数字)的基础上,完整解决数字分类问题——给定图像判断其最可能对应的数字(0–9)。配套 Notebook 为 lab/PerceptronMultiClass.ipynb。

多层网络:损失函数、随机梯度下降与反向传播

04-OwnFramework/README.md 将单层的线性二分类模型扩展为更通用的框架,目标是:

  • 支持多类分类(不限于两类);
  • 支持回归问题;
  • 能够分离线性不可分的类别。

机器学习问题的形式化

给定带标签的训练集 ⟨X,Y⟩,需要构建模型f使预测尽可能准确,预测质量由损失函数 ℒ度量:

  • 回归:绝对误差 Σ|f(x⁽ⁱ⁾)-y⁽ⁱ⁾|,或平方误差 Σ(f(x⁽ⁱ⁾)-y⁽ⁱ⁾)²;
  • 分类:0-1 损失(本质即模型准确率),或对数损失(logistic loss)。

对单层感知机,f是线性函数 f(x)=wx+b(w 为权重矩阵,x 为特征向量,b 为偏置向量)。对不同网络架构,f可以取更复杂的形态。分类场景中常希望输出各类的概率:将任意数值转换为概率(归一化输出)通常使用softmax函数 σ,此时 f(x)=σ(wx+b)。

在f的定义中,w与b合称参数θ=⟨w,b⟩。给定数据集 ⟨X,Y⟩,可以把整个数据集上的总误差表示为参数 θ 的函数。神经网络训练的目标,就是通过调整参数 θ 来最小化误差。

梯度下降优化

梯度下降(gradient descent)是经典的函数优化方法:计算损失函数对参数的导数(多维情况下即梯度),并沿使误差下降的方向调整参数:

  1. 用随机值初始化参数 w⁽⁰⁾、b⁽⁰⁾;
  2. 重复以下步骤若干次:
    • w⁽ⁱ⁺¹⁾ = w⁽ⁱ⁾ - η·∂ℒ/∂w
    • b⁽ⁱ⁺¹⁾ = b⁽ⁱ⁾ - η·∂ℒ/∂b

理论上,优化步骤应基于整个数据集计算损失(损失是对全部训练样本求和)。实践中则每次取数据集的一小部分——mini-batch(小批量)——在其子集上计算梯度;由于每次随机抽样,该方法称为随机梯度下降(SGD)。

多层感知机与反向传播

单层网络只能分类线性可分的类别。要构建更富表达力的模型,可以把多层网络组合起来,函数f分多步计算:

  • z₁ = w₁x + b₁
  • z₂ = w₂α(z₁) + b₂
  • f = σ(z₂)

其中 α 是非线性激活函数,σ 是 softmax,参数 θ = ⟨w₁, b₁, w₂, b₂⟩。梯度下降算法形式不变,但梯度计算更复杂。利用链式求导法则:

  • ∂ℒ/∂w₂ = (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂w₂)
  • ∂ℒ/∂w₁ = (∂ℒ/∂σ)(∂σ/∂z₂)(∂z₂/∂α)(∂α/∂z₁)(∂z₁/∂w₁)

注意这些表达式的最左端(∂ℒ/∂σ)是相同的,因此可以从损失函数出发,沿计算图“向前”逐层回传计算各参数梯度——这正是训练多层感知机的方法,称为反向传播(backpropagation / backprop)。04-OwnFramework/README.md 中配有的计算图与梯度回传示意可分别在 ComputeGraph.png 与 ComputeGraphGrad.png 中查看。

源码佐证:Notebook 中的Linear与Softmax层

OwnFramework.ipynb 用约百行 NumPy 代码搭建了上述框架,两个核心类与 README 的公式一一对应:

# 线性层:实现 f(x) = W·x + b(见 OwnFramework.ipynb 中 Linear 类) class Linear: def __init__(self, nin, nout): # 权重按 N(0, 1/sqrt(nin)) 初始化,偏置初始化为 0 self.W = np.random.normal(0, 1.0/np.sqrt(nin), (nout, nin)) self.b = np.zeros((1, nout)) def forward(self, x): return np.dot(x, self.W.T) + self.b
# Softmax 层:把任意数值转为概率分布 class Softmax: def forward(self, z): zmax = z.max(axis=1, keepdims=True) # 减去最大值,数值稳定技巧 expz = np.exp(z - zmax) Z = expz.sum(axis=1, keepdims=True) return expz / Z

可以看到:Linear的权重初始化采用方差为 1/nin 的正态分布、偏置取 0,Softmax.forward先减去行最大值再指数化,这是防止exp溢出的标准数值稳定做法——README 只给出 softmax 公式 σ(z_c) = e^(z_c) / Σ_j e^(z_j),Notebook 则补上了工程实现细节。该 Notebook 还包含交叉熵损失(对 one-hot 标签简化为 -log p_c)与反向传播的完整实现,并用于二维多类分类演示;对应作业是把自己搭建的框架用于MNIST 手写数字分类,见 lab/README.md 与 lab/MyFW_MNIST.ipynb。

神经网络框架:低层 API 与高层 API 的分工

05-Frameworks/README.md 指出,要高效训练神经网络需要两件事:

  1. 对张量进行运算:矩阵乘、加法,以及 sigmoid、softmax 等函数;
  2. 计算任意表达式的梯度,以执行梯度下降优化。

numpy可以完成第一件,但自研框架(OwnFramework.ipynb)必须在backward方法里手工编写所有导数函数来做反向传播。理想的框架应该能对任何用户定义的表达式自动求梯度。此外,深度学习训练计算量巨大,框架必须支持在 GPU 或 TPU 等专用计算单元上并行执行(“并行化”指把计算分布到多个设备上)。

当前最流行的两个框架是TensorFlow与PyTorch,均提供 CPU/GPU 张量运算的低层 API,其上都有一套高层 API:

API 层级TensorFlow 系PyTorch 系
低层 APITensorFlowPyTorch
高层 APIKerasPyTorch Lightning

两者的定位差异是:

  • 低层 API:允许构建计算图(computational graph)——图定义了给定输入参数如何计算输出(通常是损失函数),可以下推到 GPU 执行,并内置对计算图求导、计算梯度的函数,用于优化模型参数;
  • 高层 API:把神经网络视为层的序列,大幅简化网络构建;训练模型通常是“准备数据 + 调用fit函数”。

高层 API 适合快速搭建典型网络;低层 API 对训练过程的控制力更强,研究新架构时用得很多。两套 API 也可以混用:用低层 API 开发自定义层,嵌入高层 API 搭建的大网络;或者用高层 API 定义网络、再自己写低层训练循环做优化——它们共享相同的底层概念,设计上就是协同工作的。

课程在两个框架间均提供了内容,读者可任选其一:

API 层级TensorFlow/Keras NotebookPyTorch Notebook
低层 APIIntroKerasTF.ipynbIntroPyTorch.ipynb
高层 APIIntroKeras.ipynbPyTorch Lightning(文中未附独立 Notebook)

文档给出两条学习建议:如果不确定选哪个框架,可先了解两者差异并“都看一看”;如果想快速上手、不想花时间理解底层细节,可以跳过低层 Notebook 直接做高层 Notebook。本节作业(lab/README.md)要求用 PyTorch 或 TensorFlow 的单层/多层全连接网络完成两个分类任务:Iris 鸢尾花三分类(4 个数值特征,表格数据)与MNIST 手写数字分类,并尝试不同网络结构追求最佳准确率,配套 lab/LabFrameworks.ipynb。

过拟合:模型能力与数据量的平衡

原文档的章节路线把“过拟合”列为本节第四个知识点,其完整讨论位于 05-Frameworks/README.md。文档用一个直观实验说明问题:近似 5 个散点——

线性模型(2 参数)非线性模型(7 参数)
训练误差 = 5.3训练误差 = 0
验证误差 = 5.1验证误差 = 20

左侧线性模型参数数量与数据规模匹配,抓到了点分布的本质规律;右侧模型过于强大——只有 5 个点却有 7 个参数,它“过”了所有点使训练误差为 0,但没学到数据背后的真实模式,验证误差高达 20。在模型丰富度(参数数量)与训练样本数量之间取得正确平衡,至关重要。

文档从三个角度展开:

过拟合为什么会发生

  • 训练数据不足;
  • 模型过于强大;
  • 输入数据噪声过大。

如何检测过拟合

如上图所示,特征是训练误差极低而验证误差高。正常训练过程中,训练误差与验证误差都会下降,但到某一点验证误差会停止下降并开始上升——这就是过拟合信号,此时应该停止训练(或至少保存一个模型快照)。

如何防止过拟合

  • 增加训练数据量;
  • 降低模型复杂度;
  • 使用**正则化(regularization)**技术,例如后文计算机视觉课程会讲的 Dropout。

过拟合与偏差-方差权衡(Bias-Variance Tradeoff)

过拟合其实是统计学中更普遍问题的一个特例。模型误差可分为两类:

  • 偏差误差(bias):算法未能正确捕捉训练数据中的关系,常因模型能力不足导致(即欠拟合 underfitting);
  • 方差误差(variance):模型去拟合输入数据中的噪声而非有意义的关系(即过拟合 overfitting)。

训练过程中偏差误差下降(模型逐渐学会近似数据),方差误差上升。因此必须适时停止训练——手动(检测到过拟合时)或自动(引入正则化)——以防止过拟合。

小结与本节可复现路径

本章节以“神经网络是机器学习中通过数据训练、以最小化损失为目标的可微模型”为主线,沿四步递进:

  1. 理解神经元模型 Y = f(Σ XᵢWᵢ) 与激活函数的来源(生物学类比 + 1943 年经典文献);
  2. 用感知机准则与梯度下降更新规则训练二分类器,并完成多分类数字识别 Lab(03-Perceptron/lab);
  3. 形式化训练问题(损失函数、参数 θ、SGD、反向传播),并在 OwnFramework.ipynb 中亲手用 NumPy 搭出Linear/Softmax等可微组件,再用它解 MNIST(04-OwnFramework/lab);
  4. 迁移到 TensorFlow/PyTorch 的高低层 API 工程实践,掌握过拟合的检测与防治(05-Frameworks/lab)。

各 Notebook 基于numpy、matplotlib、scikit-learn等常规库(如 OwnFramework.ipynb 使用sklearn.datasets.make_classification生成二维样本集、np.random.seed(0)保证可复现),在标准 Jupyter 环境下即可运行;环境依赖可参考仓库根目录的 requirements.txt 与 environment.yml。

  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

相关推荐

上一篇:VAP特效动画终极指南:为什么它比Lottie和GIF更适合你的应用?
下一篇:ESP8266 Arduino 内核中的 SPIFFS:面向 SPI NOR Flash 的轻量文件系统完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询