基于深度学习的python速通(六)-与学习相关的技巧
- 基于深度学习的python速通(一)
- 基于深度学习的python速通(七)
- 基于深度学习的python速通(三)
- 基于深度学习的python速通(二)
- 基于深度学习的python速通(五)
- 基于深度学习的python速通(六)
- 基于深度学习的python速通(六)-与学习相关的技巧
与学习相关的技巧概述
本章围绕多层神经网络训练中的关键工程技巧展开:权重初始化、批归一化(Batch Normalization)、Dropout、权重衰减(L2 正则)、学习率与调度、早停与验证集、超参数优化等。它们从不同侧面改善梯度传递与泛化能力,使训练更稳定更高效。
本文沿用前文的层化实现(forward/backward)思想,在纯 Python/NumPy 环境下给出完整可运行的代码示例,辅以严谨的数学推导。
环境与依赖
示例统一使用 NumPy:
1 | import numpy as np |
权重初始化策略
深层网络中,若权重初始化不当会导致激活的方差在层间指数式增长或衰减,从而引发“梯度爆炸/消失”。合理初始化的目标是在层间保持激活与梯度的方差稳定。
Xavier 初始化(适于 tanh/sigmoid)
设某层输入维度为 (n_{\text{in}}),输出为 (n_{\text{out}})。在理想化假设下,令权重独立同分布、输入近似零均值,要求前向保持 (\operatorname{Var}(y)) 稳定,得到权重方差近似:
$$ \operatorname{Var}(W) = \frac{1}{n_{\text{in}}}. $$
常用采样:( W \sim \mathcal{N}(0, \frac{1}{n_{\text{in}}}) ) 或均匀分布 ( U\big(-\sqrt{\frac{6}{n_{\text{in}}+n_{\text{out}}}},\ \sqrt{\frac{6}{n_{\text{in}}+n_{\text{out}}}}\big) )。
He 初始化(适于 ReLU)
ReLU 会使输出一半期望为零(负半轴截断),为补偿此“有效通道数减半”,初始化方差加倍:
$$ \operatorname{Var}(W) = \frac{2}{n_{\text{in}}}. $$
Python实现
1 | def xavier_init(n_in, n_out): |
批归一化(Batch Normalization)
BN 通过在每层对激活进行标准化,稳定了梯度分布,缓解梯度消失/爆炸问题,并允许使用更高的学习率。
前向传播
对一个批次 ({x_i}_{i=1}^m),BN 的标准化与仿射变换:
$$ \mu_B = \frac{1}{m}\sum_i x_i,\quad \sigma_B^2 = \frac{1}{m}\sum_i (x_i - \mu_B)^2 $$
$$ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \varepsilon}},\quad y_i = \gamma\hat{x}_i + \beta $$
其中 (\gamma, \beta) 为可学习参数;推理阶段使用滑动平均的 (\mu,\sigma^2)。
反向传播
设上游梯度为 (dY)。BN 的梯度(对训练阶段)为:
$$ d\beta = \sum_i dY_i,\quad d\gamma = \sum_i dY_i,\hat{x}_i $$
$$ d\hat{x}_i = dY_i,\gamma $$
$$ dx_i = \frac{1}{m}\frac{1}{\sqrt{\sigma_B^2+\varepsilon}}\Big(m,d\hat{x}_i - \sum_j d\hat{x}_j - \hat{x}_i\sum_j d\hat{x}_j,\hat{x}_j\Big) $$
Python实现(训练/推理)
1 | class BatchNorm: |
Dropout
Dropout 在训练阶段随机“屏蔽”一部分神经元,以减少共适应并增强泛化。为了保持期望不变,训练时需按保留率进行缩放。
前向/反向与推理
1 | class Dropout: |
权重衰减(L2 正则化)
总损失:( L = L_{\text{data}} + \frac{\lambda}{2}\sum|W|^2 )。其对 (W) 的梯度为:
$$ \frac{\partial L}{\partial W} = \frac{\partial L_{\text{data}}}{\partial W} + \lambda W. $$
Python整合
1 | def l2_regularization(params, lam): |
学习率与优化器
学习率调度
- 常数学习率:
lr = lr0 - 阶梯衰减:每
step轮乘以系数 (\gamma) - 指数衰减:( lr_t = lr_0 \cdot \gamma^t )
1 | def step_decay(epoch, lr0=0.1, drop=0.5, step=200): |
优化器实现
1 | class SGD: |
早停与验证集
训练过程中使用验证集评估泛化误差,若验证损失在若干轮内不再改善,则提前停止。
1 | class EarlyStopping: |
超参数优化(随机搜索)
相较网格搜索,随机搜索对重要超参数的覆盖度更高。常对学习率采用 log-uniform 采样。
1 | def sample_log_uniform(low=-4, high=0): |
组合网络:支持 BN/Dropout/L2 的 MLP
1 | def softmax(x): |
综合示例:训练比较(He vs Xavier, BN/Dropout)
1 | def one_hot(y, num_classes): |








