CHAPTER 5
✓ 已完成
🧠

神经网络

Neural Networks

学习目标

🎯
  • 理解人工神经元的基本模型和激活函数的作用
  • 掌握多层前馈神经网络的结构和前向传播过程
  • 深入理解反向传播算法的原理和梯度计算
  • 了解深度学习的核心概念和常见优化技术
  • 认识神经网络训练中的挑战(梯度消失、过拟合等)
5.1

神经元模型

🔬

从生物神经元到人工神经元

人工神经网络的灵感来源于生物神经系统。生物神经元通过树突接收信号, 在细胞体中整合处理,然后通过轴突传递给其他神经元。

生物神经元

  • 树突:接收来自其他神经元的信号
  • 细胞体:整合处理输入信号
  • 轴突:传递输出信号
  • 突触:神经元之间的连接

人工神经元

  • 输入:接收多个输入特征 x₁, x₂, ..., xₙ
  • 权重:每个输入对应一个权重 w₁, w₂, ..., wₙ
  • 求和:计算加权和 z = Σwᵢxᵢ + b
  • 激活:通过激活函数输出 a = f(z)

数学表达式

z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b = wᵀx + b
y = f(z)

其中 w 是权重向量,x 是输入向量,b 是偏置项,f 是激活函数。

感知机:最简单的神经网络

感知机(Perceptron)是最早的神经网络模型之一,由 Frank Rosenblatt 在 1957 年提出。 它使用阶跃函数作为激活函数,可以解决线性可分问题。

感知机激活函数
f(z) = {
1, 如果 z ≥ 0
0, 如果 z < 0
}

局限性: 感知机只能解决线性可分问题, 无法解决异或(XOR)等非线性问题。这一局限性直到多层神经网络和反向传播算法的出现才得以解决。

📊

激活函数的作用

激活函数是神经网络中的关键组件,它引入非线性变换,使得神经网络能够学习复杂的非线性关系。

为什么需要非线性?

如果没有激活函数(或使用线性激活函数),无论网络有多少层, 整个网络仍然等价于一个单层线性模型,无法学习复杂模式。

激活函数的特性

  • 非线性:能够拟合复杂函数
  • 可导性:支持梯度下降优化
  • 计算效率:影响训练速度
  • 梯度特性:影响训练稳定性
📈

激活函数对比

比较常见激活函数的特性、优缺点和适用场景。拖动鼠标选择不同的激活函数,观察它们的图像和导数。

显示导数
xy

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)是神经网络计算输出的过程。 给定输入 x,逐层计算激活值,最终得到预测结果 ŷ。

第 l 层的计算

线性变换:z⁽ˡ⁾ = W⁽ˡ⁾a⁽ˡ⁻¹⁾ + b⁽ˡ⁾
激活函数:a⁽ˡ⁾ = f(z⁽ˡ⁾)
W⁽ˡ⁾
权重矩阵
b⁽ˡ⁾
偏置向量
a⁽ˡ⁾
激活值
🌟

万能逼近定理

Universal Approximation Theorem:一个包含至少一个隐藏层的前馈神经网络,在激活函数满足一定条件下(如 Sigmoid), 可以以任意精度逼近任何连续函数。

理论意义与实践考虑

理论保证

  • • 神经网络具有强大的表达能力
  • • 理论上可以学习任意复杂函数
  • • 为深度学习提供理论基础

实践挑战

  • • 需要足够的训练数据
  • • 可能需要大量神经元
  • • 训练算法未必能找到最优解
🎛️

交互式神经网络结构

调整网络的层数和每层的节点数,观察网络结构的变化。查看总参数数量和连接数,理解网络复杂度。

3
2
4
2
InputHidden 1Hidden 2Output
总层数
4
总节点数
13
总连接数
36
参数数量
46
💡

网络结构说明

  • 输入层:接收原始特征数据(如图像像素、文本词向量等)
  • 隐藏层:提取和转换特征,层数越多表示网络越"深"
  • 输出层:产生最终预测结果(分类概率或回归值)
  • 连接权重:每条连接都有一个可学习的权重参数
  • 前向传播:信号从输入层经过隐藏层传递到输出层的过程
5.3

反向传播算法

🔄

反向传播:神经网络训练的核心

反向传播算法(Backpropagation, BP)是训练神经网络的标准方法, 由 Rumelhart、Hinton 和 Williams 在 1986 年推广。 它基于链式法则高效计算损失函数对所有参数的梯度。

核心思想

  1. 1
    前向传播:计算网络输出和损失值
  2. 2
    反向传播:从输出层开始,利用链式法则反向计算每层的梯度
  3. 3
    参数更新:使用梯度下降法更新权重和偏置
🔗

链式法则与梯度计算

链式法则是微积分中的基本定理,它是反向传播算法的数学基础。

链式法则

∂L/∂w⁽ˡ⁾ = (∂L/∂z⁽ˡ⁾) · (∂z⁽ˡ⁾/∂w⁽ˡ⁾)

输出层梯度

δ⁽ᴸ⁾ = ∂L/∂z⁽ᴸ⁾ = (∂L/∂a⁽ᴸ⁾) ⊙ f'(z⁽ᴸ⁾)

⊙ 表示逐元素乘法(Hadamard product)

隐藏层梯度(反向递推)

δ⁽ˡ⁾ = [(W⁽ˡ⁺¹⁾)ᵀδ⁽ˡ⁺¹⁾] ⊙ f'(z⁽ˡ⁾)

权重和偏置的梯度

∂L/∂W⁽ˡ⁾ = δ⁽ˡ⁾(a⁽ˡ⁻¹⁾)ᵀ
∂L/∂b⁽ˡ⁾ = δ⁽ˡ⁾
⚙️

权重更新规则

计算出梯度后,使用梯度下降法更新参数:

W⁽ˡ⁾ ← W⁽ˡ⁾ - η · (∂L/∂W⁽ˡ⁾)
b⁽ˡ⁾ ← b⁽ˡ⁾ - η · (∂L/∂b⁽ˡ⁾)

其中 η 是学习率(learning rate), 控制每次更新的步长大小。

🎬

反向传播算法演示

观看完整的前向传播、反向传播和权重更新过程。查看每个连接的权重和梯度变化。

迭代次数:0
0.10
⏸️
准备
➡️
前向传播
⬅️
反向传播
🔄
权重更新
w=0.50w=-0.30w=0.40w=0.60w=0.70w=-0.200.800.600.000.000.00输入层隐藏层输出层
目标值
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

深度学习

🌊

什么是深度学习?

深度学习(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.5

实践指南

📋

构建神经网络的步骤

1 步:数据准备

  • 收集和清洗数据
  • 划分训练集、验证集、测试集
  • 数据归一化和标准化
  • 数据增强(可选)

2 步:网络设计

  • 确定网络层数和每层神经元数量
  • 选择激活函数
  • 设计输出层(分类用 Softmax,回归用线性)
  • 考虑加入 Dropout、BN 等正则化层

3 步:训练配置

  • 选择损失函数(交叉熵、MSE 等)
  • 选择优化器(Adam、SGD 等)
  • 设置学习率和批次大小
  • 配置学习率调度策略

4 步:训练与调试

  • 监控训练和验证损失
  • 绘制学习曲线
  • 调整超参数
  • 使用早停法防止过拟合

5 步:评估与部署

  • 在测试集上评估最终性能
  • 分析错误案例
  • 模型优化和压缩
  • 部署到生产环境
🔍

常见问题诊断

问题:训练损失不下降

可能原因:

  • • 学习率过大或过小
  • • 权重初始化不当
  • • 梯度消失或爆炸
  • • 数据未归一化

问题:训练集准确率高,测试集准确率低

诊断:过拟合

  • • 添加 Dropout 或 L2 正则化
  • • 使用数据增强
  • • 收集更多训练数据
  • • 简化模型(减少参数)

问题:训练和测试准确率都很低

诊断:欠拟合

  • • 增加网络容量(更多层或神经元)
  • • 训练更多轮次
  • • 减少正则化强度
  • • 检查特征工程是否充分
💻

代码实践:实现Sigmoid激活函数

动手实现神经网络中最基础的激活函数,理解其数学原理。

💻实现 Sigmoid 激活函数及其导数

完成 sigmoid 函数和 sigmoid_derivative 函数的实现

代码编辑器

Python
Loading...

输出结果

点击 "运行代码" 查看输出结果
期望输出
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)
💡
提示
  • • 编辑器支持代码高亮和自动补全
  • • 使用 Ctrl+S (Cmd+S) 保存代码
  • • 支持多行编辑:按住 Alt 键拖动鼠标
  • • 当前为演示环境,实际项目需要后端支持代码执行
📝

本章小结

✓ 人工神经元模拟生物神经元,通过加权求和和激活函数产生输出

✓ 激活函数引入非线性,使神经网络能够学习复杂函数(Sigmoid、ReLU、Tanh 等)

✓ 多层前馈神经网络由输入层、隐藏层和输出层组成,具有万能逼近能力

✓ 反向传播算法基于链式法则,高效计算所有参数的梯度

✓ 深度学习通过多层网络实现层次化特征学习,在许多任务上表现优异

✓ 训练深度网络面临梯度消失/爆炸、过拟合等挑战,需要使用正则化和优化技术

✓ 现代深度学习框架(PyTorch、TensorFlow 等)极大简化了神经网络的开发

📚

扩展阅读

经典论文

  • • 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(可视化深度学习概念)