梯度下降是帮助神经网络获得正确的权重值和偏差值的最常见算法之一。梯度下降法(GD)是在每一步中最小化成本函数J(W,b)的一种算法。它迭代地更新权重和偏差,以尝试在成本函数中达到全局最小值。
    在我们计算GD之前,首先获取输入并通过神经网络的所有节点,然后计算输入、权重和偏差的加权和。这是计算梯度下降的主要步骤之一,称为正向传播。一旦我们有了一个输出,我们将这个输出与预期的输出进行比较,并计算出它们之间的差异,即误差。有了这个误差,我们现在可以反向传播它,更新每个权重和偏差,并尝试最小化这个误差。正如你所预料的,这部分被称为反向传播。反向传播步骤是使用导数计算得出的,并返回“梯度”,这个值告诉我们应遵循哪个方向以最小化成本函数。
    换句话说,新的权重/偏差值将是最后一个权重/偏差值减去梯度的值,使其接近成本函数的全局最小值。我们还将这个梯度乘以一个学习率,它控制着步长。

    这种经典的梯度下降法也称为Batch梯度下降法。在这种方法中,每个epoch遍历所有训练数据,然后计算损失并更新W和b值。该方法虽然具有稳定的收敛性和稳定的误差,但是该方法使用了整个机器学习训练集,因此,对于大型机器学习数据集会非常慢。
    想象一下,将您的数据集分成几个batches。这样,它就不必等到算法遍历整个数据集后才更新权重和偏差,而是在每个所谓的Mini-batch结束时进行更新。这使得我们能够快速将成本函数移至全局最小值,并在每个epoch中多次更新权重和偏差。最常见的Mini-batch大小是16、32、64、128、256和512。大多数项目使用Mini-batch梯度下降,因为它在较大的机器学习数据集中速度更快。

    每次只选取1个样本,然后根据运行结果调整参数,这就是著名的随机梯度下降(SGD),而且可称为批大小(batch size)为1的SGD。
    批大小,就是每次调整参数前所选取的样本(称为mini-batch或batch)数量:

    如果批大小为N,每次会选取N个样本,分别代入网络,算出它们分别对应的参数调整值,然后将所有调整值取平均,作为最后的调整值,以此调整网络的参数。

    如果批大小N很大,例如和全部样本的个数一样,那么可保证得到的调整值很稳定,是最能让全体样本受益的改变。

    如果批大小N较小,例如为1,那么得到的调整值有一定的随机性,因为对于某个样本最有效的调整,对于另一个样本不一定最有效(就像对于识别某张黑猫图像最有效的调整,不一定对于识别另一张白猫图像最有效)。

    那么批大小是否越大越好?绝非如此,很多时候恰好相反。合适的批大小对于网络的训练很重要。
    训练中的另一个重要概念是epoch。每学一遍数据集,就称为1个epoch。
    举例,若数据集中有1000个样本,批大小为10,那么将全部样本训练1遍后,网络会被调整1000/10=100次。但这并不意味着网络已达到最优,我们可重复这个过程,让网络再学1遍、2遍、3遍数据集。
    注意每一个epoch都需打乱数据的顺序,以使网络受到的调整更具有多样性。同时,我们会不断监督网络的训练效果。通常情况下,网络的性能提高速度会越来越慢,在几十到几百个epoch后网络的性能会趋于稳定,即性能基本不再提高。