梯度下降
梯度下降:应用最广泛的求极小值算法。
假设一线性回归模型,它的代价函数为 J(θ0,θ1) 。我们的目标是最小化这个代价函数,而要得到最小的代价函数值关键就在于正确选取 θ0和θ1的值,于是我们引出梯度下降算法。
步骤:1. 初始化θ0和θ1的值,通常取0。
2. 不断改变θ0和θ1的值,试图通过这种改变使得 J(θ0,θ1) 变小,直到找到 J(θ0,θ1) 的最小值(也可能是局部最小值)。
将上述步骤可视化
左图中,我们初始化θ0和θ1的值得到第一个 J(θ0,θ1) 点 ,在左边红色区域。假设红色区域都是一个个小山峰,我们处于第一个点的位置,现在目标是用小碎步尽快下山,环顾四周后我们可以找到下一个点,注意是下降最快的方向(坡度最陡),以此方法一直下降,知道下降到深蓝色区域里的局部最低点。
右图中亦是如此,只是θ0和θ1的初始值不同,导致第一个J(θ0,θ1) 点 不同,下降速度最快的方向也不一样,因此到达的最低点也不同。
公式
式子中,:= 符号是赋值运算符,表示把符号后面的值赋予给符号后面的值,α 表示学习率,以下山的例子就是步子的大小,α 越大,下山时步子迈得就越大,下降速度越快。
在梯度下降中,我们使用公式更新 θ0 和 θ1 的值,在更新时,我们应当同时更新 θ0 和 θ1 的值。
如果不同时更新,如上图,前一个更新后的 θ0 会影响到 temp1 的导数项,继而影响更新θ1 。
为了更容易理解梯度下降过程,我们假定 hθ(x) = θ1x, 代价函数为 J(θ1) ,可以得到 J(θ1) 与 θ1 关系图如下
梯度下降过程即:
首先选取 θ1 的值,得到对应的 J(θ1) ,标记在上图中红点位置处。现以红点作切线(上图中红色实线),此时切线的斜率即公式中的导数项,切线斜率再与学习率 α (正数)相乘 ,最后用θ1减去它们相乘后的值,计算出的值即第一次更新后的θ1 (向左移动),此时也可以发现对应的 J(θ1) 位置会往左边移动,直到运动到最小值(局部最小值)。移动速度跟学习率 α 有关,如果 α 过大,每次移动也会跳跃得越大,很容易越过最小值,无法收敛,甚至发散。而事实上,在梯度下降过程中,学习率 α 会自动调整,越靠近最小值, α 会越小,移动越慢。
如果初始化 θ1 后,得到对应的 J(θ1) 本身就处在最小值位置,再使用梯度下降算法, θ1 将不会更新,因为此时导数项为0,J(θ1) 也不会发生变化。