5.2 三种梯度下降
在上节中,我们使用了梯度下降实现了多元线性回归。如果你仔细看过上面的算法。你就知道,这个算法能够找到一个解是很自然的。对于单个数据点来说,这个解并没有什么意义。因为实际上我们解的是一个四元一次方程,而仅仅只有一个输入点的话,四元一次方程有无数个解满足这个输入。所以找到一个解并不稀奇。比如我们输入第二个数据点。
inputs = np.array(
[cost_of_material[1],
cost_of_sales[1],cost_of_human[1], cost_of_product[1]]
)
print("预测价格2:", inputs.dot(weights))
print("实际价格2:", sell_price[1]*100)
它的输出是:
预测价格2: 94.33426689722515
实际价格2: 102.0
可见实际的误差非常巨大。计算机学习的过程不是要找到最适合某个特殊点的一组权重,而是找到一组权重,使得整体的误差最小。
如何获得整体误差?
如果我们对每一条数据,都更新权重。这种情形叫做随机梯度下降,因为每次更新的权重都会使得权重摆动。我们无法预知权重摆动的方向,每次学习都是独立的。
这种方案假定系统中存在一种主导的保守势能,或者是类似于物理中的中心力场。这种逻辑认为背后的保守势能是一种外场,而每条数据点都处在这种外场影响下,所以最后每条数据点都会趋于同一组最优权重。这就是随机梯度下降学习法的核心逻辑。但是这种算法对于每一条数据都会过度响应,所以算法最后停止在哪条数据上,对于学到的权重有比较大的影响。所以往往需要遍历数据集很多次,最后取平均值作为学习到的权重。
第二种梯度下降学习法是完全梯度下降法。它对整个数据集计算权重更新的平均值,即梯度的平均值,在均值计算完成后更新权重。它与上面的两种方案不一样,它是每次计算梯度后不运用到每条数据上,而是等所有梯度都算完了再用平均值更新所有的数据点的下一步学习的权重。这种完全梯度下降法的弊端在于学习速率的全局化,学习速率全局化意味着无法灵活调整学习速度,所以每次调参需要花费很长的时间。学习效率无法提升。
第三种方案是对一批数据而非全部学习,然后取学到的权重的平均值作为下一批数据的基准权重。这种梯度下降学习法叫做批处理梯度下降。它避免了随机梯度下降的单条数据的过度响应的问题,对于学习速率也很容易控制,而且甚至可以通过抽样的方法来快速训练一部分数据。所以往往最多只需要遍历一遍数据就可以得到最优权重,在很多时候甚至可以只学习很小一部分样本,比如十分之一的样本,就可以得到比较准确的结果。从算法效率上来讲,批处理梯度下降的效率是非常高的。因为它的计算可以大大利用矩阵算法的效率,而且不用多次遍历数据。
我们将在后面的小节中着重讲这三种梯度下降法。