1.使用批训练的原因
在“山外有山比山高”-为什么叫深度学习?一文中,介绍了实际训练深度学习模型时,可能需要将训练样本随机划分成若干批次(Batch),每个批次包含若干样本(Batch Size),利用这些样本来计算梯度更新一次参数.使用完所有的样本更新参数称为一个回合(Epoch).假设一个模型的训练数据包含样本的个数是N,每个批次包含B个样本,那么每个回合需要更新参数的次数,同时也是划分批次的个数为(N/B).下面,具体分析下训练中划分批次的原因,需要先讨论大批次和小批次在训练时间和训练精度上各自的优缺点.
图1 两种Batch Size更新参数的效果
图中左侧和右侧展示的是两种极端的情况,左侧是Batch Size等于N的情况,即每次更新参数取所有的样本计算损失梯度,将这种情况称为Full Batch;右侧是Batch Size等于1的情况,即每次更新参数只取1个样本计算损失梯度.
1.1 训练时间的比较分析
从理论上来看,每次更新参数使用所有的样本计算梯度花费的时间可能远超过每次更新参数使用一个样本花费的时间.但在实际训练的过程中,通常使用GPU进行计算,因此在分析这个问题时,需要考虑使用GPU做并行计算的情况.
图2 不同Batch Size的时间花费
上图展示了对于同样的手写数字辨识MNIST数据集,训练相同的模型时,使用不同的Batch Size花费时间的实验结果.左侧为更新一次参数所花费的时间,右侧为完成一次完整的epoch所花费的时间.横轴均为Batch Size,纵轴均为训练花费的时间.
由左图可知,在使用GPU对数据做并行计算的情况下,Batch Size增大至1000对更新一次参数所花费的时间并没有产生显著的影响;而当Batch Size增大至10000时,更新一次花费的时间才有了显著的变化.由于在GPU并行计算的作用下较大的Batch Size与较小的Batch Size更新一次参数花费的时间无甚差别,但如果选择较小的Batch Size一个Epoch中更新的次数却增加了.所以最终呈现的效果确实较大的Batch Size完成一个Epoch更新所需要时间更少,如上图右侧图所示.
综上,在考虑并行计算处理的情况下,较大的Batch Size花费的时间相对于较小的Batch Size反而更少.
1.2 训练精度的比较分析
如图1所示,由于较大的Batch Size每次更新参数所使用的训练数据较多,猜测模型参数的更新比较稳定,模型的精度比较高;而较小的Batch Size每次更新参数说使用的训练数据较少,更新会受到噪音的影响,猜测模型参数的更新不稳定,模型的精度比较低.但从实际训练的效果来看,却呈现出另一种截然不同的结果.
1.2.1 数据集的划分
在比较不同Batch Size对模型训练精度的影响之前,首先来了解一下训练模型时关于训练集(Train Data)、验证集(Validation Data)和测试集(Test Data)的划分.在拿到样本数据集时 ,通常需要将样本分成三份即训练集、验证集和测试集.训练集指用于更新模型参数的数据集,验证集指用于检验超参数模型准确率的数据集,测试集指模型真正没有见到过,用于考察模型泛化能力的数据集.之所以还需要使用测试集,是因为选择超参数时使用了验证集这部分信息,如果检验模型准确性时还使用这部分信息,不能够真实地反映模型的一般能力即泛化能力(Generalization Ability).这好比模拟考和高考试卷肯定不一样是相同的道理.
1.2.2 验证集准确率比较分析
图3 不同Batch Size的验证集准确性
上图展示了不同Batch Size的情况下分别在MNIST、CIFAR-10两种图像识别准确率的变化情况.由图可知,无论是训练集,还是验证集,两种数据集在训练集和验证集的准确率随着Batch Size增加都呈现出下降的趋势.同时可以观察到,较大的Batch Size会导致训练集准确率非常差.训练集准确率非常差的现象被称为欠拟合(Under-fitting).
图4 Batch Size小验证验证集准确率较高的原因
由此可知,较小的Batch Size在验证集的准确率反而比较高.上图给出了这种现象一种可能的解释,对于较大的Batch Size,损失函数的表达式可能基本上是固定的.如上图左侧,一种极端的情况取Full Batch,当参数更新遇到“坦途”时,模型就真的没办法更新了.而较小的Batch Size每次的训练更新所使用的样本数据差异很大,损失函数的差别就很大,此刻更新当梯度为0的点时,对于下次更新使用的损失函数来说,梯度未必为0,这就使得参数可以继续更新.
1.2.3 验证集准确率比较分析
图5 不同Batch Size测试集准确率
上图展示了两种Batch Size在不同数据集和神经网络模型的训练集和测试集准确性情况.其中SB为较小的Batch Size取值为256,LB为较大的Batch Size是整个数据集的0.1倍.由图可知,即便是在训练集的准确率相差不大的情况下,较小的Batch Size在测试集上的准确率都明显大于较大Batch Size在测试集上的准确率.图中,训练集准确率较好,测试集准确率较差的现象被称为过拟合(Over-Fitting).
图6 Batch Size小验证验证集准确率较高的原因
将模型参数更新时遇到的局部极小点分成两种情形,一种是附近较为“宽阔”的极小点(Flat Minima),另外一种是附近较为“狭窄”的极小点(Sharp Minima),如上图所示.对于较小的Batch Size, 由于每次更新的随机性较大,遇到较为“狭窄”的极小点很容易继续更新,往往倾向于在“宽阔”的极小点停止更新.反之,对于较大的Batch Size,往往倾向于在“狭窄”的极小点停止更新.这里假定测试集的损失函数在训练集的基础上进行了平移,尽管在训练集和测试集上损失函数相差较大,但对于“宽阔”的极小点来说测试集的损失和训练集的损失相差不大,损失均很小,而对于“狭窄”的极小点来说,损失函数却变成了另外一种情形,差距非常大.
综上所述,对于较大的Batch Size来说,训练模型的时间较短,但训练的精度较差;对于较小的Batch Size来说,训练的精度较高,但训练的时间较长.因此,需要在两种情况下做一个折中,这就是超参数Batch Size设计的原因,需要选择合适的Batch Size既确保模型训练的时间较短,又确保模型的精度较高.
2.动量梯度下降方法
图6 动量更新方法
在“升维的降维打击”-参数训练的驻点分析一文中,讨论了驻点为鞍点的情形以及可以通过计算Hession矩阵的特征向量来继续更新参数,但这种方法不符合现实的情况,因为模型的参数量太大了,计算Hession矩阵花费的时间代价会非常大.接下来寻找一种可以使参数训练“逃离”鞍点的参数更新方法.
上图所示,对于传统的梯度下降方法,可能参数更新到一个“坦途”即第2个黑色球所在的位置就不再更新了.然而兵法有云“居高临下,势如破竹”,这是古人发现了冷兵器时代的作战秘密——动能和惯性,由此引发了进一步的思考,对于传统的梯度下降方法进行改进.考虑现实的世界,假设真的放了一个铁球从山上滚下,铁球真的会遇到坦途就停止吗?答案是不会.
图中红色箭头表示负的梯度,蓝色虚线箭头表示上一次的动量(Movement),蓝色实线箭头表示本次的动量.本次动量等于上一次的动量与负的梯度之和,为参数应该更新的实际值.首先考虑第2个黑色球所在的位置,如果红色箭头足够地小,可能球并不会往下走,但如果加上上次的动量值,会继续走很大一段距离.接着,考虑第三个黑色球所在的位置,此时梯度为0,如果按照之前方法,参数不会更新,但是此时动量是存在的,它无形中会推着球继续往前走.最后,考虑第四个黑色球的位置,此时球走到了接近山顶的位置,按照传统的梯度下降的方法,红色的箭头往左,它会将球往回拉,但如果此时积累的动能足够多,大于此时的梯度值,动能会推着球继续往前走,这样,黑色球很有可能找到更小的局部极小点.
与上图的原理一致,当引入动量更新方法时,参数更新由传统的更新方法转变为式(1),式中,{\theta}表示模型参数,表示动量,表示更新的次数,{\eta}表示学习速率,表示梯度.
(1)
领取专属 10元无门槛券
私享最新 技术干货