首页 / 资讯中心 / 文章详情

深度学习训练六基石:梯度下降、Adam、交叉熵、过拟合与归一化

深度学习训练六基石:梯度下降、Adam、交叉熵、过拟合与归一化 ★ FEATURED ARTICLE
1. 梯度下降一切优化的起点先把这个根扎稳先说结论不管是Adam还是别的什么花哨优化器底层那个“沿着梯度反方向走”的核心逻辑从来没变过。变的是怎么走、走多快、怎么避坑。1.1 你真正该理解的“下山”模型把模型训练想象成摸黑下山。山的形状就是损失函数的曲面你的位置是当前参数目标是找到最低点损失最小。因为你“摸黑”唯一能感知的就是脚下的坡度——这个坡度在数学上就是损失函数对参数的梯度。梯度是一个向量它指向的是“上升最快”的方向那下山自然就朝它的反方向走。参数更新公式你肯定见过[ \theta_{t1} \theta_t - \eta \cdot \nabla_{\theta} L(\theta_t) ]其中 (\eta) 是学习率步长(\nabla_{\theta} L(\theta_t)) 是损失对参数的梯度。每次迭代参数沿着负梯度方向移动一小步。公式就三行但它背后有几个非常容易被忽视的隐含假设第一这个山的形状是“可导航”的——也就是说损失函数对参数可导曲面连续。如果损失函数某个点突变、不可导梯度就没了下山的人直接掉悬崖。ReLU在零点不可导但工程上用次梯度糊弄过去了实践中没出事数学上却是个坑。第二梯度只是“局部”信息。你只能知道脚下这一小块地面的倾斜方向看不到整座山长什么样。所以梯度下降天然只能保证收敛到局部极小值不保证全局最优。深度学习的损失面非凸里面有大量局部极小值、鞍点、平坦区这就是为什么裸的梯度下降在深网上跑不动。第三每次“摸坡度”的成本问题。如果你用全部训练数据算一次梯度那叫批量梯度下降BGD每次走的方向最准但算一次要看完所有数据太贵了。如果你每次只随机抽一条数据来算梯度那叫随机梯度下降SGD每次方向噪声极大路径像喝醉了酒但因为便宜所以总步数跑得飞快。中间的折中叫小批量梯度下降Mini-batch GD一次抽几十上百条来算一个还算靠谱的方向——今天90%以上的训练走的都是这条路。从数学上理解小批量梯度下降的期望正好等于真实梯度也就是说平均而言方向是对的但单次包含噪声。这个噪声不是坏事后面我们讲Adam和泛化的时候会再提。1.2 学习率那个最要命又最容易被忽略的数字我见过太多新手模型训不动就换网络结构、换损失函数折腾半天最后发现只是学习率没调好。学习率决定了你在下山时迈多大步。步子太大学习率太高你可能一脚跨过山谷从这边坡直接甩到对面坡上损失不降反升甚至发散。这个现象可以很直观地从参数更新式看出来如果 (\eta) 太大(\eta \cdot \nabla) 这一项会直接盖过参数本身更新后的参数就乱飞了。步子太小学习率太低你确实在往下走但走得比蜗牛还慢。训练半天损失曲线像一条平缓下降的直线训练十几个小时后发现验证集指标几乎没动。实践经验里有个劝退新手的现象叫loss震荡。如果你发现loss曲线上下抖动比较厉害先别加正则化、别改结构把学习率除以10试试大概率能稳住。还有一个概念值得说学习率不是非得固定不变的。理想情况下训练初期步子可以大一点快速跳过乱七八糟的区域中期开始变小精细搜索盆地底部末期再进一步缩小方便收敛。这就引出了学习率调度Learning Rate Schedule比如阶梯式下降、余弦退火。Adam论文里给的建议也和这个相关但自适应方法本身已经在逐参数地调整有效步长了这也是它容错率高的原因之一下一节展开。提示监视梯度范数比监视loss更早暴露问题。如果梯度的L2范数突然爆到1e10这种量级说明梯度爆炸了而且损失值还没反应过来。这时候优先检查是不是输出层数值溢出或者模型深处有数值不稳定的操作。1.3 梯度下降在深度学习里为何“不够用”如果你用裸的SGD去训练一个深层卷积网络你会遇到两个典型问题病态曲率和梯度消失/爆炸。病态曲率理解起来要一点线性代数直觉。损失函数在不同方向上的曲率差异巨大有的方向很陡曲率大有的方向很缓曲率小。裸SGD对每个维度用同一个学习率结果就是在陡的方向上步子太大导致震荡在缓的方向上步子太小导致磨蹭。最终路径呈锯齿状收敛奇慢。这个问题可以用牛顿法那种二阶信息解但深度学习参数动辄百万千万直接算海塞矩阵的逆是完全不现实的。梯度消失/爆炸则是反向传播的“乘法效应”。误差信号从输出层往输入层传每经过一层就要乘一次权重的梯度。如果权重初始化得稍微小一点乘上十几层之后梯度就指数级缩水消失浅层参数根本更新不动如果权重稍大梯度指数级膨胀爆炸。这也是为什么后来有权重初始化的专门研究——Xavier初始化、Kaiming初始化——本质上都是为了让每一层梯度的方差维持在一个可控范围内。理解了这个背景你再去看Adam就会明白它到底“自适应”了什么。2. Adam优化器自适应、动量与工程容错的集大成者Adam全称是Adaptive Moment Estimation自适应矩估计。它并不是一个多高深的数学发明更准确说它是把两套已有的优化思想——动量Momentum和自适应学习率如AdaGrad、RMSProp的思路——干净地组合起来再做了一个工程上极其重要的偏差修正。2014年底提出之后它迅速成为深度学习默认优化器之一至今仍然是大多数视觉、语言模型的启动选择。2.1 动量和自适应学习率各自解决了什么上面说了裸SGD在病态曲率下会走锯齿路径。一个自然的想法是既然方向总在来回摇摆那我能不能“平均”一下历史方向举个例子某个维度上梯度符号来回变互相对消这个维度上的总位移自然就小了而在某个顺畅的维度上梯度符号一致我们就把速度积累起来越走越快。这就是动量Momentum的核心直觉它模拟了物理世界里小球从山坡滚下来时累积的惯性。标准动量更新式[ v_t \beta v_{t-1} \nabla_{\theta} L(\theta_t) ][ \theta_{t1} \theta_t - \eta v_t ](\beta) 通常在0.9左右意味着当前速度保留了90%的历史速度同时混入10%的新梯度。路径因此明显变得平滑收敛也稳定得多。自适应学习率解决的是另一个问题不同的参数维度是不是该用不同的步长AdaGrad的思路是对每个参数维度把它历史梯度的平方累积起来然后用这个累积值的平方根去除学习率。也就是说经常被大梯度更新的参数维度它们的有效学习率会被压小不常更新的维度学习率保持较大。AdaGrad的毛病在于累积平方和单调增长后期学习率被压制到几乎为零直接罢工。RMSProp改进了这一点用指数滑动平均来代替累加求和让学习率缩放因子能够“遗忘”久远的梯度信息。2.2 Adam的具体数学形式和“为什么是这三个超参数”Adam就是把Momentum的“一阶矩”和RMSProp式“二阶矩”估计用了同一种指数滑动平均框架整合起来同时估计每个维度的位置和曲率。一阶矩估计带动量性质[ m_t \beta_1 m_{t-1} (1 - \beta_1) g_t ]二阶矩估计带自适应缩放性质[ v_t \beta_2 v_{t-1} (1 - \beta_2) g_t^2 ]其中 (g_t) 是当前小批量的梯度(m) 是梯度的一阶矩均值方向(v) 是梯度平方的二阶矩平均幅值(\beta_1)、(\beta_2) 是衰减率。但直接这样用有一个很严重的初始化偏差问题。训练刚开始时 (m_00)、(v_00)那么前几步算出来的矩估计会被严重拉向0尤其在 (\beta) 接近1的时候早起的估计几乎失效。Adam论文的解法是偏差校正bias correction[ \hat{m}_t \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t \frac{v_t}{1 - \beta_2^t} ](t) 是当前迭代步数。(\beta^t) 表示指数衰减到当前步之后早期“从0起步”的偏差还剩下多少。分母把它除掉之后矩估计就基本无偏了。这一步数学推导不复杂但极其关键没有它Adam的前几百步训练会明显乏力。最终更新[ \theta_{t1} \theta_t - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} \epsilon} ]分母的 (\epsilon) 通常是 (10^{-8})唯一作用就是防止除以零。整个式子解读(\frac{\hat{m}_t}{\sqrt{\hat{v}_t}}) 给出的是一个“信噪比”方向的归一化更新量——如果某个维度梯度持续稳定且大更新就大如果梯度忽正忽反、噪声剧烈更新就自动变小。超参数选型的逻辑超参数常用值含义与经验(\eta)0.001初始论文建议值多数任务起步没问题(\beta_1)0.9一阶矩衰减率动量窗口约10步(\beta_2)0.999二阶矩衰减率历史梯度的窗口约1000步(\epsilon)1e-8数值稳定项几乎不用动(\beta_20.999) 意味着二阶矩的历史记忆很长。如果训练时发现loss不降但梯度幅度又正常有可能是 (\beta_2) 把方差估计拖得太钝了可以试试把 (\beta_2) 降到0.99甚至0.98这会牺牲一点稳定性但提速明显。这是一个很少写在文档里的调参技巧。2.3 Adam的过拟合特质和工程经验Adam的收敛速度和使用便利度让它迅速普及但它在泛化性能上一直被质疑。很多实验观察是同一个模型用SGD动量好好调学习率最终测试集精度往往比Adam高一点尤其在图像分类任务上。有个比较流行的解释是Adam的归一化特性除以二阶矩会让它在平坦极小值附近停得太早——它倾向于把参数推进到一个“稳定但比较尖锐”的极小值而SGD因为噪声更大在参数空间中“误打误撞”找到更平坦的区域平坦区域通常对应更好的泛化。工程上的妥协方案很常见训练中用Adam加速前期中后期切换为SGD或带动量的SGD继续精调。还有个更省事的方案是Adam配合余弦学习率衰减效果常常能逼近SGD调参后的水平。我在实际项目里的经验如果不想花太多时间调优化器起步Adam默认学习率1e-3没问题如果追求极限的验证集精度并且有时间调参那就换成SGDMomentum并配合学习率调度上限更高。另外要注意切换优化器时学习率不能照搬SGD需要的学习率通常比Adam大一个量级左右。3. 熵从信息量到损失函数一个概念横跨三座山熵是标题里看起来最“数学”的词但它绝不是书斋里的抽象概念。恰恰相反它是贯穿深度学习理论根基和具体工程设计的核心线索。你每天用的交叉熵损失函数追根溯源就是信息熵的直接推演。3.1 自信息与熵的定义信息论里一个事件 (x) 发生所带来的信息量定义为[ I(x) -\log P(x) ]为什么取负对数直觉如下事件发生概率越低我们认为它携带的信息量越大。天气预报本来就是晴天预报“晴天”没有新信息预报“明天有陨石”这是大消息。(\log) 让独立事件的信息量可以相加概率相乘转化为对数相加负号保证信息量为正。底数通常取2单位是比特深度学习里习惯用自然对数单位是纳特nat推导时形式上更顺手。一个随机变量 (X) 的熵就是它的自信息期望[ H(X) -\sum_{x} P(x) \log P(x) ]这是“不确定性的度量”。一个均匀分布的骰子每个面概率都是1/6熵最大一个灌铅骰子总是扔出6不确定性趋近于0熵趋近于0。机器学习的本质是在不确定性中做判断所以熵天然就是个称手的工具。3.2 交叉熵从KL散度到损失函数交叉熵的定义是[ H(P, Q) -\sum_{x} P(x) \log Q(x) ]它衡量的是用模型分布Q去编码真实分布P时平均需要的编码长度。它跟KL散度的关系是[ D_{KL}(P | Q) H(P, Q) - H(P) ]KL散度是“因为用Q近似P多付出了多少编码代价”。训练分类模型时P是真实标签分布通常是one-hotQ是模型预测分布。P的熵是固定不变的所以最小化交叉熵等价于最小化KL散度等价于让模型分布逼近真实分布。为什么分类问题首选交叉熵而不是均方误差MSE因为交叉熵配合Softmax梯度形式极其优雅。推导结果是交叉熵损失对Softmax输入z的梯度恰好等于预测值减去真实值[ \frac{\partial L}{\partial z_i} \hat{y}_i - y_i ]这个形式意味着预测越离谱梯度越大修正越猛。而且Softmax的指数性质天然放大了类别间的差异梯度不会因为输出饱和而消失。对比一下MSESoftmax梯度里会多乘一项类似 ( \hat{y}(1-\hat{y}) ) 的Softmax导数当预测接近0或1的时候梯度近乎消失训练就卡住了。这就是MSE在分类问题上“明明看起来挺合理却训不动”的根本原因。很多初学者栽过这个跟头。3.3 熵在正则化和模型行为中的另一副面孔熵还有一个重要的面孔是“最大熵原则”在满足已知约束的情况下不做任何额外假设选择熵最大的那个分布。深度学习里不少正则化技术可以理解成对熵的变相操控。标签平滑Label Smoothing是最直接的例子。把硬标签从one-hot改成比如 [0.9, 0.025, 0.025, ...]其实就是给类别分布注入一点点均匀分布的“熵”强迫模型不要把预测概率推到1。这能显著抑制过拟合因为模型不需要为了那个“绝对正确”的类别而把权重推到极端值。我见过不少团队因为加了标签平滑图像分类模型的验证集精度涨了1-2个点而且曲线更稳。Dropout也可以从信息视角理解每次随机丢弃一部分神经元等价于在训练时强迫网络用更冗余、更分散的表示去完成任务隐式提高了各特征之间的信息分布均匀性避免了单个特征携带过多权重信息。对抗训练某种程度上也是熵相关的——它迫使模型对输入的微小扰动保持稳定防止它把“信心”过度集中在某些特别脆弱的特征上。这一块以后再展开但你要记住熵不是一个为了考试背的公式它是一把理解模型行为的通用钥匙。4. 过拟合从“背题”到“解题”的平衡术过拟合恐怕是深度学习实践中最常见、最不容易完全消除的问题。它本质上是模型在训练集上表现很好、但拿到新数据上就露馅的现象。不要觉得这是“学得还不够”造成的——恰恰相反很多时候是学得太好了好到把训练数据里的噪声也背下来了。4.1 过拟合的数学直觉偏差-方差权衡把模型的期望泛化误差拆成三项[ E[(y - \hat{f}(x))^2] \text{Bias}^2 \text{Variance} \text{噪声} ]偏差Bias模型预测的平均值和真实值的差距。偏差大说明模型本身表达能力不够属于“学不会”。方差Variance模型在不同训练集上结果的波动程度。方差大说明模型对训练数据太敏感换一批数据就大变属于“学太死”。噪声数据本身不可约的随机波动。模型越复杂偏差越低能拟合更细的模式但方差越高把噪声也拟合进去了。过拟合就是方差主导了误差。为什么深度学习模型动辄上亿参数训练集就十万张图还能正常工作这里面有个现代深度学习的反直觉事实参数远多于样本的过参数化模型用SGD类的优化算法找到的解恰好是泛化良好的“隐式正则化”解。SGD的噪声、小批量的随机性、隐式的权重衰减都在扮演正则化的角色。但即便如此一旦训练集太小或者模型太大、训练步数太长过拟合还是会来敲门。4.2 判断过拟合的三个阶段看训练loss和验证loss的曲线比看任何指标都直接健康期训练loss下降验证loss同趋势下降。模型在真正学习可泛化的规律。临界期训练loss继续下降验证loss开始持平。模型开始“记住”那些不具代表性的训练样本特有模式。过拟合期训练loss一路向下验证loss回头向上。模型已经大规模背题了泛化能力实质性变差。这三阶段的分类判断很简单唯一要注意的是别用验证集反复调参导致信息泄漏最好再分出一个测试集。验证集每隔多少轮看一次、基准是多少要提前定好否则你就是“看着答案改答案”。4.3 缓解过拟合的实战手段排序我最常给新手的建议是按成本从低到高去试数据增强翻转、裁剪、颜色抖动、MixUp。这是几乎所有视觉任务的第一道防线它直接扩大了训练分布让模型看到更多合法的输入变体。数学上等价于在训练样本周围引入一个“邻域平滑”降低了模型对特定像素位置的过度依赖。NLP对应的是同义词替换、文本噪声注入。成本极低效果极好。早停Early Stopping盯住验证loss当它在连续比如10个epoch内没有改善就回滚到历史最好参数。表面看是工程技巧本质上是限制模型到达那个“背题”的区域。几乎所有认真训练过的模型都能从早停里获益。权重衰减Weight Decay在损失函数里加 (\lambda |\theta|^2)。它会持续推动权重向零收缩等价于限制模型的“有效容量”。L2正则化还有个温和副作用权重小会让各维度输出变化更平滑决策边界更柔和。Adam里实现weight decay要特别小心原始Adam论文里的weight decay实现效果和L2正则化并不等价后续有一篇论文专门指出了这个问题。现在深度学习框架里Adam和AdamW是分开的AdamW把权重衰减从梯度自适应之外单独做了效果更好用它就行。Dropout前向传播时随机以概率p丢弃神经元。训练时模型相当于在集成大量“瘦身网络”推理时不丢弃并对权重做缩放。这种隐式集成对全连接层特别有效但对卷积层效果一般。留意一点加了Dropout之后训练集的收敛速度会明显变慢这是正常的别因为训练loss降得慢就急着调低dropout率。标签平滑上一节提过本质上是给硬标签加熵迫使模型不要过度自信。4.4 一个典型案例模拟项目X的训练过程复盘去年我在某公司带一个图像分类需求数据大概两万张图类别15类。训练一个标准的残差网络跑了30轮之后训练acc到了99.8%验证acc却卡在84%上下浮动。所有人都知道这是过拟合但解决过程还是踩了几个坑。一开始加到0.5的Dropout验证acc掉得更低了后来明白Dropout加得太猛会损伤表征学习能力降低收敛质量。然后试了数据增强做了随机裁剪和翻转验证acc涨到88%接着加Label Smoothing涨到89.5%最后配合余弦衰减的AdamW和早停验证acc稳定在91%。整个过程都是在训练loss和验证loss的曲线上做小步调整没有一次大改模型结构。我踩过的坑和经验总结成一句话过拟合适配的调整要“小步试探、逐项叠加”一次只改一个变量看验证曲线再动下一个。所有手段一起上效果可能是负面的——正则化本质上是“用容量换泛化”过度正则化等于把模型变成呆瓜。5. 归一化BatchNorm与LayerNorm的相似与分野归一化Normalization在深度学习里是个比“优化器”更值得深挖的话题。思想来源于一个简单观察如果神经网络的输入是均值为0、方差为1的数据训练就顺滑得多。那能不能不只是输入层而是每一层中间的特征都做这种标准化BatchNorm和LayerNorm分别从两个方向回答这个问题。5.1 内部协变量偏移与BatchNorm的解法早期训练深层网络有一个经典痛点前面层的参数一变后面层的输入分布就跟着变模型要不断适应新的分布收敛很慢。学术上叫“内部协变量偏移”Internal Covariate Shift。BatchNorm的思路是在每一层输出之后强行做一次标准化[ \hat{x} \frac{x - \mu_{\text{batch}}}{\sqrt{\sigma_{\text{batch}}^2 \epsilon}} ]其中 (\mu_{\text{batch}}) 和 (\sigma_{\text{batch}}) 是当前mini-batch在该特征维度上的均值和方差。注意是对“batch维”统计的。标准化之后再引入两个可学习参数 (\gamma) 和 (\beta)[ y \gamma \hat{x} \beta ]为什么标准化之后还要再缩放平移因为强制把数据变成0均值1方差未必对每层都最优。(\gamma) 和 (\beta) 是让网络自己决定“最合适的分布”是什么——如果它对某种分布更有利可以学回来。(\gamma) 初始为1、(\beta) 初始为0所以一开始就是纯归一化随着训练再慢慢调整。一个很少被认真讲清楚的点是BatchNorm为什么能加速收敛除了让数据分布稳定它还有一个重要机制——让损失曲面变得更平滑。有研究指出BN在参数空间中消除了损失函数的部分伸缩性使梯度方向的“尺度”更一致从而可以用更大的学习率收敛速度因此大幅提升。这也是为什么很多用了BN的网络可以放心把学习率调高一到两个数量级还不出乱子。5.2 训练与推理行为不一致的那些坑BatchNorm在推理阶段的行为和训练阶段完全不同。训练时统计当前batch的均值和方差推理时没有batch的统计量或者batch太小直接用训练阶段维护的滑动平均[ \mu_{\text{test}} \text{RunningMean}, \quad \sigma_{\text{test}}^2 \text{RunningVar} ]这种差异在正常情况没有问题但跨batch长度波动大的场景就会出事——比如在线学习和序列预测。典型的例子是NLP的任务同一个batch内部句子长度差异悬殊padding多的样本会让统计数据被大量无意义的0拉偏BN表现就很不稳定。我踩过一个大坑训练时用大batch如128到部署时输入是一条一条来的推理结果和训练时相比明显漂移。排查了很久才发现是BN的滑动统计量不准。后来养成了一个习惯训练结束前把BN设置为eval模式再在部分训练数据上“校准”一下滑动均值方差推理偏差就小了很多。BN还有一个batch size依赖的硬伤。当batch size小到4、8这种规模均值和方差本身噪声就大用这样的统计做归一化反而有害。在检测、分割这类输入分辨率高导致单卡只能放一两个样本的任务里小batch是常态BatchNorm经常拖后腿。解决方案要么跨卡同步统计SyncBN增大有效统计量要么干脆换用LayerNorm。5.3 LayerNorm面向样本内统计的归一化LayerNorm不沿batch维统计而是沿着特征维对单个样本所有神经元做归一化[ \hat{x}i \frac{x_i - \mu{\text{layer}}}{\sqrt{\sigma_{\text{layer}}^2 \epsilon}}, \quad y_i \gamma_i \hat{x}_i \beta_i ]这里的 (\mu_{\text{layer}}) 和 (\sigma_{\text{layer}}) 是同一个样本在某一层的所有神经元上的均值和方差。关键差异在于它完全不依赖batch里有多少样本对batch size没有要求也不区分训练和推理阶段。因此在NLP里LayerNorm是绝对主流。为什么Transformer用的都是LayerNorm而不是BatchNorm三个层面第一NLP的输入是变长序列句子长度不同会导致padding差异极大batch内统计不可靠第二Transformer层内特征的维度相对固定沿特征维归一化天然适配注意力机制的内部结构第三LayerNorm不受batch size限制从单样本到大批量行为一致部署时不会有训练/推理的统计量漂移问题。这里还有个值得说的细节LayerNorm的“横向归一化”直觉上有点像在问“这个神经元在自己整个层的神经元群里面处于什么相对位置”。思想类似于考点标准化——不同学生各科难度不同直接把分数对比不公平但如果把每科成绩内部标准化成Z分数再比较跨科目可比性就强了。Transformer的各个位置、各个头的输出混合在一起用LayerNorm做这种“相对化”处理非常合适。5.4 BatchNorm与LayerNorm的对照与选型决策维度BatchNormLayerNorm统计维度沿batch统计每个特征通道独立沿特征/隐藏层统计对每个样本独立依赖batch size是batch小则统计噪声大否样本间互不影响训练/推理差异有训练用batch统计推理用滑动平均无行为一致适用场景视觉任务、大batch训练NLP、序列模型、小batch任务对学习率的容忍度较高可用更大学习率相对温和典型位置卷积层之后、激活之前/之后注意力层之后、FFN之前从工程选型角度看我自己的经验是CNN结构化图像任务优先BatchNormTransformer或RNN优先LayerNorm多模态任务或者批量较小、推理需求多变的场景LayerNorm省心得多。还有一些细节BN通常在激活函数之前pre-activation效果好这有论文支持Transformer里LN更常放在子层输出之后、残差连接之前Post-LN后来又出现Pre-LN变体稳定性更好。两个归一化方法都不是什么暗黑魔法核心都是把数据的尺度控制住让梯度传播和优化过程更健康。区别只是“在哪个维度上做统计”而已但正是这个维度选择决定了它们各自适用的战场。6. 六块基石串起来组合使用的实际策略标题列出的六个概念并不是六个独立零件它们协同工作的方式才是深度学习训练的真正核心。我最后用一段实战场景把它们串起来讲。先看完整的训练回路初始化参数输入一个batch数据经网络前向传播计算损失交叉熵或均方误差反向传播得到梯度优化器SGD或Adam用梯度更新参数归一化层同时维护着自己的统计量。每一轮梯度下降提供基本更新逻辑Adam优化器调节每一步的步长和方向BatchNorm或LayerNorm稳定每层的数据分布熵以损失函数形式告诉我们预测与真值的差距而过拟合控制手段决定模型最终停在哪里。六者缺一不可。举个例子训练一个图像分类网络。输入图片先经过卷积特征提取器每层输出后接BatchNorm规整分布、平滑损失面和ReLU损失函数是Softmax交叉熵利用熵的梯度优雅性优化器用AdamW自适应步长正则化配学习率余弦退火同时做随机裁剪和翻转数据级过拟合抑制、监控验证loss并早停训练级过拟合抑制。如果出现过拟合迹象平滑地引入Label Smoothing如果batch size太小导致BN不稳考虑SyncBN或直接局部换成LayerNorm。这些决策背后都有前面几节说过的数学原理在撑着而不是凭感觉拍脑袋。我在实际项目中见过太多人把优化器、归一化、正则化当作独立调参变量各自调一遍效果不好就说模型不行。其实问题往往在于它们之间的耦合换个归一化方法最优学习率完全不同换个优化器正则化强度要重调加了数据增强后原本过拟合的模型需要的Dropout率反而可以降一些。建议做法是把这些要素当成一个整体系统看待每动一项后至少等上一个完整的学习率调度周期再评估。最后说一个个人经验。当我被困在一个模型训练不上不下的状况里时检查顺序通常是固定的先看数据有没有错shuffle是否做了、标签对不对、归一化对不对再看损失有没有算对数值稳定性、NaN、梯度爆炸然后看优化器和学习率Adam下不去就试SGDSGD发散就减学习率最后才动网络结构和归一化层。把数学基础打好之后这一套排查思路基本可以靠直觉走通不用在键盘前面干瞪眼。希望这篇内容能帮你在训练深度模型时少走一点弯路至少知道每一环在为什么服务。
阅读完成 · 觉得有帮助?
咨询建站