一、神经网络基础

1.1 神经元与感知机

输入层    隐藏层    输出层
 x₁ ────┐
         ├ w₁  ──┐
 x₂ ────┤       │  Σ (─σ─) → y
         ├ w₂  ──┘
 x₃ ────┘

 y = σ(w₁x₁ + w₂x₂ + w₃x₃ + b)

1.2 激活函数

函数公式范围优点缺点
Sigmoidσ(x)=1/(1+e^{-x})(0,1)平滑梯度消失/非0中心
Tanhtanh(x)=2σ(2x)-1(-1,1)0中心梯度消失
ReLUmax(0,x)[0,∞)稀疏/不饱和Dying ReLU
Leaky ReLUmax(0.01x,x)(-∞,∞)缓解Dying参数选择
ELUx (x>0), α(e^x-1) (x≤0)(-α,∞)连续较慢
GELUx Φ(x)近似(-∞,∞)ViT/LLM标准较复杂
Swish/SiLUx σ(x)近似(-∞,∞)Google提出同GELU
Softmaxe{x_i}/Σe{x_j}(0,1), 和为1多分类输出-

1.3 损失函数

损失公式用途
MSE½
Cross Entropy-Σy·log(ŷ)多类分类
Binary CE-y·log(ŷ) - (1-y)·log(1-ŷ)二分类
Hingemax(0, 1-y·ŷ)SVM式分类
Contrastivey·D² + (1-y)·max(0, m-D)²孪生网络
Tripletmax(0, d(a,p) - d(a,n) + m)Face Recognition

1.4 优化器演进

SGD(1950s)
  ├── Momentum (1986) ──→ NAG (Nesterov, 1983)
  ├── AdaGrad (2011) ────→ RMSProp (2012)
  └── Adam (2014) ───────→ AdamW (2017) ──→ Lion (2023)
# PyTorch 优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

学习率调度:

  • Step Decay: 每N个epoch × 0.1
  • Cosine Annealing: 余弦退火(常用于ViT)
  • Linear Warmup + Cosine: 先升温再退火
  • OneCycleLR: 一周训练策略

1.5 正则化

方法原理公式/实现
L1正则参数稀疏Loss + λ
L2正则权重衰减Loss + λ
Dropout随机丢弃神经元训练时随机z→0
DropPath随机丢弃残差路径类似Dropout
Label Smoothing软标签y = (1-ε)·y + ε/K
Batch Norm归一化+缩放移位γ(x-μ)/σ + β
Data Augmentation数据增强随机变换
Early Stopping验证集不提升就停验证损失平台期
Weight Decay权重向0衰减等效L2

二、反向传播(Backpropagation)

2.1 链式法则核心

Loss = CrossEntropy(Softmax(FC(ReLU(Conv(Input))))
                                                ∂Loss
传播方向: Loss ← CE ← Softmax ← FC ← ReLU ← Conv ← Input  → ∂w

∂L/∂w_i = ∂L/∂z_j  ·  ∂z_j/∂w_i   (链式法则逐层计算)
   ↓            ↓               ↓
 损失信号    激活梯度          输入特征

2.2 计算图

        ┌──→ Relu ──→ Weight ──→ Softmax ──→ Loss
 Input ─┤
        └──→ ...  (分支/跳连)

三、卷积神经网络(CNN)核心 ⭐

3.1 卷积层

卷积操作: (I * K)(x,y) = ΣΣ I(x+i, y+j)·K(i,j)

参数:

参数含义常见值
Kernel Size卷积核大小3×3, 5×7, 7×7
Stride步长1, 2
Padding填充方式same, valid
Dilation空洞1, 2, 4
Groups分组1, depthwise
nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1)

输出尺寸: out = (in + 2p - k) / s + 1

3.2 池化层

类型操作效果
Max Pooling取窗口最大值平移不变性,提取显著特征
Average Pooling取窗口平均值平滑,降低方差
Global Avg Pooling全图平均替代FC层防过拟合
Adaptive Pooling输出固定尺寸灵活输入

3.3 经典CNN架构演进

LeNet-5 (1998)
  │
AlexNet (2012) ←── ImageNet竞赛转折点
  │
  ├── VGG (2014) ──── 更深的架构,3×3堆叠
  ├── Inception-v1 (2014) ── 并行多分支
  │
  ├── ResNet (2015) ⭐ ──── 残差连接,(层数飙升)
  │     ├── ResNeXt (2016) ──── 分组卷积
  │     └── DenseNet (2016) ──── 密集连接
  │
  ├── SENet (2017) ──── 通道注意力
  ├── MobileNets (2017) ──── 深度可分离卷积
  │     ├── ShuffleNet (2018)
  │     └── EfficientNet (2019) ──── NAS搜索 + 复合缩放
  │
  ├── ResNeSt (2020) ──── 分组注意力
  ├── ConvNeXt (2022) ⭐ ── 现代CNN(媲美ViT)
  └── ConvNeXt V2 (2023) ── 全卷积掩码自编码器

3.4 关键架构详解

AlexNet (2012) - 里程碑
Input(224×224×3)
  ↓ Conv 11×11, 96, s4 → Pool → Norm
  ↓ Conv 5×5, 256 → Pool → Norm
  ↓ Conv 3×3, 384 → Conv 3×3, 384 → Conv 3×3, 256 → Pool
  ↓ FC 4096 → Dropout → FC 4096 → Dropout → FC 1000 → Softmax

创新: ReLU, GPU双卡并行, Dropout, 数据增强, LRN

VGG (2014)

特点: 全部3×3卷积 + 2×2池化,简洁优雅

VGG-16: 13 Conv + 3 FC = 16层 (138M参数)
VGG-19: 16 Conv + 3 FC = 19层 (144M参数)
ResNet (2015) ⭐ - 革命性

核心: 残差块 F(x) + x 解决梯度消失

     x
      │
    ┌─┴──┐
    │ Conv 3×3
    │  ReLU
    │ Conv 3×3
    └─┬──┘
      │ (+) ← x(恒等映射)
      ReLU

变体:

架构层数Top-1 Error
ResNet-181830.24%
ResNet-343426.75%
ResNet-505024.56%
ResNet-10110123.39%
ResNet-15215223.05%
Wide ResNet50 (2×)21.50%
ResNeXt-101101 (32×4d)21.17%
import torchvision.models as models
resnet = models.resnet50(pretrained=True)
EfficientNet (2019) - NAS最优

复合缩放: 同时调整 depth × width × resolution

模型ParamsTop-1
EfficientNet-B05.3M77.3%
EfficientNet-B766M84.4%
ConvNeXt (2022) - CNN复兴

设计原则 (从Swin Transformer学到的):

  1. 7×7大卷积核
  2. GELU激活
  3. LayerNorm替代BatchNorm
  4. 膨胀比率增大
  5. 反向瓶颈结构 (DW Conv → Dense → Dense)

四、训练技巧与超参数

4.1 权重初始化

方法适用公式
Xavier/Glorottanh/SigmoidVar(w) = 2/(n_in + n_out)
He/KaimingReLU/PReLUVar(w) = 2/n_in
LeCuntanhVar(w) = 1/n_in
OrthogonalRNN正交矩阵初始化
def weights_init(m):
    if isinstance(m, nn.Conv2d):
        nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
        if m.bias is not None:
            nn.init.constant_(m.bias, 0)

4.2 数据增强(CV专属)

增强效果
随机翻转平移不变性RandomHorizontalFlip
随机旋转旋转不变性RandomRotation
随机裁剪尺度/平移不变RandomResizedCrop
颜色抖动光照/颜色不变ColorJitter
灰度化颜色不变性RandomGrayscale
Cutout遮挡鲁棒随机块=0
Mixup插值融合λ·x₁ + (1-λ)·x₂
CutMix区域替换矩形替换
AutoAugmentRL搜索最优增强TensorFlow
RandAugment随机选择增强PyTorch
AugMix混合多种增强鲁棒性
from torchvision import transforms
train_transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ColorJitter(0.4, 0.4, 0.4, 0.1),
    transforms.RandomGrayscale(p=0.2),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225])
])

📺 推荐视频

内容链接
CS231n Lecture 1-8https://www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv
3Blue1Brown 神经网络系列https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi
PyTorch CNN入门教程https://www.youtube.com/playlist?list=PLhhyoLH6IjfxeoooqP9rhU3HJIAVAJ3Vz
Andrej Karpathy “Neural Networks: Zero to Hero”https://www.youtube.com/@AndrejKarpathy

📚 推荐书籍

  • Deep Learning (花书) - Goodfellow et al. ⭐
  • 动手学深度学习 - Zhang et al. (d2l.ai) ⭐ 免费
  • Deep Learning for Computer Vision - Rajalingappaa Shanmugamani
  • Understanding Deep Learning - Simon J.D. Prince (2023)

🔗 视频链接速查

建议先掌握经典CNN架构(ResNet/VGG),再学习ViT和现代架构


附录:深层补充

1. 反向传播的向量化推导

1.1 从单个神经元到全连接层

单个神经元 z = w T x + b z = w^T x + b z=wTx+b, a = σ ( z ) a = \sigma(z) a=σ(z)

∂ L ∂ w = ∂ L ∂ a ⋅ σ ′ ( z ) ⋅ x \frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \cdot \sigma'(z) \cdot x wL=aLσ(z)x
∂ L ∂ x = ∂ L ∂ a ⋅ σ ′ ( z ) ⋅ w \frac{\partial L}{\partial x} = \frac{\partial L}{\partial a} \cdot \sigma'(z) \cdot w xL=aLσ(z)w(误差前传)

全连接层(矩阵形式)
z = W a ( l − 1 ) + b , a ( l ) = f ( z ) z = W a^{(l-1)} + b, \quad a^{(l)} = f(z) z=Wa(l1)+b,a(l)=f(z)

∂ L ∂ W ⏟ m × n = δ ( l ) ⏟ m × 1 ⋅ a ( l − 1 ) T ⏟ 1 × n \underbrace{\frac{\partial L}{\partial W}}_{m \times n} = \underbrace{\delta^{(l)}}_{m \times 1} \cdot \underbrace{a^{(l-1)T}}_{1 \times n} m×n WL=m×1 δ(l)1×n a(l1)T

δ ( l − 1 ) ⏟ n × 1 = W T ⏟ n × m ⋅ δ ( l ) ⏟ m × 1 ⊙ f ′ ( z ( l − 1 ) ) ⏟ n × 1 \underbrace{\delta^{(l-1)}}_{n \times 1} = \underbrace{W^T}_{n \times m} \cdot \underbrace{\delta^{(l)}}_{m \times 1} \odot \underbrace{f'(z^{(l-1)})}_{n \times 1} n×1 δ(l1)=n×m WTm×1 δ(l)n×1 f(z(l1))

其中 δ ( l ) = ∂ L ∂ z ( l ) \delta^{(l)} = \frac{\partial L}{\partial z^{(l)}} δ(l)=z(l)L 是层 l l l 的误差信号。

1.2 计算图中的梯度传递通用规则
操作前向反向梯度
加法 c = a + b c = a + b c=a+b c c c ∂ L / ∂ a = ∂ L / ∂ c \partial L/\partial a = \partial L/\partial c L/a=L/c, 同 b b b
乘法 c = a ⋅ b c = a \cdot b c=ab c c c ∂ L / ∂ a = b ⋅ ∂ L / ∂ c \partial L/\partial a = b \cdot \partial L/\partial c L/a=bL/c
矩阵乘 C = A B C = AB C=AB C C C ∂ L / ∂ A = ( ∂ L / ∂ C ) B T \partial L/\partial A = (\partial L/\partial C) B^T L/A=(L/C)BT
ReLU a = max ⁡ ( 0 , z ) a = \max(0, z) a=max(0,z) a a a ∂ L / ∂ z = 1 [ z > 0 ] ⊙ ∂ L / ∂ a \partial L/\partial z = \mathbb{1}[z > 0] \odot \partial L/\partial a L/z=1[z>0]L/a
分支 b = f ( a ) , c = g ( a ) b = f(a), c=g(a) b=f(a),c=g(a) b , c b,c b,c ∂ L / ∂ a = ∂ L / ∂ b + ∂ L / ∂ c \partial L/\partial a = \partial L/\partial b + \partial L/\partial c L/a=L/b+L/c
1.3 CNN的反向传播

卷积层 Z = X ∗ W Z = X * W Z=XW

  • 对权重的梯度: ∂ L ∂ W = X ∗ ∂ L ∂ Z \frac{\partial L}{\partial W} = X * \frac{\partial L}{\partial Z} WL=XZL(输入与误差信号的卷积)
  • 对输入的梯度: ∂ L ∂ X = ∂ L ∂ Z ∗ W rot \frac{\partial L}{\partial X} = \frac{\partial L}{\partial Z} * W^{\text{rot}} XL=ZLWrot(误差信号与翻转核的卷积)

2. CNN各层的数学定义

2.1 卷积层

互相关运算(实际实现):
Y ( i , j , k ) = ∑ c = 0 C i n − 1 ∑ u = 0 K h − 1 ∑ v = 0 K w − 1 X ( i + u , j + v , c ) ⋅ W k ( u , v , c ) + b k Y(i,j,k) = \sum_{c=0}^{C_{in}-1} \sum_{u=0}^{K_h-1} \sum_{v=0}^{K_w-1} X(i+u, j+v, c) \cdot W_k(u,v,c) + b_k Y(i,j,k)=c=0Cin1u=0Kh1v=0Kw1X(i+u,j+v,c)Wk(u,v,c)+bk

输出尺寸 H o u t = ⌊ ( H i n + 2 p − K h ) / s ⌋ + 1 H_{out} = \lfloor (H_{in} + 2p - K_h) / s \rfloor + 1 Hout=⌊(Hin+2pKh)/s+1

参数量 K h × K w × C i n × C o u t + C o u t K_h \times K_w \times C_{in} \times C_{out} + C_{out} Kh×Kw×Cin×Cout+Cout(权重+偏置)

计算量(FLOPs) K h × K w × C i n × C o u t × H o u t × W o u t × 2 K_h \times K_w \times C_{in} \times C_{out} \times H_{out} \times W_{out} \times 2 Kh×Kw×Cin×Cout×Hout×Wout×2(乘加算2次FLOP)

2.2 池化层的反向传播

最大池化(Max Pooling):前向时记录最大值位置(switch变量),反向时梯度传到最大值位置,其他位置为0。

∂ L ∂ x i j = { ∂ L ∂ y m a x ( i , j ) = max pos 0 otherwise \frac{\partial L}{\partial x_{ij}} = \begin{cases} \frac{\partial L}{\partial y_{max}} & (i,j) = \text{max pos} \\ 0 & \text{otherwise} \end{cases} xijL={ymaxL0(i,j)=max posotherwise

平均池化(Average Pooling):梯度均匀分配到池化窗口中每个元素。

∂ L ∂ x i j = 1 K h × K w ⋅ ∂ L ∂ y \frac{\partial L}{\partial x_{ij}} = \frac{1}{K_h \times K_w} \cdot \frac{\partial L}{\partial y} xijL=Kh×Kw1yL

2.3 全连接层

y = W x + b y = Wx + b y=Wx+b

∂ L ∂ W = ∂ L ∂ y ⋅ x T \frac{\partial L}{\partial W} = \frac{\partial L}{\partial y} \cdot x^T WL=yLxT
∂ L ∂ x = W T ⋅ ∂ L ∂ y \frac{\partial L}{\partial x} = W^T \cdot \frac{\partial L}{\partial y} xL=WTyL


3. Batch Normalization的完整数学

3.1 训练时的batch统计

对于一个batch B = { x 1 , . . . , x m } B = \{x_1, ..., x_m\} B={x1,...,xm}

Step 1: 计算batch均值和方差
μ B = 1 m ∑ i = 1 m x i , σ B 2 = 1 m ∑ i = 1 m ( x i − μ B ) 2 \mu_B = \frac{1}{m} \sum_{i=1}^m x_i, \quad \sigma_B^2 = \frac{1}{m} \sum_{i=1}^m (x_i - \mu_B)^2 μB=m1i=1mxi,σB2=m1i=1m(xiμB)2

Step 2: 标准化
x ^ i = x i − μ B σ B 2 + ϵ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} x^i=σB2+ϵ xiμB

Step 3: 缩放平移
y i = γ x ^ i + β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β

其中 γ , β \gamma, \beta γ,β 是可学习参数,恢复表达能力。

3.2 推理时的移动平均

训练时维护全局移动平均:
μ running = ( 1 − α ) ⋅ μ running + α ⋅ μ B \mu_{\text{running}} = (1 - \alpha) \cdot \mu_{\text{running}} + \alpha \cdot \mu_B μrunning=(1α)μrunning+αμB
σ running 2 = ( 1 − α ) ⋅ σ running 2 + α ⋅ σ B 2 \sigma_{\text{running}}^2 = (1 - \alpha) \cdot \sigma_{\text{running}}^2 + \alpha \cdot \sigma_B^2 σrunning2=(1α)σrunning2+ασB2

推理时固定使用 μ running \mu_{\text{running}} μrunning σ running \sigma_{\text{running}} σrunning
y = γ ⋅ x − μ running σ running 2 + ϵ + β y = \gamma \cdot \frac{x - \mu_{\text{running}}}{\sqrt{\sigma_{\text{running}}^2 + \epsilon}} + \beta y=γσrunning2+ϵ xμrunning+β

PyTorch默认 α = 0.1 \alpha = 0.1 α=0.1(momentum参数)。

3.3 BN的反向传播推导

定义 ∂ L ∂ y i \frac{\partial L}{\partial y_i} yiL 已知。需要计算 ∂ L ∂ x i \frac{\partial L}{\partial x_i} xiL, ∂ L ∂ γ \frac{\partial L}{\partial \gamma} γL, ∂ L ∂ β \frac{\partial L}{\partial \beta} βL

β \beta β 梯度 ∂ L ∂ β = ∑ i ∂ L ∂ y i \frac{\partial L}{\partial \beta} = \sum_i \frac{\partial L}{\partial y_i} βL=iyiL

γ \gamma γ 梯度 ∂ L ∂ γ = ∑ i ∂ L ∂ y i ⋅ x ^ i \frac{\partial L}{\partial \gamma} = \sum_i \frac{\partial L}{\partial y_i} \cdot \hat{x}_i γL=iyiLx^i

x i x_i xi 梯度(通过链式法则经过 μ B , σ B 2 , x ^ i \mu_B, \sigma_B^2, \hat{x}_i μB,σB2,x^i):
∂ L ∂ x i = 1 m ⋅ σ B 2 + ϵ [ m ⋅ ∂ L ∂ x ^ i − ∑ j ∂ L ∂ x ^ j − x ^ i ∑ j ∂ L ∂ x ^ j ⋅ x ^ j ] \frac{\partial L}{\partial x_i} = \frac{1}{m \cdot \sqrt{\sigma_B^2 + \epsilon}} \left[ m \cdot \frac{\partial L}{\partial \hat{x}_i} - \sum_j \frac{\partial L}{\partial \hat{x}_j} - \hat{x}_i \sum_j \frac{\partial L}{\partial \hat{x}_j} \cdot \hat{x}_j \right] xiL=mσB2+ϵ 1[mx^iLjx^jLx^ijx^jLx^j]

其中 ∂ L ∂ x ^ i = γ ⋅ ∂ L ∂ y i \frac{\partial L}{\partial \hat{x}_i} = \gamma \cdot \frac{\partial L}{\partial y_i} x^iL=γyiL

3.4 BN为什么有效

原始论文观点:BN缓解内部协变量偏移(Internal Covariate Shift)。

后续研究的新观点(Santurkar et al., 2018):

  • BN的主要作用不是缓解ICS,而是让损失景观更平滑(Lipschitz常数更小)
  • 平滑的损失表面使梯度下降更稳定,允许更大学习率

4. 优化器演化详情

4.1 数学更新公式对比
优化器更新公式核心思想
SGD θ t + 1 = θ t − η g t \theta_{t+1} = \theta_t - \eta g_t θt+1=θtηgt基础梯度下降
Momentum v t + 1 = γ v t + η g t v_{t+1} = \gamma v_t + \eta g_t vt+1=γvt+ηgt, θ t + 1 = θ t − v t + 1 \theta_{t+1} = \theta_t - v_{t+1} θt+1=θtvt+1累积梯度动量,加速收敛
NAG v t + 1 = γ v t + η ∇ f ( θ t − γ v t ) v_{t+1} = \gamma v_t + \eta \nabla f(\theta_t - \gamma v_t) vt+1=γvt+ηf(θtγvt), θ t + 1 = θ t − v t + 1 \theta_{t+1} = \theta_t - v_{t+1} θt+1=θtvt+1前瞻梯度,更精准
AdaGrad G t = G t − 1 + g t 2 G_t = G_{t-1} + g_t^2 Gt=Gt1+gt2, θ t + 1 = θ t − η G t + ϵ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} g_t θt+1=θtGt+ϵ ηgt自适应学习率,稀疏导特征更新大
RMSProp E [ g 2 ] t = β E [ g 2 ] t − 1 + ( 1 − β ) g t 2 E[g^2]_t = \beta E[g^2]_{t-1} + (1-\beta)g_t^2 E[g2]t=βE[g2]t1+(1β)gt2, θ t + 1 = θ t − η E [ g 2 ] t + ϵ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} g_t θt+1=θtE[g2]t+ϵ ηgt解决AdaGrad学习率单调衰减问题
Adam m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t mt=β1mt1+(1β1)gt, v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2 vt=β2vt1+(1β2)gt2, 偏置校正后更新动量+自适应LR
AdamW在Adam基础上将权重衰减从梯度中分离: θ t + 1 = θ t − η ( m ^ t / ( v ^ t + ϵ ) + λ θ t ) \theta_{t+1} = \theta_t - \eta(\hat{m}_t/(\sqrt{\hat{v}_t}+\epsilon) + \lambda \theta_t) θt+1=θtη(m^t/(v^t +ϵ)+λθt)解耦权重衰减
4.2 AdamW vs Adam

Adam的权重衰减(不正确的实现)
θ t + 1 = θ t − η ( m ^ t v ^ t + ϵ + λ θ t ) \theta_{t+1} = \theta_t - \eta \left( \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} + \lambda \theta_t \right) θt+1=θtη(v^t +ϵm^t+λθt)
其中 λ θ t \lambda \theta_t λθt 作用在自适应学习率分母外面。

AdamW的正确解耦(Loshchilov & Hutter, 2017):
θ t + 1 = θ t − η ( m ^ t v ^ t + ϵ + η λ θ t ) \theta_{t+1} = \theta_t - \eta \left( \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} + \eta \lambda \theta_t \right) θt+1=θtη(v^t +ϵm^t+ηλθt)

效果:AdamW在各种任务上泛化性显著优于Adam。


5. 初始化方法详解

5.1 Xavier/Glorot初始化

目标:前向传播中每层输出的方差保持不变,反向传播中每层梯度方差保持不变。

假设:激活函数近似线性(tanh区域),输入/权重独立同分布,均值为0。

Var ( y i ) = n ⋅ Var ( w i j ) ⋅ Var ( x j ) \text{Var}(y_i) = n \cdot \text{Var}(w_{ij}) \cdot \text{Var}(x_j) Var(yi)=nVar(wij)Var(xj)

Var ( y ) = Var ( x ) \text{Var}(y) = \text{Var}(x) Var(y)=Var(x)
n ⋅ Var ( w ) = 1 ⇒ Var ( w ) = 1 n in n \cdot \text{Var}(w) = 1 \Rightarrow \text{Var}(w) = \frac{1}{n_{\text{in}}} nVar(w)=1Var(w)=nin1

反向传播同样要求 Var ( w ) = 1 n out \text{Var}(w) = \frac{1}{n_{\text{out}}} Var(w)=nout1。取调和平均:

Var ( w ) = 2 n in + n out \text{Var}(w) = \frac{2}{n_{\text{in}} + n_{\text{out}}} Var(w)=nin+nout2

实现 w ∼ U [ − 6 n in + n out ,    6 n in + n out ] w \sim \mathcal{U}\left[-\sqrt{\frac{6}{n_{\text{in}}+n_{\text{out}}}}, \; \sqrt{\frac{6}{n_{\text{in}}+n_{\text{out}}}}\right] wU[nin+nout6 ,nin+nout6 ]

适用:tanh, sigmoid
不适用:ReLU(因为ReLU非对称、非近似线性)

5.2 Kaiming He初始化

针对ReLU的初始化(He et al., 2015)。

ReLU特性: E [ x i 2 ] = 1 2 Var ( x ) \mathbb{E}[x_i^2] = \frac{1}{2} \text{Var}(x) E[xi2]=21Var(x)(负半轴输出为0)。

经过ReLU后的方差:
Var ( y ) = n 2 ⋅ Var ( w ) ⋅ Var ( x ) \text{Var}(y) = \frac{n}{2} \cdot \text{Var}(w) \cdot \text{Var}(x) Var(y)=2nVar(w)Var(x)

Var ( y ) = Var ( x ) \text{Var}(y) = \text{Var}(x) Var(y)=Var(x)
Var ( w ) = 2 n in \text{Var}(w) = \frac{2}{n_{\text{in}}} Var(w)=nin2

实现 w ∼ N ( 0 , 2 / n in ) w \sim \mathcal{N}(0, \sqrt{2/n_{\text{in}}}) wN(0,2/nin ) U [ − 6 / n in , 6 / n in ] \mathcal{U}[-\sqrt{6/n_{\text{in}}}, \sqrt{6/n_{\text{in}}}] U[6/nin ,6/nin ]

为什么初始化如此关键

  • 初始化过大 → 梯度爆炸 → 训练不稳定
  • 初始化过小 → 梯度消失 → 深层网络无法学习
  • 好初始化让网络在训练初期就处于有利的优化位置
  • 对深层网络(>50层)尤其重要

6. 正则化技术细节

6.1 L1/L2正则化的贝叶斯解释

L2正则化(权重衰减):高斯先验下的MAP估计

P ( w ∣ D ) ∝ P ( D ∣ w ) ⋅ P ( w ) P(w|D) \propto P(D|w) \cdot P(w) P(wD)P(Dw)P(w)

取高斯先验 P ( w ) = ∏ j 1 2 π σ 0 2 exp ⁡ ( − w j 2 2 σ 0 2 ) P(w) = \prod_j \frac{1}{\sqrt{2\pi\sigma_0^2}} \exp\left(-\frac{w_j^2}{2\sigma_0^2}\right) P(w)=j2πσ02 1exp(2σ02wj2)

取负对数:
− log ⁡ P ( w ∣ D ) = − log ⁡ P ( D ∣ w ) + 1 2 σ 0 2 ∑ j w j 2 + const -\log P(w|D) = -\log P(D|w) + \frac{1}{2\sigma_0^2} \sum_j w_j^2 + \text{const} logP(wD)=logP(Dw)+2σ021jwj2+const

这就是MSE + L2惩罚。 λ = 1 / 2 σ 0 2 \lambda = 1/2\sigma_0^2 λ=1/2σ02 控制先验的强度。

L1正则化(Lasso):Laplace先验下的MAP估计

P ( w ) = ∏ j 1 2 b exp ⁡ ( − ∣ w j ∣ b ) P(w) = \prod_j \frac{1}{2b} \exp\left(-\frac{|w_j|}{b}\right) P(w)=j2b1exp(bwj)

取负对数得L1惩罚: 1 b ∑ j ∣ w j ∣ \frac{1}{b} \sum_j |w_j| b1jwj。Laplace分布在0处有尖峰,诱导稀疏解。

6.2 Dropout的数学原理

训练时:每个神经元以概率 p p p 保留(1-p 丢弃 = 输出设为0):
r j ( l ) ∼ Bernoulli ( p ) , y ~ ( l ) = r ( l ) ⊙ y ( l ) r_j^{(l)} \sim \text{Bernoulli}(p), \quad \tilde{y}^{(l)} = r^{(l)} \odot y^{(l)} rj(l)Bernoulli(p),y~(l)=r(l)y(l)

推理时:全部神经元激活,但输出乘以 p p p 保持期望一致:
y test = p ⋅ W test y_{\text{test}} = p \cdot W_{\text{test}} ytest=pWtest

或者在训练时将输出除以 p p pInverted Dropout,更常用):
y ~ ( l ) = r ( l ) p ⊙ y ( l ) \tilde{y}^{(l)} = \frac{r^{(l)}}{p} \odot y^{(l)} y~(l)=pr(l)y(l)

这样推理时无需任何缩放操作

为什么Dropout有效

  1. 集成学习:每次迭代训练不同的子网络,推理时是这些子网络的集合
  2. 防止共适应:神经元不能过度依赖其他特定神经元的存在
  3. 正则化效果:相当于在权重上施加L2正则(但各维度的正则化强度不同)
6.3 Label Smoothing的公式推导

标准交叉熵 L C E = − ∑ k = 1 K q ( k ) log ⁡ p ( k ) \mathcal{L}_{CE} = -\sum_{k=1}^K q(k) \log p(k) LCE=k=1Kq(k)logp(k),其中 q ( k ) = 1 [ k = y ] q(k) = \mathbb{1}[k = y] q(k)=1[k=y] 是one-hot标签。

Label Smoothing(Szegedy et al., 2016):
q ′ ( k ) = ( 1 − ϵ ) ⋅ 1 [ k = y ] + ϵ K q'(k) = (1 - \epsilon) \cdot \mathbb{1}[k = y] + \frac{\epsilon}{K} q(k)=(1ϵ)1[k=y]+Kϵ

其中 ϵ \epsilon ϵ 是平滑参数(通常0.1), K K K 是类别数。

等价形式
L L S = ( 1 − ϵ ) ⋅ L C E + ϵ ⋅ L K L ( u ∥ p ) \mathcal{L}_{LS} = (1-\epsilon) \cdot \mathcal{L}_{CE} + \epsilon \cdot \mathcal{L}_{KL}(u\|p) LLS=(1ϵ)LCE+ϵLKL(up)

其中 u ( k ) = 1 / K u(k) = 1/K u(k)=1/K 是均匀分布, L K L \mathcal{L}_{KL} LKL 是KL散度。

效果

  1. 防止模型对训练标签过于自信(over-confidence)
  2. 提高泛化能力
  3. 对噪声标签更鲁棒
  4. 提高模型的校准度(calibration——模型输出的概率与实际准确率更匹配)

更多推荐