☰
深度学习炼丹指南:损失函数、优化器与正则化核心概念解析
2026/10/1 18:41:21 网站建设 项目流程

深度学习圈子里常听到一句话:“炼丹不是玄学,但有时候比玄学还玄。”所谓“深度炼丹”,指的就是训练神经网络模型的过程——你要配数据、调参数、控火候,像古代道士炼丹一样反复试错,一炉不行再来一炉,直到炼出自己想要的那个“丹”(也就是一个表现良好的模型)。这篇博文就围绕深度炼丹中绕不开的核心概念展开,梳理损失函数、优化器、学习率、过拟合、正则化、Batch Size、数据划分等常见术语背后的原理与实操要点,给正准备踏入炼丹炉旁的新手一份“防炸炉指南”,也让已经有经验的同行能对照查漏补缺。


1. 炼丹炉与丹方:损失函数和优化器怎么选

1.1 损失函数:模型学习的方向盘

训练神经网络,本质上是在做一个“不断降低误差”的循环。误差怎么衡量?靠的就是损失函数。你选择什么样的损失函数,等于给模型定了一个“什么样算好、什么样算差”的评价标准。如果这个标准定错了,模型再努力也是白费。

分类任务中最常见的是交叉熵损失。拿图像分类来说,模型输出的是一个概率分布,交叉熵衡量的是“预测分布”和“真实标签分布”之间的差距。你可能会问,为什么不直接用“预测对了没”来当损失?因为“预测对不对”是离散的、不可导的,没法用梯度下降去优化。交叉熵平滑、可导,而且它惩罚“自信地错”:当模型把某个类别的置信度打得很高但其实是错的,交叉熵的梯度会非常大,逼着模型快速纠正。

回归任务则多用均方误差(MSE)。MSE把预测值和真实值的差平方,所以它对大误差特别敏感。这种“重罚大错”的特性在某些场景下是优点,但如果你的数据里有明显离群点,MSE会被这几个点牵着鼻子走,模型学出来的结果反而不稳。这时候可以考虑 Huber Loss,它在小误差时像 MSE,在大误差时切换成线性惩罚,兼顾敏感度和鲁棒性。

我还想提一个实战中容易忽略的点:当你做多标签分类(一个样本同时属于多个类别)的时候,用传统的 Softmax + 交叉熵是错的,因为 Softmax 强制所有类别概率加起来为 1,而多标签场景每个类别是独立的。正确做法是每个类别单独算 Sigmoid 交叉熵,再取平均。

注意:损失函数不是越复杂越好。能用一个简单的 CrossEntropy 解决的任务,不要上来就堆 Focal Loss、Dice Loss 这些花活。先跑通 baseline,再根据痛点(比如类别不均衡、小目标召回率低)针对性换损失函数。

1.2 优化器:从 SGD 到 AdamW 的演化逻辑

选定损失函数之后,接下来就是“如何沿着损失曲面往下走”的问题,这就是优化器的工作。初学者往往直接把优化器当成一个黑盒:选 Adam 就完事了。但理解每种优化器背后的思路,能帮你在炼丹遇到问题时知道该往哪个方向排查。

最朴素的 SGD(随机梯度下降)做的事情很简单:每个 batch 算完梯度后,直接沿着梯度的反方向走一步,步长就是学习率。SGD 的问题是收敛慢,而且容易在峡谷地带来回震荡。后来大家发现,给 SGD 加上动量(Momentum)就好多了——就像下山时带了个惯性,遇到小坑能直接冲过去,而不是每一步都被坑壁弹回来。

Adam 的贡献在于把“动量”和“自适应学习率”合在了一起。它对每个参数单独维护一个梯度累积量(一阶矩)和梯度平方累积量(二阶矩),这样大梯度参数的学习率会自动变小,小梯度参数的学习率会自动变大。听起来很完美对吧?实践中的确如此——Adam 在大多数任务上开箱即用,收敛速度明显快于 SGD,几乎不需要花太多心思调参。

但 Adam 也有一个让人头疼的毛病:泛化性能往往不如调好参数的 SGD。为什么呢?一个比较主流的解释是,Adam 的自适应机制会让权重更新路径更曲折,最终落在损失曲面的“平坦区域”或“尖锐区域”的倾向不同,而尖锐区域的解往往泛化差。于是 AdamW 出现了——它把权重衰减(L2 正则)和 Adam 的更新步骤解耦,不再把正则项混进梯度里,而是单独在参数更新时做衰减。实测下来,AdamW 在很多任务上能兼顾 Adam 的快速收敛和接近 SGD 的泛化表现。

如果你炼丹有些时日了,可能会玩过更进阶的优化器,比如 LAMB、Lion。LAMB 主要用于大批量训练,能在一个 batch 上万的情况下保持稳定;Lion 则是 Google 提出的新配方,它在很多视觉任务上效果比 AdamW 好,但有个坑——它对学习率非常敏感,需要仔细调。

优化器核心思路优点典型痛点
SGD直接沿负梯度方向更新简单、泛化好、可解释收敛慢、易震荡
SGD+Momentum梯度累积惯性加速收敛、越过局部坑仍依赖全局学习率
Adam自适应学习率+动量开箱即用、收敛快泛化不如 SGD
AdamW解耦权重衰减兼顾速度和泛化超参数仍敏感
Lion符号梯度更新效果强、显存省学习率极敏感

1.3 学习率:炼丹的火候,不能大火一直烧

如果说优化器决定了“怎么走”,那学习率决定的就是“每一步走多大”。学习率大了,步子迈太大,损失函数容易震荡甚至直接发散;学习率小了,训练半天损失都不怎么动。

深度学习框架里的学习率默认值往往是 0.001(比如 PyTorch 的 Adam 默认就是 lr=1e-3),但这不是什么“官方推荐值”,只是一个对大多数任务不至于搞砸的保守选择。实际操作中,我会先用一个小脚本做学习率扫描:从一个很小的值(比如 1e-6)开始,每个 step 以指数方式增大到 1(比如 1e-2),同时记录 loss 的变化曲线,看看 loss 在哪个区间下降最快。这个区间基本就是合适的学习率范围。

训练过程中,学习率也不是一成不变的。常见做法是配合学习率调度器(Scheduler)使用:先用热身(Warmup)让学习率从一个小值慢慢升到设定值,避免模型一开始就在不稳定的方向猛冲;到达峰值后,再用余弦退火(Cosine Annealing)或逐步衰减(Step Decay)把学习率降下来,让模型在损失曲面的底部做精细化收敛。

实操心得:我在训练视觉模型时,常用的一条基准线是“warmup 5 个 epoch 到 1e-3,再用 cosine 调度降到 1e-5”。这套组合在大多数分类、检测任务上都能跑出不错的效果。如果你想快速验证某个想法,不要上来就精调学习率,直接用这套默认调度跑一轮,先把主要矛盾解决掉。


2. 火候与时辰:训练过程中的关键参数

2.1 Batch Size:一把抓还是小口吃

Batch Size 可能是炼丹炉前最影响“手感”的一个旋钮——调大调小,训练速度和最终效果都会变。它决定了模型每次更新参数前“看一眼多少样本”。Batch Size 为 2 的幂次方(8、16、32、64……)因为对齐了 GPU 内存的访问模式,效率最高,这个属于老生常谈,但真正值得聊的是它对梯度质量的影响。

大 Batch Size 的梯度是更多样本的平均,方向更准、更平滑,所以可以用更大的学习率,训练也更快。但另一方面,大批量的梯度容易让模型收敛到“尖锐极小值”——训练误差很低,但测试误差偏高,泛化能力差。小 Batch Size 的梯度噪声大,反而有一种“随机扰动”的效果,这种扰动让模型有机会跳出糟糕的局部极小值,最终落到更平坦、泛化更好的区域。

这个矛盾在实践中的平衡点往往是:Batch Size 设成显存能承载的最大值的 1/2 到 1/4,配合线性缩放学习率规则(Batch Size 翻倍,学习率也翻倍)来补偿。

2.2 Epoch 与 Iteration:炼几炉才算够

Epoch 是训练集完整过一遍的次数,Iteration(也叫 Step)是参数更新一次的次数。两者之间的关系很简单:每个 Epoch 的 Iteration 数 = 训练集样本数 ÷ Batch Size。假如你有 10000 张图,Batch Size 是 100,那么每个 Epoch 就有 100 次 Iteration。

“炼几炉才算够”没有标准答案——Epoch 太少,模型欠拟合;Epoch 太多,模型过拟合。判断依据主要看验证集的表现曲线:验证 loss 不再下降、甚至开始回升,说明训练到了该停的时候。这时候再继续炼,只是浪费电力和时间。

实际工作中,我通常的做法是:先设定一个比较大的总 Epoch 数(比如 300),配合 Early Stopping(早停机制)在验证集不再改善时自动停止训练。这样可以放心大胆让模型多跑一会儿,又不会真的把电费烧完。

2.3 学习率调度:大火转中火再转小火

训练的过程像煲汤,先大火烧开(Warmup 阶段快速提升学习率),再中火慢炖(主体训练阶段保持较高学习率),最后小火收汁(退火阶段降低学习率精细调整)。三个阶段缺一不可。

Warmup 存在的必要性和模型状态有关。训练初期,模型的权重还处于随机状态,梯度的方向可能非常离谱。如果一上来就用大学习率,模型可能被推到损失曲面的一个极端位置,后面怎么拉都很难拉回来。Warmup 给了模型一个“先站稳再跑”的机会。

退火阶段的意义在于收敛。学习率在训练后期仍然保持高位,参数会在极小值附近来回震荡,永远走不到“谷底”。把学习率降下来,相当于把步幅缩小,让模型能慢慢挪到更精确的位置。余弦退火是现在用得最多的方案,因为它平滑且无需人为干预;Step Decay(每隔固定 epoch 缩小学习率)更适合你明确知道训练在第几个阶段、需要什么学习率的时候。


3. 过拟合与正则化:防止丹炉炸裂

3.1 过拟合:背答案的坏学生

过拟合是炼丹过程中最常见的“炸炉”事件——训练集上分数很高,一到验证集、测试集立刻露馅。它本质上是模型把训练集里的噪声也当成了规律,死记硬背了答案,而不是学会了推理。

怎么判断过拟合?最简单的方法是观察训练 loss 和验证 loss 的差距。如果训练 loss 持续下降但验证 loss 不降反升,这就是典型的过拟合信号。此外还可以看训练集准确率和验证集准确率的差值,差值越来越大,说明模型开始“念答案”了。

过拟合一旦出现,先不要急着加正则化或者换模型,先检查一下数据量是不是太少了、数据划分有没有问题、数据增强有没有做。如果这三个都没问题,再考虑用正则化手段把模型的自由度限制住。

3.2 正则化:给模型戴上镣铐

正则化的思路很简单:让模型“不要学得那么用力”。常用的手段有这么几种。

L2 正则化(权重衰减)是最常见的。它在损失函数后面加一项权重的平方和,训练时不仅要求预测误差小,还要求权重本身不要太大。这样模型被迫在“拟合训练集”和“保持简单”之间取平衡。PyTorch 里设置weight_decay参数即可,但注意 AdamW 和 SGD 对weight_decay的处理方式不同——AdamW 是解耦衰减,可以直接对应“权重衰减”的直觉;SGD 里的weight_decay则混在梯度里,实际效果接近 L2 正则而不是严格的权重衰减。

Dropout 则是在前向传播时随机让一部分神经元“闭嘴”,强迫模型不要过度依赖某几个神经元的组合,从而让网络的各个部分都能独立学到有用的特征。Dropout 适合用在全连接层附近,输入为 0.5 常见,中间层 0.3 左右常见。但 Dropout 在卷积层和 Batch Normalization 配合时效果反而会打折——BN 本身就有正则化效果,再叠 Dropout 属于重复用力。

数据增强是“天然的正则化”。对图像做随机裁剪、翻转、颜色抖动,让模型看到同一个样本的多种变换版本,相当于免费增加了训练数据的多样性,几乎不会损失什么,理应成为默认配置。文本领域则可以用 dropout、shuffle 等操作实现类似效果。

3.3 早停与模型保存:留一条后路

早停(Early Stopping)机制是炼丹人的好帮手。你事先设定一个 patience,比如验证 loss 连续 10 个 Epoch 没有改善就停。这样既不会错过最好的模型,也不会一直烧钱跑到崩溃。

模型保存需要注意是保存“当前 epoch 的模型”还是“最佳验证 loss 的模型”。我的习惯是:不只存最后一次的权重,而是存 best_model.pt 和 last_model.pt 两个文件。best_model.pt 用于最终评估和部署,last_model.pt 则方便你在验证曲线出现异常时回溯排查。

注意事项:如果你从某个开源仓库拿到一份预训练模型,先确认它的归一化方式、输入尺寸、pixel value 范围和你的数据是否一致。很多“换了模型效果反而变差”的案例,根因是对不上输入側的处理,而不是模型本身不行。


4. 炼丹原料的讲究:数据与预处理

4.1 训练/验证/测试集的划分不能儿戏

数据集划分是炼丹的第一步,但很多人喜欢随手写个train_test_split(test_size=0.2)就算完事。真正做项目时,我会分三份:训练集、验证集、测试集。三者各司其职——训练集负责训练权重,验证集用于调参、调模型、做早停,测试集只允许在最终评估时碰一次。

验证集和测试集的区别经常被忽略。验证集你每天都在用,调参调久了,模型会对验证集产生“过拟合”——不是数据意义上的过拟合,而是你作为炼丹师,已经在心里记住了哪些修改对验证集有效,会下意识地朝这个方向调。测试集则是最终的一场考试,你有且只能用一次,才能得到相对客观的模型能力评估。

划分比例常见的是 8:1:1 或 7:2:1,如果数据量特别大(百万级),验证集和测试集各留几千到几万条就够了,不需要按比例留一大块。对于分类任务还要注意分层抽样——保证每个类别的样本在训练集、验证集、测试集中的分布大致相近,特别是类别不均衡的时候,不然后果就是“训练集精度 90%,测试集精度 30%”这种惨剧。

4.2 数据增强:免费午餐也不可乱吃

数据增强是提升模型泛化能力性价比最高的手段,没有之一。特别在视觉领域,一张猫的图片水平翻转之后还是猫,这种“人类常识”的变换对模型而言却相当于看到了一张新样本,能有效扩大数据分布覆盖范围。

但“增强”不能无脑堆。强度拉得太猛,模型反而会学到一些奇怪的鲁棒性——比如把明明是一张清晰的狗图识别成猫,因为训练集里增强变形后的狗图已经失真到不像狗了。实践中我通常采用“轻到中等的默认增强”组合:随机水平翻转 + 随机裁剪 + 轻微颜色抖动。如果任务本身对颜色敏感(比如医学病理图,颜色是诊断依据),那颜色抖动这一类增强必须禁用。

对文本任务而言,数据增强相对受限。简单的做法有同义词替换、随机删除、回译等,但这些方法要保持语义不变,盲目使用容易引入错误标签。另一种思路是用对抗训练(如 FGM),在嵌入层加一点对抗扰动,既增强鲁棒性又不容易改变语义。

4.3 归一化与标准化:让模型站在同一起跑线上

神经网络对输入数据的尺度非常敏感。如果某个特征的数值范围是 0 到 1000,另一个是 0 到 1,前者会主导梯度,让模型很难学到后者的规律。归一化(Normalization)把每个特征缩放到 [0,1],标准化(Standardization)则让均值为 0、标准差为 1,两种做法在不同场景下各有优势。

图像领域最常见的做法是标准化到 [0,1] 之后再加一个基于 ImageNet 均值和标准差的标准化。很多模型在 ImageNet 上预训练时用的就是这套 mean/std,如果你迁移预训练模型,最好沿用同样的参数。这里有一个容易踩的坑:有些人看到模型的 checkpoint 里 mean 是 [0.485, 0.456, 0.406],std 是 [0.229, 0.224, 0.225],就照抄不误,但自己的数据集根本不在这个分布上。迁移学习时沿用这套参数问题不大,因为模型已经习惯了这个输入分布;但如果你从头训练一个模型,应该自己统计一下数据集的 mean 和 std。


5. 常见问题与排查技巧实录

5.1 Loss 不下降怎么办

Loss 不下降是炼丹时最焦虑的时刻。我一般按这个顺序排查:

第一,看看是不是数据出了问题。比如标签有没有错位、数据加载有没有把图像和标签对错。快速验证方法:取一小批数据(比如 16 张),跑一个 step,打印预测和标签,肉眼对比一下是否对得上。

第二,看看学习率是否合理。学习率设置过高,loss 可能震荡、跳动不下降;学习率设置过低,loss 可能前几个 epoch 几乎不动。可以用学习率扫描快速找到有效区间。

第三,看看网络的输出层是否匹配任务。分类任务最后有没有接对维度的全连接层?激活函数有没有写错?我见过有人做二分类却用了 Softmax 输出,导致 loss 计算方式完全对不上。

第四,检查激活函数有没有“死区”。ReLU 在训练初期如果遇到大量负输入,可能大量神经元直接“死亡”,梯度永远为 0,表现为 loss 一直不变。可以换成 LeakyReLU 或 SELU 试试。

5.2 梯度爆炸或消失

梯度过大或者过小,都会让训练变得极其困难。梯度爆炸常见于深层网络,loss 会突然跳到 NaN,或者权重变成无穷大。排查方法是配一个 gradient clipping,把梯度范数裁剪到一个合理范围(比如最大范数 1.0),这样可以避免一次异常大步子把整个训练搞崩。

梯度消失则表现为深层网络的前几层权重几乎不变,网络学不到底层特征。Batch Normalization 是解决这类问题的最强武器,它对每一层的输出做归一化,让梯度保持在合理范围。此外,残差连接(Residual Connection)也是利器——它给梯度提供了一条“近路”,让信号可以跨层直接传播,有效缓解深度网络的学习困难。

5.3 GPU 显存不足

显存溢出的报错信息简直是每个炼丹师的梦魇。除了直接调小 Batch Size,有几个方法可以尝试:开启混合精度训练(AMP),在 PyTorch 里一句话的事,显存占用能少一半,很多张量用半精度存储,在 NVIDIA 新的 GPU 上还有额外加速;使用梯度累积——小 Batch Size 多次前向,把梯度累加后再大更新一次,效果接近大 Batch Size;检查有没有不必要的中间变量被存下来,比如推理时用torch.no_grad()包住。

5.4 训练模型误导性指标:只看精确率而忽略召回率

训练分类模型时,常常容易陷入“精度越高模型越好”的错觉。实际上,对类别不均衡的数据(比如欺诈检测,99% 的正常样本、1% 的欺诈样本),一个把所有样本都预测为“正常”的模型,精度能做到 99%,但毫无实用价值。这种时候要关注的是 Precision(精确率)、Recall(召回率)、F1-score 这些指标。Precision 回答“模型预测为正例的样本里,有多少是真的正例”;Recall 回答“真正的正例里,有多少被模型找出来了”。两者的权衡取决于业务场景——垃圾邮件过滤可能更看重精准率,而癌症筛查更看重召回率,宁可误报也不能漏报。


写到这,回头想想自己从入门到现在的炼丹历程,最深的感触是:这些概念看起来各自独立,实际上串起来就是一个闭环——损失函数定义了目标,优化器和学习率决定了怎么逼近目标,正则化和数据增强明确了哪些“捷径”不能走,而数据划分和评估指标则帮你看清楚到底有没有真的拿到好丹。训练一个模型不像是搭积木,按部就班就能成功;它更像是“烹饪”——同样的配料、同样的火候,不同的人做出来味道就是不一样。差别在哪里?恰恰是那些失败过的实验、踩过的坑和调参时的直觉积累。如果你正在炼丹路上,不要怕试错,每一炉废丹都是下一炉好丹的养料。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询