核心问题:神经网络是如何"学习"的?
一句话回答:前向传播算损失,反向传播算梯度,梯度下降更新参数—— 循环往复,直到模型学会。
一、从生物神经元到人工神经元
1.1 生物神经元的启发
生物神经元接收多个树突传来的信号,在细胞体内整合,如果信号强度超过阈值,就通过轴突向其他神经元传递信号。
人工神经元模仿了这个机制:
输入:多个特征值(类比树突接收的信号)
加权求和:每个输入乘以一个权重,再加偏置(类比信号整合)
激活函数:判断是否"激活"以及激活的强度(类比阈值触发)
1.2 人工神经元的数学表达
一个神经元的计算分两步:
第一步:线性组合
第二步:非线性激活
其中 f 是激活函数,赋予神经网络非线性能力。
💡为什么需要激活函数?
如果没有激活函数,多层神经网络只是多个线性变换的叠加,最终仍然是线性变换 → 无法拟合复杂函数。激活函数引入了非线性,使得神经网络可以逼近任意函数(万能近似定理)。
二、神经网络的结构
2.1 三层结构
一个典型的多层感知机(MLP)由三层组成:
| 层 | 作用 | 特点 |
|---|---|---|
| 输入层 | 接收原始特征 | 不做计算,只传递数据;神经元数 = 特征维度 |
| 隐藏层 | 特征提取与变换 | 深度学习 = 多个隐藏层;层数越多,学习特征越抽象 |
| 输出层 | 输出最终预测 | 结构取决于任务类型 |
以 MNIST 手写数字识别为例:
输入层:784 个神经元(28×28 像素展平)
隐藏层:可设 128→64 等
输出层:10 个神经元(对应数字 0~9),使用 Softmax 输出概率分布
2.2 隐藏层的层次化特征学习
深度学习的核心优势:自动学习层次化特征
| 层数 | 学习的特征类型 |
|---|---|
| 浅层(第1~2层) | 边缘、颜色、纹理等低级特征 |
| 中层(第3~5层) | 形状、部件组合(如眼睛、鼻子) |
| 深层(第6层+) | 高层语义(如人脸、物体类别) |
传统机器学习需要人工设计特征,深度学习端到端地自动学习从原始数据到高级语义的映射。
三、激活函数详解
3.1 Sigmoid(S型函数)
| 属性 | 说明 |
|---|---|
| 输出范围 | (0, 1),可解释为概率 |
| 优点 | 平滑、可导、有概率意义 |
| ⚠️ 缺点 | 梯度消失:两端导数趋近于0,深层网络反向传播时梯度逐层衰减 |
| 适用场景 | 二分类输出层(配合交叉熵损失) |
3.2 ReLU(Rectified Linear Unit)—— 深度学习的默认选择
| 属性 | 说明 |
|---|---|
| 输出范围 | [0, +∞) |
| 优点 | 计算极快;缓解梯度消失;能让网络稀疏(部分神经元输出为0) |
| ⚠️ 缺点 | 神经元死亡:某些神经元可能永远输出0,梯度为0,再也无法激活 |
| 适用场景 | 隐藏层首选(绝大多数现代网络) |
3.3 Leaky ReLU
| 属性 | 说明 |
|---|---|
| 与ReLU的区别 | 负数部分有一个很小的斜率(如0.01),不会完全死亡 |
| 适用场景 | 担心ReLU死亡问题时使用 |
3.4 Softmax —— 多分类输出层的标配
| 属性 | 说明 |
|---|---|
| 输出范围 | (0, 1),且所有类别概率之和 = 1 |
| 作用 | 将 K 个实数转换为一个概率分布 |
| 适用场景 | 多分类输出层(K个类别) |
二分类特殊情况:输出层用 1 个神经元 + Sigmoid,或用 2 个神经元 + Softmax,两者等价。
3.5 激活函数选择指南
| 位置 | 推荐 | 原因 |
|---|---|---|
| 隐藏层 | ReLU(或Leaky ReLU) | 计算快,缓解梯度消失 |
| 二分类输出层 | Sigmoid | 输出可解释为概率 |
| 多分类输出层 | Softmax | 输出概率分布 |
| 回归输出层 | 无激活(线性) | 输出任意实数 |
四、前向传播 —— 数据如何流过网络
前向传播就是输入数据从输入层开始,逐层计算,最终得到输出的过程。
以一个 2 层网络为例:
最后计算损失(以二分类交叉熵为例):
前向传播的方向:输入 → 隐藏层 → 输出 → 损失
五、反向传播 —— 神经网络如何"学习"
5.1 核心思想
反向传播(Backpropagation)是神经网络训练的核心算法,本质就是链式法则。
步骤:
前向传播:计算损失
反向传播:从输出层开始,逐层计算损失函数对每个参数的梯度(偏导数)
梯度下降:用梯度更新参数,使损失减小
5.2 链式法则的直观理解
💡直觉:误差从输出层"反向流动"到每一层,每一层根据收到的误差信号计算自己参数的梯度。
5.3 梯度下降更新参数
5.4 优化器:从 SGD 到 Adam
| 优化器 | 特点 | 适用场景 |
|---|---|---|
| SGD(随机梯度下降) | 简单,但收敛慢,对学习率敏感 | 小规模数据 |
| SGD + 动量 | 加入历史梯度方向,加速收敛 | 中等规模 |
| Adam | 自适应学习率(每个参数独立调整),结合动量和RMSProp | 现代深度学习默认选择 |
Adam 的经验起点学习率:
lr = 0.001
六、PyTorch 实战:乳腺癌二分类(代码解读)
PPT中给出了完整的 PyTorch 代码,下面为新手做详细解读。
6.1 数据准备
from sklearn.datasets import load_breast_cancer from sklearn.preprocessing import StandardScaler cancer = load_breast_cancer() X, y = cancer.data, cancer.target # X: 30个特征, y: 0/1 X_scaled = StandardScaler().fit_transform(X) # 标准化(必须!) X_train, X_test, y_train, y_test = train_test_split(...)乳腺癌数据集:569 个样本,30 个特征,二分类(恶性/良性)
标准化:神经网络对输入量纲敏感,必须标准化
6.2 定义模型
class CancerMLP(nn.Module): def __init__(self): super().__init__() self.model = nn.Sequential( nn.Linear(30, 64), # 输入30维 → 隐藏层64维 nn.ReLU(), # ReLU激活 nn.Dropout(0.3), # 随机丢弃30%神经元(防过拟合) nn.Linear(64, 32), # 64 → 32 nn.ReLU(), nn.Linear(32, 1), # 32 → 1(输出) nn.Sigmoid() # 二分类概率输出 ) def forward(self, x): return self.model(x)结构图解:
输入(30) → 全连接(64) → ReLU → Dropout(0.3) → 全连接(32) → ReLU → 全连接(1) → Sigmoid → 输出概率
6.3 训练循环
for epoch in range(epochs): # 前向传播 preds = model(batch_x) loss = criterion(preds, batch_y) # 计算损失 # 反向传播 optimizer.zero_grad() # 清空上一轮梯度 loss.backward() # 计算梯度(反向传播!) optimizer.step() # 用梯度更新参数loss.backward():这是 PyTorch 自动执行反向传播的一行代码,背后完成了所有链式法则计算optimizer.step():用 Adam 优化器更新所有参数
6.4 输出示例
Epoch [10/50], Loss: 0.1234, Val Acc: 0.9737 Epoch [20/50], Loss: 0.0891, Val Acc: 0.9825 ... 乳腺癌 PyTorch MLP → Test Acc = 0.9825
一个 3 层 MLP 在乳腺癌数据集上可达到约 98% 的测试准确率。
七、深度学习 vs 传统机器学习
7.1 核心对比
| 对比维度 | 传统机器学习 | 深度学习 |
|---|---|---|
| 特征工程 | 需要人工构建特征 | 自动学习特征(端到端) |
| 数据量要求 | 小数据也可用(N < 10K) | 需要大数据(N > 100K) |
| 可解释性 | 高(决策树、线性模型可解释) | 低(黑盒模型) |
| 训练速度 | 快(秒~分钟) | 慢(小时~天,需GPU) |
| 部署成本 | 低 | 高(GPU推理) |
7.2 数据类型的适用性
| 数据类型 | 传统机器学习 | 深度学习 |
|---|---|---|
| 结构化数据(表格) | ✅首选(XGBoost/LightGBM) | ❌ 通常不如传统ML |
| 图像数据 | ❌ 特征工程繁琐 | ✅绝对优势(CNN) |
| 文本数据 | ❌ 需要大量预处理 | ✅绝对优势(RNN/Transformer) |
| 语音数据 | ❌ 效果差 | ✅绝对优势 |
7.3 选择建议
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 数据量 < 1万条,表格数据 | XGBoost / 随机森林 | 更快、更稳、更可解释 |
| 数据量 > 10万条,图像/文本 | 深度学习(CNN/Transformer) | 能利用大规模数据优势 |
| 数据量中等,图像/文本 | 迁移学习(预训练模型微调) | 用小数据也能用好模型 |
八、总结与展望
8.1 本章核心速记
| 概念 | 一句话解释 |
|---|---|
| 神经元 | |
| 激活函数 | 赋予网络非线性能力;隐藏层用ReLU,输出层按任务选Sigmoid/Softmax |
| 前向传播 | 输入 → 逐层计算 → 输出 → 损失 |
| 反向传播 | 链式法则从输出层往回算梯度 |
| 梯度下降 | |
| Adam | 自适应学习率优化器,现代深度学习的默认选择 |
8.2 深度学习的"学习"本质
深度学习的训练过程可以概括为三句话:
前向传播:数据流过网络,产生预测和损失
反向传播:用链式法则计算每个参数的梯度
梯度下降:用梯度更新参数,让损失下降
重复这三个步骤成千上万次,网络参数不断调整,最终学会从输入到输出的映射。
8.3 下一步学什么?
| 方向 | 简介 | 典型模型 |
|---|---|---|
| CNN(卷积神经网络) | 处理图像数据,利用局部感受野和权值共享 | ResNet、VGG、EfficientNet |
| RNN/LSTM(循环神经网络) | 处理序列数据(文本、时间序列) | LSTM、GRU |
| Transformer | 自注意力机制,NLP领域的革命 | BERT、GPT系列 |
| 生成模型 | 生成新数据(图像、文本) | GAN、VAE、扩散模型 |
8.4 给新手的建议
先理解原理,再写代码:弄懂前向传播、反向传播、梯度下降这三件事
从 MNIST 开始:手写数字识别是深度学习的"Hello World"
用 PyTorch 或 Keras:不要从零手写反向传播,用框架
结构化数据优先用 XGBoost:不是所有问题都要用深度学习
记住:更多数据 + 更多算力 ≠ 更好结果:数据质量、模型设计、超参数调优同样重要