梯度优化

在神经网络的一个训练循环中,一般会发生以下步骤:

  1. 抽取训练样本\(x\)和对应的目标\(y\)组成的数据批量。
  2. 在\(x\)上运行网络,得到预测值\(y’\)。
  3. 计算网络在这批数据上的损失,用于衡量\(y’\)和\(y\)之间的距离。
  4. 更新网络的所有权重,是网络在这批数据上的损失略微下降。

当神经网络的\(y’\)和预期目标\(y\)之间的距离很小时,神经网络就会“学会”将输入映射到正确的目标。在这四个步骤中,最大的难点在于第四步,如何确定系数的变化以及调整量。

由于神经网络中所有的操作都是可微的,所以计算损失相对于网络系数的梯度,然后向梯度相反的方向改变系数来降低损失是目前比较简便易行的方法。

梯度是张量运算的导数,是导数概念向多元函数导数的推广。在给定一个可微的函数时,理论上可以找到它的最小值,也就是函数的导数为0的点。但是在实际神经网络运行时,参与计算的参数已经多到了无法进行求解的地步,所以不可能能够按照理论取得导数为0的点。所以在神经网络进行学习时,通常会采用的方法是每次抽取一个小样本进行训练,将这一批数据的损失减小一些,然后再进行下一次迭代。这种方法被称为小批量随机梯度下降(SGD)。两次SGD之间损失减小的步长称为学习率。

当学习率过小时,SGD可能会陷入局部极小点而无法找到全局极小点,这种情况下可以借助物理学中的动量的概念来将损失下降的速率计算进来,使SGD冲出局部极小点。

由于神经网络中所有的函数都是可微的,所以可以明确计算每一层处张量计算的导数,所以可以将链式法则(\((f(g(x)))’=f’(g(x)) \times g’(x)\))应用于梯度值的计算,这种算法被称为反向传播