AI-For-Beginners 神经网络课程导读:从感知机到深度学习框架

原创2026-10-01 17:34:521,385 阅读
文章标签:教程人工智能机器学习深度学习

AI-For-Beginners 神经网络课程导读:从感知机到深度学习框架

本节内容是开源课程 AI-For-Beginners 第 3 章「神经网络」的入门总纲,对应 translations/bg/lessons/3-NeuralNetworks/README.md 及其英文原版 lessons/3-NeuralNetworks/README.md。在动手训练模型之前,你需要先理解神经网络的生物起源与数学本质,明确它在整个机器学习学科中的位置,并规划好后续五节内容的学习路径。读完本文,你将掌握:神经元的数学建模方式、机器学习两大核心问题的形式化表示(分类与回归)、从单层感知机到多层网络再到主流框架的技术演进脉络,以及课程配套的动手实验资源。

神经网络的定位:通往人工智能的数学大脑

课程开篇反复强调一个核心观点:实现智能的一种途径是训练一个"计算机模型"或"人工大脑"。自 20 世纪中叶以来,研究者尝试过各种数学模型,直到近年来这一方向才被证明取得了巨大成功。这些模仿大脑的数学模型,就是本文的主角——神经网络。

术语澄清:神经网络有时也被称为人工神经网络(Artificial Neural Networks,ANN),目的是强调我们讨论的是数学模型,而不是真实的生物神经元网络。

本课程将神经网络置于更广阔的学科背景下看待:

  • 机器学习的子集:神经网络隶属于机器学习(Machine Learning)这一更大的学科,机器学习的核心目标是用数据训练出能够解决问题的计算机模型。
  • AI 的重要组成部分:机器学习是人工智能的重要组成部分,但本课程不涉及经典机器学习(如决策树、SVM 等)的内容,专注于神经网络模型。

如果希望补充经典机器学习的基础知识,可以参阅课程附带的独立学习路径 Machine Learning for Beginners 课程说明 中提及的资源;在 binder/environment.yml 与 requirements.txt 中则列出了本课程各章节运行 Notebook 所依赖的 Python 环境,例如运行本章案例需要 numpy、matplotlib、scikit-learn、pytorch 等库。

机器学习的形式化:特征、标签与两类经典问题

在开始构建任何模型之前,必须先建立统一的数学语言。机器学习的基本设定是:我们拥有一组训练样本 X 与对应的输出值 Y。其中:

  • 样本(Examples):通常是 N 维向量,由一系列特征(Features) 组成,例如肿瘤的大小、年龄等属性。
  • 标签(Labels):即样本对应的输出值 Y。

从张量(tensor)的角度看,输入数据集是一个大小为 M×N 的矩阵,其中 M 是样本数量、N 是特征数量;输出标签 Y 是一个大小为 M 的向量。课程将围绕机器学习中最常见的两类问题展开:

问题类型 任务定义 典型输出
分类(Classification) 将输入对象划分到两个或多个类别中 类别标签(如良/恶性肿瘤)
回归(Regression) 为每个输入样本预测一个数值 连续数值(如房价、温度)

这一形式化框架在课程随后的动手实验中被反复使用。例如 examples/02-simple-neural-network.py 中,generate_training_data 函数生成 100 个二维坐标点(特征为 x、y 坐标),并为每个点打上"位于直线 y=x 上方"(标签 1)或"下方"(标签 0)的标签,这正是分类问题的直观体现。

神经元模型:从生物学到数学的映射

神经网络的灵感直接来源于生物学。大脑由神经细胞(神经元)组成,每个神经元拥有多个"输入"(树突)和一个"输出"(轴突);树突和轴突都能传导电信号,而它们之间的连接——突触——具有可调的导电程度,由神经递质调节。

生物神经元 人工神经元
真实神经元示意 人工神经元示意

把这种生物机制抽象化,就得到最简单的神经元数学模型:包含若干输入 X₁, ..., X_N 与一个输出 Y,以及一系列权重 W₁, ..., W_N。输出按如下公式计算:

Y = f( Σᵢ Xᵢ·Wᵢ )

其中 f 是非线性激活函数(activation function)。这个看似简单的公式,正是后续所有神经网络的基石:加权求和 + 非线性变换。

历史注记:最早的神经元数学模型由 Warren McCullock 与 Walter Pitts 于 1943 年在经典论文 A logical calculus of the ideas immanent in nervous activity 中提出;Donald Hebb 在《The Organization of Behavior: A Neuropsychological Theory》中则提出了这些网络可以被训练的方式(即著名的 Hebb 学习规则)。

从公式到代码:课程示例的实现印证

公式不只是一行数学符号,课程仓库的示例代码完整复现了这一计算过程。在 examples/02-simple-neural-network.py 中,SimpleNeuron 类对单个神经元的建模流程与上面的公式一一对应:

  1. 每个输入分配一个初始随机权重(weights),并附加一个偏置项(bias);
  2. feedforward 方法执行前向传播:先加权求和(total = sum(w * x for w, x in zip(self.weights, inputs))),再加偏置;
  3. 最后应用 sigmoid 激活函数(sigmoid(total)),把输出压缩到 0~1 区间,作为预测结果。

代码中还实现了一个关键的辅助函数 sigmoid_derivative(导数 σ(x)·(1−σ(x))),它是后面反向传播更新权重的基础——这一步虽然在单神经元里很简单,但正是"让网络从错误中学习"的核心机制。运行该示例(python examples/02-simple-neural-network.py)即可看到:一个仅有 2 个输入的单神经元,经过 50 轮(epoch)训练后,即可学会判断二维平面上的点位于直线 y=x 的上方还是下方。

本节课程地图:五节课的技术演进路线

第 3 章"神经网络"并非单篇文档,而是由一节导读加三节正文(外加独立实验)构成的完整教学单元。下表汇总了本节的课程结构与学习顺序:

小节 核心主题 配套资源
03-Perceptron 感知机:最早的神经网络模型,用于二分类 Perceptron.ipynb、实验:多分类感知机
04-OwnFramework 多层网络与反向传播:构建自己的神经网络框架 OwnFramework.ipynb、实验:自研框架求解 MNIST
05-Frameworks 主流深度学习框架(PyTorch / TensorFlow + Keras)与过拟合 IntroPyTorch.ipynb、IntroKerasTF.ipynb、实验

第一站:感知机(Perceptron)——最早的神经网络模型

感知机是课程的第一课,也是整个神经网络领域的起点。1957 年,Frank Rosenblatt 在康奈尔航空实验室实现了最早的硬件感知机 "Mark-1",用于识别三角形、正方形、圆形等基本几何图形。其输入是一个 20×20 的光电池阵列,即神经网络拥有 400 个输入与 1 个二值输出;网络中的权重相当于需要手动调节的电位器。

感知机是一个二分类模型:对每个输入向量 x,输出为 +1 或 −1(取决于类别)。其输出计算式为:

y(x) = f(wᵀx)

其中 f 是阶跃激活函数(step activation function)。训练的目标是找到能正确分类绝大多数样本的权重向量 w,使误差最小。误差由感知机准则(perceptron criterion)定义:对误分类样本求和。优化通常采用梯度下降(gradient descent),即从初始权重 w⁽⁰⁾ 出发,按公式逐步更新:

w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ − η·∇E(w)

其中 η 是学习率(learning rate),∇E(w) 是误差 E 对权重的梯度。课程给出了完整的 Python 训练代码(见 03-Perceptron 正文):从随机初始权重出发,每轮随机挑选一个正例和一个负例,用 np.dot 计算感知机输出,若正例被误判为负则 weights = weights + eta*weights.shape,反之则减去该项,迭代 num_iterations(默认 100)轮。

配套的 Perceptron.ipynb 则把玩具问题落地:用 sklearn.datasets.make_classification 生成带两个特征的随机分类数据集(例如根据肿瘤大小与年龄判断良性/恶性),把 0/1 标签转换为 ±1,并按 8:2 切分为训练集与测试集,逐步演示感知机的训练与可视化过程。课程实验 PerceptronMultiClass.ipynb 则要求把二分类感知机推广到完整的手写数字识别(多分类)。

第二站:多层网络与自建框架——从线性到非线性

感知机只能解决线性可分问题。第二课 04-OwnFramework 将模型扩展为更灵活的框架,实现三大能力提升:

  1. 从二分类扩展到多分类;
  2. 在分类之外解决回归问题;
  3. 分离线性不可分的类别。

课程首先把机器学习问题进一步形式化:给定训练数据集 X 与标签 Y,需要构建模型 f 使预测最准确,预测质量由**损失函数(Loss function)**衡量。常用损失函数包括:

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

单层感知机的函数形式是线性的 f(x)=wx+b(w 为权重矩阵、x 为输入特征向量、b 为偏置向量)。做分类时,常希望网络输出各类别的概率,因此引入 softmax 函数 σ 对输出归一化,函数变为 f(x)=σ(wx+b)。这里的 w 与 b 合称参数 θ=⟨w,b⟩,而神经网络训练的目标,就是通过改变参数 θ 使整体误差最小化。

梯度下降优化是达成这一目标的标准方法:随机初始化参数 w⁽⁰⁾、b⁽⁰⁾,然后反复执行更新步骤 w⁽ⁱ⁺¹⁾ = w⁽ⁱ⁾ − η·∂ℒ/∂w、b⁽ⁱ⁺¹⁾ = b⁽ⁱ⁾ − η·∂ℒ/∂b。实际训练中,误差是遍历全部训练样本求和得到的,因此梯度计算开销巨大;现实做法是每次只取一小部分数据——小批量(minibatches)——基于子集计算梯度。由于子集是随机抽取的,这种方法被称为随机梯度下降(Stochastic Gradient Descent,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/images/ComputeGraphGrad.png。

✅ 反向传播的更多细节会在配套 Notebook 中深入展开。

自建框架的动手环节在 OwnFramework.ipynb 中:课程要求读者逐步实现自己的神经网络库,使其能完成多分类与回归任务。Notebook 首先用 make_classification 生成带噪声(flip_y=0.2)的二维数据集并可视化,随后逐步实现网络层、激活函数、损失函数与前向/反向传播。配套实验 MyFW_MNIST.ipynb 则要求用这个自研框架解决 MNIST 手写数字识别。

第三站:主流框架——PyTorch 与 TensorFlow/Keras

第三课 05-Frameworks 指出,高效训练神经网络需要两件事:对张量(tensor)进行运算(乘法、加法、sigmoid、softmax 等)以及为所有表达式计算梯度以执行梯度下降。numpy 能完成第一部分,但梯度需要专门的机制。在上一课自建的框架中,所有导数函数都必须手写在 backward 方法里;而理想的框架应能对任意可定义的表达式自动计算梯度。

此外,深度学习训练需要海量计算,框架还必须支持在 GPU(乃至 TPU 等专用计算单元)上并行化张量运算。目前最主流的两个框架是 TensorFlow 与 PyTorch,它们都提供:

  • 低级 API:允许构建"计算图",定义如何由输入参数计算输出(通常是损失函数),并可推送到 GPU 执行,且提供对计算图求导、计算梯度的函数,供优化模型参数使用;
  • 高级 API:把神经网络看作"层的序列",大幅简化常规网络的构建。训练模型通常只需准备数据然后调用 fit 函数。
TensorFlow PyTorch
低级 API TensorFlow PyTorch
高级 API Keras PyTorch Lightning

两种 API 各有定位:高级 API 能快速构建典型网络、不必操心细节;低级 API 对训练过程控制力更强,常用于研究新架构。两者可以混用——例如用低级 API 开发自定义层,再嵌入高级 API 构建的大网络;或用高级 API 定义网络结构、用低级 API 编写自定义训练循环,因为二者底层概念一致、设计上相互兼容。

课程采取"双框架"策略:绝大部分内容同时提供 PyTorch 与 TensorFlow 两个版本,学习者可任选其一深入。从入门顺序上,课程建议先用低级 API 和张量理解神经网络的底层原理,但若想快速上手,也可以直接跳到高级 API 的 Notebook:

API 层级 TensorFlow 生态 PyTorch 生态
低级 API IntroKerasTF.ipynb IntroPyTorch.ipynb
高级 API IntroKeras.ipynb PyTorch Lightning

PyTorch 入门 Notebook(IntroPyTorch.ipynb)开篇即总结了框架的核心能力:在 CPU/GPU/TPU 上操作张量、自动计算梯度(所有内建张量函数的导数都被显式编程)、提供高层网络构造器与简化训练函数 fit、附带多种优化算法与数据处理抽象。安装方式通常简单到只需两条命令:

pip install torch torchvision

或

conda install pytorch -c pytorch

过拟合:必须掌握的核心概念

在掌握框架之后,课程马上引入机器学习中最重要、也最容易出错的概念——过拟合(overfitting)。考虑一个拟合 5 个数据点的任务(图中以 x 标记):

线性模型(2 个参数) 非线性模型(7 个参数)
线性模型拟合效果 过拟合模型的拟合效果
训练误差 = 5.3 训练误差 = 0
验证误差 = 5.1 验证误差 = 20
  • 左图:直线近似恰到好处,参数数量合适,模型正确抓住了数据分布背后的规律;
  • 右图:模型过于强大——只有 5 个点却有 7 个参数,模型可以扭曲自身穿过所有点,使训练误差归零;但正因如此它无法理解数据背后的正确模式,验证误差高达 20。

因此,在模型丰富度(参数数量)与训练样本数量之间取得正确平衡至关重要。

过拟合为何发生

课程归纳了三个常见原因:

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

如何检测过拟合

从上图可见,过拟合的特征是训练误差极低、验证误差很高。训练过程中通常训练误差与验证误差先一起下降,随后验证误差在某一点停止下降甚至开始回升——这就是过拟合的信号,提示我们应该在此停止训练(或至少保存一份模型快照)。曲线示意见 lessons/3-NeuralNetworks/images/Overfitting.png。

如何预防过拟合

发现过拟合后,可以采取以下措施之一:

过拟合与偏差-方差权衡

从统计学角度看,过拟合是更一般问题——偏差-方差权衡(Bias-Variance Tradeoff)——的一个具体实例。模型的误差来源可分为两类:

  • 偏差误差(Bias errors):算法未能正确捕捉训练数据中的关系,通常源于模型能力不足(欠拟合,underfitting);
  • 方差误差(Variance errors):模型拟合的是输入数据中的噪声而非有意义的规律(过拟合)。

训练过程中,偏差误差逐渐下降(模型学会逼近数据),方差误差逐渐上升,因此必须在恰当的时机停止训练——无论是手动检测到过拟合,还是通过引入正则化自动完成——以防止过拟合。

在框架 Notebook 中还可以观察到另一个与过拟合相关的实操经验:学习率过高可能导致过拟合或结果不稳定,而学习率过低则需要更多 epoch 才能收敛(见 IntroKeras.ipynb 中的实验提示)。

动手与实验路线

第 3 章的学习强调"边学边做",每个小节都配套了 Notebook 与实验任务,实验答案与说明位于对应 lab/ 目录:

实验 任务内容 对应资源
感知机实验 完成完整的手写数字分类:判断给定图像最可能是哪个数字 03-Perceptron/lab/README.md、PerceptronMultiClass.ipynb
自建框架实验 用本课构建的框架解决 MNIST 手写数字分类 04-OwnFramework/lab/README.md、MyFW_MNIST.ipynb
框架实验 用 PyTorch 或 TensorFlow,以单层与多层全连接网络解决两个分类问题 05-Frameworks/lab/README.md、LabFrameworks.ipynb

此外,examples/02-simple-neural-network.py 可作为本章的零依赖入门示例:它不依赖任何 ML 框架,从零实现 sigmoid 激活函数、单神经元的前向传播与反向传播,读者可以修改 num_samples、epochs 与 learning_rate 观察训练行为的变化,直观理解"神经元如何学习"。

小结

本节导读为整章神经网络学习搭建了完整的地基:从生物神经元到 Y = f(Σ XᵢWᵢ) 的数学抽象,从机器学习的两大问题(分类与回归)到张量化的数据表示,从感知机的梯度下降训练到多层网络的反向传播,再到 PyTorch 与 TensorFlow 两大主流框架的 API 生态,最后落脚于贯穿整个深度学习生涯的过拟合概念。掌握这些基础后,就可以沿着 03-Perceptron → 04-OwnFramework → 05-Frameworks 的路线,亲手实现并训练自己的第一个神经网络。

登录后查看全文
AI-For-Beginners