梯度下降算法
什么是梯度?
梯度的公式定义:
g
r
a
d
f
(
x
0
,
x
1
,
⋯
,
x
n
)
=
(
∂
f
∂
x
0
,
⋯
,
∂
f
∂
x
j
,
∂
f
∂
x
n
)
gradf(x_0,x_1,\cdots,x_n)=(\frac{\partial f}{\partial x_0},\cdots,\frac{\partial f}{\partial x_j},\frac{\partial f}{\partial x_n})
gradf(x0,x1,⋯,xn)=(∂x0∂f,⋯,∂xj∂f,∂xn∂f)
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)(from baidubaike)
在机器学习领域中,大多数的问题都是最优化问题,而这些问题的求解几乎都可以使用梯度下降算法来处理,因为梯度致力于解决这样一个问题:函数沿着哪一个方向下降最快?
注意:
- 梯度是一个向量
- 梯度的方向是最大方向导数的方向
- 梯度的值是最大方向导数的值
什么是梯度下降算法?
梯度下降算法(gradient descent),又名最速下降算法(steepest descent)是一阶优化算法。根据目标函数在某一点处,沿梯度方向有最大的变化率,沿着这一负梯度方向减小函数值,来搜索局部最小值点
权重更新公式:
θ
i
=
θ
i
−
α
∂
∂
θ
i
J
(
θ
)
\theta_i=\theta_i-\alpha\frac{\partial}{\partial\theta_i}J(\theta)
θi=θi−α∂θi∂J(θ)
其中,
θ
\theta
θ为权重,
α
\alpha
α为学习率,J为目标函数
用梯度下降算法求函数的局部最小值并可视化
import numpy as np
import matplotlib.pyplot as plt
lr = 0.2
precision = 1e-6
x_list = []
y_list = []
count = 0
def y_diff(x):
return x * 2
def y(x):
return x ** 2
def iter_x(x):
if x > precision:
print("第%d次迭代结果:"% len(x_list) , x)
x_list.append(x)
y_list.append(y(x))
plt.scatter(x,y(x))
plt.pause(0.1)
return iter_x( x - lr*y_diff(x))
delta = 1/100000
x = np.arange(-1.1, 1.1, delta)
plt.ion()
plt.plot(x, y(x))
plt.grid(True)
iter_x(1.0)
plt.ioff()
plt.show()