梯度下降
什么是梯度下降
梯度其实就是斜度,就是一个曲面沿着指定方向的倾斜程度。
梯度下降法的基本思想可以类比为一个下山的过程。
假设这样一个场景:一个人被困在山上,需要从山上下来(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)