游乐游手机版
首页/AI热点日报/热点详情

深度学习模型优化:数据、模型、训练三方面关键技巧

类型:热点整理2026-07-22
深度学习模型优化涉及学习率动态调整、权重初始化、Dropout、数据增强、多模型融合及差分学习率等技巧。余弦退火与热重启、过拟合小数据集验证、多尺度训练及交叉验证也有效。优化器选择上,Adam收敛快但SGD泛化更好,需根据任务权衡。

在深度学习模型训练(炼丹)过程中,掌握一些实用技巧能显著提升效率与效果,涉及超参数学习率选择、权重初始化、数据与模型优化等关键环节。下面逐一拆解这些核心方法,帮助你少走弯路。

寻找合适的学习率(learning rate)

学习率无疑是深度学习中最重要的超参数之一。面对不同规模的数据集、不同的batch size、不同的优化器以及不同的任务场景,最优学习率几乎不存在通用值——仅凭经验猜测往往不可靠。唯一可行的策略是在训练过程中动态寻找当前状态下最合适的lr值。

例如,利用fastai中的lr_find()函数,观察学习率与损失曲线,找到损失下降最快的区间,对应的学习率就是一个不错的起点。下图展示了一个典型示例,曲线显示1e-2左右比较合适。

对此感兴趣的话,可以进一步参考Sylvain Gugger的博客《How Do You Find A Good Learning Rate》以及论文《Cyclical Learning Rates for Training Neural Networks》。

学习率与batch size的关系

一般来说,batch size越大,学习率也应相应增大。原理很简单:大批量样本计算出的梯度方向更加稳定,置信度更高,步长可以适当加大;而小批量数据方差较大,容易偏离方向,因此需要使用更小的学习率来保证训练稳定。下面这张图直观展示了不同batch size下Loss与Lr之间的关系。

如果显存许可,建议直接使用较大的batch size进行训练——只要找到合适的学习率,收敛速度会明显加快。此外,大batch size还能避免Batch Normalization的一些小问题,PyTorch相关的Issue中有详细讨论。

权重初始化

权重初始化在实际项目中其实并不常用——大多数场景下我们直接加载预训练模型,比如ImageNet上训练好的权重,完全不需要自己从头初始化。只有那些没有预训练模型的领域,或者模型最后的几个全连接层,才需要手动进行初始化。

常见的初始化方法包括kaiming_normalXavier_normal。如果不加以初始化,收敛速度会变慢,甚至影响最终性能。

相关论文参考:

  • Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification
  • Understanding the difficulty of training deep feedforward neural networks
  • Xavier初始化论文
  • He初始化论文

具体公式(设网络输入大小为n_in,输出大小为n_out):

  • 均匀分布初始化:
    Xavier(适用于tanh、sigmoid):W ~ U(-√(6/(n_in+n_out)), √(6/(n_in+n_out)))
    He(适用于ReLU):W ~ U(-√(6/(n_in)), √(6/(n_in)))
  • 高斯分布初始化,均值0,标准差:
    Xavier:stdev = √(2/(n_in+n_out))
    He:stdev = √(2/n_in)
  • SVD初始化:对RNN效果较好,参考论文《https://arxiv.org/abs/1312.6120》

Dropout

Dropout即以一定概率暂时将神经元从网络中丢弃——注意是“暂时”,每个mini-batch都在训练不同的网络,相当于bagging集成,能有效减少方差。通常在全连接层使用dropout,卷积层参数较少,加dropout对泛化能力提升有限,因此一般不推荐。不过不要无脑添加,只有在效果明显时才使用。

实操中,全连接层往往位于网络的开始和结尾,而hidden layers通常是卷积层。因此,一般在全连接层采用较大概率的dropout,卷积层则使用低概率甚至不用。

数据集处理

主要包括数据筛选数据增强。fastai中的图像增强技术较为完善,值得参考借鉴。此外还有难例挖掘(hard negative mining),即分析模型难以正确预测的样本,并针对性地进行优化。

多模型融合

Ensemble是提升最终结果的终极手段,常用方式包括:

  • 同一参数不同初始化
  • 不同参数交叉验证选出最优几组
  • 同一参数不同迭代阶段的模型
  • 不同结构模型线性融合(例如RNN+传统模型)

具体融合方法:

  1. 直接融合概率(probs):model1 probs + model2 probs + model3 probs → final label
  2. 投票法:各模型输出label,投票决定最终label
  3. 先对每个模型多次预测(不同随机种子),将多次probs融合得到该模型的label,再跨模型投票

这些方法的效果取决于label数量、数据集规模等因素,没有绝对最优解,本质上是probs融合与投票法的各种排列组合。

差分学习率与迁移学习

迁移学习非常常见:用预训练模型(如ImageNet)的权重来初始化自己的任务。虽然领域不同,但底层特征仍然具有共性。下图展示了从Model A迁移到Model B的过程。

差分学习率就是针对不同层设置不同的学习率。一般来说,卷积层学到的是通用特征,应该设置较低的学习率;全连接层学习的是任务相关特征,可以设置较高的学习率。这样训练效果会更好。

上图来自towardsdatascience.com上的一篇迁移学习教程。

余弦退火(Cosine Annealing)与热重启随机梯度下降

余弦退火是指学习率按照余弦函数形状逐渐下降;热重启则是在下降过程中突然跳回一个较高的值,然后继续下降。两者结合的效果如下图所示:

更详细的介绍可参考知乎文章《机器学习算法如何调参?这里有一份神经网络学习速率设置指南》,以及论文《SGDR: Stochastic Gradient Descent with Warm Restarts》。

尝试过拟合一个小数据集

这是一个经典但很多人忽视的技巧:关闭正则化、dropout、数据增强,仅使用训练集的一小部分,让神经网络跑几个epoch。如果能够实现零损失,说明模型能够正常学习;如果做不到,很可能是代码或配置存在问题。

多尺度训练

多尺度训练通过输入不同分辨率的图像,让网络充分学习不同尺度下的特征,既能提升性能,也能缓解过拟合。YOLOv2论文中明确使用了这一技巧。

不过并非所有任务都适合——多尺度本质上是一种特殊的数据增强。最好先可视化缩放后的图像,确认没有破坏关键信息,否则反而会误导模型。

交叉验证(Cross Validation)

交叉验证主要用于数据不充足时的重复利用。日常中把数据分成训练集和验证集,其实就是1折交叉验证。注意:测试集不参与交叉验证,它是最终衡量算法效果的独立数据。

Kaggle比赛中5折交叉验证很常用:将训练集随机分成5份,轮流用4份训练、1份验证,循环5次。还有一种留一交叉验证(Leave-one-out),n折(n等于样本数),计算量巨大,只适合小数据集。

吴恩达在课程《The nuts and bolts of building applications using deep learning》中也提到过这一点。

优化算法

不同优化器各有利弊,实际中最常用的是Adam和SGD+Momentum。

  • Adam:能够解决一些奇怪的问题(比如loss降不下去,换Adam立刻好转),但也可能带来新的问题(比如词向量更新异常、与L2正则的复杂耦合)。遇到问题可以尝试魔改Adam(如MaskedAdam、AdamW)。
  • SGD+Momentum:收敛较慢但泛化能力通常更好。很多论文都推荐:从1.0或0.1的学习率开始,每隔一段时间在验证集上检查,如果loss不再下降,就把学习率减半。也可以先用Adam训练,快收敛时换成SGD继续训练。

经验上,AdaDelta在分类任务中效果较好,Adam在生成任务中表现更佳。如果不考虑时间成本,SGD更值得信赖——只是需要花时间调整学习率和初始权重。

数据预处理方式

  • Zero-center:常用。
  • PCA whitening:相对少用。

训练技巧汇总

  • 梯度归一化:计算出的梯度除以mini-batch size。
  • 梯度裁剪:限制最大梯度值(如5、10、15),防止梯度爆炸。
  • Dropout对小数据集防止过拟合效果很好,值一般设为0.5。位置有讲究:RNN建议放在输入→RNN和RNN→输出的位置。
  • 激活函数尽量不用sigmoid(除非需要输出0-1)。sigmoid在(-4,4)之外梯度接近0,容易梯度消失,且输出不是0均值。
  • RNN的dim和embedding size一般从128附近调试,batch size也从128附近开始。
  • Word2vec初始化在小数据上能有效提高收敛速度和最终效果。
  • 尽量对数据做shuffle。
  • LSTM的forget gate bias初始化为1.0或更大值,有助于收敛(参考Jozefowicz等人论文)。
  • Batch Normalization通常能提升效果。
  • 如果模型输入输出维度相同,可考虑将全连接层替换为Highway Network,给输出加一个门控,提升效果。
  • 来自张馨宇的技巧:一轮加正则、一轮不加正则,反复进行。
  • 大数据集先拿1/100或1/10的数据试跑,估算全量数据所需时间,避免盲目开跑。
  • Subword在稳定涨点,只管使用。
  • GPU上报错时尽量放到CPU重跑,错误信息更友好。例如“loss = NaN”可能是输入ID超出softmax词表范围。
  • 确定初始学习率时,从一个极小值(如1e-7)开始,每步指数增大(如1.05倍),训练几百步观察loss曲线,选择下降最快那段对应的学习率。
  • 不考虑时间成本时,batch size=1可以作为一种很强的正则化(Alex Graves实验常设batch size=1)。
  • 注意实验的可复现性和记录习惯,否则分析不出结论。
  • 超参数中学习率最重要,推荐尝试余弦学习率和循环学习率;其次是batch size和weight decay。模型表现不错后,再考虑数据增强和损失函数改进。
来源:https://m.elecfans.com/article/2390964.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。