4.1 深度学习基础

🎯 学习目标

通过神经网络基础项目,掌握深度学习的核心概念和基本技术,包括:

  • 理解神经网络的基本结构和原理
  • 掌握激活函数的作用和选择
  • 学会数据预处理和模型构建
  • 理解损失函数和优化器的作用
  • 掌握模型训练和评估的方法

📋 项目预览

我们将创建一个手写数字识别神经网络,能够识别0-9的手写数字。通过这个项目,你将理解神经网络如何从数据中学习模式。

🧠 核心概念详解

1. 什么是深度学习?

深度学习是机器学习的一个分支,它使用包含多个处理层的神经网络来学习数据的层次化表示。

关键特点

  • 深度结构:包含多个隐藏层
  • 自动特征学习:无需手动设计特征
  • 端到端学习:直接从原始数据到最终输出

生活化比喻

  • 传统机器学习:像教孩子识别动物,需要告诉他"有翅膀的是鸟,有四条腿的是狗"
  • 深度学习:给孩子看很多动物图片,让他自己总结规律

2. 神经网络的基本结构

神经网络由三个主要部分组成:

输入层 → 隐藏层 → 输出层

输入层

  • 接收原始数据
  • 神经元数量等于特征数量
  • 在手写数字识别中:28×28=784个神经元

隐藏层

  • 进行特征提取和转换
  • 可以有多层,每层有不同数量的神经元
  • 深度学习的"深度"就体现在这里

输出层

  • 产生最终预测结果
  • 神经元数量等于类别数量
  • 在手写数字识别中:10个神经元(0-9)

3. 神经元的工作原理

单个神经元就像一个小型决策单元:

输出 = 激活函数(权重×输入 + 偏置)

数学公式

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

组成部分

  • 权重(w):每个输入的重要性
  • 偏置(b):调整激活阈值
  • 激活函数(f):引入非线性

4. 激活函数

激活函数决定了神经元是否被激活,引入非线性关系。

常用激活函数

函数 公式 特点 适用场景
Sigmoid 1/(1+e⁻ˣ) 输出0-1,平滑 二分类输出层
Tanh (eˣ-e⁻ˣ)/(eˣ+e⁻ˣ) 输出-1到1,零中心 隐藏层
ReLU max(0,x) 计算简单,防梯度消失 最常用的隐藏层
Softmax eˣ/∑eˣ 输出概率分布 多分类输出层

为什么需要激活函数?

  • 没有激活函数:神经网络只是线性变换的组合
  • 有激活函数:可以学习复杂的非线性关系

5. 前向传播

前向传播是数据从输入层流向输出层的过程:

# 输入层到隐藏层1
h1 = relu(w1 * input + b1)

# 隐藏层1到隐藏层2  
h2 = relu(w2 * h1 + b2)

# 隐藏层2到输出层
output = softmax(w3 * h2 + b3)

过程特点

  • 逐层计算
  • 每层使用前一层的输出作为输入
  • 最终得到预测结果

6. 损失函数

损失函数衡量预测值与真实值的差异:

常用损失函数

  • 均方误差(MSE):回归问题
  • 交叉熵损失:分类问题
  • 二元交叉熵:二分类问题

交叉熵损失公式

Loss = -∑(y_true × log(y_pred))

为什么使用交叉熵?

  • 对错误预测惩罚更大
  • 训练更稳定
  • 适合概率输出

7. 反向传播

反向传播是神经网络学习的核心算法:

工作原理

  1. 计算损失函数
  2. 从输出层向输入层反向传播误差
  3. 根据误差调整权重和偏置
  4. 使用梯度下降更新参数

梯度下降公式

w_new = w_old - 学习率 × ∂Loss/∂w

优化器的作用

  • SGD:基本梯度下降
  • Adam:自适应学习率,最常用
  • RMSprop:适合非平稳目标

🔧 代码实现详解

1. 数据预处理

# 加载MNIST数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 归一化像素值
X_train = X_train.astype('float32') / 255.0
X_test = X_test.astype('float32') / 255.0

# One-hot编码标签
y_train_onehot = to_categorical(y_train, 10)
y_test_onehot = to_categorical(y_test, 10)

预处理重要性

  • 归一化:加速收敛,防止梯度爆炸
  • One-hot编码:将类别标签转换为向量形式

2. 模型构建

model = Sequential([
    Flatten(input_shape=(28, 28)),
    Dense(128, activation='relu'),
    Dense(64, activation='relu'), 
    Dense(10, activation='softmax')
])

层类型说明

  • Flatten:将二维图像展平为一维向量
  • Dense:全连接层,每个神经元连接前一层的所有神经元
  • 激活函数:ReLU用于隐藏层,Softmax用于输出层

3. 模型编译

model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

编译参数

  • optimizer:优化算法(Adam最常用)
  • loss:损失函数(分类问题用交叉熵)
  • metrics:评估指标(准确率)

4. 模型训练

history = model.fit(
    X_train, y_train_onehot,
    batch_size=128,
    epochs=10,
    validation_data=(X_test, y_test_onehot)
)

训练参数

  • batch_size:每次梯度更新使用的样本数
  • epochs:完整遍历训练集的次数
  • validation_data:用于监控验证集性能

5. 模型评估

test_loss, test_accuracy = model.evaluate(X_test, y_test_onehot)
print(f"测试准确率: {test_accuracy:.4f}")

评估指标

  • 准确率:正确预测的比例
  • 损失值:预测误差的大小

📊 完整代码解析

数据加载和探索

(X_train, y_train), (X_test, y_test) = mnist.load_data()
print(f"训练集大小: {X_train.shape[0]}")
print(f"图像尺寸: {X_train.shape[1]}x{X_train.shape[2]}")
  • 了解数据的基本信息
  • 确保数据加载正确

网络结构设计

model = Sequential([
    Flatten(input_shape=(28, 28)),
    Dense(128, activation='relu'),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax')
])
  • 输入层:784个神经元(28×28)
  • 隐藏层1:128个神经元
  • 隐藏层2:64个神经元
  • 输出层:10个神经元

训练过程监控

history = model.fit(X_train, y_train_onehot, 
                   validation_data=(X_test, y_test_onehot))
  • 监控训练集和验证集的性能
  • 及时发现过拟合或欠拟合

预测和可视化

y_pred_probs = model.predict(X_test)
y_pred = np.argmax(y_pred_probs, axis=1)
  • 得到每个类别的概率
  • 选择概率最高的类别作为预测结果

🎯 学习要点总结

  1. 神经网络结构:理解输入层、隐藏层、输出层的作用
  2. 激活函数:掌握ReLU、Softmax等常用激活函数
  3. 前向传播:理解数据从输入到输出的流动过程
  4. 损失函数:学会选择合适的损失函数
  5. 反向传播:理解神经网络的学习机制
  6. 优化器:掌握Adam等优化算法的作用
  7. 数据预处理:学会归一化和One-hot编码
  8. 模型评估:掌握准确率、损失值等评估指标

💡 练习建议

基础练习

  1. 修改网络结构:尝试不同的层数和神经元数量
  2. 改变激活函数:实验Sigmoid、Tanh等不同激活函数
  3. 调整优化器:尝试SGD、RMSprop等不同优化器

进阶练习

  1. 添加正则化:使用Dropout防止过拟合
  2. 学习率调度:实现动态学习率调整
  3. 早停技术:防止过拟合的实用技巧

扩展练习

  1. 其他数据集:在Fashion-MNIST等数据集上应用
  2. 模型部署:创建Web界面进行实时识别
  3. 迁移学习:使用预训练模型加速训练

🔍 常见问题解答

Q: 为什么神经网络需要多个隐藏层?

A: 多个隐藏层可以学习数据的层次化特征,浅层学习简单特征,深层学习复杂特征。

Q: 如何选择隐藏层的神经元数量?

A: 通常使用经验法则:输入层和输出层神经元数量的平均值,或通过实验选择。

Q: 什么是过拟合?如何防止?

A: 过拟合是模型在训练集上表现很好但在新数据上表现差。防止方法:正则化、Dropout、数据增强等。

Q: 为什么需要验证集?

A: 验证集用于监控模型在未见数据上的表现,帮助调整超参数和防止过拟合。

🚀 下一步学习

完成神经网络基础项目后,你可以:

  • 学习卷积神经网络(CNN)处理图像数据
  • 探索循环神经网络(RNN)处理序列数据
  • 了解自编码器进行无监督学习
  • 学习生成对抗网络(GAN)生成新数据

记住:深度学习的关键是理解数据流动、参数更新和模型评估的完整流程!

« 上一篇 3.3 KNN算法与图像分类 下一篇 » 4.2 卷积神经网络