什么是梯度下降法?基于微积分的观点认为:目标函数关于参数θ的梯度方向是函数上升最快的方向。对于损失函数的优化来说,负梯度方向是损失函数下降最快的方向。对于神经网络来说,关于损失函数对权值参数w和偏置参数b求梯度,并基于负梯度方向进行参数更新,如式(3.3)和式(3.4)所示。
其中α为学习率,也叫作步长,是一个超参数,可以预先指定,也可以通过超参数调优进行选择。以上是梯度下降法在数学上的直观解释,那么如何更加通俗地理解梯度下降法呢?图3.1所示是梯度下降法的直观展示。
图3.1 梯度下降法的直观展示
假设你正站在图3.1中的山顶,想要尽快从这陡峭的山上下山,那么该如何下山呢?这时你举目四望,从中发现了一个最陡峭的方向,从这儿下去虽然艰险但是速度最快,于是你便到了山腰中的一个点,然后又四下查看,寻找最陡峭的方向,从这个方向继续下山,用这个方法一步步不断下降,经过若干次尝试你终于到山脚了。简而言之,梯度下降法就是不断寻找最陡峭的方向,即负梯度方向下降得最快。
但在深度学习实际的算法调优中,原始的梯度下降法一般不好用。通常来说,工业生产环境下深度学习所处理的数据量都是相当大的。这时如果直接使用原始的梯度下降法,训练速度就会很慢,并且运算效率也会非常低。因此,需要采取一些策略对原始的梯度下降法进行调整,以便加速训练过程。
这时将训练数据划分为小批量(MiniGBatch)进行训练就非常重要了。将训练集划分为一个个子集的小批量数据,相较于原始的整体进行梯度下降的方法,整个神经网络的训练效率会大大提高,这便是小批量梯度下降法。如果批量足够小,小到一批只有一个样本,这时算法就变成了随机梯度下降法,此时模型训练起来会很灵活,数据中的噪声也会减小。但是SGD有一个劣势,就是失去了向量化运算带来的训练加速度,算法也较难收敛。因为一次只处理一个样本,虽然足够灵活但是效率过于低下。所以,在实际的深度学习模型训练时,选择一个不大不小的batchGsize(执行一次梯度下降所需要的样本量)就显得格外重要了。
那么如何选择合适的batchGsize呢?这个问题没有标准答案,一般而言,需要根据训练的数据量来定,也需要不断地试验。通常而言,batchGsize过小会使得算法偏向SGD一点,失去向量化带来的加速效果,算法也不容易收敛,但若是盲目增大batchGsize,一方面会占用更多内存,另一方面是梯度下降的方向很难再有变化,进而影响训练精度。所以,一个合适的batchGsize对于深度学习的训练来说非常重要,合适的batchGsize会提高内存的利用率,向量化运算带来的并行效率会提高,跑完一轮训练所需要的迭代次数也会减少,训练速度会加快,这便是MBGD的作用。
总之,无论是GD、MBGD还是SGD,它们的本质都是基于梯度下降的算法策略,三者的区别在于执行一次运算所需要的样本量不同。GD、MBGD和SGD的优化过程,如图3.2所示。
图3.2 GD、MBGD和SGD的优化过程