第 10 部分:从数据中学习
9.1(原文10.1) 学习函数 F(x,v0):数据 v0 与权重 x
一个神经网络是 L 个层函数的复合:
vk=ReLU(Akvk−1+bk)for k=1,…,L
其中:
- v0 是输入数据
- Ak 是权重矩阵(可学习参数,统称为 x)
- bk 是偏置向量 (bias vectors)
- vL 是输出(预测值)
**ReLU (整流线性单元,Rectified Linear Unit):**非线性激活函数:
ReLU(y)=max(y,0)
ReLU 是一个分段线性的斜坡函数 (ramp function),这使得整个网络在权重和输入上都是分段线性的。这对训练至关重要:函数 F(x,v0) 是分段线性的。
学习函数: F(x,v0) 将权重 x 和输入 v0 映射为输出 vL。目标是找到使训练数据上的损失函数 (loss function) 最小化的权重 x。
9.2(原文10.2) 计算 F 的图像中平坦片段的个数
由于 ReLU 会产生折痕 (y=0 处的"折缝",crease),分段线性函数 F 将输入空间划分为许多线性区域 (linear regions)。
**计数公式:**对于 Rp 中的 N 个 ReLU 折缝:
r(N,p)=(0N)+(1N)+⋯+(pN)
递推公式:
r(N,p)=r(N−1,p)+r(N−1,p−1)
**增长性:**区域数量大约按 r(N,p)≈cNp 增长,这表明即使中等规模的网络也能表示极其复杂的分段线性函数。
**示例:**对于 R10 中的 N=100 个 ReLU 神经元,线性区域的个数约为 (10100)≈1.7×1013。
9.3(原文10.3) 最小化损失:随机梯度下降
**梯度下降 (Gradient Descent):**沿着最陡下降方向 (steepest descent) 迭代更新权重:
xk+1=xk−sk∇F(xk)
其中 sk 是学习率 (learning rate,步长),∇F(xk) 是损失在 xk 处的梯度。
损失函数:
- 平方损失 (Square loss): L=(ypred−ytrue)2
- 交叉熵损失 (Cross-entropy loss): L=−∑yilog(y^i) (用于分类任务)
**随机梯度下降 (SGD,Stochastic Gradient Descent):**不在整个数据集上计算梯度(成本高昂),而是每次使用一个随机样本:
xk+1=xk−sk∇Fik(xk)
其中 ik 是随机选取的索引。这样做每次迭代快得多,且随机性有助于逃离局部极小值。
**小批量随机梯度下降 (Minibatch SGD):**对 B 个随机样本组成的一小批 (batch) 求梯度平均:
xk+1=xk−sk⋅B1i∈batch∑∇Fi(xk)
典型的批量大小 (batch size):32、64、128、256。批量在梯度精度与计算效率之间取得平衡。
9.4(原文10.4) 锯齿状收敛缓慢:加入动量
当损失地形 (loss landscape) 呈狭长形状(高条件数,high condition number)时,标准的梯度下降会产生锯齿状振荡 (zigzag),导致收敛缓慢。
**动量法 (Momentum,或称重球法 Heavy Ball Method):**加上上一次更新量的一部分:
zk+1xk+1=βzk+∇F(xk)=xk−skzk+1
动量项 βzk (通常取 β≈0.9)平滑了轨迹,减小了振荡并加速了收敛。
**ADAM (自适应矩估计,Adaptive Moment Estimation):**将动量与每个参数的自适应学习率相结合:
- 维护过去梯度与梯度平方的指数衰减平均值
- 为每个参数单独调整学习率
- 有效处理稀疏梯度
- 通常是深度学习的默认优化器
9.5(原文10.5) 卷积神经网络:一维与二维CNN
卷积神经网络 (CNN) 使用通过滑动窗口应用的共享权重,使其具有平移不变性 (shift-invariant,或称平移等变性 translation equivariant)。
**一维卷积:**一个滤波器(卷积核,kernel/filter) w 在输入上滑动,在每个位置计算点积:
(f∗w)[i]=j∑f[i+j]w[j]
**二维卷积 (用于图像):**一个小型卷积核(如 3×3)在图像上滑动,在每个图块 (patch) 处计算相同的加权和:
(I∗K)[i,j]=p,q∑I[i+p,j+q]K[p,q]
关键性质:
- **权重共享:**同一组滤波权重在每一个位置使用(大幅减少参数数量)
- **局部性:**每个输出像素仅依赖一个局部邻域
- **层次性:**浅层检测边缘,深层检测形状和物体
**池化层 (Pooling Layers):**减少空间维度:
- **最大池化 (Max-pooling):**在每个 2×2(或其他尺寸)的块中取最大值
- **平均池化 (Average-pooling):**取平均值
其他组成部分:
- Softmax: softmax(z)i=ezi/∑jezj 将输出转换为概率
- **批量归一化 (Batch Normalization):**在每一层对激活值进行重新缩放和重新居中 (rescale and recenter),以维持稳定的梯度
- **残差网络 (ResNet):**跳跃连接 x→f(x)+x 通过缓解梯度消失问题 (vanishing gradient problem),使得训练非常深的网络成为可能
9.6(原文10.6) 反向传播:F 的链式法则
反向传播 (Backpropagation) 是神经网络中计算梯度的算法。它是以高效的反向模式 (reverse mode) 应用的链式法则。
**前向传播 (Forward Pass):**计算 v1,v2,…,vL 和损失 L。
**反向传播 (Backward Pass,反向模式):**从输出层反向逐层计算梯度,直至输入层:
∂vk−1∂L=∂vk∂L⋅∂vk−1∂vk
对于每一层 vk=ReLU(Akvk−1+bk),对 Ak 和 bk 的梯度通过局部导数计算:
∂Ak∂L∂bk∂L=∂vk∂L⋅vk−1T=∂vk∂L
自动求导为何高效:前向传播花费一次函数求值。反向传播在大致等同于一次前向传播的时间内计算出所有偏导数——相比通过有限差分法对一个有 n 个参数的函数进行 O(n) 次前向传播,这是巨大的提升。
核心洞察:永远不要构造完整的雅可比矩阵(其规模将是巨大的)。取而代之的是,将梯度信息沿着计算图反向传播,同时存储并复用中间结果。