1 分类
- 牛顿法(Newton‘s method)
- 最小二乘法(Least Squares method)
- 梯度下降法(Gradients Descent)
2 方向导数与梯度
2.1 方向导数
若函数f(x,y,z)在点P(x,y,z)处沿方向l(方向角为α、β、γ),方向导数:
∂
f
∂
l
=
lim
ρ
→
0
Δ
f
Δ
ρ
=
lim
ρ
→
0
f
(
x
+
Δ
x
,
y
+
Δ
y
,
z
+
Δ
z
)
−
f
(
x
,
y
,
z
)
ρ
=
δ
f
δ
x
cos
α
+
δ
f
δ
y
cos
β
+
δ
f
δ
z
cos
γ
\frac{\partial f}{\partial l}=\lim_{\rho\to0}\frac{\Delta f}{\Delta \rho}\\=\lim_{\rho\to0}\frac{f(x+\Delta x, y+\Delta y, z+\Delta z)-f(x, y, z)}{\rho} \\ = \frac{\delta f}{\delta x}\cos \alpha+ \frac{\delta f}{\delta y}\cos \beta + \frac{\delta f}{\delta z}\cos \gamma
∂l∂f=ρ→0limΔρΔf=ρ→0limρf(x+Δx,y+Δy,z+Δz)−f(x,y,z)=δxδfcosα+δyδfcosβ+δzδfcosγ
其中
{
ρ
=
(
Δ
x
)
2
+
(
Δ
y
)
2
+
(
Δ
z
)
2
Δ
x
=
ρ
cos
α
Δ
y
=
ρ
cos
β
Δ
z
=
ρ
cos
γ
\begin{cases} \rho = \sqrt{(\Delta x)^2 + (\Delta y)^2 + (\Delta z)^2} \\ \Delta x = \rho \cos \alpha \\ \Delta y = \rho \cos \beta \\ \Delta z = \rho \cos \gamma \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧ρ=(Δx)2+(Δy)2+(Δz)2Δx=ρcosαΔy=ρcosβΔz=ρcosγ
证明
∵
Δ
f
=
∂
f
∂
x
Δ
x
+
∂
f
∂
y
Δ
y
+
∂
f
∂
z
Δ
z
=
ρ
(
∂
f
∂
x
cos
α
)
+
∂
f
∂
y
cos
β
+
∂
f
∂
z
cos
γ
∴
∂
f
∂
l
=
lim
ρ
→
0
Δ
f
Δ
ρ
=
Δ
f
Δ
x
cos
α
+
∂
f
∂
y
cos
β
+
∂
f
∂
z
cos
γ
\because \Delta f = \frac{\partial f}{\partial x}\Delta x + \frac{\partial f}{\partial y}\Delta y + \frac{\partial f}{\partial z}\Delta z \\ =\rho(\frac{\partial f}{\partial x}\cos \alpha) + \frac{\partial f}{\partial y}\cos \beta + \frac{\partial f}{\partial z}\cos \gamma\\ \therefore \frac{\partial f}{\partial l}= \lim_{\rho\to0}{\frac{\Delta f}{\Delta \rho}}\\ =\frac{\Delta f}{\Delta x}\cos \alpha+\frac{\partial f}{\partial y}\cos \beta+\frac{\partial f}{\partial z}\cos \gamma
∵Δf=∂x∂fΔx+∂y∂fΔy+∂z∂fΔz=ρ(∂x∂fcosα)+∂y∂fcosβ+∂z∂fcosγ∴∂l∂f=ρ→0limΔρΔf=ΔxΔfcosα+∂y∂fcosβ+∂z∂fcosγ
2.2 梯度
2.2.1 定义
向量G称为函数
f
(
P
)
f(P)
f(P)在点P处的梯度(gradient),记为
g
r
a
d
f
grad f
gradf。
∂
f
∂
l
=
∂
f
∂
x
cos
α
+
∂
f
∂
y
cos
β
+
∂
f
∂
z
cos
γ
=
G
→
⋅
l
→
\frac{\partial f}{\partial l}=\frac{\partial f}{\partial x}\cos \alpha + \frac{\partial f}{\partial y}\cos \beta + \frac{\partial f}{\partial z}\cos \gamma=\overrightarrow{G}\cdot \overrightarrow{l}
∂l∂f=∂x∂fcosα+∂y∂fcosβ+∂z∂fcosγ=G⋅l
可知:
{
G
→
=
(
∂
f
∂
x
,
∂
f
∂
y
,
∂
f
∂
z
)
l
→
=
(
cos
α
,
cos
β
,
cos
γ
)
\begin{cases} \overrightarrow{G}=(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z})\\ \overrightarrow{l}=(\cos \alpha, \cos \beta, \cos \gamma) \end{cases}
⎩⎨⎧G=(∂x∂f,∂y∂f,∂z∂f)l=(cosα,cosβ,cosγ)
g
r
a
d
f
=
(
∂
f
∂
x
,
∂
f
∂
y
,
∂
f
∂
z
)
=
∂
f
∂
x
i
→
+
∂
f
∂
y
j
→
+
∂
f
∂
z
k
→
grad f = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z})=\frac{\partial f}{\partial x}\overrightarrow{i} + \frac{\partial f}{\partial y}\overrightarrow{j} + \frac{\partial f}{\partial z}\overrightarrow{k}
gradf=(∂x∂f,∂y∂f,∂z∂f)=∂x∂fi+∂y∂fj+∂z∂fk
其中,
i
→
,
j
→
,
k
→
\overrightarrow{i},\overrightarrow{j}, \overrightarrow{k}
i,j,k为
x
,
y
,
z
x,y,z
x,y,z方向的单位向量,
l
→
\overrightarrow{l}
l为方向
l
l
l的单位向量.
函数的方向导数为梯度在该方向上的投影。
2.2.2 几何意义
函数在一点的梯度垂直于该点等值面或等值线,为该等值面的法向量
n
n
n,指向函数增大的方向,从一条等值线到另一条等值线,沿梯度方向距离最短,即下降或上升最快。
梯度方向:
f
f
f变化率最大的方向;
梯度模:
f
f
f的最大变化率的值;
2.2.3 梯度方向变化率最大推导
据上面梯度推导,可知:
∂
f
∂
l
=
∂
f
∂
x
cos
α
+
∂
f
∂
y
cos
β
+
∂
f
∂
z
cos
γ
=
G
→
⋅
l
→
=
∣
G
→
⋅
l
→
∣
cos
[
G
→
,
l
→
]
\frac{\partial f}{\partial l}=\frac{\partial f}{\partial x}\cos \alpha + \frac{\partial f}{\partial y}\cos \beta + \frac{\partial f}{\partial z}\cos \gamma \\=\overrightarrow{G}\cdot \overrightarrow{l}=|\overrightarrow{G}\cdot\overrightarrow{l}|\cos[\overrightarrow{G}, \overrightarrow{l}]
∂l∂f=∂x∂fcosα+∂y∂fcosβ+∂z∂fcosγ=G⋅l=∣G⋅l∣cos[G,l]
因此当
G
→
\overrightarrow{G}
G和
l
→
\overrightarrow{l}
l方向一致时,
∂
f
∂
l
\frac{\partial f}{\partial l}
∂l∂f取最大值,所以函数的某一点沿梯度方向变化率最大,最大值为该梯度的模.
3 梯度优化方法
梯度法中,求函数极值时,沿着梯度方向走,可最快达到极大值点;反之,沿着负梯度方向,可最快到达极小值点。这也就引出了两个不同的概念,梯度上升和梯度下降两种不同的梯度优化方法.
3.1 梯度下降法
梯度下降法又称最速下降法,函数f(x)在某点
x
k
x_k
xk的梯度
∇
f
(
x
k
)
\nabla f(x_k)
∇f(xk)的一个向量,其方向是f(x)增长最快的方向(变化率最大的方向),负梯度方向是f(x)减少最快的方向,如图2.1所示。
算法流程
(1) 确定目标函数
f
(
x
)
f(x)
f(x)
(2) 选择初始点
x
0
x_0
x0,给定允许误差
α
>
0
,
β
>
0
\alpha>0, \beta>0
α>0,β>0,令
k
=
0
k=0
k=0
(3) 计算负梯度
s
k
=
−
∇
f
(
x
k
)
s^{k}=-\nabla f(x_k)
sk=−∇f(xk)及单位向量
s
^
k
=
−
∇
f
(
x
k
)
∣
∣
∇
f
(
x
k
)
∣
∣
\hat{s}^k=-\frac{\nabla f(x_k)}{||\nabla f(x_k)||}
s^k=−∣∣∇f(xk)∣∣∇f(xk)
(4) 检查是否满足条件:
∣
∣
s
k
∣
∣
≤
α
||s^k||\leq \alpha
∣∣sk∣∣≤α,若满足转(9),否则继续
(5) 计算的最佳步长
ρ
k
∗
\rho_{k}^{*}
ρk∗(即机器学习的学习率)
(6) 更新变量:
x
k
+
1
=
x
k
+
ρ
k
∗
s
k
=
x
k
−
ρ
k
∗
∇
f
(
x
k
)
x_{k+1}=x_{k}+\rho_{k}^{*}s^k=x_k-\rho_{k}^{*}\nabla f(x_k)
xk+1=xk+ρk∗sk=xk−ρk∗∇f(xk)
(7) 计算并检验:若
f
(
x
k
+
1
)
−
f
(
x
k
)
≤
β
f(x_{k+1})-f(x_k)\leq \beta
f(xk+1)−f(xk)≤β转(9),否则继续
(8) 更新步长:
k
=
k
+
1
k=k+1
k=k+1,转(3)
(9) 输出结果,停止迭代
求函数
f
(
x
)
f(x)
f(x)极小值,可任意选初始点
x
0
x0
x0,从
x
0
x0
x0出发沿着负梯度方向搜索,可使
f
(
x
)
f(x)
f(x)下降最快。
3.2 梯度上升法
梯度上升法又称为最速上升法(可能没有,按照最速下降法命名),即求函数
f
(
x
)
f(x)
f(x)极大值,可任意选初始点
x
0
x0
x0,从
x
0
x0
x0出发沿着梯度方向搜索,可使
f
(
x
)
f(x)
f(x)上升最快,如图2.2所示。
算法流程
(1) 确定目标函数
f
(
x
)
f(x)
f(x)
(2) 选择初始点
x
0
x_0
x0,给定允许误差
α
>
0
,
β
>
0
\alpha>0, \beta>0
α>0,β>0,令
k
=
0
k=0
k=0
(3) 计算梯度
s
k
=
∇
f
(
x
k
)
s^{k}=\nabla f(x_k)
sk=∇f(xk)及单位向量
s
^
k
=
∇
f
(
x
k
)
∣
∣
∇
f
(
x
k
)
∣
∣
\hat{s}^k=\frac{\nabla f(x_k)}{||\nabla f(x_k)||}
s^k=∣∣∇f(xk)∣∣∇f(xk)
(4) 检查是否满足条件:
∣
∣
s
k
∣
∣
≤
α
||s^k||\leq \alpha
∣∣sk∣∣≤α,若满足转(9),否则继续
(5) 计算的最佳步长
ρ
k
∗
\rho_{k}^{*}
ρk∗(即机器学习的学习率)
(6) 更新变量:
x
k
+
1
=
x
k
+
ρ
k
∗
s
k
=
x
k
+
ρ
k
∗
∇
f
(
x
k
)
x_{k+1}=x_{k}+\rho_{k}^{*}s^k=x_k+\rho_{k}^{*}\nabla f(x_k)
xk+1=xk+ρk∗sk=xk+ρk∗∇f(xk)
(7) 计算并检验:若
f
(
x
k
+
1
)
−
f
(
x
k
)
≤
β
f(x_{k+1})-f(x_k)\leq \beta
f(xk+1)−f(xk)≤β转(9),否则继续
(8) 更新步长:
k
=
k
+
1
k=k+1
k=k+1,转(3)
(9) 输出结果,停止迭代
4 基于GradientDescent神经网络
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#模拟数据集
x_data = np.random.rand(200).astype(np.float32)
#目标函数:权重=0.5,偏置=0.8
y_data = x_data*0.5+0.8
#权重与偏置
weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
biases = tf.Variable(tf.zeros([1]))
#训练生成函数
y = weights*x_data+biases
#损失函数
loss = tf.reduce_mean(tf.square(y-y_data))
#梯度下降法优化器
optimizer = tf.train.GradientDescentOptimizer(0.5)
#训练
train = optimizer.minimize(loss)
#新建会话
with tf.Session() as sess:
#初始化变量
init_op = tf.global_variables_initializer()
sess.run(init_op)
for step in range(301):
sess.run(train)
if step % 10 == 0:
#每训练20步,输出一次权重与偏置结果 print(step,sess.run(weights),sess.run(biases))
#绘制结果图像
plt.title("Train Results")
plt.xlabel('x-axis')
plt.xlabel('y-axis')
plt.scatter(x_data,y_data,c='blue',marker='+',label='source data')
#绘制数据需要list,y为numpy.ndarray,使用tolist()转换 plt.plot(x_data,sess.run(y).tolist(),c='red',label='train data')
plt.grid(True)
plt.legend(loc='best')
plt.show()
从图4.1中,可看出计算的权重为0.4999,偏置为0.8000,从训练100步开始,与目标权重0.5和偏置0.8极为接近,神经网络学习成功。
5 总结
(1) 梯度:对于二维平面曲线而言,梯度是线上某一点的导数,且沿着数值增大的方向;对于三维平面,梯度垂直于等值面和等值线,沿梯度方向上升速度最快,即梯度方向函数变化率最大;
(2) 方向导数由两部分组成:方向和导数,方向即
l
l
l的方向,使用角度表示,导数即梯度,表示变化率;
(3) 梯度下降法即使用负梯度方向,使更新的值下降速度最快;
(4) 优化算法核心是优化目标函数,将问题抽象成目标函数,如机器学习中,将估计值和真实值计算损失,该损失表达式即为该训练的目标函数,进一步使用不同的优化算法进行优化,常用的优化算法有:Momentum、Nesterov、RMSProp、AdaGrad、Adam、SGD、GD等;
(5) 梯度上升法和梯度下降法比较如下:
序号 | 优化方法 | 搜索方向 | 目标 |
---|---|---|---|
1 | 梯度上升法 | 梯度方向 | 求极大值 |
2 | 梯度下降法 | 负梯度方向 | 求极小值 |