Appearance
第5章 神经网络
🎯 学习目标
- 理解人工神经元的基本模型和激活函数的作用
- 掌握多层前馈神经网络的结构和前向传播过程
- 深入理解反向传播算法的原理和梯度计算
- 认识全局最小与局部最小的问题及其缓解策略
- 了解其他常见神经网络模型(RBF、SOM、Boltzmann 机等)
- 了解深度学习的核心概念和常见优化技术
- 认识神经网络训练中的挑战(梯度消失、过拟合等)
5.1 神经元模型
🔬 从生物神经元到人工神经元
人工神经网络的灵感来源于生物神经系统。生物神经元通过树突接收信号,在细胞体中整合处理,然后通过轴突传递给其他神经元。
生物神经元:
- 树突:接收来自其他神经元的信号
- 细胞体:整合处理输入信号
- 轴突:传递输出信号
- 突触:神经元之间的连接
人工神经元:
- 输入:接收多个输入特征
- 权重:每个输入对应一个权重
- 求和:计算加权和
- 激活:通过激活函数输出
数学表达式:
其中
⚡ 感知机:最简单的神经网络
感知机(Perceptron)是最早的神经网络模型之一,由 Frank Rosenblatt 在 1957 年提出。它使用阶跃函数作为激活函数,可以解决线性可分问题。
感知机激活函数:
局限性: 感知机只能解决线性可分问题,无法解决异或(XOR)等非线性问题。这一局限性直到多层神经网络和反向传播算法的出现才得以解决。
感知机学习算法:一步步推导出权重向量
把偏置并入权重:令
训练算法只有三步:
- 初始化:
。 - 逐点检查:对训练集中每个点
,若 (分类错误),则更新 。 - 终止判断:若一整轮没有任何更新,算法终止;否则回到步骤 2 再遍历一轮。
为什么用
收敛性: 设存在单位向量
在下面的演示中逐步执行算法:左图看决策边界如何翻转、平移;「本步推导」给出每一步的具体算式;权重空间图展示
训练状态
轮次1
累计更新 M0
错分点0 / 0
cos θ(w, w*)—
w = (w₀, w₁, w₂) = (0, 0, 0)
本步推导
步骤1:初始化 w = (0, 0, 0)
每个点增广为 x = (1, x₁, x₂),偏置 w₀ 与 x₀ = 1 相乘。
点击「单步检查」开始步骤2:逐个检查 y·wᵀx。
权重空间:wnew = wold + y·x
只画 (w₁, w₂) 分量。灰色虚线箭头为 wold,琥珀色为本次加上的 ±x,蓝色为 wnew; 点状轨迹是每次更新后 w 的位置,紫色射线为 w* 的方向。
为什么一定会停:收敛性
w·w*(‖w*‖ = 1)下界 kγ‖w‖上界 √k·R
每次更新:w·w* 至少增加 γ = Infinity,‖w‖² 至多增加 R² = Infinity
⇒ M·γ ≤ w·w* ≤ ‖w‖ ≤ √M·R ⇒ M ≤ R²/γ² ≈ NaN
当前 M = 0,cos θ = w·w*/‖w‖ = —(≤ 1)
迭代记录 (最近 60 次检查)
| # | 轮 | 点 | y | y·wᵀx | 操作 | w(检查后) |
|---|---|---|---|---|---|---|
| 尚未开始 | ||||||
正类 y = +1负类 y = −1琥珀描边:当前 w 下错分(y·wᵀx ≤ 0)当前边界 wᵀx = 0更新前的边界理想超平面 w*
激活函数的作用
📊 为什么需要非线性?
激活函数是神经网络中的关键组件,它引入非线性变换,使得神经网络能够学习复杂的非线性关系。
如果没有激活函数(或使用线性激活函数),无论网络有多少层,整个网络仍然等价于一个单层线性模型,无法学习复杂模式。
激活函数的特性:
- 非线性:能够拟合复杂函数
- 可导性:支持梯度下降优化
- 计算效率:影响训练速度
- 梯度特性:影响训练稳定性
比较常见激活函数的特性、优缺点和适用场景。选择不同的激活函数,观察它们的图像和导数。
显示导数
Sigmoid
σ(x) = 1 / (1 + e⁻ˣ)将输入压缩到 (0, 1) 区间,常用于二分类输出层
✅ 优点
- 输出范围有界,适合概率解释
- 平滑可导,便于梯度计算
⚠️ 缺点
- 梯度消失问题严重(饱和区梯度接近0)
- 输出非零中心,影响收敛速度
- 计算代价较高(指数运算)
值域:
(0, 1)| 函数 | 值域 | 零中心 | 梯度消失 | 计算速度 |
|---|---|---|---|---|
| Sigmoid | (0, 1) | ✗ | 严重 | 较慢 |
| ReLU | [0, +∞) | ✗ | 较轻 | 快 |
| Tanh | (-1, 1) | ✓ | 严重 | 较慢 |
| Leaky ReLU | (-∞, +∞) | ✗ | 很轻 | 快 |
5.2 多层前馈神经网络
网络结构
多层前馈神经网络(Multilayer Feedforward Neural Network)也称为多层感知机(MLP),是最基础的深度学习模型。信息从输入层经过一层或多层隐藏层,最终到达输出层。
- 输入层 (Input Layer) — 接收原始特征数据。节点数等于特征维度。例如,28×28 的图像展平后有 784 个输入节点。
- 隐藏层 (Hidden Layers) — 提取和转换特征表示。每层通过非线性变换学习更抽象的特征。层数越多(越"深"),理论上能学习的特征越复杂。
- 输出层 (Output Layer) — 产生最终预测。分类任务通常使用 Softmax 激活,回归任务使用线性激活。节点数等于类别数(分类)或输出维度(回归)。
前向传播过程
➡️ 前向传播
前向传播(Forward Propagation)是神经网络计算输出的过程。给定输入
第
线性变换:
激活函数:
其中
🌟 万能逼近定理
Universal Approximation Theorem: 一个包含至少一个隐藏层的前馈神经网络,在激活函数满足一定条件下(如 Sigmoid),可以以任意精度逼近任何连续函数。
理论保证:
- 神经网络具有强大的表达能力
- 理论上可以学习任意复杂函数
- 为深度学习提供理论基础
实践挑战:
- 需要足够的训练数据
- 可能需要大量神经元
- 训练算法未必能找到最优解
调整网络的层数和每层的节点数,观察网络结构的变化。查看总参数数量和连接数,理解网络复杂度。
3
2
4
2
总层数
4
总节点数
13
总连接数
36
参数数量
46
网络结构说明
- 输入层:接收原始特征数据(如图像像素、文本词向量等)
- 隐藏层:提取和转换特征,层数越多表示网络越"深"
- 输出层:产生最终预测结果(分类概率或回归值)
- 连接权重:每条连接都有一个可学习的权重参数
- 前向传播:信号从输入层经过隐藏层传递到输出层的过程
5.3 反向传播算法
🔄 反向传播:神经网络训练的核心
反向传播算法(Backpropagation, BP)是训练神经网络的标准方法,由 Rumelhart、Hinton 和 Williams 在 1986 年推广。它基于链式法则高效计算损失函数对所有参数的梯度。
核心思想:
- 前向传播:计算网络输出和损失值
- 反向传播:从输出层开始,利用链式法则反向计算每层的梯度
- 参数更新:使用梯度下降法更新权重和偏置
链式法则与梯度计算
🔗 链式法则
链式法则是微积分中的基本定理,它是反向传播算法的数学基础。
链式法则:
输出层梯度:
其中
隐藏层梯度(反向递推):
权重和偏置的梯度:
权重更新规则
⚙️ 梯度下降更新
计算出梯度后,使用梯度下降法更新参数:
其中
观看完整的前向传播、反向传播和权重更新过程。查看每个连接的权重和梯度变化。
迭代次数: 0
0.10
准备
前向传播
反向传播
权重更新
目标值
0.90
预测值
0.00
损失 (MSE)
0.4050
📚 反向传播算法步骤
1. 前向传播 (Forward Pass)
从输入层开始,逐层计算每个神经元的输出值,直到得到最终的预测结果。
z = Σ(wᵢxᵢ) + b, a = σ(z)2. 计算损失 & 反向传播 (Backward Pass)
计算输出误差,然后利用链式法则反向计算每层的梯度。
δₗ = (∂L/∂aₗ) · σ'(zₗ)3. 权重更新 (Weight Update)
使用梯度下降法更新所有权重和偏置。
w ← w - η · (∂L/∂w)5.4 全局最小与局部最小
🏔️ 优化的挑战
梯度下降法通过沿梯度的负方向更新参数来最小化损失函数。然而,对于复杂的非凸损失函数,梯度下降可能陷入局部最小(local minimum)而非全局最小(global minimum)。
两种极值的区别:
- 全局最小:整个参数空间中损失函数值最小的点
- 局部最小:仅在某个邻域内损失函数值最小的点
- 鞍点:在某些方向是极小值、在另一些方向是极大值的点
💡 梯度为零不等于最优
当梯度
- 全局最小点(理想情况)
- 局部最小点(次优解)
- 鞍点(高维空间中更常见)
在高维参数空间中,鞍点的数量远多于局部最小点。实际上,研究表明神经网络损失曲面上的大多数局部最小值与全局最小值的损失差距很小,因此即使陷入局部最小,模型性能也往往可以接受。
缓解策略
| 策略 | 原理 | 说明 |
|---|---|---|
| 多组随机初始化 | 从不同起点出发 | 使用多组不同的初始权重训练,选择损失最小的结果 |
| 随机梯度下降 (SGD) | 引入随机性 | 每次使用小批量样本计算梯度,噪声有助于跳出局部最小 |
| 模拟退火 | 以一定概率接受更差的解 | 温度逐渐降低,前期大幅探索,后期精细收敛 |
| 遗传算法 | 全局搜索 | 通过种群进化搜索参数空间,不依赖梯度 |
| 学习率预热 | 初始大步长 | 开始时使用较大学习率有助于跳出不良局部区域 |
⚖️ 实践启示
在实际应用中,对于神经网络这样的高维优化问题:
- 局部最小通常不是主要障碍——鞍点和平坦区域更为棘手
- 大多数局部最小对应的损失值相差不大
- 使用 SGD 配合动量(Momentum)或 Adam 优化器通常足以获得满意的结果
- 过拟合的危害往往大于陷入局部最小
5.5 其他常见神经网络
🧩 多样化的网络架构
除了标准的多层前馈网络,还有许多针对不同任务和场景设计的神经网络模型。它们各有特点,适用于不同的问题。
网络类型一览
| 网络 | 全称 | 核心特点 | 典型应用 |
|---|---|---|---|
| RBF 网络 | 径向基函数网络 | 单隐层,局部响应 | 函数逼近、模式分类 |
| ART 网络 | 自适应谐振理论 | 竞争学习,在线增量 | 无监督聚类 |
| SOM 网络 | 自组织映射 | 拓扑保持映射 | 高维数据可视化 |
| 级联相关 | Cascade-Correlation | 自动确定结构 | 小规模学习任务 |
| Elman 网络 | Elman Recurrent Network | 递归连接,记忆 | 时间序列预测 |
| Boltzmann 机 | Boltzmann Machine | 基于能量模型 | 特征学习、生成模型 |
RBF 网络(径向基函数网络)
RBF 网络使用径向基函数作为隐层神经元的激活函数,通常为高斯函数:
- 单隐层结构,训练速度快
- 隐层神经元对输入进行局部响应——仅当输入接近中心
时才产生显著输出 - 输出层是隐层输出的线性组合
- 常用于函数逼近和插值问题
ART 网络(自适应谐振理论)
ART 网络由 Stephen Grossberg 提出,是一种竞争学习网络:
- 由比较层、识别层和重置模块组成
- 通过竞争机制选择最匹配的类别
- 支持增量学习——无需重新训练即可学习新类别
- 通过警戒参数(vigilance parameter)控制分类的粗细程度
- 解决了"稳定性-可塑性困境":既能学习新知识,又不遗忘旧知识
SOM 网络(自组织映射)
SOM 由 Teuvo Kohonen 提出,是一种无监督学习网络:
- 将高维输入数据映射到低维(通常是二维)网格
- 保持输入空间的拓扑结构——相似的输入映射到相邻的网格节点
- 通过竞争学习和邻域协作进行训练
- 广泛用于数据可视化和聚类分析
级联相关网络
级联相关网络(Cascade-Correlation)由 Fahlman 和 Lebiere 提出:
- 构造性网络——从最小网络开始,逐步添加隐层神经元
- 每次添加一个新的隐层节点,使其与当前网络残差的相关性最大
- 自动确定网络结构,无需预先指定层数和节点数
- 训练过程中已有连接的权重被冻结,只训练新添加节点的连接
Elman 网络
Elman 网络是一种简单的递归神经网络(RNN):
- 隐层的输出被反馈到一个上下文层,作为下一时刻的额外输入
- 使网络具有短期记忆能力,能处理序列数据
- 可以看作是现代 RNN(LSTM、GRU)的早期形态
- 适用于时间序列预测和简单的序列建模任务
Boltzmann 机
Boltzmann 机是一种基于能量的随机网络模型:
- 网络状态的概率由能量函数决定,能量越低概率越高
- 受限 Boltzmann 机(RBM):限制同层神经元之间无连接,简化训练
- RBM 使用对比散度(Contrastive Divergence, CD)算法进行高效训练
- 曾作为深度信念网络(DBN)的构建模块,推动了深度学习的早期复兴
- 可用于特征学习、降维和生成建模
📖 历史注记:深度学习的复兴
2006 年,Hinton 等人提出使用逐层预训练的 RBM 构建深度信念网络(DBN),首次成功训练了深层神经网络,这被认为是深度学习复兴的标志性事件。此后,ReLU 激活函数、Dropout、BatchNorm 等技术的出现使得直接训练深层网络成为可能,RBM 预训练逐渐不再是必需步骤。
5.6 深度学习
🌊 什么是深度学习?
深度学习(Deep Learning)是机器学习的一个分支,特指使用多层神经网络进行学习的方法。"深度"指的是网络的层数较多(通常 > 2 层隐藏层)。
深度网络的优势:
- 层次化特征学习:从低层到高层自动学习特征表示
- 端到端学习:无需手工设计特征工程
- 表达能力强:能够学习极其复杂的函数映射
- 泛化性能好:在大规模数据上表现优异
典型应用领域:
- 计算机视觉:图像分类、目标检测、语义分割
- 自然语言处理:机器翻译、文本生成、问答系统
- 语音识别:语音转文字、语音合成
- 推荐系统:个性化推荐、用户画像
训练深度网络的挑战
⚠️ 常见挑战
1. 梯度消失与梯度爆炸
在深层网络中,梯度在反向传播过程中可能会变得极小(消失)或极大(爆炸),导致网络难以训练。
原因:
- Sigmoid/Tanh 等激活函数的饱和区梯度接近 0
- 权重初始化不当
- 网络层数过深
解决方案:
- 使用 ReLU 等激活函数
- 批归一化(Batch Normalization)
- 残差连接(Residual Connections)
- 合理的权重初始化(Xavier、He 初始化)
2. 过拟合问题
深度网络参数众多,容易在训练集上过拟合,泛化性能差。
正则化技术:
- Dropout — 训练时随机丢弃部分神经元
- L2 正则化 — 在损失函数中添加权重惩罚项
- 数据增强 — 通过变换扩充训练数据
- 早停法 — 监控验证集性能,及时停止训练
3. 计算资源需求
深度网络训练需要大量计算资源和时间。
- GPU 加速:利用 GPU 并行计算能力
- 分布式训练:使用多机多卡训练大模型
- 混合精度训练:使用 FP16 减少显存占用
- 模型压缩:剪枝、量化、知识蒸馏
现代优化技术
🚀 优化算法与归一化
优化算法:
- SGD with Momentum — 累积历史梯度信息
- Adam — 自适应学习率,最常用的优化器
- AdaGrad / RMSProp — 调整每个参数的学习率
- 学习率调度 — 动态调整学习率
归一化技术:
- Batch Normalization — 归一化每层的输入
- Layer Normalization — 适用于序列模型
- Group Normalization — 介于 BN 和 LN 之间
- Instance Normalization — 用于风格迁移
深度学习框架
- 🔥 PyTorch — 动态图,易于调试
- 🧮 TensorFlow — Google,生产部署
- 🌸 Keras — 高级 API,易用
- ⚡ JAX — 自动微分,高性能
5.7 实践指南
构建神经网络的步骤
📋 五步实践流程
第 1 步:数据准备
- 收集和清洗数据
- 划分训练集、验证集、测试集
- 数据归一化和标准化
- 数据增强(可选)
第 2 步:网络设计
- 确定网络层数和每层神经元数量
- 选择激活函数
- 设计输出层(分类用 Softmax,回归用线性)
- 考虑加入 Dropout、BN 等正则化层
第 3 步:训练配置
- 选择损失函数(交叉熵、MSE 等)
- 选择优化器(Adam、SGD 等)
- 设置学习率和批次大小
- 配置学习率调度策略
第 4 步:训练与调试
- 监控训练和验证损失
- 绘制学习曲线
- 调整超参数
- 使用早停法防止过拟合
第 5 步:评估与部署
- 在测试集上评估最终性能
- 分析错误案例
- 模型优化和压缩
- 部署到生产环境
常见问题诊断
🔍 训练问题排查
问题:训练损失不下降
- 学习率过大或过小
- 权重初始化不当
- 梯度消失或爆炸
- 数据未归一化
问题:训练集准确率高,测试集准确率低(过拟合)
- 添加 Dropout 或 L2 正则化
- 使用数据增强
- 收集更多训练数据
- 简化模型(减少参数)
问题:训练和测试准确率都很低(欠拟合)
- 增加网络容量(更多层或神经元)
- 训练更多轮次
- 减少正则化强度
- 检查特征工程是否充分
代码实践:实现 Sigmoid 激活函数
python
import math
def sigmoid(x):
"""
Sigmoid 激活函数: σ(x) = 1 / (1 + e^(-x))
"""
return 1 / (1 + math.exp(-x))
def sigmoid_derivative(x):
"""
Sigmoid 函数的导数: σ'(x) = σ(x) * (1 - σ(x))
"""
s = sigmoid(x)
return s * (1 - s)
# 测试代码
test_values = [-2, -1, 0, 1, 2]
print("x\t\tσ(x)\t\tσ'(x)")
print("-" * 40)
for x in test_values:
sig = sigmoid(x)
sig_prime = sigmoid_derivative(x)
print(f"{x:.1f}\t\t{sig:.4f}\t\t{sig_prime:.4f}")
# 输出:
# x σ(x) σ'(x)
# ----------------------------------------
# -2.0 0.1192 0.1050
# -1.0 0.2689 0.1966
# 0.0 0.5000 0.2500
# 1.0 0.7311 0.1966
# 2.0 0.8808 0.1050
#
# 特性观察:
# - σ(0) = 0.5 (中心点)
# - σ(-x) = 1 - σ(x) (对称性)
# - σ'(x) 在 x=0 处最大 (0.25)扩展阅读
经典论文:
- Rumelhart et al. (1986): "Learning representations by back-propagating errors"
- LeCun et al. (1998): "Gradient-based learning applied to document recognition"
- Hinton et al. (2012): "ImageNet Classification with Deep Convolutional Neural Networks"
推荐资源:
- 课程:Andrew Ng 的深度学习专项课程(Coursera)
- 书籍:《深度学习》(Goodfellow, Bengio, Courville)
- 网站:distill.pub(可视化深度学习概念)
📝 本章小结
总结
- ✅ 人工神经元模拟生物神经元,通过加权求和和激活函数产生输出
- ✅ 激活函数引入非线性,使神经网络能够学习复杂函数(Sigmoid、ReLU、Tanh 等)
- ✅ 多层前馈神经网络由输入层、隐藏层和输出层组成,具有万能逼近能力
- ✅ 反向传播算法基于链式法则,高效计算所有参数的梯度
- ✅ 梯度下降可能陷入局部最小或鞍点,可通过多初始化、SGD 等策略缓解
- ✅ 除标准前馈网络外,还有 RBF、SOM、Elman、Boltzmann 机等多种网络架构
- ✅ 深度学习通过多层网络实现层次化特征学习,在许多任务上表现优异
- ✅ 训练深度网络面临梯度消失/爆炸、过拟合等挑战,需要使用正则化和优化技术
- ✅ 现代深度学习框架(PyTorch、TensorFlow 等)极大简化了神经网络的开发