梯度下降法
文章目录
1.数学基础知识:
1.1偏导数
求x的偏导数,y为定值,沿y反向切片,研究z与x的关系
1.2方向导数
用三个维度的偏导数内积方向向量(相当于偏导数向量在给定方向上的投影)
1.3梯度
方向导数的方向与偏导数向量相同(梯度下降求极小值,梯度上升求极大值)
2.梯度下降法
θ1 = θ0 - α*J(θ)【J是梯度】
2.1形象化理解
- **失忆:**有一只失忆的兔子不知道自己在哪里,也不知道自己曾经去过哪里
- **浓雾:**兔子来到一个被浓雾所包裹的大山之中,它只能看见自己脚下的路
- **梯度下降法:**通过不断的行走,它可以走到一个山窝里,但因为浓雾弥漫,它看不见自己是否处于整座山的最低点,因此只能找到局部最优解而不一定找到全局最优解(因此初始值的选择对其起着决定性的作用)
2.2实战练习
2.2.1一元凸函数的梯度下降实现
#f(x) = x^2 + 2x
def base_func(x):
return x**2 + 2*x
def base_daoshu(x):
return 2*x + 2
x_ori = 5
eta = 0.01
for i in range(300):
result = base_func(x_ori)
x_ori -= eta * base_daoshu(x_ori)
print(x_ori)
print(result)
#输出结果为:
#-0.9857193530533586
#-0.9997876542303055
2.2.2一元非凸函数的梯度下降实现
#一元非凸函数
#f(x) = x^4 + 2x^3 - 3x^2 - 2x
def base_func(x):
return x**4 + 2*x**3 - 3*x**2 - 2*x
def df(x):
return 4*x**3 + 6*x**2 - 6*x - 2
x1 = -3
x2 = 0
x3 = 1.6
x4 = -1
eta = 0.05
for i in range(20):
result1 = base_func(x1)
result2 = base_func(x2)
result3 = base_func(x3)
result4 = base_func(x4)
x1 -= df(x1)*eta
x2 -= df(x2)*eta
x3 -= df(x3)*eta
x4 -= df(x4)*eta
print(x1)
print(x2)
print(x3)
print(x4)
#输出结果为:
#-2.1007361691096205
#0.8732841094532444
#0.873284123199441
#-2.1007361691096205
print(df(x1))
print(df(x2))
print(df(x3))
print(df(x4))
#输出结果为:
#0.0
#-1.9144088803102477e-07
#-4.067704395538385e-09
#0.0
2.2.3多元函数的梯度下降法
#多元函数的梯度下降法
def init_func(x,y):
return 2*x**3 + 4*y**4
def dfx(x):
return 6*x**2
def dfy(y):
return 16*y**3
eta = 0.01
x = 1
y = 3
for i in range(100):
x -= dfx(x)*eta
y -= dfy(y)*eta
result = init_func(x,y)
print(x)
print(y)
print(result)
#输出结果:
#0.14046142957333435
#-0.17325237427960236
#0.009146376685150644
注:利用梯度下降法必须是凸函数且有界,才能得到全局最优解,否则找到局部最优解