梯度下降
梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数
J
(
θ
0
,
θ
1
)
J(\theta_0,\theta_1)
J(θ0,θ1)的最小值。
这里可以想象一下下山的画面
假如你正站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转 360 度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置(局部最优)。
批量梯度下降的公式:
其中
α
\alpha
α是学习率它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。
在梯度下降算法中,还有一个更微妙的问题,梯度下降中,我们要更新 θ 0 \theta_0 θ0和 θ 1 \theta_1 θ1 ,当 j= 0和j = 1时,会产生更新,所以你将更新 J ( θ 0 ) J(\theta_0) J(θ0)和 J ( θ 1 ) J(\theta_1) J(θ1)。实现梯度下降算法的微妙之处是,在这个表达式中,如果你要更新这个等式,你需要同时更新 θ 0 \theta_0 θ0和 θ 1 \theta_1 θ1,更新方法如下图所示:
梯度算法是做什么的,更新过程的意义
梯度下降算法
让我们看看这条红色直线的斜率,就是这条刚好与函数曲线相切的这条直线,这条直线的斜率正好是这个三角形的高度除以这个水平长度,现在,这条线有一个正斜率,也就是说它有正导数,因此,我得到的新的
θ
0
\theta_0
θ0,
θ
1
\theta_1
θ1更新后等于
θ
1
\theta_1
θ1减去一个正数乘以
α
\alpha
α。假设
θ
1
\theta_1
θ1在左边的时候,我得到的新的
θ
0
\theta_0
θ0,
θ
1
\theta_1
θ1更新后等于
θ
1
\theta_1
θ1减去一个负数数乘以
α
\alpha
α,最终的目的就是求最小值。
其中
α
\alpha
α是学习速率,相当于下山的时候迈的步子,当然如何选取一个合适的学习速率是非常重要的:1.如果
α
\alpha
α太小了,即我的学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果
α
\alpha
α太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。
2.如果
α
\alpha
α太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果
α
\alpha
α太大,它会导致无法收敛,甚至发散。
梯度下降的线性回归
梯度下降算法和线性回归算法比较如图:
对我们之前的线性回归问题运用梯度下降法,关键在于求出代价函数的导数,即:
这种算法也称为批量梯度下降(因为在每次一次更新中,都要对m个训练样本求和)。