跳到主要内容

深度学习实战练习 (Deep Learning Exercises)

“神经网络的强大源于其层层递进的非线性变换。” —— 本专题聚焦神经网络底层机制、架构优化及大规模分布式训练原理,配套 C++ 算子级模拟。


🪜 练习阶梯与评价标准

等级难度目标核心考察点期望达成
Level A张量运算与 BP反向传播、激活函数、卷积计算理解梯度流动的物理本质
Level B模型设计与正则BN/LN 原理、Dropout、ResNet 结构具备解决梯度消失/爆炸能力
Level C架构创新与工程Transformer 缩放点积、分布式 SGD理解现代 LLM 底层设计逻辑

🎯 考点覆盖模型 (Knowledge Matrix)

知识模块核心考点关联习题推荐等级
反向传播自动微分原理、梯度链式法则矩阵化练习 1, 6Level A
卷积神经网络感受野计算、参数量推导、空洞卷积练习 2Level A
正则化与归一化BN 推理偏差、LayerNorm 原理练习 3Level B
残差结构恒等映射证明、梯度流优化练习 4Level B
注意力机制Scaled Dot-Product 统计学意义练习 5Level C
优化器算法Momentum, Adam, 学习率调度练习 7Level C

📂 核心习题库

Level A:基础巩固 (Foundations)

练习 1:反向传播 (Backpropagation) 的矩阵形式推导

题目描述:在全连接网络中,已知第 ll 层的激活值为 a(l)=σ(z(l))a^{(l)} = \sigma(z^{(l)})z(l)=W(l)a(l1)+b(l)z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)}。定义误差 δ(l)=Lz(l)\delta^{(l)} = \frac{\partial L}{\partial z^{(l)}}。请推导 δ(l)\delta^{(l)}δ(l+1)\delta^{(l+1)} 的递推关系。

Check Solution (Matrix Derivation)

推导过程

  1. 链式法则展开δi(l)=Lzi(l)=jLzj(l+1)zj(l+1)zi(l)\delta^{(l)}_i = \frac{\partial L}{\partial z^{(l)}_i} = \sum_j \frac{\partial L}{\partial z^{(l+1)}_j} \frac{\partial z^{(l+1)}_j}{\partial z^{(l)}_i}
  2. 计算局部导数: 由于 zj(l+1)=kWjk(l+1)ak(l)+bj(l+1)=kWjk(l+1)σ(zk(l))+bj(l+1)z^{(l+1)}_j = \sum_k W^{(l+1)}_{jk} a^{(l)}_k + b^{(l+1)}_j = \sum_k W^{(l+1)}_{jk} \sigma(z^{(l)}_k) + b^{(l+1)}_j。 则 zj(l+1)zi(l)=Wji(l+1)σ(zi(l))\frac{\partial z^{(l+1)}_j}{\partial z^{(l)}_i} = W^{(l+1)}_{ji} \sigma'(z^{(l)}_i)
  3. 合并项δi(l)=(jδj(l+1)Wji(l+1))σ(zi(l))\delta^{(l)}_i = \left( \sum_j \delta^{(l+1)}_j W^{(l+1)}_{ji} \right) \sigma'(z^{(l)}_i)
  4. 矩阵化表示δ(l)=((W(l+1))Tδ(l+1))σ(z(l))\delta^{(l)} = ((W^{(l+1)})^T \delta^{(l+1)}) \odot \sigma'(z^{(l)}) 其中 \odot 表示 Hadamard 积。

练习 2:卷积层参数量计算

题目描述:输入图像尺寸 224×224×3224 \times 224 \times 3,使用 7×77 \times 7 卷积核,步长 2,填充 3,输出通道数 64。求输出尺寸及该层参数量(含偏置)。

Check Solution

计算步骤

  1. 尺寸计算O=224+2×372+1=112.5112O = \frac{224 + 2 \times 3 - 7}{2} + 1 = 112.5 \to 112。输出为 112×112×64112 \times 112 \times 64
  2. 参数量:每个卷积核参数 = 7×7×3+1=1487 \times 7 \times 3 + 1 = 148。总参数 = 148×64=9472148 \times 64 = 9472

Level B:综合提升 (Intermediate)

练习 3:Batch Normalization (BN) 的作用与推理偏差

题目描述:为什么 BN 在训练和推理(Test time)时的行为不同?推理时如何获得均值和方差?

Check Solution

核心机制

  1. 训练时:利用当前 Batch 的均值 μB\mu_B 和方差 σB2\sigma_B^2 进行归一化,以加速收敛并缓解梯度消失。
  2. 推理时:单个样本没有 Batch 统计量。因此,推理时使用训练过程中通过 移动平均 (Running Average) 累计得到的全局均值和方差。
  3. 目的:确保推理结果的确定性,不依赖于推理时的 Batch Size。

练习 4:ResNet 解决退化问题的数学直觉

题目描述:考虑残差块 y=f(x,{Wi})+xy = f(x, \{W_i\}) + x。请从梯度流的角度解释为什么这种设计能允许训练成百上千层的网络。

Check Solution

梯度流分析: 在反向传播时,Lx=Lyyx=Ly(fx+1)\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} = \frac{\partial L}{\partial y} \cdot (\frac{\partial f}{\partial x} + 1)。 由于存在常数项 11,梯度可以直接跨过复杂的非线性层 ff 传回前一层。即使 ff 层的权重导致梯度消失(fx0\frac{\partial f}{\partial x} \to 0),整体梯度依然保持在 11 左右,确保了深层网络参数的有效更新。


Level C:竞赛挑战 (Advanced)

练习 5:Attention 机制中的 Scaled Dot-Product

题目描述:在 Transformer 的注意力计算中,Attention(Q,K,V)=softmax(QKTdk)VAttention(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V。为什么需要除以 dk\sqrt{d_k}

Check Solution

统计学解释: 假设 QQKK 的分量是独立且均值为 0、方差为 1 的随机变量。则点积 qk=i=1dkqikiq \cdot k = \sum_{i=1}^{d_k} q_i k_i 的均值为 0,方差为 dkd_k。 当 dkd_k 很大时,点积的量级会变得非常大,导致经过 softmax 后梯度落入饱和区(极小),引发梯度消失。除以 dk\sqrt{d_k} 可以将方差重新缩放到 1,使 softmax 的输入处于敏感区,确保梯度平稳。

练习 6:手写神经网络反向传播 (C++ Implementation)

题目描述:实现一个简单的 2 层 MLP(全连接网络)在 C++ 中的前馈过程。

Check Solution (C++ Neural Engine Simulation)
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// 简单激活函数
double sigmoid(double x) { return 1.0 / (1.0 + exp(-x)); }

struct Layer {
int in, out;
vector<vector<double>> W;
vector<double> b, a;

Layer(int i, int o) : in(i), out(o), W(o, vector<double>(i, 0.1)), b(o, 0), a(o, 0) {}

void forward(const vector<double>& input) {
for (int i = 0; i < out; i++) {
double sum = b[i];
for (int j = 0; j < in; j++) sum += W[i][j] * input[j];
a[i] = sigmoid(sum);
}
}
};

int main() {
vector<double> input = {0.5, 0.3};
Layer layer1(2, 3);
layer1.forward(input);

cout << "Output Activations: ";
for (double val : layer1.a) cout << val << " ";
cout << endl;
return 0;
}

🏆 训练建议

  1. 理解归一化:对比 BN, LN, IN, GN 的应用场景(如 NLP 为什么首选 LN)。
  2. 关注感受野:计算深层网络中一个神经元对应的输入图像区域大小。
  3. 工程实战:尝试在 PyTorch 中从零实现一个带有残差结构的 Transformer Block。