内容概览
本教程从一个异常现象切入:字符级 MLP 的首次损失高达 27,而 27 类均匀预测对应的合理初始损失应约为 3.29。这说明输出 logits 过大,模型在训练开始时便“自信地犯错”。缩小输出层权重并将偏置置零后,损失曲线不再呈现前期快速压缩权重的曲棍球杆形状。随后,教程进一步检查 tanh 隐层,指出大量接近 −1 或 1 的激活会进入平坦区,削弱甚至截断梯度,并可能产生永久无法学习的死神经元。为避免激活和梯度逐层膨胀或衰减,权重尺度应依据 fan-in 和非线性增益设定,例如 tanh 可采用 5/3 除以 fan-in 平方根。BatchNorm 则直接按批次标准化预激活,再通过可学习的增益和偏置恢复表达自由度,并利用运行均值和方差支持单样本推理。最后,教程把网络重构为 Linear、BatchNorm、Tanh 等模块,并建立一套诊断流程:观察前向激活、反向梯度、参数分布以及更新/参数比。核心结论是,规范化能降低初始化敏感性,却不能替代学习率校准;当前模型性能的进一步提升还需要更长上下文和更强架构,而非仅继续优化 BatchNorm。
更多内容
核心概念
理解初始化、梯度传播和 BatchNorm 所需的关键术语。
- Fan-in:某层每个输出单元接收的输入特征数量,用于确定权重初始化尺度;在线性层中常以 1/√fan-in 缩放权重。
- 激活饱和:tanh 或 sigmoid 的输出进入平坦尾部,使局部导数接近零并显著削弱反向梯度。
- 死神经元:对所有训练样本都处于零梯度区域、因而无法继续学习的神经元。
- Batch Normalization:按当前批次统计量标准化每个特征,再使用可学习的 gamma 和 beta 进行缩放与平移的归一化层。
- 参数与缓冲区:gamma、beta 是通过反向传播更新的参数;运行均值和运行方差是通过指数移动平均维护的缓冲区。
- 更新/参数比:参数单步更新量的标准差除以参数值标准差,用于判断实际学习速度是否合理。
综合洞察
从各项实验中可归纳出的训练规律与设计含义。
- 训练损失曲线的形状本身就是初始化诊断信号:明显的前期“曲棍球杆”可能表示优化器先在纠正输出尺度,而不是学习任务结构。
- BatchNorm 的价值不只是把激活变得整齐,而是降低深层网络中各层初始化误差的累积;代价是把原本独立的样本变成相互依赖的计算单元。
- 前向激活正常并不代表训练已正确校准。BatchNorm 可以掩盖权重尺度问题,但参数更新仍可能过小或过大,因此必须同时观察更新/参数比。
- 规范化层提升的是优化可靠性,而非表达能力;当损失受上下文长度限制时,继续调整初始化或 BatchNorm 不会带来决定性提升。
技术细节
可直接用于实现和排查神经网络训练的公式、配置与结构。
- 27 类均匀预测的初始交叉熵为 −log(1/27)≈3.29;显著高于该值意味着初始 logits 过于分散。
- tanh 的局部梯度为 1−t²;可用 |t|>0.97 或 |t|>0.99 的比例衡量饱和程度。
- 线性层可采用 W∼N(0, gain²/fan-in);教程中 tanh 的 gain 使用 5/3,ReLU 的 Kaiming 增益为 √2。
- BatchNorm 计算 y=gamma·(x−mean)/√(variance+epsilon)+beta;epsilon 用于避免方差为零时除零。
- 训练时使用批次 mean/variance,并以 running=(1−momentum)·running+momentum·batch_stat 更新运行统计量;推理时使用固定运行统计量。
- 典型深层模块顺序为 Linear/Conv → BatchNorm → 非线性;当后接 BatchNorm 时,前置 Linear/Conv 应设置 bias=false。
- 教程的小批量大小为 32,并使用较低的运行统计 momentum 0.001;PyTorch 默认 momentum 为 0.1,小批量下可能导致统计量波动较大。
- 更新/参数比定义为 std(learning_rate·gradient)/std(parameter),再取 log10;约 −3 是教程采用的粗略参考线。
执行清单
训练或排查深层网络时可按优先级落实的具体动作。
- 根据类别数计算均匀预测的理论初始损失,并与第一个 batch 的实际损失比较。
- 将输出层偏置初始化为零,并把输出权重缩小到足以避免初始 softmax 过度自信的尺度。
- 绘制每层预激活和非线性输出的直方图,记录均值、标准差及 tanh 饱和比例,并检查是否存在整列失活。
- 采用基于 fan-in 和非线性增益的初始化,避免依赖逐层手工试出的魔法数字。
- 若网络较深,可在线性层或卷积层之后加入 BatchNorm;同时移除前置层的冗余 bias。
- 实现明确的 train/eval 模式:训练使用批次统计量并更新 buffers,推理使用固定运行统计量。
- 持续绘制各参数的更新/参数比,并围绕 log10≈−3 的参考值调节学习率,而非只看损失是否下降。
- 如果规范化后验证损失仍停滞,应检查上下文长度和模型架构瓶颈,考虑 RNN 或 Transformer,而不是继续堆叠优化技巧。