梯度下降
1.概念
梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。梯度下降(Gradient Descent)是在求解机器学习算法的模型参数最常采用的方法之一(另外一种是最小二乘法)。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。
2.梯度
梯度下降法的计算过程就是沿梯度下降的方向求解极小值的过程,我们首先要知道梯度的数学意义以及表达式,在单变量函数中,梯度就是函数的微分 例如
d
(
x
2
)
d
(
x
)
=
2
x
\frac{d(x^2)}{d(x)}=2x
d(x)d(x2)?=2x,
d
(
?
2
y
3
)
d
(
y
)
=
?
6
y
2
\frac{d(-2y^3)}{d(y)}=-6y^2
d(y)d(?2y3)?=?6y2。对于多变量的微分,当函数有多个变量时,分别对每一个变量求微分,例如
?
?
x
\frac{\partial}{\partial x}
?x??
(
x
2
y
2
)
(x^2y^2)
(x2y2)=
2
x
y
2
2xy^2
2xy2,
?
?
y
\frac{\partial}{\partial y}
?y??
(
?
y
4
+
z
2
)
(-y^4 + z^2)
(?y4+z2)=
?
4
y
3
-4y^3
?4y3。对于一元函数来讲,梯度就是函数的导数。而对于多元函数而言,梯度是一个向量,也就是说,把求得的偏导数以向量的形式写出来,就是梯度。
3.梯度下降
梯度下降就是通过一步一步的迭代,让所有的编导函数都下降到最低,用数学公式来描述就是
x
k
+
1
x_{k+1}
xk+1?=
x
k
x_k
xk? -
α
\alpha
α
?
\cdot
?g 。
x
k
x_k
xk?为k时刻的点坐标,
x
k
+
1
x_{k+1}
xk+1?为下一刻要移动的点的坐标,例如
x
0
x_0
x0?就代表初始化的点的坐标,
x
1
x_1
x1?就代表第一部移动到的位置。 g代表梯度,前边有个负号,就代表朝着梯度相反的方向移动,也即梯度下降。
α
\alpha
α代表学习率(也叫做步长)。用它乘以梯度值来控制每次移动的距离,
α
\alpha
α的值需要自己设置,如果过大,容易一步跨太大,直接跳过了最小值,设置太小则会导致迭代次数过多。
4.简单示例分析
下面以简单的一元函数来进行实例分析:
y
=
(
x
?
2.5
)
2
+
3
y=(x-2.5)^2+3
y=(x?2.5)2+3
多元函数的思路也一样,先初始化一个点,计算它的梯度,然后往梯度相反的方向,每次移动一点点,直到达到停止条件。这个停止条件,可以是足够大的迭代步数,也可以是一个比较小的阈值,当两次迭代之间的差值小于该阈值时,认为梯度已经下降到最低点附近了。
5.代码实现
import numpy as np
import matplotlib.pyplot as plt
x = eval(input("输入初始的x的位置:"))
ap = eval(input("输入学习率:"))
i = 0
x11 = list()
y11 = list()
sl = list()
for i in range(10000):
y = (x - 2.5) ** 2 + 3
y1 = 2 * x - 5
ak = [x, y]
x11.append(x)
y11.append(y)
x = x - ap * y1
sl.append(ak)
i += 1
if abs(x - 2.5) < 1e-5:
print("运行次数为:", i)
print("坐标分别是:")
for e in sl:
print(e, end="")
break
elif i > 500:
print("迭代次数过多,学习率过小")
break
plt.plot(x11, y11)
plt.show()
6.总结
本文只是讲解了梯度下降的最简单的一种形式,有很多概念以及函数未涉及到,在之后的文章里会慢慢补充。
|