机器学习实战(基于scikit-learn和TensorFlow)学习心得(17)--梯度下降法
当我们需要寻找多元线性函数回归方程的时候,除了直接计算法,通过多次梯度的迭代求得最优的theta值.
- batch Gradient Descent
批次梯度下降法,这个下降法就是按部就班的来计算梯度,找切线位置通过几次迭代找到最优解.注意,上面的函数中包含theta,所以说我们要随机设一个初始值以便开始迭代.
计算出cost function的梯度之后就可以向最小梯度的方向迭代了.但要注意的是设计合理的步长,如果步长太高就会跳过最优解,如果步长太小就会增加迭代的次数
上图是对于同一个training set使用不同的步长的前10次迭代的结果.
-
Stochastic Gradient Descent(随机梯度)
Batch Gradient Descent的主要问题在于,它使用整个训练集来计算每一步的梯度,这在训练集很大时非常慢。相反,随机梯度下降在每一步中从训练集中选择一个随机实例,并仅基于该单个实例来计算梯度。
从上面的code可以看出来,公式与批次梯度的公式是一样的,但是用随机的点代替矩阵.
另一方面,由于它的随机性,该算法比批次梯度下降的规律性要差得多:与缓慢降低直到达到最小值的彼此梯度相比,随机梯度的cost function没法精确到最小值.随着时间的流逝,它最终会非常接近最小值,但是一旦到达最小值,它就会继续反弹,从不沉降。因此,一旦算法停止,最终的参数值将是良好的,但不是最佳的。
解决这一难题的一种方法是逐渐降低学习率。步骤从大开始(这有助于快速进行并避免局部最小值),然后变得越来越小,从而使算法能够稳定在全局最小值。此过程类似于模拟退火,这是一种从退火冶金过程中启发出来的算法.
确定每次迭代的学习率的函数称为learning schedule。如果学习速度降低得太快,可能会陷入局部最小值,甚至在中途就不再降低了。如果学习速度降低得太慢,可能会长时间徘徊在最小值附近. -
Mini-batch Gradient Descent
就是不用一个算梯度也不用所有算梯度,用一小部分算梯度.
上图是三种方式对于其中一个参数的迭代过程.