梯度下降是一种非常通用的优化算法,它能够找到各种问题的最优解。梯度下降的一般概念是迭代地调整参数,以最小化代价函数。

假如你在浓雾中迷失在群山之中;你只能感觉到脚下地面的坡度。要想快速到达谷底,最好的办法就是沿着最陡的斜坡向下走。这正是梯度下降法:它测量的是误差函数关于参数向量θ的局部梯度,它向着梯度下降的方向。一旦梯度为零,你就达到了代价函数的最小值!

具体地说,首先用随机值填充θ(这被称为随机初始化),然后逐渐改进,一次一小步,每一步试图降低代价函数(例如,MSE),直至算法收敛于一个最低点(见图4 - 3)。

图4 - 3 梯度下降

梯度下降的一个重要参数是步长的大小,步长是由学习速率[learning rate]这个超参数决定的。如果学习速率[learning rate]太小,那么算法需要经过多次迭代才能收敛,这需要很长的时间(见图4-4)。

图4 - 4 学习速率太小

另一方面,如果学习速率[learning rate]过高,你可能会跨过山谷(即收敛的最低点),最终到达另一边,甚至可能比以前更高(即代价函数的值变得更大了)。这可能会使算法变得发散,代价函数的值会变得越来越大,导致无法找到一个好的解决方案(参见图4-5)。

图4 - 5 学习速率过大

最后,并不是所有的代价函数看起来都像一个规则的碗形。他可能回有很多的洞,脊,高原,以及各种不规则地形,使得使收敛到最小值变得很困难。图4-6显示了梯度下降的两个主要挑战:

  • 如果随机初始化的点在左边启动算法,那么它就会收敛到一个局部最小值,它并不像全局的最小值那么好
  • 如果它从右边开始,那么需要很长时间才能跨越这个高原(即图中的Plateau),如果你过早停止,你将永远无法达到全局最小值。

图4 - 6 梯度下降法的缺陷

幸运的是,线性回归模型的MSE代价函数恰好是一个凸函数,也就是说,如果你在曲线上选取任意两个点,连接它们的线段永远不会穿过曲线。这意味着没有局部最小值,只有一个全局最小值。它也是一个斜率永远不会突然改变的连续函数。这两个事实成就了一个很好的结果:梯度下降可以保证任意地接近全局最小值(如果你等待的时间足够长,并且如果学习速率不高的话)。

事实上,代价函数是一个比较规则的碗形,但如果特征的有着相差很大的尺度的话(通俗而言,就是有的特征的值是0~1,而有的特征的值是-1000~1000),那么代价函数的图像就可能是一个很细长的碗。图4-7显示了一个训练集上的梯度下降,其中特征1和2具有相同的尺度(见左图),在另一个训练集上,特征1的值比特征2小得多(见右图)。

图4 - 7 无特征缩放的梯度下降

正如你说看到的,在左边,梯度下降算法可以笔直的抵达最低点,因此速度也很快。而在右边,它的方向与全局最小值的方向几乎是正交的,最后在一个几乎平坦的山谷里,沿着一条很长的线路在长征。它最终会达到最小值,但要花很长时间。、

当使用梯度下降时,您应该确保所有特性都具有差不多的尺度规模(例如,使用Scikit-Learn的StandardScaler类),否则就需要更长的时间来收敛。

这个图表还说明了一个事实,即训练一个模型意味着要搜索是得成本函数最小化的模型参数的组合。它是在模型的参数空间[parameter space]中进行的搜索:一个模型的参数越多,这个空间的维度就越多,搜索就越困难:在一个300维的大草堆中寻找一根针比在三维空间中要复杂得多。幸运的是,由于在线性回归的情况下,成本函数是凸的,所以这根针就在碗的底部。

results matching ""

    No results matching ""