卷积层的超参数包括卷积核尺寸、数量及卷积的步长等。通常认为较小尺寸的卷积核能够在相同参数数量下增加网络容量和模型复杂程度,并减少卷积核个数,因此经典的网络如LeNet-5、VGG-19、Inception 网络使用3×3、5×5甚至1×x1结构,而在实践中最常用的尺寸为3×3、5x5。也有工作使用不同尺寸卷积操作并联,提取不同分辨率特征。
由于卷积操作对图像的边界有影响,因此在卷积前通常进行填充操作
,可以充分利用图像的边缘信息,搭配合适的卷积步长以便控制图像输出大小,避免随着网络深度的增加,图像尺寸急剧下降。
卷积的步长主要用于控制输出分辨率
,如果填充操作使图像大小不变,步长为2的卷积输出为输入的1/4(长宽皆为1/2),对于一些需要降分辨率操作非常有效。
空洞卷积
(dilated convolution)是一种有效的减少卷积参数的手段,设置了固定空洞大小的卷积核在前后卷积层级联,可以大大增加感受野,达到大的卷积核无法获得的效果。
卷积操作的输出尺寸不大于输入尺寸
,而
在图像到图像的生成任务中却需要增大图像大小,此时可以采用反卷积(又称转置卷积,transposed convolution)
。反卷积本质上是一种分数步长卷积,是将输入图像内插变大后按卷积步骤的操作,内插也是超参数。
卷积神经网络训练可视为最小化损失函数的过程,训练网络需要初始化参数,设置合适的学习率,选择合适的批量归一化方法,再根据优化算法和策略不断迭代、更新参数,涉及的超参数有:
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数值大,收敛速度是比较快,但有时会陷入局部最小的情况;Batch_Size数值小,引入的随机性会更大些,有可能会有更好的效果,但是收敛速度会慢一些;当Batch_Size太小,而类别数又比较多的时候,会导致loss函数震荡而不收敛。
具体调试过程中,一般可根据GPU显存,设置为最大,Batch_Size数值通常设为2的n次幂,常用的包括64,128,256。实际训练时候,可以选择一部分数据,跑几个Batch看看loss是否在变小,再选择合适的Batch_Size。每完成Batch_Size个样本,网络会更新一次参数。
比如对于一个有 5000 个训练样本的数据集。将 5000 个样本分成大小为 100 的 batch(batch_size = 100, number of bachs = 5000/100 = 50),那么完成一个 epoch 需要 50个 iteration。
假如你的数据集训练集数据有11000张图片, 划分训练集(10000)和验证集(1000)。若选择Batch_size = 128 对网络模型进行训练,则有:
在小批量梯度下降法中,当批量大小设置较大时候,通常要配置较大的学习率。但是,在刚开始训练时,由于参数是随机初始化的,梯度也往往比较大,再加上较大的学习率,会使得训练不稳定。为了提高训练稳定性,我们可以在最初几轮迭代时,采用比较小的学习率,等梯度下降到一定程度后再恢复到初始的学习率,这种方法称为
学习率预热(Learning Rate Waarmup)
。
设置较好的learning rate,需要不断尝试。在一开始的时候,可以将其设大一点,这样可以使weights快一点发生改变,在迭代一定的epochs之后人工减小学习率。