第4周:神经网络基础
课程简介
神经网络结构、前向传播、激活函数、非线性假设的必要性。
🎬 本课程视频:吴恩达机器学习 (2014) — 交互式学习笔记
一、非线性假设的必要性
1.1 为什么需要非线性模型
当特征数量很大时,使用包含多项式特征的逻辑回归会遇到严重问题。考虑一个包含 100 个特征的分类问题。如果我们想加入所有二次项特征——x₁²、x₁x₂、x₁x₃——二次项的数量大约是 100²/2 = 5000 个。如果包含三次项,特征数量会膨胀到约 170,000 个。
特征空间爆炸带来三个问题:
1. 过拟合:参数过多,模型自由度太大
2. 计算开销:训练和预测的计算量呈平方/立方增长
3. 数据需求:高维特征需要更多训练数据
尤其是在计算机视觉领域——一张 50x50 像素的灰度图就有 2500 个原始特征,加上二次项变成约 300 万个特征——这已经远远超出了典型训练集能支持的范围。
1.2 神经网络提供的解决方案
神经网络通过层次化的特征学习来解决这个问题。网络的前几层学习简单的低级特征(如边缘、角点),中间层将低级特征组合成中级特征(如形状、纹理),最后用高级特征来做分类。
这种层次化的方式让神经网络用相对少的参数学习极其复杂的非线性决策边界。
二、神经网络的模型表示
2.1 神经元模型
神经网络的基本单元是神经元——它模拟了生物神经元的工作方式。一个神经元接收多个输入信号,对它们进行加权求和,然后通过一个激活函数产生输出。
用数学语言描述:
$$\text{output} = g(\sum_{i=0}^{n} w_i x_i) = g(w^T x)$$
其中 g 是激活函数,w₀ 对应偏置项,x₀ = 1。
2.2 网络结构
一个神经网络由多个层组成:
- 输入层(Input Layer):接收原始特征数据
- 隐藏层(Hidden Layer):位于输入和输出之间的层
- 输出层(Output Layer):输出最终预测结果
每个神经元的计算可以看作是:先计算输入的加权和 z = wᵀx + b,再通过激活函数得到 a = g(z)。这个结构与逻辑回归的计算过程完全一致——每个神经元就是一个逻辑回归单元。
2.3 记号说明
Andrew Ng 课程中使用以下记号:
- a_i^{(j)}:第 j 层第 i 个神经元的激活值
- Θ^{(j)}:从第 j 层到第 j+1 层的权重矩阵
- Θ^{(j)}_{ki}:从第 j 层第 i 个单元到第 j+1 层第 k 个单元的权重
权重矩阵的维度:如果第 j 层有 s_j 个单元(不包括偏置),第 j+1 层有 s_{j+1} 个单元,则 Θ^{(j)} 的维度是 s_{j+1} × (s_j + 1)。
三、前向传播
3.1 前向传播的计算过程
前向传播(Forward Propagation)是信息从输入层经过隐藏层流向输出层的过程。以三层网络为例:
从输入层到隐藏层:
$$a_1^{(2)} = g(\Theta_{10}^{(1)} x_0 + \Theta_{11}^{(1)} x_1 + \Theta_{12}^{(1)} x_2 + \Theta_{13}^{(1)} x_3)$$
$$a_2^{(2)} = g(\Theta_{20}^{(1)} x_0 + \Theta_{21}^{(1)} x_1 + \Theta_{22}^{(1)} x_2 + \Theta_{23}^{(1)} x_3)$$
向量化形式:
$$z^{(2)} = \Theta^{(1)} \cdot a^{(1)}$$
$$a^{(2)} = g(z^{(2)})$$
从隐藏层到输出层:
$$z^{(3)} = \Theta^{(2)} \cdot a^{(2)}$$
$$a^{(3)} = h_\theta(x) = g(z^{(3)})$$
3.2 神经网络拟合逻辑运算
为了理解神经网络的能力,Andrew Ng 通过几个逻辑运算的例子来说明:
AND 运算:设置 Θ = [-30, 20, 20]
- x=[0,0] → g(-30) ≈ 0
- x=[1,1] → g(10) ≈ 1
OR 运算:设置 Θ = [-10, 20, 20]
NOT 运算:设置 Θ = [10, -20]
通过组合基本逻辑门——AND、OR、NOT——我们可以构建 XOR(异或)运算的神经网络。这正是神经网络强大之处的体现:多层结构可以实现单层无法实现的复杂函数。
XOR 神经网络实现:第一层学习 (x₁ AND x₂) 和 (NOT x₁ AND NOT x₂),第二层将它们 OR 起来,就得到了 XOR。
四、激活函数
4.1 为什么需要激活函数
如果每个神经元只做线性变换——即使有多个隐藏层——整个网络的输出仍然是输入的线性函数。数学上可以证明:多层线性网络的组合等价于单层线性网络。因此激活函数引入非线性是神经网络获得强大表达能力的关键。
| 激活函数 | 公式 | 输出范围 | 特点 |
|---|---|---|---|
| Sigmoid | 1/(1+e^{-z}) | (0, 1) | 适合二分类输出层,有梯度饱和问题 |
| Tanh | (e^z-e^{-z})/(e^z+e^{-z}) | (-1, 1) | 均值为零,收敛快于 Sigmoid |
| ReLU | max(0, z) | [0, +∞) | 计算简单,缓解梯度消失 |
| Leaky ReLU | max(0.01z, z) | (-∞, +∞) | 解决 ReLU 死区问题 |
在 2014 年的课程中,Andrew Ng 主要使用 Sigmoid 和 Tanh。ReLU 在之后的研究中被发现效果更好,成为当今深度学习的默认选择。
4.2 选择激活函数的指导原则
- 输出层(二分类):Sigmoid
- 输出层(多分类):Softmax
- 输出层(回归):线性激活
- 隐藏层:ReLU 是现代默认选择
五、多分类与 Softmax
对于 K 类分类问题(K ≥ 3),输出层使用 K 个神经元,每个神经元对应一个类别。Softmax 函数将输出向量转换为概率分布:
$$P(y = k | x; \theta) = \frac{e^{\Theta_k x}}{\sum_{j=1}^{K} e^{\Theta_j x}}$$
六、前向传播的实现
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def forward_propagation(X, theta1, theta2):
m = X.shape[0]
a1 = np.hstack([np.ones((m, 1)), X])
z2 = a1.dot(theta1.T)
a2 = sigmoid(z2)
a2 = np.hstack([np.ones((m, 1)), a2])
z3 = a2.dot(theta2.T)
a3 = sigmoid(z3)
return a1, a2, a3
第 4 周我们学习了神经网络的基本结构——输入层、隐藏层、输出层,以及信息如何在网络中进行前向传播。神经网络通过层次化的方式学习特征:前几层学习简单模式,后几层组合成复杂模式。这种能力使神经网络能够处理传统机器学习方法难以应对的高维非线性问题。但仅仅能前向传播还不够——我们还需要让网络能够学习,这就是第 5 周反向传播的内容。
神经网络的学习能力来源
神经网络的强大来源于三个关键因素:
1. 非线性激活函数:如果没有非线性激活函数,多层网络等价于单层线性网络
2. 层次化特征学习:每一层在前一层的基础上构建更抽象的表示
3. 大规模并行计算:通过向量化和 GPU 加速实现高效计算
激活函数的梯度性质
不同激活函数的梯度性质对训练有重要影响:
- Sigmoid:在 z 很大或很小时梯度接近 0(饱和区)→ 梯度消失
- Tanh:同样存在饱和区,但以 0 为中心 → 收敛比 Sigmoid 快
- ReLU:在 z > 0 时梯度恒为 1 → 缓解梯度消失;在 z < 0 时梯度为 0 → 可能导致神经元死亡
ReLU 的死亡问题是指:如果某个神经元的加权和为负数,ReLU 的输出为 0,梯度为 0——这个神经元就再也不会被激活了。解决方案是使用 Leaky ReLU 或 PReLU。
神经网络单元数的选择
隐藏层神经元数量的选择是一个重要的设计决策:
- 太少:模型容量不足,无法学习复杂模式
- 太多:计算开销大,容易过拟合
经验法则:
- 分类任务:从 (输入维度 + 输出维度) / 2 开始
- 回归任务:可以从更多神经元开始(因为输出是连续的)
- 逐步增加直到验证误差不再下降
通常 1-3 个隐藏层足以解决大多数问题。更深的网络需要更多的数据和正则化。
神经网络与生物神经元的对比
人工神经网络受到生物神经元的启发,但两者有显著差异:
- 生物神经元有复杂的电化学过程,人工神经元只是简单的加权和加非线性
- 生物神经网络有 860 亿个神经元和数万亿个连接,人工网络规模小得多
- 生物学习涉及突触可塑性等机制,人工学习主要是梯度下降
尽管如此,人工神经网络在特定任务上已经超越了人类水平的表现——尤其是在图像识别、语音识别等感知任务中。
前向传播的计算图视角
将前向传播看作一个计算图有助于理解反向传播:
输入 x → 线性变换(Θ¹, b¹) → 激活函数 → 线性变换(Θ², b²) → 激活函数 → 输出 ŷ → 损失函数 J
计算图中的每个节点对应一个计算步骤,边对应数据的流动。反向传播就是在计算图上应用链式法则——从输出端向输入端逐层计算梯度。这种计算图视角是现代深度学习框架(TensorFlow、PyTorch)的基础。
神经网络的表达能力
通用近似定理(Universal Approximation Theorem)指出:一个包含足够多隐藏神经元的单隐藏层前馈神经网络,可以以任意精度逼近任意连续函数。这个定理保证了神经网络在理论上的强大表达能力。
但通用近似定理有重要的实践限制:
1. 它只说明存在这样的网络,但没有告诉我们如何找到它
2. "足够多"的神经元在实践中可能非常巨大
3. 网络可能因过拟合而泛化能力差
4. 训练过程(反向传播)不保证找到最优的权重
因此,深度学习的成功不仅仅是理论上的——更是工程实践上的突破。深度网络(多层而非单宽层)被证明更有效地利用参数,而且更容易泛化。
神经网络的历史与发展
神经网络的发展历程经历了多次起伏:
1. 第一次热潮(1950-1960年代):感知机(Perceptron)的发明——单层神经网络
2. 第一次寒冬(1969年):Minsky 证明感知机无法解决 XOR 问题
3. 第二次热潮(1980年代):反向传播算法的提出——多层网络的学习成为可能
4. 第二次寒冬(1990年代):SVM 等更有效的算法兴起,神经网络被边缘化
5. 深度学习革命(2006-至今):Hinton 提出了深度信念网络的预训练方法,GPU 加速训练使深度网络变为现实
Andrew Ng 的 2014 年课程正好处于深度学习革命的前期——这个课程为无数学者提供了进入这个领域的敲门砖。
权重初始化策略详解
除了打破对称性,权重初始化还需要考虑梯度流动的稳定性:
Xavier 初始化(适用于 Sigmoid 和 Tanh):
Θ ~ U[-√(6/(n_in + n_out)), √(6/(n_in + n_out))]
He 初始化(适用于 ReLU):
Θ ~ N(0, √(2/n_in))
选择合适的初始化方法可以显著加快收敛速度,避免梯度消失或爆炸。
延伸阅读
- 📺 B 站播放列表:吴恩达机器学习 (2014) — 交互式学习笔记
- 📚 更多学习资源,请访问 deeplearning.ai 官网