在深度学习领域,参数(parameter)和超参数(hyperparameter)是两个相似但本质不同的概念。超参数是用来确定模型的一些参数,一般是根据经验和验证集效果确定的变量,超参数不同,模型是不同的。在卷积神经网络中,超参数有学习速率、迭代次数、层数、每层神经元的个数、批大小(batch size)及损失函数中各部分的权值等。而参数是可以根据模型自身的算法,通过数据迭代自动学习出的变量,如卷积核的权值w、偏置b等。如果将态积神经网络的训练看成多项式拟合问题,那么超参数是最高项次数,参数是各次项的系数。其中,参数可以用最小二乘法求解;而超参数只能先人工设定,再根据验证集上的效果选取最优的。
Ⅰ、 网络超参数
创建整个神经网络模型前,首先要指定与网络结构相关的超参数,如输入图像大小、卷积层和池化层以及网络训练、优化相关超参数。
1. 输入图像大小
卷积神经网络结构是固定的,当处理不同尺寸图像时,卷积层的输出特征图尺寸也会随着输入图像大小而改变。尽管这对于分割问题的全卷积结构或检测问题的Rol pooling结构没有影响,但是会造成分类问题的全连接层输入维度不一致,因此需要在数据集处理中将图像尺寸调整到固定大小,使不同输入图像获得相同规格的输出。
图像大小的选择要考虑多方面因素,为充分利用GPU效率,一些通用数据集的图像尺寸是固定的,如CIFAR-10中的图像为32×32像素,STL数据集中的图像为96×96像素。
AlexNet 和VGG等经典模型的官方版本输入图像大小为224×224像素,如果要使用其全部参数,可选择默认大小、否则无法使用其全连接层参数,需要重新定义全连接层甚至卷积层。卷积神经网络的本质是模拟人脑对图像的感知,更高分辨率的图像有利于提升学习效率,但是,会增加全连接层单元的个数,从而大大增加计算量,这时可以增加1个卷积池化层,在增加表达能力的情况俩下减少参数数量。
2. 卷积层超参数
卷积核尺寸、卷积核数量、卷积的步长
卷积层的超参数包括卷积核尺寸、数量及卷积的步长等。通常认为较小尺寸的卷积核能够在相同参数数量下增加网络容量和模型复杂程度,并减少卷积核个数,因此经典的网络如LeNet-5、VGG-19、Inception 网络使用3×3、5×5甚至1×x1结构,而在实践中最常用的尺寸为3×3、5x5。也有工作使用不同尺寸卷积操作并联,提取不同分辨率特征。
由于卷积操作对图像的边界有影响,因此在卷积前通常进行填充操作,可以充分利用图像的边缘信息,搭配合适的卷积步长以便控制图像输出大小,避免随着网络深度的增加,图像尺寸急剧下降。
卷积的步长主要用于控制输出分辨率,如果填充操作使图像大小不变,步长为2的卷积输出为输入的1/4(长宽皆为1/2),对于一些需要降分辨率操作非常有效。
空洞卷积(dilated convolution)是一种有效的减少卷积参数的手段,设置了固定空洞大小的卷积核在前后卷积层级联,可以大大增加感受野,达到大的卷积核无法获得的效果。
卷积操作的输出尺寸不大于输入尺寸,而在图像到图像的生成任务中却需要增大图像大小,此时可以采用反卷积(又称转置卷积,transposed convolution)。反卷积本质上是一种分数步长卷积,是将输入图像内插变大后按卷积步骤的操作,内插也是超参数。
3. 池化层超参数
池化核尺寸、池化步长、池化方式
池化层一般没有参与运算的参数,它的超参数主要是池化核尺寸、池化步长及池化方式。
池化的目的是保留大的响应值并降低分辨率,与卷积层类似,池化核尺寸一般也设定为此较小的值,如2×2、3×3等,常用的是尺寸为2x2、步长为2。此外,池化方式也是可选超参数,
“用的有最大池化(Mx Poling)、平均池化(Avamge Pooling)、K-iMax Poling等。
Ⅱ 、网络训练、优化超参数
1、Epoch、Batch、Batch_size、Iteration(迭代)、学习率 Ir
卷积神经网络训练可视为最小化损失函数的过程,训练网络需要初始化参数,设置合适的学习率,选择合适的批量归一化方法,再根据优化算法和策略不断迭代、更新参数,涉及的超参数有:Epoch(回合)、Batch(批)、Batch_size、iteration(迭代)、学习率 lr 等。
Epoch(回合): 将全部的训练集数据投入神经网络模型完成一次完整的训练,这个过程称为一个Epoch。简单理解epoch的值就是整个训练集数据被输入神经网络训练了几次。
随着 Epoch 数量增加,神经网络中的权重的更新次数也增加,网络训练的结果会有欠拟合或者过拟合。
Batch:使用训练集中的一小部分数据样本对模型权重进行一次反向传播的参数更新,这一小部分样本数据被称为:“一批数据”
因为算力或者其他原因,不能将数据一次性通过神经网络的时候,就需要将数据集分成几个 batch,也就有了Batch_Size(一次投入网络模型中的图片数)
batch_size主要用于批量梯度下降算法(Batch Gradient Descent)中,批量梯度下降算法是每次迭代都遍历批中的所有样本,由批中的样本共同决定最优的方向,Batch_Size 正是批中的样本数量。
在训练深度神经网络时,训练数据的规模通常都比较大,如果在梯度下降时,每次迭代都要计算整个训练数据上的梯度,这就需要比较多的计算资源.另外大规模训练集中的数据通常会非常冗余,也没有必要在整个训练集上计算梯度.因此,在训练深度神经网络时,经常使用小批量梯度下降法(Mini-Batch Gradient Descent).
对梯度下降优化算法不同方式的理解:
每次的参数更新的方式不同
① 基本梯度下降(BGD),基本的梯度下降算法使用所有的样本计算梯度,称为批量梯度下降(Batch Gradient Descent)。BGD一次迭代是 对所有样本进行计算,由全数据集确定的负梯度方向能够更好地代表 样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。然而在深度学习问题中,通常数据集很大,计算成本很高,并且所有样本取平均的负梯度方向通常使得收敛很慢,可能会陷人局部极小。不支持在线学习。
② 随机梯度下降( Stochastic Gradient Descent. SGD )。随机梯度下降在每轮迭代中随机使用1个样本xi来计算梯度并进行参数更新: 由于只在单个样本上计算梯度,使得每轮参数更新大大加快,但同时增加了不确定性,可能会陷人局部极小,也可能会跳出局部极小,搜索过程随机性大。造成收敛性能不太好,就会在最优点附近晃来晃去,获取不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。
③ 小批量梯度下降(Mini-Batch GD):
这种方法把数据分为若干个批,按批来更新参数,每次用1个批量(batch sie )的样本计算梯度并更新,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。是BGD和SGD的折中,Mini-Batch GD使得每轮迭代的计算量较少,训练时目标函数下降的随机性减小, batch size 可在收敛速度和内存、显存消耗上灵活选择,因此是深度学习的最常用策略。
梯度下降法的几种方式的根本区别就在于上面公式中的 Batch Size不同:
梯度下降方式 | 训练集样本数 | Batch_size | Number of banchs |
---|---|---|---|
基本梯度下降(BGD) | N | N | 1 |
随机梯度下降(SGD) | N | 1 | N |
小批量梯度下降(Mini-Batch) | N | B | N/B or N/B + 1 |
N / B + 1 是针对未整除的情况; 整除则是 N / B |
---|
Batch_Size的设置与参考因素:
在计算机硬件显存能允许的情况下,Batch_Size数值大,收敛速度是比较快,但有时会陷入局部最小的情况;Batch_Size数值小,引入的随机性会更大些,有可能会有更好的效果,但是收敛速度会慢一些;当Batch_Size太小,而类别数又比较多的时候,会导致loss函数震荡而不收敛。
具体调试过程中,一般可根据GPU显存,设置为最大,Batch_Size数值通常设为2的n次幂,常用的包括64,128,256。实际训练时候,可以选择一部分数据,跑几个Batch看看loss是否在变小,再选择合适的Batch_Size。每完成Batch_Size个样本,网络会更新一次参数。
iteration(迭代): 训练时,1个batch训练图像通过网络训练一次(一次前向传播+一次后向传播),每迭代一次权重更新一次;测试时,1个batch测试图像通过网络一次(一次前向传播)
iteration(迭代)就是使用一个batch数据对模型进行一次参数更新的过程
比如对于一个有 5000 个训练样本的数据集。将 5000 个样本分成大小为 100 的 batch(batch_size = 100, number of bachs = 5000/100 = 50),那么完成一个 epoch 需要 50个 iteration。
即是:1个epoch包含的iteration次数=样本数量/batch_size
整体的迭代次数:iterations = epochs×(images / batch_size)
小栗子理解:
假如你的数据集训练集数据有11000张图片, 划分训练集(10000)和验证集(1000)。若选择Batch_size = 128 对网络模型进行训练,则有:
学习率 lr :
学习率是神经网络优化时的重要超参数.在梯度下降法中,学习率的取值非常关键,学习率决定了参数移动到最优值的速度快慢,如果学习率过大,很可能会越过最优值导致函数无法收敛,甚至发散;反之,如果学习率过小,优化的效率可能过低,收敛速度太慢,也易使算法陷入局部最优。合适的学习率应该是在保证收敛的前提下,能尽快收敛。
常用的学习率调整方法包括学习率衰减、学习率预热、周期性学习率调整以及一些自适应调整学习率的方法,比如AdaGrad、RMSprop、AdaDelta等.自适应学习率方法可以针对每个参数设置不同的学习率。
在小批量梯度下降法中,当批量大小设置较大时候,通常要配置较大的学习率。但是,在刚开始训练时,由于参数是随机初始化的,梯度也往往比较大,再加上较大的学习率,会使得训练不稳定。为了提高训练稳定性,我们可以在最初几轮迭代时,采用比较小的学习率,等梯度下降到一定程度后再恢复到初始的学习率,这种方法称为学习率预热(Learning Rate Waarmup)。
设置较好的learning rate,需要不断尝试。在一开始的时候,可以将其设大一点,这样可以使weights快一点发生改变,在迭代一定的epochs之后人工减小学习率。
2.神经网络优化的改善方法
改善神经网络优化的目标是找到更好的局部最小值和提高优化效率,目前比较有效的经验性改善方法通常分为以下几点:
(1)使用更有效的优化算法,来提高梯度下降优化方法的效率和稳定性,此如动态学习率调整、梯度估计修正等。
(2)使用更好的参数初始化方法、数据预处理方法来提高优化效率。
(3)修改网络结构来得到更好的优化地形(Optimization Landscape),比如使用ReLU激活函数、残差连接、逐层归一化等。
优化地形:指在高维空间中损失函数的曲面形状,好的优化地形通常比较平滑。
(4)使用更好的超参数优化方法。
通过上面的方法,我们通常可以高效地、端到端地训练一个深度神经网络。
reference
https://blog.csdn.net/yimingsilence/article/details/79217180
https://blog.csdn.net/yudiemiaomiao/article/details/72391316
https://blog.csdn.net/qq_36447181/article/details/80149590
https://blog.csdn.net/qq_18668137/article/details/80883350
https://zhuanlan.zhihu.com/p/29409502