- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
导读
本篇以 AI for Beginners 课程「3-NeuralNetworks」章节(章节总览)为核心骨架,系统讲解神经网络从生物启发到数学建模、从单层感知机到多层网络的完整演进路径。你将掌握神经元模型的数学表达与激活函数、感知机的训练原理与代码实现、梯度下降与反向传播的核心推导,以及 TensorFlow / PyTorch 框架的选型思路与过拟合的检测、预防方法,并了解仓库中配套 notebook 与实验的完整实践路线。
一、神经网络与机器学习:从"人工大脑"说起
课程开篇指出,实现智能的一条经典路径是训练一个计算机模型,即"人工大脑"(artificial brain)。自 20 世纪中叶起,研究者不断尝试各种数学模型,直到近年这一方向取得了巨大成功——这类对大脑的数学建模被称为神经网络(Neural Networks)。当强调它们是"模型"而非真实的神经元网络时,常被称作人工神经网络(Artificial Neural Networks, ANNs)。
1.1 神经网络在机器学习中的位置
神经网络属于更大的学科——机器学习(Machine Learning)的一部分。机器学习的核心目标是用数据训练计算机模型,使其具备解决实际问题的能力。机器学习是人工智能的很大一个组成部分,但本课程聚焦神经网络模型,并不展开经典机器学习方法(若想系统学习经典 ML,可参考本仓库配套的另一套公开课程 "Machine Learning for Beginners")。
1.2 数据、特征与标签
机器学习的基本设定是:我们拥有一个样本数据集X及其对应的输出值Y。其中:
- 样本(examples)通常是 N 维向量,由若干特征(features)组成;
- 输出被称为标签(labels)。
若以张量(tensor)表示输入与输出,则输入数据集是一个 M×N 的矩阵,M 为样本数,N 为特征数;输出标签Y是长度为 M 的向量。
1.3 两类最常见的问题
本课程讨论两类机器学习问题:
- 分类(Classification):将输入对象划分到两个或多个类别之一;
- 回归(Regression):为每个输入样本预测一个数值。
二、神经元的数学模型:生物启发下的第一块积木
2.1 从生物神经元说起
从生物学我们知道,大脑由神经细胞(神经元)构成,每个神经元有多个"输入"(树突,dendrites)和一个"输出"(轴突,axon)。树突与轴突都能传导电信号,而它们之间的连接——突触(synapses)——由神经递质调节,表现出不同程度的导电性。神经元的这种"多输入、单输出、连接可调节"结构,成为人工神经元模型的直接灵感来源。
| 真实神经元 | 人工神经元 |
|---|---|
(上图为课程文档中的对照图:左为取自 Wikipedia 的真实神经元示意图,右为课程作者绘制的人工神经元示意图。)
2.2 神经元的最简数学形式
最简单的人工神经元模型包含多个输入 X₁, …, X_N 与一个输出 Y,以及一组权重 W₁, …, W_N。输出按下式计算:
其中f是某个非线性的激活函数(activation function)。权重可以直观理解为"该输入有多重要",激活函数则负责引入非线性能力——这是后续多层网络能够拟合复杂决策边界的关键。
2.3 历史坐标
课程文档特别提示了两份里程碑文献:
- 1943 年,Warren McCulloch 与 Walter Pitts 在经典论文A logical calculus of the ideas immanent in nervous activity中描述了早期的神经元模型;
- Donald Hebb 在The Organization of Behavior: A Neuropsychological Theory一书中提出了如何训练这类网络,即著名的 Hebb 学习规则雏形。
三、感知机(Perceptron):最早的二分类神经网络
3.1 历史:Mark-1 感知机
第一次真正接近现代神经网络的尝试,来自 1957 年 Cornell 航空实验室的 Frank Rosenblatt。他做出了名为Mark-1的硬件实现,用于识别三角形、正方形、圆形等基础几何图形。输入图像由 20×20 的光电池阵列表示,因此网络有 400 个输入和 1 个二值输出。这个简单网络只含一个神经元,也被称为阈值逻辑单元(threshold logic unit);其权重扮演类似电位器(potentiometer)的角色,需要在训练阶段手工调节。当时《纽约时报》甚至预言它"将成为能够行走、说话、看见、书写、自我复制并意识到自身存在的电子计算机的胚胎"——这段话今天读来颇有历史趣味。
3.2 感知机模型
假设模型有 N 个特征,输入向量是 N 维的。感知机是一个二分类模型,即只能区分两类输入数据。对每个输入向量 x,感知机输出 +1 或 -1(取决于类别),计算公式为:
y(x) = f(wᵀx)
其中 f 是阶跃激活函数(step activation function):当输入 ≥ 0 时输出 +1,当输入 < 0 时输出 -1(参见课程文档中的 activation-func 示意图)。
3.3 训练目标:最小化误差
训练感知机的目标是找到能正确分类绝大多数样本的权重向量 w,即让误差(error)最小。该误差由感知机准则(perceptron criterion)定义:
E(w) = −∑ wᵀxᵢ·tᵢ
其中:
- 求和针对被错误分类的训练样本 i;
- xᵢ 是输入数据,tᵢ 对正例取 +1、对负例取 −1。
该准则被看作权重 w 的函数,需要最小化它。常用的方法是梯度下降(gradient descent):从初始权重 w⁽⁰⁾ 出发,每步按下式更新:
w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ − η∇E(w)
其中η是学习率(learning rate),∇E(w) 是误差 E 关于 w 的梯度(gradient)。代入梯度后得到:
w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ + ∑ η·xᵢ·tᵢ
即:每次向被误分类样本的加权方向修正权重。
3.4 训练代码(来自课程文档)
课程文档给出了如下 Python 训练循环(其中pos为正样本、neg为负样本,η 默认为 1,迭代 100 轮):
def train(positive_examples, negative_examples, num_iterations = 100, eta = 1): weights = [0,0,0] # 初始化权重(近乎随机) for i in range(num_iterations): pos = random.choice(positive_examples) neg = random.choice(negative_examples) z = np.dot(pos, weights) # 计算感知机输出 if z < 0: # 正样本被误判为负类 weights = weights + eta*weights.shape z = np.dot(neg, weights) if z >= 0: # 负样本被误判为正类 weights = weights - eta*weights.shape return weights提示:上述伪代码在仓库原文档中保留了示意性质(
eta*weights.shape处需按 numpy 广播语义替换为与样本同维的更新量)。想获得可直接运行、工程完整的从零实现,可对照仓库示例 examples/02-simple-neural-network.py:它用纯 Python +math实现了一个含feedforward(前向传播)与train(反向修正)的单神经元,通过 50 轮训练学会区分直线 y = x 上下的点,并输出分类准确率——这段示例与感知机课程互为印证,非常适合动手验证。
3.5 配套 notebook 与实验
课程为感知机配备了交互式 notebook Perceptron.ipynb,其中用sklearn.datasets.make_classification生成 50 个二维样本(正负标签被转换为 +1/−1),并按 8:2 划分训练/测试集,逐步演示感知机的 toy problem 与真实问题求解。
对应的课后实验 lab/README.md 则要求把二分类感知机扩展为完整的多分类数字识别:思路是"逐数字 vs 其余数字"构造 10 个二分类感知机,并把 10 个权重合并成矩阵一次性做矩阵乘法,最后用argmax找出最可能的数字,同时计算训练集/测试集准确率并打印混淆矩阵。起始代码见 PerceptronMultiClass.ipynb。
四、多层感知机与反向传播:突破线性边界
上一节讨论的单层感知机是线性二分类模型,只能处理线性可分问题。课程在 04-OwnFramework 章节 中将其扩展为更灵活的框架,目标是支持:
- 除二分类外的多分类(multi-class classification);
- 除分类外的回归问题(regression);
- 分离线性不可分的类别。
同时,课程将带领你用 Python 自建一个模块化框架,以理解现代神经网络的工作原理。
4.1 机器学习的规范化表述
形式化地看:给定带标签的训练集X与Y,需要构建模型 f 做出最准确的预测,预测质量由损失函数(loss function)衡量。常用损失包括:
- 回归问题(预测数值):绝对误差∑ᵢ|f(x⁽ⁱ⁾)−y⁽ⁱ⁾|,或平方误差∑ᵢ(f(x⁽ⁱ⁾)−y⁽ⁱ⁾)²;
- 分类问题:0-1 损失(本质等价于模型准确率),或逻辑损失(logistic loss)。
单层感知机的函数 f 是线性形式 f(x) = wx + b(w 为权重矩阵,x 为输入特征向量,b 为偏置向量);更复杂的网络架构会让 f 呈现更复杂的形式。在分类场景中,常常希望网络输出各类别的概率,为此会用softmax 函数σ 对输出做归一化,使 f(x) = σ(wx + b)。
这里的 w、b 统称为参数 θ = ⟨w, b⟩。给定数据集 ⟨X, Y⟩,可以计算出整个数据集上作为参数 θ 之函数的总体误差。
神经网络训练的目标,就是通过改变参数 θ 来最小化误差。
4.2 梯度下降优化
函数优化有一个成熟方法——梯度下降:计算损失函数关于参数的导数(多维情形下即梯度),并沿着使误差减小的方向调整参数。形式化如下:
- 用随机值初始化参数 w⁽⁰⁾、b⁽⁰⁾;
- 反复执行更新步:
- w⁽ⁱ⁺¹⁾ = w⁽ⁱ⁾ − η·∂𝓛/∂w
- b⁽ⁱ⁺¹⁾ = b⁽ⁱ⁾ − η·∂𝓛/∂b
4.3 随机梯度下降(SGD)
理论上,优化步应基于整个数据集计算(因为损失是对所有训练样本求和)。但在实际训练中,我们取数据集的小块——小批量(minibatches)——基于子集计算梯度。由于每次随机抽取子集,这种方法被称为随机梯度下降(Stochastic Gradient Descent, SGD),它是现代深度学习训练的默认引擎。
4.4 多层网络与链式法则
单层网络只能分类线性可分的类别。为了构建更强大的模型,可以把若干网络层组合起来。数学上,函数 f 会变得更复杂,分多步计算:
- z₁ = w₁x + b₁
- z₂ = w₂α(z₁) + b₂
- f = σ(z₂)
其中α 是非线性激活函数,σ 是 softmax,参数 θ = ⟨w₁, b₁, w₂, b₂⟩。
梯度下降算法本身不变,但梯度的计算变难了。依据链式求导法则(chain rule),可以这样展开:
- ∂𝓛/∂w₂ = (∂𝓛/∂σ)·(∂σ/∂z₂)·(∂z₂/∂w₂)
- ∂𝓛/∂w₁ = (∂𝓛/∂σ)·(∂σ/∂z₂)·(∂z₂/∂α)·(∂α/∂z₁)·(∂z₁/∂w₁)
注意到这些表达式的最左端部分完全相同,因此可以高效地从损失函数出发、沿计算图"反向"逐层计算导数。这种训练多层感知机的方法因此被称为反向传播(backpropagation,简称 backprop)。课程在 OwnFramework.ipynb 中会给出非常详细的推导与实现;你可以亲手构建自己的框架,并观察现代神经网络内部的运作细节。
4.5 配套实验
本节的课后实验 lab/README.md 要求:使用本节自建的框架,解决MNIST 手写数字分类问题。完成代码见 MyFW_MNIST.ipynb——"不用任何 ML 框架,训练一个能认手写数字的神经网络",正是理解反向传播的绝佳路径。
五、深度学习框架:TensorFlow 与 PyTorch
5.1 为什么需要框架
要高效训练神经网络,需要解决两件事(课程文档 05-Frameworks/README.md):
- 张量运算:矩阵乘、加法以及 sigmoid、softmax 等函数的计算;
- 自动求梯度:为执行梯度下降,需要计算所有表达式的梯度。
numpy能胜任第一点,但无法自动求导。在上一节自建框架中,我们不得不在backward方法里手工编写每个导数函数。理想的框架应能对任意可定义表达式自动计算梯度。
另一个关键诉求是在 GPU 或其他专用计算单元(如 TPU)上执行计算。深层网络训练的计算量巨大,能否把计算并行化到 GPU 上至关重要("并行化"意为把计算分布到多个设备上)。
5.2 两大框架与两级 API
当前最流行的两个神经网络框架是TensorFlow与PyTorch,二者都提供在 CPU/GPU 上操作张量的低层 API;其上层又有更高级的封装:
| 层级 | TensorFlow | PyTorch |
|---|---|---|
| 低层 API | TensorFlow | PyTorch |
| 高层 API | Keras | PyTorch Lightning |
- 低层 API允许你构建所谓计算图(computational graph):该图定义了在给定输入参数下如何计算输出(通常是损失函数),并可在可用时推送到 GPU 上执行;框架还提供对计算图求导、计算梯度的函数,用于优化模型参数。
- 高层 API把神经网络看作层的序列(sequence of layers),让搭建大多数网络变得非常简单:训练模型通常只需准备数据,然后调用
fit函数即可完成。
5.3 两级 API 如何取舍
- 高层 API 能让你快速搭建典型网络,不必操心大量细节;
- 低层 API 对训练过程提供更精细的控制,因此在研究新架构时被大量使用;
- 二者可以混用:比如用低层 API 开发自定义网络层,再放进高层 API 构建的大网络里;或用高层 API 以层序列定义网络,再用自己的低层训练循环做优化。两种 API 基于同一套底层概念,设计上就能良好协作。
5.4 本课程的学习路径
课程尽量为 PyTorch 和 TensorFlow 双线提供内容,可按偏好任选其一的 notebook 跟学;不确定时建议先浏览两个框架再做决定。在可能的情况下,课程优先用高层 API 以简化入门,但同时强调"从底层理解神经网络如何工作",因此开篇仍从低层 API 与张量操作讲起——如果你只想快速上手,也可以跳过底层细节直接进入高层 API 的 notebook。
动手练习请跟随以下 notebook:
| 层级 | TensorFlow 线 | PyTorch 线 |
|---|---|---|
| 低层 API | IntroKerasTF.ipynb | IntroPyTorch.ipynb |
| 高层 API | IntroKeras.ipynb | PyTorch Lightning |
配套实验 lab/LabFrameworks.ipynb 要求你使用 PyTorch 或 TensorFlow,分别用单层与多层全连接网络解决两个分类问题——恰好用来对比感知机与多层网络的表达能力差异。
六、过拟合(Overfitting):必须一次学对的概念
掌握框架之后,课程用一节内容专门回顾过拟合——机器学习中极其重要、也极易出错的议题(详见 05-Frameworks 章节的 Overfitting 部分)。
6.1 什么是过拟合
考虑用 5 个数据点(图中用x标记)做曲线拟合:
| 线性模型(2 个参数) | 非线性模型(7 个参数) |
|---|---|
| 训练误差 = 5.3 | 训练误差 = 0 |
| 验证误差 = 5.1 | 验证误差 = 20 |
- 左图:直线近似是恰当的。参数数量与数据规模匹配,模型正确把握了点的分布规律;
- 右图:模型过于强大。只有 5 个点却给了 7 个参数,模型可以扭曲自身穿过所有点,使训练误差降为 0,但这反而阻止模型学到数据背后的真实模式,导致验证误差非常高(20)。
可见,在模型丰富度(参数数量)与训练样本数量之间取得平衡至关重要。
6.2 过拟合的成因
课程文档归纳了三个常见原因:
- 训练数据不足;
- 模型过于强大;
- 输入数据中的噪声过多。
6.3 如何检测过拟合
从上图可以看出,过拟合表现为训练误差极低、验证误差却很高。正常训练过程中,训练误差与验证误差通常先一起下降;随后验证误差可能停止下降甚至开始回升——这正是过拟合的信号,意味着此时应当停止训练(或至少为模型保存一份快照)。
6.4 如何预防过拟合
发现过拟合时,可以采取以下措施之一:
- 增加训练数据量;
- 降低模型复杂度;
- 使用正则化技术(regularization),例如课程后续章节(08-TransferLearning/TrainingTricks.md)中会讲到的Dropout。
6.5 过拟合与偏差-方差权衡
过拟合本质上是统计学中更一般的问题——偏差-方差权衡(Bias-Variance Tradeoff)的一个特例。模型误差有两个来源:
- 偏差误差(bias):算法没能正确捕捉训练数据之间的关系,通常源于模型能力不足,即欠拟合(underfitting);
- 方差误差(variance):模型拟合了输入数据中的噪声而非真实关系,即过拟合。
训练过程中,偏差误差随模型逼近数据而下降,方差误差则上升。因此重要的是在合适的时机停止训练——无论是人工检测到过拟合而手动停止,还是通过引入正则化自动抑制——从而防止过拟合。
七、动手实践路径总览
结合上述内容,本部分的学习路线可以这样串联:
- 概念基础:阅读 3-NeuralNetworks 章节总览,理解神经元模型、机器学习与激活函数;
- 感知机实战:完成 Perceptron.ipynb,再挑战 lab/PerceptronMultiClass.ipynb 的多分类数字识别;
- 自建框架:跟随 OwnFramework.ipynb 手工实现前向传播与反向传播,并用 lab/MyFW_MNIST.ipynb 在 MNIST 上验证;
- 框架入门:按偏好选择 IntroPyTorch.ipynb 或 IntroKerasTF.ipynb,再完成 lab/LabFrameworks.ipynb;
- 概念巩固:深入理解过拟合的检测与预防,为后续计算机视觉、NLP 等章节打好基础。
如果想先跑一个"最简可运行"的完整示例建立直觉,仓库根目录的 examples/02-simple-neural-network.py 是一个极佳起点:它不依赖任何 ML 框架,用 100 行左右的纯 Python 完成数据生成、前向传播、反向修正与准确率评估;更早的 examples/01-hello-ai-world.py 则用最简单的"权重学习"演示了"从数据中学习模式"这一 AI 最核心的思想,可作为进入神经网络前的热身。
小结
本部分从生物神经元的启发出发,依次走过了神经元的数学建模、感知机的历史与训练、多层感知机与反向传播的推导、TensorFlow/PyTorch 框架的两级 API 选择,以及贯穿始终的过拟合议题。这条路径完整覆盖了"AI for Beginners"神经网络入门所需的核心知识,配合仓库中的 notebook 与实验,足以支撑你从零开始亲手训练出第一个能用的神经网络模型。
- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
相关推荐
AI-For-Beginners 神经网络课程导读:从感知机到深度学习框架
AI For Beginners 神经网络课程导读:从感知机到深度学习框架 本节内容是开源课程 AI For Beginners https://link.gi
教程人工智能机器学习深度学习AI for Beginners 神经网络入门:从感知机到现代深度学习框架
AI for Beginners 神经网络入门:从感知机到现代深度学习框架 导读 本文是 AI for Beginners 课程第 3 大章《神经网络(Neur
教程人工智能机器学习深度学习AI-For-Beginners 神经网络入门指南:从感知机到现代深度学习框架
AI For Beginners 神经网络入门指南:从感知机到现代深度学习框架 本指南以 AI For Beginners 课程第三部分"神经网络"( less
教程人工智能机器学习深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考