深度学习 超参数调整策略

超参数调整

一、前言

关于深度学习模型训练,最难的事情之一是需要处理大量的参数。无论是从网络本身的宽度和深度、连接方式,还是损失函数的超参数设计和调试,亦或者是学习率、批样本数量、优化器参数等,这些大量的参数都会对我们的网络模型产生直接或间接的影响。面对如此众多的参数,如果我们要逐一优化调整,所需的时间和资源都是不切实际的。结果证实,一些超参数比其它的更为重要,因此,认识各个超参数的作用及其可能会造成的影响是深度学习模型训练中必不可少的一项重要技能。

超参数调整可以说是深度学习中理论和实际联系最重要的一个环节。目前,深度学习仍存在许多不可解释的部分,如何设计并优化出优秀的网络可以为深度学习理论的探索提供重要支持。超参数调整通常分为手动调整和自动优化超参数两种。

二、超参数概念

1. 什么是超参数,参数和超参数的区别

区分两者的关键在于是否通过数据进行调整。模型参数通常是由数据驱动调整的,而超参数则不需要数据驱动,是在训练前或训练中人为调整的参数。例如,卷积核的具体核参数是模型参数,由数据驱动调整,而学习率则是人为调整的超参数。需要注意的是,卷积核的数量和尺寸通常也被视为超参数,这与卷积核的具体参数不同。

2. 神经网络中包含哪些超参数?

通常可以将超参数分为三类:网络参数、优化参数、正则化参数。

  • 网络参数:包括网络层之间的交互方式(如相加、相乘或串接)、卷积核的数量和尺寸、网络层数(深度)和激活函数等。
  • 优化参数:一般指学习率、批样本数量、不同优化器的参数及部分损失函数的可调参数。
  • 正则化参数:如权重衰减系数、丢弃比率(dropout)。

3. 为什么要进行超参数调优?

超参数调优的目的是优化模型,找到最优解与正则项之间的关系。网络模型优化的目的是找到全局最优解(或相对更好的局部最优解),而正则项则希望模型能更好地拟合到最优。两者虽然存在一定对立,但目标是一致的,即最小化期望风险。模型优化希望最小化经验风险,但容易过拟合,而正则项用来约束模型复杂度。因此,如何平衡两者关系,得到最优或较优的解,就是超参数调整的目标。

4. 超参数的重要性顺序

  1. 学习率,损失函数上的可调参数

    • 学习率控制着训练中网络梯度更新的幅度,直接影响模型的有效容限能力。
    • 损失函数的可调参数需要结合具体的损失函数来调整,影响模型的有效容限能力。
    • 举例:度量学习中的Center loss,通常结合交叉熵损失,用于特定任务的优化。
  2. 批样本数量,动量优化器的动量参数β

    • 批样本数量决定了梯度下降的方向。过小的批样本数量会导致难以收敛,尤其在存在批归一化时,而过大的批样本数量容易陷入局部最优解。
    • 动量参数β用于加快训练,帮助避免陷入局部最优解。
  3. Adam优化器的超参数、权重衰减系数、丢弃比率和网络参数

    • 这些参数在大部分实践中不建议过多尝试。
    • Adam优化器中的β1,β2,ϵ,常设为0.9、0.999、10^-8即有不错表现。
    • 权重衰减系数建议值为0.0005,dropout建议比率控制在0.2到0.5之间。

5. 部分超参数如何影响模型性能

超参数影响模型容量的方式原因注意事项
学习率调至最优,提升有效容量过高或过低的学习率都会影响优化效果,降低模型有效容限。学习率的最优点在训练的不同阶段可能变化,需要有效的学习率衰减策略。
损失函数部分超参数调至最优,提升有效容量损失函数的超参数会影响优化过程,错误的超参数设置会使模型难以优化。部分损失函数超参数对结果敏感,调整时建议参考论文的推荐值。
批样本数量过大或过小,降低有效容量大部分情况下,选择适合硬件容量的批样本数量即可。特殊任务(如度量学习中的N-pair loss)可能依赖于批样本数量。
丢弃法比率降低提升模型容量较少的丢弃参数意味着参数量的增加,提升模型容量。-
权重衰减系数调至最优,提升有效容量权重衰减可以限制参数变化幅度,起到正则作用。-
优化器动量调至最优,可能提升有效容量动量参数用于加快训练,避免陷入局部最优解。-
模型深度同条件下,深度增加,模型容量提升增加模型深度意味着参数增多,拟合能力增强。模型深度越深,所需时间和硬件资源也越多。
卷积核尺寸尺寸增加,模型容量提升增加卷积核尺寸意味着参数量的增加。-

6. 部分超参数合适的范围

lr部分
SGD: [1e-2, 1e-1]
momentum: [1e-3, 1e-2]
Adagrad: [1e-3, 1e-2]
Adadelta: [1e-2, 1e-1]
RMSprop: [1e-3, 1e-2]
Adam: [1e-3, 1e-2]
Adamax: [1e-3, 1e-2]
Nadam: [1e-3, 1e-2]
超参数建议范围注意事项
初始学习率SGD: [1e-2, 1e-1] momentum: [1e-3, 1e-2] Adagrad: [1e-3, 1e-2] Adadelta: [1e-2, 1e-1] RMSprop: [1e-3, 1e-2] Adam: [1e-3, 1e-2] Adamax: [1e-3, 1e-2] Nadam: [1e-3, 1e-2]这些范围适用于从头开始训练的情况。微调时,初始学习率可降低一到两个数量级。
损失函数部分超参数多个损失函数之间,损失值尽量相近,不建议超过或低于两个数量级这是指多个损失组合的情况,单个损失超参数需结合实际情况。
批样本数量[1:1024]批样本数量过大(大于6000)或为1时,需调整学习策略或内部归一化方式。
丢弃法比率[0, 0.5]-
权重衰减系数[0, 1e-4]-
卷积核尺寸[7x7], [5x5], [3x3], [1x1]-

三、超参数调整方法

在手动调整超参数的过程中,可按照以下步骤进行:

  1. 初始训练:首先设置合适的初始学习率,测试小范围不同批样本数量下的效果。
  2. 单一超参数调整:针对一个超参数,固定其他参数,进行调整和验证。
  3. 重复和精细调整:逐步缩小范围,重复调整和验证,直到获得较为稳定的超参数组合。

1. 如何选择激活函数

选择一个适合的激活函数并不容易,需要考虑很多因素。通常的做法是,如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或测试集上进行评价,选择表现更好的那个。

以下是常见的选择情况:

  • 如果输出是 0、1 值(二分类问题),输出层选择 sigmoid 函数,其他的所有单元都选择 ReLU 函数。
  • 如果在隐藏层上不确定使用哪个激活函数,通常使用 ReLU 激活函数。有时,也会使用 tanh 激活函数,但 ReLU 的一个优点是:当是负值时,导数等于 0。
  • sigmoid 激活函数:除了输出层是一个二分类问题外,基本不会使用它。
  • tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
  • ReLU 激活函数:最常用的默认函数,如果不确定用哪个激活函数,就使用 ReLU 或者 Leaky ReLU,再去尝试其他的激活函数。
  • 如果遇到了一些死的神经元,可以使用 Leaky ReLU 函数。

2. 如何调整 Batch Size

  • Batch Size 太小,模型表现效果极其糟糕(error 飙升)。
  • 随着 Batch Size 增大,处理相同数据量的速度越快。
  • 随着 Batch Size 增大,达到相同精度所需要的 epoch 数量越来越多。
  • 由于上述两种因素的矛盾,Batch Size 增大到某个时候,达到时间上的最优。
  • 由于最终收敛精度会陷入不同的局部极值,因此 Batch Size 增大到某些时候,达到最终收敛精度上的最优。
  • 根据自身显卡显存情况,一般使用 32/64 倍数调整。

3. 调整学习率

在深度学习中,通过定义一个模型,并根据训练集上的数据估计最优参数。梯度下降法是一个广泛被用来最小化模型误差的参数优化算法。梯度下降法通过多次迭代,并在每一步中最小化成本函数(cost)来估计模型的参数。学习率 (learning rate) 控制模型的学习进度。

在梯度下降法中,通常给定统一的学习率,整个优化过程中都以确定的步长进行更新。 在迭代优化的前期,学习率较大则步长较长,可以较快地进行梯度下降;而在迭代优化的后期,逐步减小学习率的值,减小步长,这样将有助于算法的收敛,更容易接近最优解。因此,如何对学习率的更新成为了研究者的关注点。

在模型优化中,常用的几种学习率衰减方法有:分段常数衰减、多项式衰减、指数衰减、自然指数衰减、余弦衰减、线性余弦衰减、噪声线性余弦衰减。

学习率范围参考:
  • SGD: [1e-2, 1e-1]
  • momentum: [1e-3, 1e-2]
  • Adagrad: [1e-3, 1e-2]
  • Adadelta: [1e-2, 1e-1]
  • RMSprop: [1e-3, 1e-2]
  • Adam: [1e-3, 1e-2]
  • Adamax: [1e-3, 1e-2]
  • Nadam: [1e-3, 1e-2]

四、自动调参方法:随机搜索、网格搜索、贝叶斯优化等。

1.网格搜索与随机搜索

网格搜索是超参数调优中较为基础的方法。将各超参数分别在一个给定的范围内按固定步长进行遍历,并组合成不同的超参数集进行实验测试。

随机搜索是一种改进的网格搜索方法,通过随机采样给定范围内的超参数组合,相较于网格搜索效率更高。

from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier

# 假设已准备好训练数据
X_train, y_train = ...

# 定义模型
model = RandomForestClassifier()

# 定义超参数范围
param_grid = {
    'n_estimators': [100, 200, 300],
    'max_depth': [5, 10, 15],
    'min_samples_split': [2, 5, 10]
}

# 创建网格搜索实例
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3)

# 进行训练
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("Best parameters found: ", grid_search.best_params_)

2.贝叶斯优化

贝叶斯优化是一种高级的自动调参方法,通过构建代理模型对超参数空间进行探索。相比于网格搜索和随机搜索,贝叶斯优化能够更有效地找到最优超参数。

from skopt import BayesSearchCV
from sklearn.ensemble import RandomForestClassifier

# 定义模型
model = RandomForestClassifier()

# 定义超参数搜索空间
param_space = {
    'n_estimators': (10, 500),
    'max_depth': (1, 50),
    'min_samples_split': (2, 10)
}

# 创建贝叶斯优化搜索实例
bayes_search = BayesSearchCV(estimator=model, search_spaces=param_space, n_iter=32, cv=3)

# 进行训练
bayes_search.fit(X_train, y_train)

# 输出最佳参数
print("Best parameters found: ", bayes_search.best_params_)

五、实战经验

  • 初始学习率和批样本数量的选择

    • 这些参数的初始选择极其重要,决定了训练过程的稳定性和效率。可以采用指数递减或余弦退火等学习率衰减策略。
  • 损失函数的选取和调整

    • 损失函数的选取和其可调参数的设置对模型最终效果有着至关重要的影响,特别是在多任务学习或存在多种损失组合的情况下。
  • 正则化方法的使用

    • 使用适当的正则化方法(如L2正则化、dropout等)有助于防止模型过拟合。对于特定任务,可以考虑特定的正则化技术,如权重剪枝或蒸馏学习。

六、调试模型技巧

在讨论如何调试模型之前,需要澄清一个误区:数据是模型的根本。如果有一批质量优秀的数据,或者能够将数据质量处理得很好,往往比挑选或设计模型带来的收益更大。之后才是模型的设计和训练技巧。

1. 探索和清洗数据

探索数据集是设计算法之前最重要的一步。例如,在图像分类任务中,我们需要了解数据集的样本类别及其数量是否平衡,图像之间是否存在质量差异等。如果类别数远超样本数,那么普通方法可能效果不佳,此时可以考虑few-shot learning或数据增强。

2. 探索模型结果

在验证集上对模型结果进行深入分析是提升模型性能的重要步骤。通过训练集和验证集的结果对比,可以直观地分析模型的偏差和结果的正确性。例如,在样本不平衡的情况下,关注少样本类别的表现,进行数值和可视化分析,以确定模型的行为。

3. 监控训练和验证误差

首先,确认代码的正确性至关重要,特别是在训练和验证均存在问题时。其次,根据训练和验证误差追踪模型的拟合状态,对于小数据

集过拟合问题可能会更加显著,但并不是过拟合一定比欠拟合表现差,因此需结合具体任务衡量。

七、结语

超参数调整是深度学习模型训练中的一项重要任务,通过合理的超参数调优,模型性能可以大幅提升。虽然手动调优超参数需要耗费大量的时间和精力,但对于理解模型的内部机制和优化策略大有裨益。与此同时,自动调优方法的引入,如贝叶斯优化、网格搜索和随机搜索,可以大大提高调优的效率和效果。无论采用何种方法,超参数的调整都应基于数据和任务的具体特性,结合实际需求进行灵活应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值