梯度下降

什么是梯度下降

梯度其实就是斜度,就是一个曲面沿着指定方向的倾斜程度。

梯度下降法的基本思想可以类比为一个下山的过程。

假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷)。那么如何快速的下山?寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,对于计算机来说就是没走一段重新寻找坡度最陡峭的地方。

梯度下降的基本过程就和下山的场景很类似。

首先,我们有一个可微分的函数。这个函数就代表着一座山。

我们的目标就是找到这个函数的最小值,也就是山底。

根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方
向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向。 所
以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。

案例

import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-6,6,1000)

y = X**4-4*X**3 + 1.2
plt.plot(X,y)

#当x等于几的时候y值最小

梯度下降:全局范围类,找到坡度最陡的地方

#上一次迭代到x=?
old = 0 
#这一次x=?
new = 6

#迭代率
step = 0.0001

def func(X):
    return 4*X**3 - 12*X**2
while abs(new-old) > step:
    print(new)
    old = new
    new = new - func(old)*step


结果是:x = 3.027196165589084的时候,y是最小的

def foo(X):
    return  X**4-4*X**3 + 1
foo(3)