Lecture 1:预备知识
408 学习笔记:Lecture 1:预备知识。保留原有知识内容、公式与图示;有对应原件时提供查看和下载入口。
本页目录
描述:本节从标准神经网络、CNN 与 RNN 的适用场景出发,建立二分类和逻辑回归的数学记号,推导交叉熵损失、梯度下降、计算图与反向传播,最后用向量化一次处理 $m$ 个训练样本。
1.1 学习资源
源课件给出的配套资源:
- 视频课程:跟李沐学 AI。
- 参考书:《动手学深度学习》2.0。
1.2 神经网络类型
1.2.1 标准神经网络
标准神经网络通常指全连接前馈网络:相邻层的神经元彼此连接,信息从输入层经隐藏层流向输出层。
- 适合处理已经表示成固定长度向量的表格或一般特征数据。
- 每个全连接层执行仿射变换,再配合非线性激活函数。
- 当输入维度很大时,全连接参数量可能迅速增长。
1.2.2 卷积神经网络
卷积神经网络(Convolutional Neural Network,CNN)通过局部连接和权重共享提取空间特征。
- 典型应用是图像分类、目标检测和语义分割。
- 卷积层逐步把像素转换为边缘、纹理、局部结构和高层语义特征。
1.2.3 循环神经网络
循环神经网络(Recurrent Neural Network,RNN)在时间步之间传递隐藏状态。
- 适合文本、语音、时间序列等有顺序的数据。
- LSTM、GRU 通过门控机制改善基础 RNN 对长期依赖的建模能力。
1.2.4 深度学习为什么发展迅速
源课件曲线表达的核心关系是:
- 数据量较小时,传统机器学习、小型神经网络和大型神经网络的性能差距可能不明显,此时特征工程和归纳偏好很重要。
- 数据量增加后,传统方法和小模型更早遇到性能平台;更大的神经网络通常仍能从更多数据中受益。
- 在数据、算力和优化方法共同支持下,大模型往往能达到更高的性能上限。
这是一种经验趋势,不是“网络越大、数据越多就一定更好”的无条件定律。模型容量还要与数据质量、任务难度、正则化、计算预算和优化能力相匹配。
1.3 二分类的数学记号
1.3.1 单个样本
输入特征:
$$ \boldsymbol{x}\in\mathbb R^{n_x}. $$
二分类标签:
$$ y\in{0,1}. $$
1.3.2 训练集
包含 $m$ 个样本的训练集:
$$ \mathcal D
\left{ (\boldsymbol{x}^{(1)},y^{(1)}), (\boldsymbol{x}^{(2)},y^{(2)}), \ldots, (\boldsymbol{x}^{(m)},y^{(m)}) \right}. $$
- 上标括号 $(i)$ 表示第 $i$ 个样本,不是幂。
- 源课件把第二个输入误写成 $\boldsymbol{x}^{(1)}$,应为 $\boldsymbol{x}^{(2)}$。
把输入按列拼接:
$$ X= \begin{bmatrix} | & | & & |\ \boldsymbol{x}^{(1)} & \boldsymbol{x}^{(2)} & \cdots & \boldsymbol{x}^{(m)}\ | & | & & | \end{bmatrix} \in\mathbb R^{n_x\times m}. $$
把标签写成行向量:
$$ Y= \begin{bmatrix} y^{(1)} & y^{(2)} & \cdots & y^{(m)} \end{bmatrix} \in\mathbb R^{1\times m}. $$
1.4 逻辑回归
1.4.1 从线性输出到概率
若直接使用线性模型:
$$ z=\boldsymbol{w}^{\mathrm T}\boldsymbol{x}+b, $$
则 $z$ 可取任意实数,不能直接解释为二分类概率。
逻辑回归使用 Sigmoid:
$$ \sigma(z)=\frac{1}{1+e^{-z}}, $$
得到:
$$ \hat y
a
\sigma(\boldsymbol{w}^{\mathrm T}\boldsymbol{x}+b) \approx P(y=1\mid\boldsymbol{x}). $$
其中:
$$ \boldsymbol{w}\in\mathbb R^{n_x}, \qquad b\in\mathbb R. $$
把 $\boldsymbol{w}$ 和 $b$ 保持为独立参数,可使表达和实现更清晰;也可以把偏置合并进增广特征,但本节不采用这种写法。
1.4.2 分类决策
常见阈值规则为:
$$ \hat c= \begin{cases} 1, & a\geq0.5,\ 0, & a<0.5. \end{cases} $$
阈值不一定固定为 $0.5$;类别不平衡或错分代价不同的任务可根据验证集调整。
1.5 逻辑回归损失与代价函数
1.5.1 为什么不直接使用平方误差
平方误差可写为:
$$ L_{\mathrm{MSE}}(a,y)=\frac{1}{2}(a-y)^2. $$
对“线性输出经过 Sigmoid”的逻辑回归,平方误差关于参数通常不是理想的凸目标,梯度还可能在 Sigmoid 饱和区变小。二元交叉熵与 Bernoulli 最大似然对应,具有更合适的优化性质。
1.5.2 单样本二元交叉熵
$$ L(a,y)
-\left[ y\log a+(1-y)\log(1-a) \right]. $$
当 $y=1$:
$$ L(a,1)=-\log a, $$
最小化损失会推动 $a\rightarrow1$。
当 $y=0$:
$$ L(a,0)=-\log(1-a), $$
最小化损失会推动 $a\rightarrow0$。
- 源课件公式中的
log(i-y_hat)是排版/OCR 错误,应为 $\log(1-\hat y)$。
1.5.3 全训练集代价函数
对 $m$ 个样本取平均:
$$ J(\boldsymbol{w},b)
\frac{1}{m} \sum_{i=1}^{m} L(a^{(i)},y^{(i)}), $$
即:
$$ J(\boldsymbol{w},b)
-\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)}\log a^{(i)} +(1-y^{(i)})\log(1-a^{(i)}) \right]. $$
对线性逻辑回归,该目标关于 $\boldsymbol{w},b$ 是凸函数;但多层神经网络的损失通常不是凸函数。
1.6 梯度下降
1.6.1 更新规则
从初始参数出发,沿目标函数下降最快的负梯度方向迭代:
$$ \boldsymbol{w} \leftarrow \boldsymbol{w}
\alpha \frac{\partial J}{\partial\boldsymbol{w}}, $$
$$ b \leftarrow b
\alpha \frac{\partial J}{\partial b}. $$
- $\alpha$ 是学习率,控制每次更新的步长。
- 学习率过小会收敛缓慢;过大可能振荡甚至发散。
- 对凸目标,合适条件下可收敛到全局最优;对非凸深度网络,一般只能寻求良好驻点。
- 求多变量函数时应使用偏导符号 $\partial$,不是普通导数符号 $d$。
1.6.2 一维直观解释
若当前位置导数为正,则:
$$ w\leftarrow w-\alpha J'(w) $$
会使 $w$ 减小;若导数为负,更新会使 $w$ 增大。因此在凸碗形曲线上,从左右两侧都会朝最低点移动。
1.7 计算图与反向传播
1.7.1 前向计算
对函数:
$$ J(a,b,c)=3(a+bc), $$
定义中间变量:
$$ u=bc, \qquad v=a+u, \qquad J=3v. $$
这形成计算链:
b ─┐
├─ u=bc ─┐
c ─┘ ├─ v=a+u ─ J=3v
a ──────────┘
课件示例取:
$$ a=5,\qquad b=3,\qquad c=2. $$
前向传播结果:
$$ u=6, \qquad v=11, \qquad J=33. $$
1.7.2 反向求导
从输出向输入应用链式法则:
$$ \frac{\partial J}{\partial v}=3, $$
$$ \frac{\partial J}{\partial a}
\frac{\partial J}{\partial v} \frac{\partial v}{\partial a} =3, $$
$$ \frac{\partial J}{\partial u}
\frac{\partial J}{\partial v} \frac{\partial v}{\partial u} =3, $$
$$ \frac{\partial J}{\partial b}
\frac{\partial J}{\partial u} \frac{\partial u}{\partial b} =3c=6, $$
$$ \frac{\partial J}{\partial c}
\frac{\partial J}{\partial u} \frac{\partial u}{\partial c} =3b=9. $$
计算图把复杂函数拆成局部运算;前向传播保存中间结果,反向传播把上游梯度与局部导数相乘。
1.8 逻辑回归的计算图
单个样本的前向链:
$$ z=\boldsymbol{w}^{\mathrm T}\boldsymbol{x}+b, $$
$$ a=\sigma(z), $$
$$ L(a,y)
-\left[y\log a+(1-y)\log(1-a)\right]. $$
计算图可概括为:
x,w,b -> z=w^T x+b -> a=sigmoid(z) -> L(a,y)
二元交叉熵与 Sigmoid 组合后,有简洁结果:
$$ dz
\frac{\partial L}{\partial z} =a-y. $$
因此:
$$ d\boldsymbol{w}
\frac{\partial L}{\partial\boldsymbol{w}}
\boldsymbol{x},dz, $$
$$ db
\frac{\partial L}{\partial b} =dz. $$
1.9 $m$ 个样本的梯度
因为总代价是样本损失的平均:
$$ J(\boldsymbol{w},b)
\frac{1}{m} \sum_{i=1}^{m} L(a^{(i)},y^{(i)}), $$
所以梯度也是各样本梯度的平均:
$$ \frac{\partial J}{\partial\boldsymbol{w}}
\frac{1}{m} \sum_{i=1}^{m} \frac{\partial L^{(i)}}{\partial\boldsymbol{w}}, $$
$$ \frac{\partial J}{\partial b}
\frac{1}{m} \sum_{i=1}^{m} \frac{\partial L^{(i)}}{\partial b}. $$
逐样本实现的逻辑是:
cost = 0.0
dw = np.zeros((n_x, 1))
db = 0.0
for i in range(m):
z_i = w.T @ X[:, i:i + 1] + b
a_i = sigmoid(z_i)
dz_i = a_i - Y[:, i:i + 1]
cost += loss(a_i, Y[:, i:i + 1])
dw += X[:, i:i + 1] * dz_i
db += float(dz_i)
cost /= m
dw /= m
db /= m
这能表达算法,但 Python 显式循环在大数据上效率较低。
1.10 向量化
1.10.1 基本思想
向量化把同类标量运算组合为数组运算,让底层高效数值库一次处理许多元素。
例如,对向量:
$$ \boldsymbol{v}
\begin{bmatrix} v_1\ v_2\ \vdots\ v_n \end{bmatrix}, $$
逐元素指数可直接写为:
u = np.exp(v)
这等价于:
$$ \boldsymbol{u}
\begin{bmatrix} e^{v_1}\ e^{v_2}\ \vdots\ e^{v_n} \end{bmatrix}. $$
向量化主要消除对样本和特征的低效 Python 循环;训练轮次、批次等高层循环仍然可能存在。
1.10.2 前向传播向量化
对所有样本:
$$ Z
\begin{bmatrix} z^{(1)} & z^{(2)} & \cdots & z^{(m)} \end{bmatrix}
\boldsymbol{w}^{\mathrm T}X+b. $$
形状:
| 变量 | 形状 |
|---|---|
| $X$ | $(n_x,m)$ |
| $\boldsymbol{w}$ | $(n_x,1)$ |
| $\boldsymbol{w}^{\mathrm T}X$ | $(1,m)$ |
| $b$ | 标量,广播到 $(1,m)$ |
| $Z,A,Y,dZ$ | $(1,m)$ |
NumPy:
Z = np.dot(w.T, X) + b
A = sigmoid(Z)
1.10.3 反向传播向量化
把所有样本的误差信号拼接:
$$ dZ=A-Y. $$
权重梯度:
$$ d\boldsymbol{w}
\frac{1}{m}X(dZ)^{\mathrm T} \in\mathbb R^{n_x\times1}. $$
偏置梯度:
$$ db
\frac{1}{m} \sum_{i=1}^{m}dZ^{(i)}. $$
NumPy:
dZ = A - Y
dw = np.dot(X, dZ.T) / m
db = np.sum(dZ) / m
- 源课件的
np.sin(dz)是笔误,应为np.sum(dZ)。 - 源课件的
np.zeros((n-x),1)也是排版错误;正确形状为np.zeros((n_x, 1))。 - $A$、$Y$ 应包含 $m$ 个样本,不是 $n$ 个样本。
1.11 一次完整的向量化更新
import numpy as np
def sigmoid(z):
return 1.0 / (1.0 + np.exp(-z))
def logistic_step(X, Y, w, b, learning_rate):
m = X.shape[1]
# 前向传播
Z = np.dot(w.T, X) + b
A = sigmoid(Z)
# 数值稳定的平均交叉熵
eps = 1e-12
A_safe = np.clip(A, eps, 1.0 - eps)
cost = -np.mean(
Y * np.log(A_safe)
+ (1.0 - Y) * np.log(1.0 - A_safe)
)
# 反向传播
dZ = A - Y
dw = np.dot(X, dZ.T) / m
db = np.sum(dZ) / m
# 参数更新
w = w - learning_rate * dw
b = b - learning_rate * db
return w, b, cost, dw, db
维度检查:
$$ X:(n_x,m), \quad Y:(1,m), \quad w:(n_x,1), \quad b:\text{scalar}. $$
输出的 dw 与 w 同形,db 为标量,更新才能正确进行。
1.12 易错点
- 样本上标 $(i)$ 是样本编号;训练集应为 $(\boldsymbol{x}^{(i)},y^{(i)})$ 配对。
- $X$ 按列存样本时形状是 $(n_x,m)$,$Y$ 是 $(1,m)$。
- 逻辑回归输出 $a=\sigma(z)$ 可解释为 $P(y=1\mid x)$,线性分数 $z$ 本身不是概率。
- 二元交叉熵第二项是 $(1-y)\log(1-a)$。
- 线性逻辑回归的交叉熵目标是凸的;深层神经网络目标通常不是凸的。
- 梯度下降使用偏导数;学习率过大可能越过最低点并发散。
- 反向传播的核心是链式法则,必须把上游梯度乘以局部导数。
- Sigmoid 与二元交叉熵组合后,单样本有 $dz=a-y$。
- 对 $m$ 个样本,梯度要取平均,不能只累加不除以 $m$。
dw的正确向量化公式是 $X(dZ)^T/m$,形状必须与 $w$ 相同。- 偏置梯度使用
np.sum(dZ)/m,不是np.sin(dZ)。 - NumPy 的标量 $b$ 会广播到 $(1,m)$;广播方便,但仍应主动核对形状,避免静默错误。
相关知识
- 科目导航:复试常考科目导航
- 阅读顺序:上一篇:PyTorch 总结 · 下一篇:神经网络与后向传播
- 关联专题:线性模型与逻辑回归
1.13 本节复盘
- 全连接网络处理一般向量特征,CNN 擅长空间数据,RNN 及其门控变体适合序列数据。
- 深度学习的性能上限通常随有效数据、模型容量和算力提高,但三者必须合理匹配。
- 二分类样本写为 $x\in\mathbb R^{n_x}$、$y\in{0,1}$;按列组成 $X\in\mathbb R^{n_x\times m}$。
- 逻辑回归通过 $a=\sigma(w^Tx+b)$ 输出类别 1 的概率。
- 二元交叉熵来自 Bernoulli 似然,训练集代价是各样本损失的平均。
- 梯度下降沿负梯度方向更新,学习率决定步长。
- 计算图把复杂函数拆成局部运算,反向传播通过链式法则逐层传递梯度。
- 逻辑回归有 $dZ=A-Y$、$dw=X(dZ)^T/m$、$db=\sum dZ/m$。
- 向量化能一次处理全部样本,既减少显式循环,也让维度关系更清晰。