2.4 归一化与超参数调优


2.4 归一化与超参数调优

本节摘要:同样的结构、同样的数据,训练顺不顺常取决于两件事——各层输入是否"体检过"(归一化)以及训练节奏是否有人管(超参数与学习率调度)。本节讲清批量归一化与层归一化治什么病,再给一套可照做的调参节奏与评估指标清单。

引擎(反向传播)和保险(正则化)都齐了,本节收尾这台训练工程:两层"润滑"。一是让梯度血流通畅的归一化,二是让步伐有章法的超参数管理。它承接 2.2 的评估话题,也把第3到5章会用到的"归一化选型"一并交代。

让每一层的输入告别忽大忽小

深层网络训练不稳定的一个重要根源:每往前走一层,数据分布都在悄悄漂移(有人把它叫内部协变量位移)。上一层权重稍微一动,下一层的输入就整体变了口味,导致该层得不断适应新环境。批量归一化(BatchNorm)的做法很干脆:把每个 mini-batch 内、每个特征通道上的取值做一次"标准化"——减去均值、除以标准差,再让模型自学一对缩放与平移参数把它调回合理尺度。

它的红利不止于稳定:让梯度更健谈——各特征尺度拉齐后,梯度不再被几个"大嗓门"特征带偏;还顺带让反向传播对学习率没那么挑,常常能放心把学习率调大一档。LayerNorm 干的是类似的活,但统计口径从"一批样本"换成"单个样本的所有隐藏单元",好处是不依赖 batch 大小、对序列长度变化更稳,正是第5章 Transformer 和 RNN 的伙伴。

两种归一化怎么选

维度 批量归一化 BatchNorm 层归一化 LayerNorm
统计对象 一批样本的同一通道 单个样本的全部隐藏单元
依赖 batch 大小 依赖,批小时不稳 不依赖,随处稳
适用结构 CNN 常见 RNN、Transformer
训练/推理 训练用批统计、推理用滑动平均 训练推理都一致

一句话选择:卷积和普通全连接优先 BatchNorm;序列模型和注意力优先 LayerNorm

超参数不是越多越好,而是先在层层少上试

超参数调优最容易犯的错是贪多。理想的节奏是"先锁定、再精调":先把 batch size 定下(常选 16、32、64 等 2 的幂),把优化器和初始学习率定下,其余先给常规值,跑一小段看损失曲线是否健康。曲线不健康,多半在"学习率不对"或"数据没喂对",先解决这两个大头,别急着去搜那一堆细枝末节的超参。

当可选空间真的很大时,网格搜索把所有组合穷举一遍,维度一高就天文数字;随机搜索在空间里撒点,往往以少得多的尝试找到同样好的点;贝叶斯优化则基于前几次的结果聪明地挑下一个采样点,最省尝试但实现最重。工程实务里,随机搜索配两三轮就已很常见。

学习率调度:让步伐随时间收放

学习率不是定死了就完事。训练前期损失下降快,希望步子大点;后期接近谷底,步子要收细,否则在谷底两侧打转。学习率调度就是给学习率编一份"随时间变化的时刻表":阶梯式衰减(每若干轮减一截)、余弦退火(平滑地由大变小再回升)、还有先热身再降速的 warmup。热身尤其重要——它让训练初期先小步稳住,避免一上来被大梯度掀翻,这在第5章的 Transformer 几乎是标配。

用代码演示学习率按余弦形状衰减的三种形态:

import math def cosine_lr(base, cur, total, warmup=0): ratio = cur / max(total, 1) if cur < warmup: # 热身期线性爬升 return base * cur / max(warmup, 1) t = (cur - warmup) / max(total - warmup, 1) return 0.5 * base * (1 + math.cos(math.pi * t)) base, total = 0.1, 100 for step in (0, 5, 30, 70, 99): print("step", step, "lr=", round(cosine_lr(base, step, total, 10), 4))

打印出的学习率曲线:前 10 步从 0.01 爬到 0.1,之后按余弦一路平滑降到接近 0,既给了热身又给了收尾。

评估指标:别让准确率一叶障目

调参终究要看评估。除了准确率,还要备一张常用指标清单:

指标 关心什么 何时重要
精确率 Precision 判定为对的里真对的占比 误报代价高时
召回率 Recall 真对的里被找出的占比 漏报代价高时
F1 前两者的调和平均 类别不均时
AUC 排序能力的强健度量 二分类整体评价
训练/验证差值 过拟合程度 每轮都要看

真正稳妥的做法是同时盯住"我看上的指标"和"训练/验证差值"两行,前者立项、后者体检,任何一个报警都值得停下思考。

一次"先修大头"的排查示范

抽象地讲"先锁定再精调"容易飘,落到一个具体症状上就清楚多了。假设你新起的网络训练集损失几乎一条直线、怎么跑都不降。多数人第一反应是加层、加宽、加正则或换优化器,其实最该先查三件事:学习率是不是被设成了几乎不可动的量级(先放大几倍看它动不动),数据有没有喂对(标签错位、特征没归一会在源头上卡死梯度),以及 batch size 是不是小到让梯度噪声盖过了信号。这三件中任一修正,往往比换十种优化器更见效。等损失曲线能"健康下降"了,再回来精调学习率调度与归一化组合,才算进入正轨。

这段排错顺序的价值在于:它把"调超参数"从玄学放回工程——先保证一瓶水流动,再谈往哪流。和第2.1 你学过的数值梯度校验一脉相承:能定位,就不慌。

一个自查:批量归一化的推理差异

记住 BatchNorm 一个容易翻车的点:训练时用 mini-batch 的实时均值方差,推理时却要改用训练阶段累计下来的滑动平均,两阶段统计口径不同。若脚本里只有训练分支、没有推理分支,放那种每个样本单独过的情况(如在线预测)就会数值错乱。这和第1章 1.4 讲训练推理要"对账"是同一个习惯——留意两阶段口径一致。

本节要点回顾

  • BatchNorm 拉齐批内各通道尺度,让梯度更健谈,训练可大步
  • LayerNorm 不依赖 batch,是 RNN、Transformer 的伙伴
  • 超参先锁定再精调,先修学习率和数据两个大头
  • 学习率要调度:热身 + 余弦退火是 Transformer 的标配
  • 评估指标按场景挑,别让准确率一叶障目

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U