← 返回学习笔记

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)$;广播方便,但仍应主动核对形状,避免静默错误。

相关知识

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$。
  • 向量化能一次处理全部样本,既减少显式循环,也让维度关系更清晰。