深度学习课程总结:线性回归和卷积神经网络
本文是对一周深度学习课程的系统性整理,涵盖线性回归、感知机、BP 网络、卷积神经网络以及 LeNet、AlexNet、VGG、ResNet 等经典架构。内容包括公式推导、网络结构分析、算法细节和部分代码思路,适合初学者复习参考。
目录
- 线性回归与最小二乘
- 线性分类:逻辑回归与 Softmax
- 神经元与感知机
- 多层感知机与误差反向传播
- 卷积神经网络基础
- LeNet-5:CNN 的早期代表
- 深度 CNN 经典结构:AlexNet、VGG、ResNet
1. 线性回归与最小二乘
1.1 问题定义
线性回归是一种监督学习模型,假设输入特征 x ∈ R n x \in \mathbb{R}^n x∈Rn 与输出 y y y 之间存在线性关系:
h θ ( x ) = θ 0 + θ 1 x 1 + ⋯ + θ n x n = θ T x h_\theta(x) = \theta_0 + \theta_1 x_1 + \dots + \theta_n x_n = \theta^T x hθ(x)=θ0+θ1x1+⋯+θnxn=θTx
其中 θ 0 \theta_0 θ0 为偏置(bias)。通常将 x x x 扩展为 [ 1 , x 1 , … , x n ] T [1, x_1, \dots, x_n]^T [1,x1,…,xn]T, θ \theta θ 相应扩展。
1.2 代价函数与最小二乘
给定训练集 { ( x ( i ) , y ( i ) ) } i = 1 N \{(x^{(i)}, y^{(i)})\}_{i=1}^N {(x(i),y(i))}i=1N,定义均方误差(MSE)代价函数:
J ( θ ) = 1 2 ∑ i = 1 N ( y ( i ) − h θ ( x ( i ) ) ) 2 J(\theta) = \frac{1}{2} \sum_{i=1}^N \left( y^{(i)} - h_\theta(x^{(i)}) \right)^2 J(θ)=21i=1∑N(y(i)−hθ(x(i)))2
系数 1 2 \frac12 21 是为了求导后消去平方项。
1.3 解析解(正规方程)
将损失函数对 θ \theta θ 求导并令为零:
∂ J ∂ θ = ∑ i = 1 N ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) = X T ( X θ − y ) = 0 \frac{\partial J}{\partial \theta} = \sum_{i=1}^N \left( h_\theta(x^{(i)}) - y^{(i)} \right) x^{(i)} = X^T (X\theta - y) = 0 ∂θ∂J=i=1∑N(hθ(x(i))−y(i))x(i)=XT(Xθ−y)=0
解得:
θ = ( X T X ) − 1 X T y \theta = (X^T X)^{-1} X^T y θ=(XTX)−1XTy
其中 X X X 为 N × ( n + 1 ) N \times (n+1) N×(n+1) 的设计矩阵,每行为 ( x ( i ) ) T (x^{(i)})^T (x(i))T。
该解析解要求 X T X X^T X XTX 可逆(特征之间线性无关)。当特征维度很高时,计算逆矩阵的复杂度 O ( n 3 ) O(n^3) O(n3) 不可接受,此时梯度下降更优。
1.4 梯度下降法(数值解)
迭代更新公式:
θ j : = θ j − α ∂ J ∂ θ j = θ j − α ∑ i = 1 N ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha \frac{\partial J}{\partial \theta_j} = \theta_j - \alpha \sum_{i=1}^N \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_j^{(i)} θj:=θj−α∂θj∂J=θj−αi=1∑N(hθ(x(i))−y(i))xj(i)
- 批量梯度下降:使用全部样本计算梯度,稳定但慢。
- 随机梯度下降(SGD):每次只用一个样本,快但不稳定。
- 小批量梯度下降:实践中效果最好。
1.5 过拟合与正则化
当特征过多或样本不足时,模型容易过拟合。常见解决方法:
- L2 正则化(岭回归): J ( θ ) + λ ∥ θ ∥ 2 2 J(\theta) + \lambda \|\theta\|_2^2 J(θ)+λ∥θ∥22
- L1 正则化(Lasso): J ( θ ) + λ ∥ θ ∥ 1 J(\theta) + \lambda \|\theta\|_1 J(θ)+λ∥θ∥1(可用于特征选择)
- 早停法、交叉验证
2. 线性分类:逻辑回归与 Softmax
2.1 从回归到分类
分类问题输出是离散标签(如 0/1)。若直接套用线性回归,输出值会超出 [ 0 , 1 ] [0,1] [0,1] 区间,且对异常值敏感。引入 Sigmoid 函数将实数映射到概率区间:
σ ( z ) = 1 1 + e − z , z = θ T x \sigma(z) = \frac{1}{1 + e^{-z}}, \quad z = \theta^T x σ(z)=1+e−z1,z=θTx
性质: σ ′ ( z ) = σ ( z ) ( 1 − σ ( z ) ) \sigma'(z) = \sigma(z)(1-\sigma(z)) σ′(z)=σ(z)(1−σ(z)),值域 ( 0 , 1 ) (0,1) (0,1),光滑且单调。此时假设函数为:
h θ ( x ) = σ ( θ T x ) = P ( y = 1 ∣ x ; θ ) h_\theta(x) = \sigma(\theta^T x) = P(y=1|x;\theta) hθ(x)=σ(θTx)=P(y=1∣x;θ)
2.2 损失函数:交叉熵
单个样本的损失:
L ( θ ) = − [ y log h θ ( x ) + ( 1 − y ) log ( 1 − h θ ( x ) ) ] L(\theta) = -\left[ y \log h_\theta(x) + (1-y) \log(1-h_\theta(x)) \right] L(θ)=−[yloghθ(x)+(1−y)log(1−hθ(x))]
全局代价函数:
J ( θ ) = − 1 N ∑ i = 1 N [ y ( i ) log h θ ( x ( i ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] J(\theta) = -\frac{1}{N} \sum_{i=1}^N \left[ y^{(i)} \log h_\theta(x^{(i)}) + (1-y^{(i)}) \log(1-h_\theta(x^{(i)})) \right] J(θ)=−N1i=1∑N[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]
使用交叉熵而非 MSE 的原因:MSE 配合 Sigmoid 会导致非凸的损失函数,易陷入局部极小;而交叉熵是凸的(对于逻辑回归而言),且从最大似然估计自然导出。
2.3 梯度下降求解
对 J ( θ ) J(\theta) J(θ) 求导:
∂ J ∂ θ = 1 N ∑ i = 1 N ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) \frac{\partial J}{\partial \theta} = \frac{1}{N} \sum_{i=1}^N \left( h_\theta(x^{(i)}) - y^{(i)} \right) x^{(i)} ∂θ∂J=N1i=1∑N(hθ(x(i))−y(i))x(i)
形式上与线性回归的梯度完全相同,但 h θ h_\theta hθ 的含义不同。参数更新公式:
θ : = θ − α 1 N ∑ i = 1 N ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) \theta := \theta - \alpha \frac{1}{N} \sum_{i=1}^N \left( h_\theta(x^{(i)}) - y^{(i)} \right) x^{(i)} θ:=θ−αN1i=1∑N(hθ(x(i))−y(i))x(i)
2.4 多分类:Softmax 回归
对于 K 个类别,输出一个 K 维概率向量:
h θ ( x ) = [ P ( y = 1 ∣ x ) ⋮ P ( y = K ∣ x ) ] = 1 ∑ j = 1 K e θ j T x [ e θ 1 T x ⋮ e θ K T x ] h_\theta(x) = \begin{bmatrix} P(y=1|x) \\ \vdots \\ P(y=K|x) \end{bmatrix} = \frac{1}{\sum_{j=1}^K e^{\theta_j^T x}} \begin{bmatrix} e^{\theta_1^T x} \\ \vdots \\ e^{\theta_K^T x} \end{bmatrix} hθ(x)= P(y=1∣x)⋮P(y=K∣x) =∑j=1KeθjTx1 eθ1Tx⋮eθKTx
损失函数(交叉熵形式):
J ( θ ) = − 1 N ∑ i = 1 N ∑ k = 1 K 1 { y ( i ) = k } log e θ k T x ( i ) ∑ j = 1 K e θ j T x ( i ) J(\theta) = -\frac{1}{N} \sum_{i=1}^N \sum_{k=1}^K \mathbf{1}\{y^{(i)}=k\} \log \frac{e^{\theta_k^T x^{(i)}}}{\sum_{j=1}^K e^{\theta_j^T x^{(i)}}} J(θ)=−N1i=1∑Nk=1∑K1{y(i)=k}log∑j=1KeθjTx(i)eθkTx(i)
梯度:
∂ J ∂ θ k = − 1 N ∑ i = 1 N x ( i ) ( 1 { y ( i ) = k } − P ( y ( i ) = k ∣ x ( i ) ; θ ) ) \frac{\partial J}{\partial \theta_k} = -\frac{1}{N} \sum_{i=1}^N x^{(i)} \left( \mathbf{1}\{y^{(i)}=k\} - P(y^{(i)}=k|x^{(i)};\theta) \right) ∂θk∂J=−N1i=1∑Nx(i)(1{y(i)=k}−P(y(i)=k∣x(i);θ))
3. 神经元与感知机
3.1 M-P 神经元模型(1943)
- 输入: x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1,x2,…,xn
- 权重: w 1 , w 2 , … , w n w_1, w_2, \dots, w_n w1,w2,…,wn
- 阈值: θ \theta θ(或偏置 b = − θ b = -\theta b=−θ)
- 净输入: z = ∑ i = 1 n w i x i − θ z = \sum_{i=1}^n w_i x_i - \theta z=∑i=1nwixi−θ
- 激活函数:阶跃函数
y = { 1 z ≥ 0 0 z < 0 y = \begin{cases} 1 & z \ge 0 \\ 0 & z < 0 \end{cases} y={10z≥0z<0
3.2 感知机(Perceptron,1957)
Rosenblatt 提出的感知机是第一个可学习的神经网络。学习规则(Hebb 准则变体):对于样本 ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i)),若分类错误(即 y ( i ) ⋅ ( θ T x ( i ) ) ≤ 0 y^{(i)} \cdot (\theta^T x^{(i)}) \le 0 y(i)⋅(θTx(i))≤0),则更新:
w : = w + α y ( i ) x ( i ) w := w + \alpha y^{(i)} x^{(i)} w:=w+αy(i)x(i)
若训练数据线性可分,感知机算法经过有限步迭代后必然收敛(感知机收敛定理)。其局限性在于无法解决异或(XOR)问题。XOR 真值表:
| x 1 x_1 x1 | x 2 x_2 x2 | y y y |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
在平面上,XOR 的两类点无法被一条直线分开。这一结论在 1969 年由 Minsky 和 Papert 指出,导致神经网络进入第一个低谷期。
4. 多层感知机与误差反向传播
4.1 XOR 问题的解决方案
增加一个隐层,用两个隐节点分别构造两条直线,再组合输出。例如:
- 节点 1:实现逻辑 OR(线 x 1 + x 2 − 0.5 = 0 x_1 + x_2 - 0.5 = 0 x1+x2−0.5=0)
- 节点 2:实现逻辑 NAND(线 − x 1 − x 2 + 1.5 = 0 -x_1 - x_2 + 1.5 = 0 −x1−x2+1.5=0)
- 输出层:将两者做 AND 运算,得到 XOR。
定理:三层(单隐层)感知机可以表示任意布尔函数。
4.2 多层前馈网络结构
- 输入层:接收原始特征
- 隐层:一层或多层,每个神经元采用非线性激活函数(早期用 Sigmoid/Tanh,现代用 ReLU)
- 输出层:根据任务选择(回归用线性,二分类用 Sigmoid,多分类用 Softmax)
4.3 BP 算法详细推导(以三层网络为例)
设网络结构:输入 n 0 n_0 n0 维 → 隐层 n 1 n_1 n1 个神经元 → 输出 n 2 n_2 n2 维。
符号约定:
- a [ l ] a^{[l]} a[l]:第 l l l 层的输出(激活值)
- z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]} z[l]=W[l]a[l−1]+b[l]
- a [ l ] = f ( z [ l ] ) a^{[l]} = f(z^{[l]}) a[l]=f(z[l])
- 损失函数 J J J(如 MSE 或交叉熵)
前向传播(以单样本为例):
z [ 1 ] = W [ 1 ] x + b [ 1 ] , a [ 1 ] = σ ( z [ 1 ] ) z^{[1]} = W^{[1]} x + b^{[1]},\quad a^{[1]} = \sigma(z^{[1]}) z[1]=W[1]x+b[1],a[1]=σ(z[1])
z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] , y ^ = a [ 2 ] = σ ( z [ 2 ] ) z^{[2]} = W^{[2]} a^{[1]} + b^{[2]},\quad \hat{y} = a^{[2]} = \sigma(z^{[2]}) z[2]=W[2]a[1]+b[2],y^=a[2]=σ(z[2])
反向传播:定义误差 δ [ l ] = ∂ J ∂ z [ l ] \delta^{[l]} = \frac{\partial J}{\partial z^{[l]}} δ[l]=∂z[l]∂J。
- 输出层(MSE 损失,激活函数为 Sigmoid):
δ [ 2 ] = ∂ J ∂ y ^ ⋅ σ ′ ( z [ 2 ] ) = ( y ^ − y ) ⋅ y ^ ( 1 − y ^ ) \delta^{[2]} = \frac{\partial J}{\partial \hat{y}} \cdot \sigma'(z^{[2]}) = (\hat{y} - y) \cdot \hat{y}(1-\hat{y}) δ[2]=∂y^∂J⋅σ′(z[2])=(y^−y)⋅y^(1−y^)
若采用交叉熵 + Sigmoid,则 δ [ 2 ] = y ^ − y \delta^{[2]} = \hat{y} - y δ[2]=y^−y(形式更简洁)。
- 隐层:
δ [ 1 ] = ( ( W [ 2 ] ) T δ [ 2 ] ) ⊙ σ ′ ( z [ 1 ] ) \delta^{[1]} = \left( (W^{[2]})^T \delta^{[2]} \right) \odot \sigma'(z^{[1]}) δ[1]=((W[2])Tδ[2])⊙σ′(z[1])
其中 ⊙ \odot ⊙ 是逐元素相乘。
- 梯度:
∂ J ∂ W [ l ] = δ [ l ] ( a [ l − 1 ] ) T , ∂ J ∂ b [ l ] = δ [ l ] \frac{\partial J}{\partial W^{[l]}} = \delta^{[l]} (a^{[l-1]})^T,\quad \frac{\partial J}{\partial b^{[l]}} = \delta^{[l]} ∂W[l]∂J=δ[l](a[l−1])T,∂b[l]∂J=δ[l]
参数更新: W [ l ] : = W [ l ] − α ∂ J ∂ W [ l ] W^{[l]} := W^{[l]} - \alpha \frac{\partial J}{\partial W^{[l]}} W[l]:=W[l]−α∂W[l]∂J
4.4 激活函数对比
| 函数 | 公式 | 优点 | 缺点 |
|---|---|---|---|
| Sigmoid | σ ( x ) = 1 / ( 1 + e − x ) \sigma(x)=1/(1+e^{-x}) σ(x)=1/(1+e−x) | 光滑,输出可解释为概率 | 饱和区梯度接近 0,非零均值 |
| Tanh | tanh ( x ) = ( e x − e − x ) / ( e x + e − x ) \tanh(x) = (e^x-e^{-x})/(e^x+e^{-x}) tanh(x)=(ex−e−x)/(ex+e−x) | 零均值,收敛快于 Sigmoid | 仍有梯度饱和 |
| ReLU | max ( 0 , x ) \max(0,x) max(0,x) | 计算快,缓解梯度消失 | 神经元“死亡”(负区间梯度为 0) |
| Leaky ReLU | max ( 0.01 x , x ) \max(0.01x, x) max(0.01x,x) | 解决死亡问题 | 需要调整超参数 |
现代卷积网络几乎默认使用 ReLU 或其变种。
4.5 BP 算法的不足与改进
- 局部极小值:采用动量法、Adam 等自适应优化器
- 梯度消失/爆炸:使用 ReLU、批归一化(Batch Normalization)、残差连接
- 学习率选择困难:学习率衰减策略(Step、Exponential、Cosine Annealing)
5. 卷积神经网络基础
5.1 全连接网络的参数爆炸问题
输入图像 1000 × 1000 1000 \times 1000 1000×1000(1M 像素),若第一个隐层也有 1M 个神经元,则输入到隐层的连接参数达到 10 12 10^{12} 1012,无法训练。
5.2 卷积的三大核心思想
- 局部连接:每个神经元只与输入图像的局部区域连接(感受野)。
- 权值共享:同一个卷积核在整个图像上滑动时,参数完全相同,大幅减少参数量。
- 池化:下采样,降低分辨率,增强平移不变性。
5.3 卷积操作详解
单通道卷积
输入 I ∈ R H × W I \in \mathbb{R}^{H \times W} I∈RH×W,卷积核 K ∈ R h × w K \in \mathbb{R}^{h \times w} K∈Rh×w,输出 O O O:
O ( x , y ) = ∑ u = 0 h − 1 ∑ v = 0 w − 1 I ( x + u , y + v ) ⋅ K ( u , v ) O(x,y) = \sum_{u=0}^{h-1}\sum_{v=0}^{w-1} I(x+u, y+v) \cdot K(u,v) O(x,y)=u=0∑h−1v=0∑w−1I(x+u,y+v)⋅K(u,v)
严格卷积需要翻转核,但深度学习中的“卷积”实际是互相关,由于权重可学习,等效。
多通道卷积
输入 I ∈ R H × W × C in I \in \mathbb{R}^{H \times W \times C_{\text{in}}} I∈RH×W×Cin,卷积核 K ∈ R h × w × C in × C out K \in \mathbb{R}^{h \times w \times C_{\text{in}} \times C_{\text{out}}} K∈Rh×w×Cin×Cout,输出 O ∈ R H ′ × W ′ × C out O \in \mathbb{R}^{H' \times W' \times C_{\text{out}}} O∈RH′×W′×Cout:
O ( x , y , c out ) = ∑ c = 0 C in − 1 ∑ u = 0 h − 1 ∑ v = 0 w − 1 I ( x + u , y + v , c ) ⋅ K ( u , v , c , c out ) O(x,y,c_{\text{out}}) = \sum_{c=0}^{C_{\text{in}}-1} \sum_{u=0}^{h-1}\sum_{v=0}^{w-1} I(x+u,y+v,c) \cdot K(u,v,c,c_{\text{out}}) O(x,y,cout)=c=0∑Cin−1u=0∑h−1v=0∑w−1I(x+u,y+v,c)⋅K(u,v,c,cout)
填充(Padding)与步长(Stride)
输出尺寸公式:
H ′ = ⌊ H + 2 p − h s ⌋ + 1 H' = \left\lfloor \frac{H + 2p - h}{s} \right\rfloor + 1 H′=⌊sH+2p−h⌋+1
常用填充方式:'same' 保持尺寸( p = ( h − 1 ) / 2 p = (h-1)/2 p=(h−1)/2,当 h h h 为奇数)。
5.4 池化
- 最大池化:取局部窗口最大值,保留最显著特征。
- 平均池化:取平均值,保留整体信息。
- 作用:降维、减少过拟合、增大感受野。
5.5 CNN 的 BP 算法要点
- 卷积层误差回传:将 δ [ l + 1 ] \delta^{[l+1]} δ[l+1] 与旋转 180° 的卷积核做卷积(full 卷积),得到 δ [ l ] \delta^{[l]} δ[l]。
- 池化层误差回传:
- 最大池化:只在原窗口最大值位置传递误差,其余位置为 0。
- 平均池化:将误差均匀分配到窗口每个位置。
现代深度学习框架自动完成这些计算,但理解原理有助于网络调试。
6. LeNet-5:CNN 的早期代表
Yann LeCun 在 1998 年提出的 LeNet-5 用于手写数字识别(MNIST),奠定了现代 CNN 的基本结构。
6.1 网络结构
| 层 | 类型 | 核尺寸 / 步长 | 输入尺寸 | 输出尺寸 | 参数数量 |
|---|---|---|---|---|---|
| 输入 | 灰度图 | - | 32×32×1 | - | - |
| C1 | 卷积 | 5×5, 6 核 | 32×32×1 | 28×28×6 | (5×5+1)×6 = 156 |
| S2 | 平均池化 | 2×2, stride=2 | 28×28×6 | 14×14×6 | 0 |
| C3 | 卷积 | 5×5, 16 核 | 14×14×6 | 10×10×16 | 部分连接(见论文) |
| S4 | 平均池化 | 2×2, stride=2 | 10×10×16 | 5×5×16 | 0 |
| C5 | 卷积 | 5×5, 120 核 | 5×5×16 | 1×1×120 | (5×5×16+1)×120=48120 |
| F6 | 全连接 | - | 120 | 84 | (120+1)×84=10164 |
| 输出 | RBF | - | 84 | 10 | 84×10=840 |
C3 层采用部分连接(组合连接),目的是打破对称性,迫使不同卷积核学习互补特征。具体连接表见原论文。
6.2 参数与连接数计算示例(以 C1 层为例)
- 每个卷积核有 5×5=25 个权重,加 1 个偏置,共 26 个参数,6 个核总计 156 个参数。
- 每个输出神经元的连接数为 25(来自输入的 5×5 区域),不计偏置的连接。若计入偏置,则每个神经元多一个连接。输出神经元个数为 28 × 28 × 6 = 4704 28 \times 28 \times 6 = 4704 28×28×6=4704,因此总连接数为 26 × 4704 = 122 , 304 26 \times 4704 = 122,304 26×4704=122,304(课程讲义中的数据)。
6.3 与当代 CNN 的主要区别
| 项目 | LeNet-5 | 现代 CNN |
|---|---|---|
| 填充 | 无 | 通常有 ‘same’ |
| 池化 | 平均池化 | 最大池化居多 |
| 激活函数 | Sigmoid/Tanh | ReLU 或变种 |
| 深度 | 5 层可学习 | 几十到上百层 |
| 参数规模 | 约 6 万 | 百万到亿级 |
7. 深度 CNN 经典结构:AlexNet、VGG、ResNet
7.1 AlexNet(2012)
背景
ImageNet 图像分类竞赛,1000 个类别,120 万训练图像。AlexNet 以较大优势夺冠,top-5 错误率 15.3%(第二名 26.2%),被视作深度学习复兴的标志。
网络结构(8 层可学习)
- 输入:224×224×3(RGB)
- 卷积层:5 层(部分后跟 LRN 和池化)
- 全连接层:3 层(最后为 1000 维 Softmax)
详细配置:
| 层 | 类型 | 核/池化大小 | 步长 | 输出尺寸 |
|---|---|---|---|---|
| 1 | 卷积 96 | 11×11 | 4 | 55×55×96 |
| LRN + 池化 | 3×3 | 2 | 27×27×96 | |
| 2 | 卷积 256 | 5×5 | 1 | 27×27×256 |
| LRN + 池化 | 3×3 | 2 | 13×13×256 | |
| 3 | 卷积 384 | 3×3 | 1 | 13×13×384 |
| 4 | 卷积 384 | 3×3 | 1 | 13×13×384 |
| 5 | 卷积 256 | 3×3 | 1 | 13×13×256 |
| 池化 | 3×3 | 2 | 6×6×256 | |
| 6 | 全连接 4096 | - | - | 4096 |
| 7 | 全连接 4096 | - | - | 4096 |
| 8 | 全连接 1000 | - | - | 1000 |
主要创新点
-
ReLU 激活函数
相比 tanh,ReLU 在正区间梯度恒为 1,避免了梯度饱和,加速收敛(论文称速度提升约 6 倍)。 -
Dropout 正则化
以概率 0.5 随机丢弃神经元输出,迫使网络学习冗余表示,减少过拟合。仅在两个全连接层使用。 -
数据增强
- 随机裁剪:从 256×256 图像中随机裁剪 224×224 块(平移变换)
- 水平翻转(反射变换)
- PCA 颜色增强:改变 RGB 通道强度(模拟光照变化)
-
重叠池化
池化窗口 3×3,步长 2(窗口有重叠)。相比非重叠池化(2×2,步长 2),重叠池化能略微降低过拟合。 -
双 GPU 并行
受限于当时 GPU 显存(GTX 580 仅 3GB),AlexNet 将网络分布在两个 GPU 上,只在特定层交换信息。
7.2 VGG-16(2014)
VGG 团队的核心发现是:增加网络深度比增加单个卷积核尺寸更有效。
网络特点
- 所有卷积核统一为 3×3(步长 1,填充 1 保持尺寸)
- 所有池化统一为 2×2 最大池化(步长 2,尺寸减半)
- 每池化一次,通道数翻倍(64 → 128 → 256 → 512)
感受野分析
两个 3×3 卷积层堆叠,感受野为 5×5;三个堆叠为 7×7。
- 参数量对比:一个 7×7 卷积核参数 49C²,三个 3×3 卷积核参数 27C²(C 为通道数)。
- 三个 3×3 堆叠引入更多非线性(三层 ReLU),表达能力更强。
VGG-16 配置
| 层块 | 卷积配置 | 输出尺寸 |
|---|---|---|
| conv1 | 2×[3×3, 64] | 224×224×64 |
| pool1 | 2×2 | 112×112×64 |
| conv2 | 2×[3×3, 128] | 112×112×128 |
| pool2 | 2×2 | 56×56×128 |
| conv3 | 3×[3×3, 256] | 56×56×256 |
| pool3 | 2×2 | 28×28×256 |
| conv4 | 3×[3×3, 512] | 28×28×512 |
| pool4 | 2×2 | 14×14×512 |
| conv5 | 3×[3×3, 512] | 14×14×512 |
| pool5 | 2×2 | 7×7×512 |
| fc6 | 4096 | 4096 |
| fc7 | 4096 | 4096 |
| fc8 | 1000 | 1000 |
总参数量约 1.38 亿,其中全连接层占了大部分(约 1.2 亿)。VGG 的缺点是计算量大、内存占用高。
7.3 残差网络 ResNet(2015)
退化问题(Degradation)
当网络加深到一定程度(如 56 层),训练误差反而高于 20 层的网络。这不是过拟合(因为训练误差也高),而是梯度消失/爆炸导致优化困难。
梯度消失的数学分析(以 4 层 Sigmoid 网络为例)
损失对第一层偏置的梯度:
∂ C ∂ b 1 = σ ′ ( z 1 ) w 2 σ ′ ( z 2 ) w 3 σ ′ ( z 3 ) w 4 σ ′ ( z 4 ) ∂ C ∂ a 4 \frac{\partial C}{\partial b_1} = \sigma'(z_1) w_2 \sigma'(z_2) w_3 \sigma'(z_3) w_4 \sigma'(z_4) \frac{\partial C}{\partial a_4} ∂b1∂C=σ′(z1)w2σ′(z2)w3σ′(z3)w4σ′(z4)∂a4∂C
由于 σ ′ ( z ) ≤ 1 / 4 \sigma'(z) \le 1/4 σ′(z)≤1/4,且初始化时 ∣ w j ∣ < 1 |w_j| < 1 ∣wj∣<1,于是 ∣ w j σ ′ ( z j ) ∣ < 1 / 4 |w_j \sigma'(z_j)| < 1/4 ∣wjσ′(zj)∣<1/4,连乘后指数级衰减。层数越多,梯度越接近 0。
残差块设计
一个残差块(residual block)的形式为:
y = F ( x , { W i } ) + x y = F(x, \{W_i\}) + x y=F(x,{Wi})+x
其中 F F F 通常是两到三个卷积层(含 BN 和 ReLU)。 x x x 通过“捷径连接”(shortcut)直接与输出相加。
- 若 x x x 和 F F F 的维度不匹配,用 1×1 卷积调整 x x x 的通道数。
- 梯度反向传播时,误差可以直接从深层传到浅层,避免了多层连乘导致的衰减。
ResNet-34 结构
| 层名 | 输出尺寸 | 残差块配置(堆叠次数) |
|---|---|---|
| conv1 | 112×112 | 7×7,64, stride2 |
| pool | 56×56 | 3×3 max pool |
| conv2_x | 56×56 | [3×3,64] ×3 |
| conv3_x | 28×28 | [3×3,128] ×4 |
| conv4_x | 14×14 | [3×3,256] ×6 |
| conv5_x | 7×7 | [3×3,512] ×3 |
| 全局平均池化,1000-d fc,softmax |
更深的变体(ResNet-50/101/152)
使用“瓶颈结构”(bottleneck)降低计算量:
1 × 1 降维 → 3 × 3 卷积 → 1 × 1 升维 1\times1 \text{ 降维} \;\rightarrow\; 3\times3 \text{ 卷积} \;\rightarrow\; 1\times1 \text{ 升维} 1×1 降维→3×3 卷积→1×1 升维
例如 256 维输入,先 1×1 降到 64,3×3 卷积后,再 1×1 升回 256。
设计原则
- 全部使用 3×3 卷积,每个残差块保持相同输出尺寸,尺寸减半时通道翻倍。
- 不使用 Dropout(现代实现中可能加入)。
- 全连接层仅保留最后的 1000 维分类层(其余用全局平均池化代替)。
更多推荐




所有评论(0)