Day 114 — 神经网络入门 · 图解
神经网络前向传播流程
输入层 隐藏层 输出层
(64维) (256维) (10维)
[x1] ─────┬──→ [h1] ──┬──→ [y1] ← 类别 0
[x2] ───┬─┼─→ [h2] ──┼─→ [y2] ← 类别 1
... │ │ ... │ ...
[x64] ──┼─┴─→ [h256] ─┴─→ [y10] ← 类别 9
│
全连接:每个输入与每个神经元相连
参数量:
第一层: 64 × 256 + 256 = 16,640 + 256 = 16,896
第二层: 256 × 10 + 10 = 2,560 + 10 = 2,570
总计: 19,466 个参数
训练循环五步
┌─────────────────────────────────────────────┐
│ 1. 前向传播 │
│ 输入 ──→ 模型 ──→ 预测值 │
└─────────────────┬───────────────────────────┘
│
┌─────────────────▼───────────────────────────┐
│ 2. 计算损失 │
│ loss = criterion(预测值, 真实值) │
└─────────────────┬───────────────────────────┘
│
┌─────────────────▼───────────────────────────┐
│ 3. 反向传播 │
│ loss.backward() ← 自动求导 │
└─────────────────┬───────────────────────────┘
│
┌─────────────────▼───────────────────────────┐
│ 4. 更新参数 │
│ optimizer.step() ← 根据梯度更新权重 │
└─────────────────┬───────────────────────────┘
│
┌─────────────────▼───────────────────────────┐
│ 5. 清空梯度 │
│ optimizer.zero_grad() ← 防止梯度累积 │
└─────────────────────────────────────────────┘
激活函数可视化(Mermaid)
graph LR
subgraph ReLU
A1[-5] -->|0| B1[0]
A2[-2] -->|0| B2[0]
A3[0] -->|0| B3[0]
A4[2] -->|2| B4[2]
A5[5] -->|5| B5[5]
end
subgraph Sigmoid
C1[-5] -->|0.007| D1[接近0]
C2[0] -->|0.5| D2[0.5]
C3[5] -->|0.993| D3[接近1]
end
subgraph Tanh
E1[-5] -->|接近-1| F1[~-1]
E2[0] -->|0| F2[0]
E3[5] -->|接近1| F3[~1]
end
graph LR
subgraph ReLU
A1[-5] -->|0| B1[0]
A2[-2] -->|0| B2[0]
A3[0] -->|0| B3[0]
A4[2] -->|2| B4[2]
A5[5] -->|5| B5[5]
end
subgraph Sigmoid
C1[-5] -->|0.007| D1[接近0]
C2[0] -->|0.5| D2[0.5]
C3[5] -->|0.993| D3[接近1]
end
subgraph Tanh
E1[-5] -->|接近-1| F1[~-1]
E2[0] -->|0| F2[0]
E3[5] -->|接近1| F3[~1]
end
交叉熵损失直觉
预测概率分布: [0.7, 0.2, 0.1] ← 类别 0 概率最高
真实标签 (one-hot): [1, 0, 0] ← 确实是类别 0
交叉熵 = -Σ(y_i × log(p_i))
= -(1×log(0.7) + 0×log(0.2) + 0×log(0.1))
= -log(0.7)
= 0.357 ← 损失较小,预测较准
如果预测为: [0.1, 0.1, 0.8] ← 错了!
交叉熵 = -log(0.1) = 2.303 ← 损失很大,预测很差