在我们深入研究梯度下降算法之前,回顾一下线性回归中的一些概念可能会有所帮助。 大家可能还记得直线斜率公式 y=mx+b,其中 m 表示斜率,b 表示直线在 y 轴上的截距。
大家也可能还记得在统计方法中如何绘制散点图并找到最佳拟合线的过程,这需要使用均方误差公式计算实际输出和预测输出(y 的拟合值)之间的误差。 梯度下降算法也与此类似,但它基于凸函数。
梯度下降算法的起点可以是我们评估性能的任意点。 我们通过这个起点求出导数(或斜率),可以用切线来观察斜率的大小。 斜率将促使一些参数更新,包括权重和偏差。 起始点处的斜率比较大,但随着新参数的生成,斜率会逐渐减小,直至达到曲线上的最低点,即收敛点。
与在线性回归中寻找最佳拟合线类似,梯度下降算法的目标是使成本函数最小化,即最大程度减小预测值与实际值之间的误差。 为了做到这一点,需要两个数据点 — 一个是方向,另一个是学习速率。 这些因素决定了未来迭代的偏导数计算,使其逐渐达到局部或全局最小值(即收敛点)。
梯度下降学习算法有三种类型:批量梯度下降、随机梯度下降和小批量梯度下降。
批量梯度下降算法对训练集中每个点的误差求总和, 只有在所有训练示例都评估后才更新模型。 这个过程称为一个训练周期 (training epoc)。
虽然这种批量处理提高了计算效率,但对于大型训练数据集而言,它仍然需要很长的处理时间,因为仍要将所有数据存储到内存中。 批量梯度下降算法通常也会产生稳定的误差梯度和收敛性,但有时在寻找局部最小值和全局最小值时,收敛点并不是最理想。
随机梯度下降算法 (SGD) 为数据集中的每个示例运行一个训练周期,并一次性更新所有训练示例的参数。 由于只需保存一个训练示例,所以可以更轻松地将它们存储在内存中。 虽然这些频繁的更新可以使计算更加详细,速度更快,但与批量梯度下降算法相比,这可能会导致计算效率下降。 随机梯度下降算法的频繁更新可能导致嘈杂梯度,但这也有助于避开局部最小值,找到全局最小值。
小批量梯度下降算法结合了批量梯度下降算法和随机梯度下降算法的理念。 它将训练数据集分成小批次, 并对每批进行更新。 这种方法兼顾了批量梯度下降算法的计算效率和随机梯度下降算法的速度。
虽然梯度下降算法是优化问题的最常见方法,但其本身也面临着一些挑战。 其中包括:
对于凸问题,梯度下降算法可以很容易地找到全局最小值,但出现非凸问题时,梯度下降算法很难找到全局最小值,而模型只有找到该值才能得到最好的结果。
上文中提到过,当成本函数的斜率等于或接近于零时,模型会停止学习。 在一些场景中,除了全局最小值外,局部最小值和鞍点也可能产生这种斜率。 在全局最小值处,成本函数的斜率在当前点的任意一侧都会增加,而局部最小值可以模拟全局最小值处的特征。 而对于鞍点,负梯度只存在于点的一侧,在一侧达到局部最大值,在另一边达到局部最小值。 它的名字来源于马鞍。
嘈杂梯度可以帮助梯度避开局部最小值和鞍点。
在更深层次的神经网络中,特别是在递归神经网络中,当使用梯度下降算法和反向传播算法训练模型时,我们还会遇到另外两个问题。