【python深度学习】DAY 52 神经网络调参
- 随机种子
- 内参的初始化
- 神经网络调参指南
- 参数的分类
- 调参的顺序
- 各部分参数的调整心得
作业:对于day41的简单cnn,看看是否可以借助调参指南进一步提高精度。
一、随机种子
1.torch中使用随机数的场景
(1)权重、偏置的随机初始化
(2)数据加载(shuffling打乱)与批次加载(随机批次加载)的随机化
(3)数据增强的随机化(随机旋转、缩放、平移、裁剪等)
(4)随机正则化dropout
(5)优化器中的随机性
2.随机种子作用
(1)python的随机种子,需要确保random模块、以及一些无序数据结构的一致性
(2)numpy的随机种子,控制数组的随机性
(3)torch的随机种子,控制张量的随机性,在cpu和gpu上均适用
(4)cuDNN(CUDA Deep Neural Network library ,CUDA 深度神经网络库)的随机性,针对cuda的优化算法的随机性
二、参数初始化
-
避免梯度消失或爆炸:如果神经网络的权重初始化过大或过小,会导致梯度在反向传播过程中迅速消失或爆炸。例如,当权重初始化为非常小的值时,激活函数的导数可能接近于零,使得梯度在传播过程中逐渐减小,导致网络难以更新权重;而当权重初始化为非常大的值时,激活函数的导数可能变得非常大,使得梯度在传播过程中迅速增大,导致权重更新过于剧烈,网络无法收敛。
-
打破对称性:在多层神经网络中,如果所有权重都初始化为相同的值,那么在训练过程中,每一层的神经元会以相同的方式更新权重,导致网络无法学习到复杂的特征。通过随机初始化权重,可以打破这种对称性,使每个神经元能够学习到不同的特征,从而提高网络的表达能力。
-
加速收敛:合适的参数初始化可以使网络在训练初期更快地收敛到一个较好的状态,减少训练所需的迭代次数,提高训练效率。
三、神经网络调参
1.神经网络超参数类别
网络参数:包括网络层之间的交互方式(如相加、相乘或串接)、卷积核的数量和尺寸、网络层数(深度)和激活函数等。
优化参数:一般指学习率、批样本数量、不同优化器的参数及部分损失函数的可调参数。
正则化参数:如权重衰减系数、丢弃比率(dropout)。
2.调参顺序
模型能训练(基础配置)→ 提升性能(核心参数)→ 最后,抑制过拟合(正则化)
之前的模型,主要都是停留在第一步,先跑起来。如果想要更进一步提高精度,就需要进一步调参。以下是进一步调参的流程:
(1)参数初始化----有预训练的参数直接起飞
预训练参数是最好的参数初始化方法,在训练前先找找类似的论文有无预训练参数,其次是Xavir,尤其是小数据集的场景,多找论文找到预训练模型是最好的做法。关于预训练参数,我们介绍过了,优先动深层的参数,因为浅层是通用的;其次是学习率要采取分阶段的策略。
如果从0开始训练的话,PyTorch 默认用 Kaiming 初始化(适配 ReLU)或 Xavier 初始化(适配 Sigmoid/Tanh)。
(2)batchsize---测试下能允许的最高值
当Batch Size 太小的时候,模型每次更新学到的东西太少了,很可能白学了因为缺少全局思维。所以尽可能高一点,16的倍数即可,越大越好。
(3)epoch---这个不必多说,默认都是训练到收敛位置,可以采取早停策略
学习率就是参数更新的步长,LR 过大→不好收敛;LR 过小→训练停滞(陷入局部最优)
一般最开始用adam快速收敛,然后sgd收尾,一般精度会高一点;只能选一个就adam配合调度器使用。比如 CosineAnnealingLR余弦退火调度器、StepLR固定步长衰减调度器,比较经典的搭配就是Adam + ReduceLROnPlateau,SGD + CosineAnnealing,或者Adam → SGD + StepLR。
(4)学习率与调度器----收益最高,因为鞍点太多了,模型越复杂鞍点越多
(5)模型结构----消融实验或者对照试验
如卷积核尺寸等,一般就是7*7、5*5、3*3这种奇数对构成,其实我觉得无所谓,最开始不要用太过分的下采样即可。
神经元的参数,直接用 Kaiming 初始化(适配 ReLU,PyTorch 默认)或 Xavier 初始化(适配 Sigmoid/Tanh)。
(6)损失函数---选择比较少,试出来一个即可,高手可以自己构建
大部分我们目前接触的任务都是单个损失函数构成的,正常选即可
分类任务
1) 交叉熵损失函数Cross-Entropy Loss--多分类场景
2) 二元交叉熵损失函数Binary Cross-Entropy Loss--二分类场景
3) Focal Loss----类别不平衡场景
注意点:
- CrossEntropyLoss内置 Softmax,输入应为原始 logits(非概率)。
- BCEWithLogitsLoss内置 Sigmoid,输入应为原始 logits。
- 若评价指标为准确率,用交叉熵损失;若为 F1 分数,考虑 Focal Loss 或自定义损失。
回归任务
1) 均方误差MSE
2) 绝对误差MAE
也要根据场景和数据特点来选,不同损失受到异常值的影响程度不同
(7)激活函数---选择同样较少
视情况选择,一般默认relu或者其变体,如leaky relu,再或者用tanh。只有二分类任务最后的输出层用sigmoid,多分类任务用softmax,其他全部用relu即可。此外,还有特殊场景下的,比如GELU(适配 Transformer)
(8)正则化参数---主要是droupout,等到过拟合了用,上述所有步骤都为了让模型过拟合
droupout一般控制在0.2-0.5之间,这里说一下小技巧,先追求过拟合后追求泛化性。也就是说先把模型做到过拟合,然后在慢慢增加正则化程度。
正则化中,如果train的loss可以很低,但是val的loss还是很高,则说明泛化能力不强,优先让模型过拟合,在考虑加大正则化提高泛化能力,可以分模块来droupout,可以确定具体是那部分参数导致过拟合,这里还有个小trick是引入残差链接后再利用droupout
注:调参顺序并不固定,而且也不是按照重要度来选择,是按照方便程度来选择,比如选择少的选完后,会减小后续实验的成本。