- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
本篇技术指南围绕 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)
原文档给出了本节的完整学习地图,四个子主题层层递进,全部资源均存在于当前仓库中:
- 感知机(Perceptron):最早期的两类分类神经网络模型,见 lessons/3-NeuralNetworks/03-Perceptron/README.md,配套可运行练习 Perceptron.ipynb;
- 多层网络(Multi-layered networks):并附“如何构建自己的框架”Notebook OwnFramework.ipynb,说明文档见 lessons/3-NeuralNetworks/04-OwnFramework/README.md;
- 神经网络框架:配套 PyTorch Notebook IntroPyTorch.ipynb 与 Keras/TensorFlow Notebook IntroKerasTF.ipynb,说明文档见 lessons/3-NeuralNetworks/05-Frameworks/README.md;
- 过拟合(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)是经典的函数优化方法:计算损失函数对参数的导数(多维情况下即梯度),并沿使误差下降的方向调整参数:
- 用随机值初始化参数 w⁽⁰⁾、b⁽⁰⁾;
- 重复以下步骤若干次:
- 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 指出,要高效训练神经网络需要两件事:
- 对张量进行运算:矩阵乘、加法,以及 sigmoid、softmax 等函数;
- 计算任意表达式的梯度,以执行梯度下降优化。
numpy可以完成第一件,但自研框架(OwnFramework.ipynb)必须在backward方法里手工编写所有导数函数来做反向传播。理想的框架应该能对任何用户定义的表达式自动求梯度。此外,深度学习训练计算量巨大,框架必须支持在 GPU 或 TPU 等专用计算单元上并行执行(“并行化”指把计算分布到多个设备上)。
当前最流行的两个框架是TensorFlow与PyTorch,均提供 CPU/GPU 张量运算的低层 API,其上都有一套高层 API:
| API 层级 | TensorFlow 系 | PyTorch 系 |
|---|---|---|
| 低层 API | TensorFlow | PyTorch |
| 高层 API | Keras | PyTorch Lightning |
两者的定位差异是:
- 低层 API:允许构建计算图(computational graph)——图定义了给定输入参数如何计算输出(通常是损失函数),可以下推到 GPU 执行,并内置对计算图求导、计算梯度的函数,用于优化模型参数;
- 高层 API:把神经网络视为层的序列,大幅简化网络构建;训练模型通常是“准备数据 + 调用
fit函数”。
高层 API 适合快速搭建典型网络;低层 API 对训练过程的控制力更强,研究新架构时用得很多。两套 API 也可以混用:用低层 API 开发自定义层,嵌入高层 API 搭建的大网络;或者用高层 API 定义网络、再自己写低层训练循环做优化——它们共享相同的底层概念,设计上就是协同工作的。
课程在两个框架间均提供了内容,读者可任选其一:
| API 层级 | TensorFlow/Keras Notebook | PyTorch Notebook |
|---|---|---|
| 低层 API | IntroKerasTF.ipynb | IntroPyTorch.ipynb |
| 高层 API | IntroKeras.ipynb | PyTorch 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)。
训练过程中偏差误差下降(模型逐渐学会近似数据),方差误差上升。因此必须适时停止训练——手动(检测到过拟合时)或自动(引入正则化)——以防止过拟合。
小结与本节可复现路径
本章节以“神经网络是机器学习中通过数据训练、以最小化损失为目标的可微模型”为主线,沿四步递进:
- 理解神经元模型 Y = f(Σ XᵢWᵢ) 与激活函数的来源(生物学类比 + 1943 年经典文献);
- 用感知机准则与梯度下降更新规则训练二分类器,并完成多分类数字识别 Lab(03-Perceptron/lab);
- 形式化训练问题(损失函数、参数 θ、SGD、反向传播),并在 OwnFramework.ipynb 中亲手用 NumPy 搭出
Linear/Softmax等可微组件,再用它解 MNIST(04-OwnFramework/lab); - 迁移到 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!
相关推荐
AI-For-Beginners 神经网络导论:从神经元模型到多层感知机、框架与过拟合的完整实战指南
AI For Beginners 神经网络导论:从神经元模型到多层感知机、框架与过拟合的完整实战指南 导读:本文基于 AI For Beginners 课程 3
教程人工智能机器学习深度学习AI-For-Beginners 神经网络入门:从神经元数学模型到多层感知机与 PyTorch/TensorFlow 实战
AI For Beginners 神经网络入门:从神经元数学模型到多层感知机与 PyTorch/TensorFlow 实战 人工智能的路径之一是训练一个"计算机
教程人工智能机器学习深度学习AI for Beginners:神经网络入门——从神经元模型到多层感知机与深度学习框架
AI for Beginners:神经网络入门——从神经元模型到多层感知机与深度学习框架 导读 :本文以 AI for Beginners 课程第 3 章《In
教程人工智能机器学习深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考