本文是对一周深度学习课程的系统性整理,涵盖线性回归、感知机、BP 网络、卷积神经网络以及 LeNet、AlexNet、VGG、ResNet 等经典架构。内容包括公式推导、网络结构分析、算法细节和部分代码思路,适合初学者复习参考。

目录

  1. 线性回归与最小二乘
  2. 线性分类:逻辑回归与 Softmax
  3. 神经元与感知机
  4. 多层感知机与误差反向传播
  5. 卷积神经网络基础
  6. LeNet-5:CNN 的早期代表
  7. 深度 CNN 经典结构:AlexNet、VGG、ResNet

1. 线性回归与最小二乘

1.1 问题定义

线性回归是一种监督学习模型,假设输入特征 x ∈ R n x \in \mathbb{R}^n xRn 与输出 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=1N(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=1N(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αθjJ=θjαi=1N(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+ez1,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)+(1y)log(1hθ(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=1N[y(i)loghθ(x(i))+(1y(i))log(1hθ(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=1N(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=1N(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=Kx) =j=1KeθjTx1 eθ1Txeθ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=1Nk=1K1{y(i)=k}logj=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) θkJ=N1i=1Nx(i)(1{y(i)=k}P(y(i)=kx(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={10z0z<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+x20.5=0
  • 节点 2:实现逻辑 NAND(线 − x 1 − x 2 + 1.5 = 0 -x_1 - x_2 + 1.5 = 0 x1x2+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[l1]+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^(1y^)

若采用交叉熵 + 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[l1])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+ex) 光滑,输出可解释为概率 饱和区梯度接近 0,非零均值
Tanh tanh ⁡ ( x ) = ( e x − e − x ) / ( e x + e − x ) \tanh(x) = (e^x-e^{-x})/(e^x+e^{-x}) tanh(x)=(exex)/(ex+ex) 零均值,收敛快于 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 卷积的三大核心思想

  1. 局部连接:每个神经元只与输入图像的局部区域连接(感受野)。
  2. 权值共享:同一个卷积核在整个图像上滑动时,参数完全相同,大幅减少参数量。
  3. 池化:下采样,降低分辨率,增强平移不变性。

5.3 卷积操作详解

单通道卷积

输入 I ∈ R H × W I \in \mathbb{R}^{H \times W} IRH×W,卷积核 K ∈ R h × w K \in \mathbb{R}^{h \times w} KRh×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=0h1v=0w1I(x+u,y+v)K(u,v)

严格卷积需要翻转核,但深度学习中的“卷积”实际是互相关,由于权重可学习,等效。

多通道卷积

输入 I ∈ R H × W × C in I \in \mathbb{R}^{H \times W \times C_{\text{in}}} IRH×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}}} KRh×w×Cin×Cout,输出 O ∈ R H ′ × W ′ × C out O \in \mathbb{R}^{H' \times W' \times C_{\text{out}}} ORH×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=0Cin1u=0h1v=0w1I(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+2ph+1

常用填充方式:'same' 保持尺寸( p = ( h − 1 ) / 2 p = (h-1)/2 p=(h1)/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
主要创新点
  1. ReLU 激活函数
    相比 tanh,ReLU 在正区间梯度恒为 1,避免了梯度饱和,加速收敛(论文称速度提升约 6 倍)。

  2. Dropout 正则化
    以概率 0.5 随机丢弃神经元输出,迫使网络学习冗余表示,减少过拟合。仅在两个全连接层使用。

  3. 数据增强

    • 随机裁剪:从 256×256 图像中随机裁剪 224×224 块(平移变换)
    • 水平翻转(反射变换)
    • PCA 颜色增强:改变 RGB 通道强度(模拟光照变化)
  4. 重叠池化
    池化窗口 3×3,步长 2(窗口有重叠)。相比非重叠池化(2×2,步长 2),重叠池化能略微降低过拟合。

  5. 双 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} b1C=σ(z1)w2σ(z2)w3σ(z3)w4σ(z4)a4C

由于 σ ′ ( 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 维分类层(其余用全局平均池化代替)。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐