17-2 神经网络的表示与基础任务
📌 一、 课程导入(5 分钟)
主题:从单个神经元到神经网络
第 17-1 课已经学习了逻辑回归——一个包含单个神经元的模型:
\[ \hat{y} = \sigma(w^T x + b) \]该模型具有以下特征:
- 输入特征直接连接到输出
- 无中间层(隐藏层)
- 表达能力受限于线性决策边界
现实问题的复杂度远超线性可分范畴。以下任务无法用单神经元解决:
| 任务 | 数据形态 | 单神经元能否解决? |
|---|---|---|
| 预测房价(波士顿) | 13 个特征 → 1 个连续值 | ✅ 可解决(线性回归) |
| 判断垃圾邮件 | 词频向量 → 二分类 | 可解决(逻辑回归) |
| 手写数字识别(MNIST) | 784 像素 → 10 类别 | ❌ 线性模型准确率 ~70% |
| 图像分类(CIFAR-10) | 3072 像素 → 10 类别 | ❌ 线性模型准确率 ~30% |
核心问题:如何提升模型的表达能力?
解决方案:在输入与输出之间插入多个神经元,形成“隐藏层”——这就是神经网络。
本课路径:
- 👨🏫 教师活动:回顾单神经元逻辑回归的局限性;展示 MNIST 手写数字图片,说明线性分类器的不足;给出本课结构图。
- 🧑🎓 学生活动:回顾逻辑回归的模型形式;观察手写数字的变体,思考为什么需要更复杂的模型。
从已知的单神经元过渡到多层网络,建立“复杂任务需要多层抽象”的直觉;通过具体数据集的准确率对比,说明模型表达能力与任务复杂度的匹配关系。
📖 二、 解决问题过程(一):神经网络的表示(25 分钟)
2.1 网络结构的三层视图
一个典型的前馈神经网络包含三层:
- 输入层:接收原始数据,节点数 = 特征维度。不进行计算,仅做数据传递。
- 隐藏层:进行特征变换与抽象。深度网络可以包含多个隐藏层。
- 输出层:产生最终预测。结构取决于任务类型。
2.2 符号体系
统一的上标与下标:
| 符号 | 含义 | 示例 |
|---|---|---|
| \( x_i \) | 输入特征的第 \( i \) 个分量 | \( x_1 \) 表示房价数据中的房间数 |
| \( a^{[l]}_j \) | 第 \( l \) 层第 \( j \) 个神经元的激活值 | \( a^{[1]}_2 \) 表示隐藏层第 2 个神经元 |
| \( a^{[l]} \) | 第 \( l \) 层的激活值向量 | \( a^{[1]} = [a^{[1]}_1, a^{[1]}_2, \dots, a^{[1]}_{n_1}]^T \) |
| \( W^{[l]} \) | 第 \( l \) 层的权重矩阵 | 维度:\( n_l \times n_{l-1} \) |
| \( w^{[l]}_{j i} \) | 第 \( l \) 层第 \( j \) 个神经元的第 \( i \) 个权重 | 连接 \( a^{[l-1]}_i \to a^{[l]}_j \) |
| \( b^{[l]} \) | 第 \( l \) 层的偏置向量 | 维度:\( n_l \times 1 \) |
| \( z^{[l]} \) | 第 \( l \) 层的加权输入(线性部分) | \( z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]} \) |
| \( f^{[l]} \) | 第 \( l \) 层的激活函数 | 逐元素应用 |
| \( n_l \) | 第 \( l \) 层的神经元数量 | 超参数 |
2.3 维度推导示例(含隐藏层的网络)
以一个具体网络为例:
- 输入层:\( n_0 = 3 \)(3 个特征)
- 隐藏层:\( n_1 = 4 \)(4 个神经元)
- 输出层:\( n_2 = 1 \)(单输出,回归任务)
各层的参数维度:
| 层 | 权重矩阵 \( W^{[l]} \) | 偏置向量 \( b^{[l]} \) | 线性输出 \( z^{[l]} \) | 激活 \( a^{[l]} \) |
|---|---|---|---|---|
| 第 1 层(隐藏) | \( 4 \times 3 \) | \( 4 \times 1 \) | \( 4 \times 1 \) | \( 4 \times 1 \) |
| 第 2 层(输出) | \( 1 \times 4 \) | \( 1 \times 1 \) | \( 1 \times 1 \) | \( 1 \times 1 \) |
计算流程:
\[ z^{[1]} = W^{[1]} x + b^{[1]}, \quad a^{[1]} = f^{[1]}(z^{[1]}) \]\[ z^{[2]} = W^{[2]} a^{[1]} + b^{[2]}, \quad \hat{y} = a^{[2]} = f^{[2]}(z^{[2]}) \]2.4 通用前向传播的数学形式
对任意第 \( l \) 层(\( l = 1, 2, \dots, L \)):
\[ z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]} \]\[ a^{[l]} = f^{[l]}(z^{[l]}) \]其中 \( a^{[0]} = x \) 为输入特征。
2.5 单隐藏层网络的张量流图
flowchart LR
subgraph 输入层
x1["x₁"]
x2["x₂"]
x3["x₃"]
end
subgraph 隐藏层
h1["a₁¹"]
h2["a₂¹"]
h3["a₃¹"]
h4["a₄¹"]
end
subgraph 输出层
y["ŷ"]
end
x1 --> h1
x1 --> h2
x1 --> h3
x1 --> h4
x2 --> h1
x2 --> h2
x2 --> h3
x2 --> h4
x3 --> h1
x3 --> h2
x3 --> h3
x3 --> h4
h1 --> y
h2 --> y
h3 --> y
h4 --> y</pre>
说明:权重以矩阵形式组织,每个隐藏层神经元接收所有前层神经元的输入。
- 👨🏫 教师活动:在黑板上绘制三层网络结构图;标注各层参数矩阵的维度;用矩阵乘法展示前向传播过程;强调维度检查对于实现代码的重要性。
- 🧑🎓 学生活动:在笔记本中画出三层网络结构图并标注维度;针对给出的具体网络结构,手算 \( z^{[1]} \) 中各元素的表达式。
建立清晰的符号体系和维度感知是成功实现神经网络的先决条件。通过具体数字示例让学生掌握维度推导的方法,避免在实际编码中出现矩阵维度不匹配的错误。
📖 三、 解决问题过程(二):做回归的神经网络(20 分钟)
3.1 回归任务的网络配置
| 配置项 | 选择 | 理由 |
|---|---|---|
| 输出层神经元数 | \( 1 \) | 回归输出为单个连续值 |
| 输出层激活函数 | 无(线性激活)\( f(z) = z \) | 输出不限制取值范围 |
| 损失函数 | 均方误差(MSE) | 衡量预测值与真实值的距离 |
网络结构(以单隐藏层为例):
\[ z^{[1]} = W^{[1]} x + b^{[1]}, \quad a^{[1]} = \text{ReLU}(z^{[1]}) \]\[ z^{[2]} = W^{[2]} a^{[1]} + b^{[2]}, \quad \hat{y} = z^{[2]} \]3.2 损失函数
\[ J = \frac{1}{2m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)})^2 \]或等价地:
\[ J = \frac{1}{m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)})^2 \](两种写法在使用梯度下降时效果相同,常数因子可由学习率吸收)
3.3 与线性回归的对比
| 对比维度 | 线性回归 | 回归神经网络(含隐藏层) |
|---|---|---|
| 模型形式 | \( \hat{y} = w^T x + b \) | \( \hat{y} = W^{[2]} f(W^{[1]} x + b^{[1]}) + b^{[2]} \) |
| 参数数量 | \( n + 1 \) | \( (n \times h) + h + (h \times 1) + 1 \) |
| 表达能力 | 线性函数 | 可以逼近任意连续函数(通用近似定理) |
| 计算复杂度 | \( O(n) \) | \( O(n \cdot h + h) \) |
| 可解释性 | 高(权重直接表示特征贡献) | 低(隐藏层特征是黑箱) |
其中 \( n \) 为特征数,\( h \) 为隐藏层神经元数。
3.4 隐藏层的作用
隐藏层神经元学到的可以理解为特征的新的表示:
| 层的深度 | 特征抽象层次 | 示例 |
|---|---|---|
| 输入层 | 原始特征(像素值) | 图像中的每个像素 |
| 第一隐藏层 | 简单组合(边缘、纹理) | 检测局部对比度 |
| 更深隐藏层 | 复杂模式(形状、部件) | 检测眼睛、鼻子等 |
| 输出层 | 高层语义(类别) | “这是一只猫” |
信息从输入逐层向前流动,每个隐藏层都在构建更高层次的抽象。
- 👨🏫 教师活动:在黑板上写出回归神经网络的完整前向表达式;对比线性回归的参数数量和计算量;用图示解释隐藏层的“特征抽象”功能。
- 🧑🎓 学生活动:思考“如果隐藏层不使用激活函数,回归神经网络与线性回归有何区别”;记录通用近似定理的含义。
回归任务是理解神经网络输出的基础场景。通过与线性回归的系统对比,帮助学生看清“增加隐藏层”到底带来了什么本质变化——从线性到非线性的跃迁。
📖 四、 解决问题过程(三):做二分类的神经网络(20 分钟)
4.1 二分类任务的网络配置
| 配置项 | 选择 | 理由 |
|---|---|---|
| 输出层神经元数 | \( 1 \) | 二分类只需输出一个概率值 |
| 输出层激活函数 | Sigmoid | 输出 \( (0,1) \) 区间的概率 |
| 损失函数 | 二元交叉熵 | 概率输出的标准损失函数 |
网络结构(以单隐藏层为例):
\[ z^{[1]} = W^{[1]} x + b^{[1]}, \quad a^{[1]} = \text{ReLU}(z^{[1]}) \]\[ z^{[2]} = W^{[2]} a^{[1]} + b^{[2]}, \quad \hat{y} = \sigma(z^{[2]}) = \frac{1}{1 + e^{-z^{[2]}}} \]4.2 与单神经元逻辑回归的对比
| 对比维度 | 单神经元逻辑回归 | 含隐藏层的二分类神经网络 |
|---|---|---|
| 决策边界 | 始终为直线 | 可以是任意曲线(非线性) |
| 参数数量 | \( n + 1 \) | \( (n \times h) + h + (h \times 1) + 1 \) |
| 能否解决 XOR 问题 | ❌ 不能 | ✅ 可以 |
| 表达能力 | 受限 | 显著提升 |
XOR 问题的意义:XOR(异或)是线性不可分问题的经典代表。单神经元逻辑回归无法正确分类 XOR 数据,而含一个隐藏层的网络可以完美解决。这直观验证了引入隐藏层的必要性。
4.3 网络结构变化的影响:宽度(隐藏层神经元数)
固定层数(单隐藏层),改变隐藏层宽度 \( h \) 对模型的影响:
| \( h \) 值 | 参数量 | 表达容量 | 风险 |
|---|---|---|---|
| 过小(如 1) | 少 | 欠拟合 | 无法捕获数据模式 |
| 适中(如 32) | 适中 | 较好 | 一般表现最佳 |
| 过大(如 1024) | 大 | 过拟合 | 训练慢、泛化差 |
4.4 二分类神经网络的前向传播实现框架
- 👨🏫 教师活动:写出二分类神经网络的完整表达式;对比其与逻辑回归的异同;用 XOR 问题说明隐藏层的必要性;演示宽度变化对模型的影响。
- 🧑🎓 学生活动:记录 XOR 问题的真值表,思考为什么单神经元无法解决;对比二分类和回归网络的输出层差异。
二分类是神经网络最直观的应用场景。通过与第 17-1 课的单神经元逻辑回归对比,学生能清晰看到“增加隐藏层”对表达能力的提升,建立从简单模型到复杂模型的演进式理解。
✍️ 五、 代码实践与课堂练习(15 分钟)
5.1 前向传播实现练习
5.2 输出层配置对比可视化
- 👨🏫 教师活动:运行前向传播代码,展示各中间变量的维度变化;可视化输出层配置的对比。
- 🧑🎓 学生活动:在 Jupyter 中复现代码,修改隐藏层神经元数观察维度变化;完成课堂练习。
通过可执行的代码,将抽象的矩阵运算具象化。维度检查训练是编码实践中的重要排查技能。
✍️ 六、 课堂练习与巩固(10 分钟)
📝 七、 课堂小结(5 分钟)
flowchart TB
root["17-2 神经网络的表示与基础任务"]
subgraph C1["🏗️ 网络表示"]
direction TB
A1["输入层 → 隐藏层 → 输出层"]
A2["W[l]: n_l × n_{l-1}, b[l]: n_l × 1"]
A3["z[l] = W[l]a[l-1] + b[l], a[l] = f[l](z[l])"]
end
subgraph C2["📈 回归网络"]
direction TB
B1["输出层: 1 个神经元, 线性激活"]
B2["损失: MSE"]
B3["单层等价于线性回归"]
B4["多层可逼近任意连续函数"]
end
subgraph C3["📊 二分类网络"]
direction TB
C1["输出层: 1 个神经元, Sigmoid 激活"]
C2["损失: 二元交叉熵"]
C3["隐藏层使决策边界非线性化"]
C4["→ 可解决 XOR 问题"]
end
subgraph C4["⚙️ 宽度"]
direction TB
D1["隐藏层神经元数 h 为超参数"]
D2["太小: 欠拟合"]
D3["太大: 过拟合 + 训练慢"]
end
root --> C1
root --> C2
root --> C3
root --> C4
style root fill:#4b6cb7,stroke:#253b6e,color:#fff,stroke-width:2px
style C1 fill:#e3f2fd,stroke:#2196f3
style C2 fill:#fff3e0,stroke:#ff9800
style C3 fill:#e8f5e9,stroke:#4caf50
style C4 fill:#f3e5f5,stroke:#9c27b0
✏️ 随堂检测与互动练习
📮 八、 课后作业与拓展
📋 九、 板书设计
🔤 本课用到的单词
| 单词 | 发音(美式) | 解释 |
|---|---|---|
| Neural Network | /ˈnʊrəl ˈnetwɜːrk/ | 神经网络,由多层神经元组成的计算模型 |
| Hidden Layer | /ˈhɪdən ˈleɪər/ | 隐藏层,输入层与输出层之间的中间层 |
| Forward Propagation | /ˈfɔːrwərd ˌprɑːpəˈɡeɪʃən/ | 前向传播,信息从输入层向输出层逐层传递的过程 |
| Weight Matrix | /weɪt ˈmeɪtrɪks/ | 权重矩阵,存储相邻两层之间的连接权重 |
| Bias | /ˈbaɪəs/ | 偏置,每个神经元的偏移项 |
| Activation | /ˌæktɪˈveɪʃən/ | 激活值,神经元经过激活函数后的输出 |
| Width | /wɪdθ/ | 宽度,某一层神经元的数量 |
| Depth | /depθ/ | 深度,神经网络的层数 |
| Capacity | /kəˈpæsəti/ | 容量,模型能够学习复杂函数的能力 |
| Universal Approximation Theorem | /ˌjuːnɪˈvɜːrsl əˌprɑːksɪˈmeɪʃən ˈθiːərəm/ | 通用近似定理,证明神经网络可逼近任意连续函数 |
| XOR Problem | /ˈzɔːr ˈprɑːbləm/ | 异或问题,线性不可分问题的经典示例 |
| Underfitting | /ˌʌndərˈfɪtɪŋ/ | 欠拟合,模型未能充分学习训练数据的规律 |
| Overfitting | /ˌoʊvərˈfɪtɪŋ/ | 过拟合,模型过度拟合训练数据导致泛化能力下降 |
| Representation | /ˌreprɪzenˈteɪʃən/ | 表示,数据在网络内部各层的编码形态 |