17-1 神经网络基础:逻辑回归与激活函数
📌 一、 课程导入(8 分钟)
主题:从线性回归到神经网络——缺失的那一环
线性回归(第 8 章)解决了连续数值预测问题:给定输入特征 \( x \),模型输出 \( \hat{y} = w^T x + b \),通过最小化均方误差拟合数据。
但现实世界的问题往往不止于此:
| 问题类型 | 示例 | 输出形式 | 能否用线性回归? |
|---|---|---|---|
| 房价预测 | 预测房屋售价 | 连续数值(如 200 万) | ✅ 适用 |
| 邮件分类 | 判断邮件是否为垃圾邮件 | 是/否(二分类) | ❌ 不适用 |
| 手写数字识别 | 识别图片中是 0-9 哪个数字 | 10 个类别(多分类) | ❌ 不适用 |
分类问题要求输出的是离散的类别标签,而非连续的数值。线性回归无法直接处理分类任务。
在进入完整的神经网络之前,需要先解决一个更基础的问题:如何使用线性模型做二分类? 逻辑回归提供了答案。它只包含一个神经元,是神经网络的最简形态。理解逻辑回归,等于理解了神经网络的一半。
本课路径:
- 👨🏫 教师活动:以邮件分类为例,引导学生思考“线性回归能否输出‘是/否’?”;回顾第 8 章波士顿房价预测的任务形式;给出本课结构图。
- 🧑🎓 学生活动:回忆线性回归的输出形式与损失函数;思考二分类问题的需求与输出约束。
建立课程间的联系,让学生明确本课在整个知识体系中的位置——线性模型到神经网络的关键过渡。
📖 二、 解决问题过程(一):逻辑回归——神经元的雏形(35 分钟)
2.1 从线性回归到逻辑回归
核心问题:线性回归的输出 \( z = w^T x + b \) 取值范围为 \( (-\infty, +\infty) \),无法直接作为二分类(0 或 1)的预测结果。
解决方案:在线性输出后加一层“映射”,将任意实数压缩到 \( (0, 1) \) 区间,作为正类的概率。
2.2 Sigmoid 函数(Logistic 函数)
\[ \sigma(z) = \frac{1}{1 + e^{-z}} \]数学性质:
- 值域:\( (0, 1) \)
- 对称性:\( \sigma(-z) = 1 - \sigma(z) \)
- 单调递增
- 导数表达式:\( \sigma'(z) = \sigma(z) \cdot (1 - \sigma(z)) \)(该性质在反向传播中简化计算)
逻辑回归的模型形式:
\[ \hat{y} = P(y = 1 | x) = \sigma(w^T x + b) = \frac{1}{1 + e^{-(w^T x + b)}} \]预测规则:
\[ \hat{y} \geq 0.5 \Rightarrow \text{预测为类别 1} \]\[ \hat{y} < 0.5 \Rightarrow \text{预测为类别 0} \]
2.3 决策边界
\( w^T x + b = 0 \) 是逻辑回归的决策边界。在二维特征空间中,该边界是一条直线;在更高维空间中,是一个超平面。
💡 直觉理解:逻辑回归本质上仍是线性分类器——决策边界是线性的。若数据线性不可分,逻辑回归无法正确分类。
2.4 逻辑回归的损失函数
为什么不能用均方误差(MSE)?
对于逻辑回归,损失函数 \( L(\hat{y}, y) = \frac{1}{2}(\hat{y} - y)^2 \) 关于参数 \( w \) 的梯度表达式中包含因子 \( \sigma'(z) \)。当预测接近 0 或 1 时,\( \sigma'(z) \approx 0 \),梯度趋近于零,模型无法有效更新参数(梯度消失)。
二元交叉熵损失(Binary Cross-Entropy Loss):
\[ L(\hat{y}, y) = -\left[ y \cdot \log(\hat{y}) + (1 - y) \cdot \log(1 - \hat{y}) \right] \]直观理解:
- 当真实标签 \( y = 1 \) 时,损失 \( = -\log(\hat{y}) \):预测概率越接近 1,损失越接近 0;预测越接近 0,损失趋向无穷。
- 当真实标签 \( y = 0 \) 时,损失 \( = -\log(1 - \hat{y}) \):预测概率越接近 0,损失越接近 0;预测越接近 1,损失趋向无穷。
批量的平均损失:
\[ J(w, b) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \cdot \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \cdot \log(1 - \hat{y}^{(i)}) \right] \]其中 \( m \) 为样本数。
2.5 参数学习:梯度下降
梯度(偏导数):
\[ \frac{\partial J}{\partial w_j} = \frac{1}{m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)}) x_j^{(i)} \]\[ \frac{\partial J}{\partial b} = \frac{1}{m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)}) \]参数更新规则(以 \( w_j \) 为例):
\[ w_j := w_j - \alpha \cdot \frac{\partial J}{\partial w_j} \]对比线性回归的梯度:
| 模型 | 输出 | 损失函数 | 梯度表达式 |
|---|---|---|---|
| 线性回归 | \( \hat{y} = w^T x + b \) | MSE | \( \frac{1}{m} \sum (\hat{y} - y) x \) |
| 逻辑回归 | \( \hat{y} = \sigma(w^T x + b) \) | Cross-Entropy | \( \frac{1}{m} \sum (\hat{y} - y) x \) |
观察:梯度表达式在形式上完全一致,区别仅在于 \( \hat{y} \) 的计算方式不同。这是有意设计的,使得两种模型的代码实现几乎可以复用。
- 👨🏫 教师活动:在黑板逐步推导 Sigmoid 导数公式;对比 MSE 与 Cross-Entropy 在逻辑回归中的梯度差异,解释交叉熵的必要性;写出梯度下降参数更新公式。
- 🧑🎓 学生活动:跟随推导过程在笔记本上记录;完成数学推理;思考“为什么同样形式的梯度可以用于两种不同模型”。
逻辑回归是理解神经网络的基础,其推导过程体现了“线性变换 + 非线性激活 + 损失函数”这一神经网络核心范式的全部要素。强化对梯度表达式的理解,为后续 BP 算法建立直观基础。
📖 三、 解决问题过程(二):激活函数——非线性的来源(25 分钟)
3.1 为什么需要激活函数?
问题:若神经网络中每个神经元都仅做线性变换 \( z = w^T x + b \),那么无论叠加多少层,整体仍是一个线性函数:
\[ z^{(2)} = W_2^T (W_1^T x + b_1) + b_2 = (W_2^T W_1^T) x + (W_2^T b_1 + b_2) = W'^T x + b' \]结论:没有非线性激活函数的多层网络等价于单层线性模型,无法拟合复杂函数。
激活函数的作用:
- 引入非线性,使神经网络能够逼近任意复杂函数(通用近似定理)
- 将神经元输出映射到特定范围(如 \( (0,1) \)、\( (-1,1) \)、\( [0, +\infty) \) 等)
3.2 常见激活函数
(1)Sigmoid 函数
\[ \sigma(x) = \frac{1}{1 + e^{-x}} \]| 属性 | 说明 |
|---|---|
| 值域 | \( (0, 1) \) |
| 导数 | \( \sigma'(x) = \sigma(x)(1 - \sigma(x)) \),最大值 0.25 |
| 特点 | 可解释为概率;饱和区梯度极小 |
| 适用场景 | 输出层(二分类) |
| 主要缺陷 | 饱和区梯度消失;输出非零中心(后层输入全为正) |
(2)tanh 函数
\[ \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} = 2\sigma(2x) - 1 \]| 属性 | 说明 |
|---|---|
| 值域 | \( (-1, 1) \) |
| 导数 | \( \tanh'(x) = 1 - \tanh^2(x) \),最大值 1 |
| 特点 | 零中心,实际表现通常优于 Sigmoid |
| 主要缺陷 | 仍有饱和区梯度消失问题 |
(3)ReLU(Rectified Linear Unit)
\[ \text{ReLU}(x) = \max(0, x) \]| 属性 | 说明 |
|---|---|
| 值域 | \( [0, +\infty) \) |
| 导数 | \( x > 0 \) 时为 1,\( x < 0 \) 时为 0,\( x = 0 \) 处不可导(次梯度取 0) |
| 特点 | 计算简单;正区间梯度恒为 1,缓解梯度消失 |
| 适用场景 | 隐藏层默认选择 |
| 主要缺陷 | 负区间输出为 0,可能导致“神经元死亡” |
(4)Leaky ReLU
\[ \text{LeakyReLU}(x) = \max(\alpha x, x), \quad \alpha \text{ 为小常数(如 0.01)} \]缓解 ReLU 在负区间的神经元死亡问题,负区间保留一个较小的梯度。
3.3 激活函数选择原则
| 层的位置 | 推荐激活函数 | 理由 |
|---|---|---|
| 隐藏层 | ReLU(首选) | 计算快、缓解梯度消失 |
| 输出层(二分类) | Sigmoid | 输出可解释为概率 |
| 输出层(多分类) | Softmax | 输出各类别概率,和为 1 |
| 输出层(回归) | 无(线性激活) | 输出无范围限制 |
- 👨🏫 教师活动:在黑板上绘制四种激活函数曲线,标注关键性质;用叠加两层线性变换的数学推导说明激活函数的必要性;讲解每种激活函数的导数与特性。
- 🧑🎓 学生活动:在笔记中手绘激活函数曲线,标注值域与关键点;思考“为什么 ReLU 在正区间梯度恒为 1 就能缓解梯度消失”。
激活函数是神经网络非线性能力的来源。通过系统的函数对比与数学分析,帮助学生建立科学的函数选择框架。
✍️ 四、 解决问题过程(三):代码实践与课堂练习(20 分钟)
4.1 激活函数可视化
4.2 逻辑回归从零实现(代码框架)
- 👨🏫 教师活动:运行激活函数可视化代码,展示四种函数曲线形态;运行逻辑回归代码,展示训练过程;逐段解释代码与数学公式的对应关系。
- 🧑🎓 学生活动:运行并理解激活函数可视化代码;在 Jupyter Notebook 中复现逻辑回归实现并完成课堂练习。
将抽象的数学公式转化为可运行的代码,帮助学生建立“数学推导 → 代码实现 → 实验验证”的完整闭环思维。
✍️ 五、 课堂练习与巩固(10 分钟)
📝 六、 课堂小结(7 分钟)
flowchart LR
root["17-1 神经网络基础:逻辑回归与激活函数"]
subgraph C1["📐 逻辑回归"]
direction TB
A1["模型: ŷ = σ(wᵀx + b)"]
A2["Sigmoid: 实数 → (0,1) 概率映射"]
A3["决策边界: wᵀx + b = 0"]
end
subgraph C2["📉 损失函数与梯度"]
direction TB
B1["交叉熵损失: 惩罚错误预测"]
B2["梯度: ∂J/∂w = (1/m)∑(ŷ-y)x"]
B3["与线性回归梯度形式一致"]
end
subgraph C3["⚡ 激活函数"]
direction TB
C3_1["Sigmoid: (0,1) 饱和区梯度消失"]
C3_2["Tanh: (-1,1) 零中心"]
C3_3["ReLU: max(0,x) 正区间恒梯度"]
C3_4["Leaky ReLU: 缓解神经元死亡"]
end
subgraph C4["💻 代码实现"]
direction TB
D1["激活函数可视化"]
D2["LogisticRegression 从零实现"]
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
✏️ 随堂检测与互动练习
📮 七、 课后作业与拓展
📋 八、 板书设计
🔤 本课用到的单词
| 单词 | 发音(美式) | 解释 |
|---|---|---|
| Logistic Regression | /ləˈdʒɪstɪk rɪˈɡreʃən/ | 逻辑回归,用于二分类的线性分类模型 |
| Sigmoid | /ˈsɪɡmɔɪd/ | S 型函数,将实数映射到 (0,1) 区间 |
| Activation Function | /ˌæktɪˈveɪʃən ˈfʌŋkʃən/ | 激活函数,向神经网络中引入非线性 |
| Decision Boundary | /dɪˈsɪʒən ˈbaʊndəri/ | 决策边界,分类器区分不同类别的分界面 |
| Binary Cross-Entropy | /ˈbaɪnəri krɔːs ˈentrəpi/ | 二元交叉熵,二分类任务的常用损失函数 |
| Gradient Descent | /ˈɡreɪdiənt dɪˈsent/ | 梯度下降,通过梯度反向更新参数的优化算法 |
| Logit | /ˈloʊdʒɪt/ | 对数几率,\( \log(\frac{p}{1-p}) \),逻辑回归的线性部分 |
| ReLU | /ˈriːluː/ | Rectified Linear Unit,修正线性单元,最常用的隐藏层激活函数 |
| Tanh | /tæntʃ/ | 双曲正切函数,值域为 (-1,1) 的激活函数 |
| Leaky ReLU | /ˈliːki ˈriːluː/ | 带泄露的 ReLU,在负区间保留小梯度防止神经元死亡 |
| Neuron | /ˈnʊrɑːn/ | 神经元,神经网络中的基本计算单元 |
| Vanishing Gradient | /ˈvænɪʃɪŋ ˈɡreɪdiənt/ | 梯度消失,深层网络中梯度逐层衰减为 0 的问题 |
| Saturation | /ˌsætʃəˈreɪʃən/ | 饱和,函数在输入较大时梯度趋近于零的区域 |
| Generalization | /ˌdʒenərəlaɪˈzeɪʃən/ | 泛化,模型在未见数据上的表现能力 |
| Hyperparameter | /ˌhaɪpərˈpærəmɪtər/ | 超参数,需在训练前设定的参数(如学习率) |