机器学习实战(基于scikit-learn和TensorFlow)学习心得(17)--梯度下降法

当我们需要寻找多元线性函数回归方程的时候,除了直接计算法,通过多次梯度的迭代求得最优的theta值.

  1. batch Gradient Descent
    批次梯度下降法,这个下降法就是按部就班的来计算梯度,找切线位置通过几次迭代找到最优解.
    机器学习实战(基于scikit-learn和TensorFlow)学习心得(17)--梯度下降法注意,上面的函数中包含theta,所以说我们要随机设一个初始值以便开始迭代.

计算出cost function的梯度之后就可以向最小梯度的方向迭代了.但要注意的是设计合理的步长,如果步长太高就会跳过最优解,如果步长太小就会增加迭代的次数
机器学习实战(基于scikit-learn和TensorFlow)学习心得(17)--梯度下降法
机器学习实战(基于scikit-learn和TensorFlow)学习心得(17)--梯度下降法
上图是对于同一个training set使用不同的步长的前10次迭代的结果.

  1. Stochastic Gradient Descent(随机梯度)
    Batch Gradient Descent的主要问题在于,它使用整个训练集来计算每一步的梯度,这在训练集很大时非常慢。相反,随机梯度下降在每一步中从训练集中选择一个随机实例,并仅基于该单个实例来计算梯度。
    机器学习实战(基于scikit-learn和TensorFlow)学习心得(17)--梯度下降法
    从上面的code可以看出来,公式与批次梯度的公式是一样的,但是用随机的点代替矩阵.
    另一方面,由于它的随机性,该算法比批次梯度下降的规律性要差得多:与缓慢降低直到达到最小值的彼此梯度相比,随机梯度的cost function没法精确到最小值.随着时间的流逝,它最终会非常接近最小值,但是一旦到达最小值,它就会继续反弹,从不沉降。因此,一旦算法停止,最终的参数值将是良好的,但不是最佳的。
    机器学习实战(基于scikit-learn和TensorFlow)学习心得(17)--梯度下降法
    解决这一难题的一种方法是逐渐降低学习率。步骤从大开始(这有助于快速进行并避免局部最小值),然后变得越来越小,从而使算法能够稳定在全局最小值。此过程类似于模拟退火,这是一种从退火冶金过程中启发出来的算法.
    确定每次迭代的学习率的函数称为learning schedule。如果学习速度降低得太快,可能会陷入局部最小值,甚至在中途就不再降低了。如果学习速度降低得太慢,可能会长时间徘徊在最小值附近.

  2. Mini-batch Gradient Descent
    就是不用一个算梯度也不用所有算梯度,用一小部分算梯度.
    机器学习实战(基于scikit-learn和TensorFlow)学习心得(17)--梯度下降法
    上图是三种方式对于其中一个参数的迭代过程.
    机器学习实战(基于scikit-learn和TensorFlow)学习心得(17)--梯度下降法