前言
终于抢到八月份Datawhale的组队学习内容,这一月的项目都很吸引人,挑来挑去选择了集成学习这一模块,希望可以与一群小伙伴们一起学到知识,以下是task1的学习笔记,参考内容为Datawhale集成学习开源教程。
梯度向量
表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大。
定义:设二元函数
z
=
f
(
x
,
y
)
z=f(x, y)
z=f(x,y) 在平面区域D上具有一阶连续偏导数,则对于每一个点P(x, y)都可定出一个向量
{
∂
f
∂
x
,
∂
f
∂
y
}
=
f
x
(
x
,
y
)
i
ˉ
+
f
y
(
x
,
y
)
j
ˉ
,
\left\{\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right\}=f_{x}(x, y) \bar{i}+f_{y}(x, y) \bar{j},
{∂x∂f,∂y∂f}=fx(x,y)iˉ+fy(x,y)jˉ, 该函数就称为函数
z
=
f
(
x
,
y
)
z=f(x, y)
z=f(x,y) 在点P
(
x
,
y
)
(\mathrm{x}, \mathrm{y})
(x,y) 的梯度,记作gradf
(
x
,
y
)
(\mathrm{x}, \mathrm{y})
(x,y) 或
∇
f
(
x
,
y
)
\nabla f(x, y)
∇f(x,y),即有:
gradf
(
x
,
y
)
=
∇
f
(
x
,
y
)
=
{
∂
f
∂
x
,
∂
f
∂
y
}
=
f
x
(
x
,
y
)
i
ˉ
+
f
y
(
x
,
y
)
j
ˉ
\operatorname{gradf}(\mathrm{x}, \mathrm{y})=\nabla f(x, y)=\left\{\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right\}=f_{x}(x, y) \bar{i}+f_{y}(x, y) \bar{j}
gradf(x,y)=∇f(x,y)={∂x∂f,∂y∂f}=fx(x,y)iˉ+fy(x,y)jˉ
其中
∇
=
∂
∂
x
i
ˉ
+
∂
∂
y
j
ˉ
\nabla=\frac{\partial}{\partial x} \bar{i}+\frac{\partial}{\partial y} \bar{j}
∇=∂x∂iˉ+∂y∂jˉ 称为(二维的)向量微分算子或Nabla算子,
∇
f
=
∂
f
∂
x
i
ˉ
+
∂
f
∂
y
j
ˉ
\nabla f=\frac{\partial f}{\partial x} \bar{i}+\frac{\partial f}{\partial y} \bar{j}
∇f=∂x∂fiˉ+∂y∂fjˉ 。
举一个栗子:
计算
f
(
x
,
y
)
=
x
2
+
y
2
f(x,y) = x^2 + y^2
f(x,y)=x2+y2的梯度向量
雅克比矩阵
假设
F
:
R
n
→
R
m
F: \mathbb{R}_{n} \rightarrow \mathbb{R}_{m}
F:Rn→Rm 是一个从n维欧氏空间映射到到m维欧氏空间的函数。
这个函数由m个实函数组成:
y
1
(
x
1
,
⋯
,
x
n
)
,
⋯
,
y
m
(
x
1
,
⋯
,
x
n
)
y_{1}\left(x_{1}, \cdots, x_{n}\right), \cdots, y_{m}\left(x_{1}, \cdots, x_{n}\right)
y1(x1,⋯,xn),⋯,ym(x1,⋯,xn) 。这些函数的偏导数(如果存在)可以组成一个m行n列的矩阵,这个矩阵就是所谓的雅可比矩阵:
[
∂
y
1
∂
x
1
⋯
∂
y
1
∂
x
n
⋮
⋱
⋮
∂
y
m
∂
x
1
⋯
∂
y
m
∂
x
n
]
\left[\begin{array}{ccc} \frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_{m}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}} \end{array}\right]
⎣⎢⎡∂x1∂y1⋮∂x1∂ym⋯⋱⋯∂xn∂y1⋮∂xn∂ym⎦⎥⎤
举一个栗子:
求
F
=
(
f
1
(
x
,
y
)
,
f
(
x
,
y
)
)
T
F=(f_1(x,y),f_(x,y))^T
F=(f1(x,y),f(x,y))T的雅克比矩阵,其中
f
1
(
x
,
y
)
=
2
x
2
+
y
2
,
f
2
(
x
,
y
)
=
x
2
+
3
y
2
f_1(x,y) = 2x^2 + y^2,f_2(x,y) = x^2 + 3y^2
f1(x,y)=2x2+y2,f2(x,y)=x2+3y2
海森矩阵
海森矩阵是一个自变量为向量的实值函数的二阶偏导数组成的方块矩阵,假有一实数函数
f
(
x
1
,
x
2
,
…
,
x
n
)
f\left(x_{1}, x_{2}, \ldots, x_{n}\right)
f(x1,x2,…,xn)
如果
f
f
f 所有的二阶偏导数都存在,那么
f
f
f 的海森矩阵的第
i
j
i j
ij 项,即:
H
(
f
)
i
j
(
x
)
=
D
i
D
j
f
(
x
)
H(f)_{i j}(x)=D_{i} D_{j} f(x)
H(f)ij(x)=DiDjf(x)
其中
x
=
(
x
1
,
x
2
,
…
,
x
n
)
,
x=\left(x_{1}, x_{2}, \ldots, x_{n}\right),
x=(x1,x2,…,xn), 即
H
(
f
)
=
[
∂
2
f
∂
x
1
2
∂
2
f
∂
x
1
∂
x
2
⋯
∂
2
f
∂
x
1
∂
x
n
∂
2
f
∂
x
2
∂
x
1
∂
2
f
∂
x
2
2
⋯
∂
2
f
∂
x
2
∂
x
n
⋮
⋮
⋱
⋮
∂
2
f
∂
x
n
∂
x
1
∂
2
f
∂
x
n
∂
x
2
⋯
∂
2
f
∂
x
n
2
]
H(f)=\left[\begin{array}{cccc} \frac{\partial^{2} f}{\partial x_{1}^{2}} & \frac{\partial^{2} f}{\partial x_{1} \partial x_{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{1} \partial x_{n}} \\ \frac{\partial^{2} f}{\partial x_{2} \partial x_{1}} & \frac{\partial^{2} f}{\partial x_{2}^{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{2} \partial x_{n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^{2} f}{\partial x_{n} \partial x_{1}} & \frac{\partial^{2} f}{\partial x_{n} \partial x_{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{n}^{2}} \end{array}\right]
H(f)=⎣⎢⎢⎢⎢⎢⎡∂x12∂2f∂x2∂x1∂2f⋮∂xn∂x1∂2f∂x1∂x2∂2f∂x22∂2f⋮∂xn∂x2∂2f⋯⋯⋱⋯∂x1∂xn∂2f∂x2∂xn∂2f⋮∂xn2∂2f⎦⎥⎥⎥⎥⎥⎤
也就是雅克比矩阵的导数就是海森矩阵。
举一个栗子:
求
f
(
x
,
y
)
=
2
x
2
+
y
2
f(x,y)=2x^2+y^2
f(x,y)=2x2+y2的海森矩阵
有了以上的基础,接下来为函数的极值问题。
函数的极值与最值
极值:设函数
f
(
x
)
f(x)
f(x) 在点
x
0
x_{0}
x0 的某邻域
U
(
x
0
)
U\left(x_{0}\right)
U(x0) 内有定义,如果对于去心邻域U
(
x
0
)
\left(x_{0}\right)
(x0) 内的任一
x
x
x, 有 A
f
(
x
)
<
f
(
x
0
)
或
f
(
x
)
>
f
(
x
0
)
f(x)<f\left(x_{0}\right) \text { 或 } f(x)>f\left(x_{0}\right)
f(x)<f(x0) 或 f(x)>f(x0)
那么就称
f
(
x
0
)
f\left(x_{0}\right)
f(x0) 是函数的一个极大值或极小值。函数的极大值和极小值统称为函数的极值, 使函数取得极值的点被称作极值点。
最值是函数在其定义域内取得最大值(或最小值)的点的函数值。极值是局部性的概念,而最值是全局性的概念。
最优性条件
一元函数
设函数
f
(
x
)
f(x)
f(x) 在
x
0
x_{0}
x0 处具有二阶导数且
f
′
(
x
0
)
=
0
,
f
′
′
(
x
0
)
≠
0
f^{\prime}\left(x_{0}\right)=0, \quad f^{\prime \prime}\left(x_{0}\right) \neq 0
f′(x0)=0,f′′(x0)=0 那么:
(1) 当
f
′
′
(
x
0
)
<
0
f^{\prime \prime}\left(x_{0}\right)<0
f′′(x0)<0 时,函数
f
(
x
)
f(x)
f(x) 在
x
0
x_{0}
x0 处取得极大值;
(2) 当
f
′
′
(
x
0
)
>
0
f^{\prime \prime}\left(x_{0}\right)>0
f′′(x0)>0 时,函数
f
(
x
)
f(x)
f(x) 在
x
0
x_{0}
x0 处取得极小值。
多元函数
设n多元实函数
f
(
x
1
,
x
2
,
⋯
,
x
n
)
f\left(x_{1}, x_{2}, \cdots, x_{n}\right)
f(x1,x2,⋯,xn) 在点
M
0
(
a
1
,
a
2
,
…
,
a
n
)
M_{0}\left(a_{1}, a_{2}, \ldots, a_{n}\right)
M0(a1,a2,…,an) 的邻域内有二阶连续偏导,若有:
∂
f
∂
x
j
∣
(
a
1
,
a
2
,
…
,
a
n
)
=
0
,
j
=
1
,
2
,
…
,
n
\left.\frac{\partial f}{\partial x_{j}}\right|_{\left(a_{1}, a_{2}, \ldots, a_{n}\right)}=0, j=1,2, \ldots, n
∂xj∂f∣∣∣∣(a1,a2,…,an)=0,j=1,2,…,n
并且
A
=
[
∂
2
f
∂
x
1
2
∂
2
f
∂
x
1
∂
x
2
⋯
∂
2
f
∂
x
1
∂
x
n
∂
2
f
∂
x
2
∂
x
1
∂
2
f
∂
x
2
2
⋯
∂
2
f
∂
x
2
∂
x
n
⋮
⋮
⋱
⋮
∂
2
f
∂
x
n
∂
x
1
∂
2
f
∂
x
n
∂
x
2
⋯
∂
2
f
∂
x
n
2
]
A=\left[\begin{array}{cccc} \frac{\partial^{2} f}{\partial x_{1}^{2}} & \frac{\partial^{2} f}{\partial x_{1} \partial x_{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{1} \partial x_{n}} \\ \frac{\partial^{2} f}{\partial x_{2} \partial x_{1}} & \frac{\partial^{2} f}{\partial x_{2}^{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{2} \partial x_{n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^{2} f}{\partial x_{n} \partial x_{1}} & \frac{\partial^{2} f}{\partial x_{n} \partial x_{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{n}^{2}} \end{array}\right]
A=⎣⎢⎢⎢⎢⎢⎡∂x12∂2f∂x2∂x1∂2f⋮∂xn∂x1∂2f∂x1∂x2∂2f∂x22∂2f⋮∂xn∂x2∂2f⋯⋯⋱⋯∂x1∂xn∂2f∂x2∂xn∂2f⋮∂xn2∂2f⎦⎥⎥⎥⎥⎥⎤
则有如下结果:
(1) 当A正定矩阵时,
f
(
x
1
,
x
2
,
⋯
,
x
n
)
f\left(x_{1}, x_{2}, \cdots, x_{n}\right)
f(x1,x2,⋯,xn) 在
M
0
(
a
1
,
a
2
,
…
,
a
n
)
M_{0}\left(a_{1}, a_{2}, \ldots, a_{n}\right)
M0(a1,a2,…,an) 处是极小值;
(2) 当A负定矩阵时,
f
(
x
1
,
x
2
,
⋯
,
x
n
)
f\left(x_{1}, x_{2}, \cdots, x_{n}\right)
f(x1,x2,⋯,xn) 在
M
0
(
a
1
,
a
2
,
…
,
a
n
)
M_{0}\left(a_{1}, a_{2}, \ldots, a_{n}\right)
M0(a1,a2,…,an) 处是极大值;
(3) 当A不定矩阵时,
M
0
(
a
1
,
a
2
,
…
,
a
n
)
M_{0}\left(a_{1}, a_{2}, \ldots, a_{n}\right)
M0(a1,a2,…,an) 不是极值点。
(4) 当A为半正定矩阵或半负定矩阵时,
M
0
(
a
1
,
a
2
,
…
,
a
n
)
M_{0}\left(a_{1}, a_{2}, \ldots, a_{n}\right)
M0(a1,a2,…,an) 是“可疑"极值点,尚需要利用其他方法来判定。
举一个栗子:
求三元函数
f
(
x
,
y
,
z
)
=
x
2
+
y
2
+
z
2
+
2
x
+
4
y
−
6
z
f(x, y, z)=x^{2}+y^{2}+z^{2}+2 x+4 y-6 z
f(x,y,z)=x2+y2+z2+2x+4y−6z 的极值
基于梯度的优化方法–梯度下降法
代码:
import numpy as np
import matplotlib.pyplot as plt
# 定义开方函数
def f(x):
return np.power(x, 2)
# 定义求导方式
def d_f(f, x, delta=1e-4):
return (f(x+delta) - f(x-delta)) / (2 * delta)
# 绘图
xs = np.arange(-10, 11)
plt.plot(xs, f(xs))
learning_rate = 0.1 # 学习率
max_loop = 30 # 迭代数
x_init = 10.0 # 初始值
x = x_init
lr = 0.1
x_list = []
# 不断迭代直到找到最小值
for i in range(max_loop):
d_f_x = d_f(f, x)
x = x - learning_rate * d_f_x
x_list.append(x)
x_list = np.array(x_list)
plt.scatter(x_list,f(x_list),c="r")
plt.show()
print('initial x =', x_init)
print('arg min f(x) of x =', x)
print('f(x) =', f(x))
基于梯度的优化方法–牛顿迭代法
- 牛顿法是求解函数值为0时的自变量取值的方法。
- 利用牛顿法求解目标函数的最小值其实是转化成求使目标函数的一阶导为0的参数值。
- 迭代过程是在当前位置x0求该函数的切线,该切线和x轴的交点x1,作为新的x0,重复这个过程,直到交点和函数的零点重合。
迭代的公式如下:
θ
:
=
θ
−
α
ℓ
′
(
θ
)
ℓ
′
′
(
θ
)
\theta:=\theta-\alpha \frac{\ell^{\prime}(\theta)}{\ell^{\prime \prime}(\theta)}
θ:=θ−αℓ′′(θ)ℓ′(θ)
当
θ
\theta
θ是向量时, 牛顿法可以使用下面式子表示:
θ
:
=
θ
−
α
H
−
1
∇
θ
ℓ
(
θ
)
\theta:=\theta-\alpha H^{-1} \nabla_{\theta} \ell(\theta)
θ:=θ−αH−1∇θℓ(θ)
其中
H
H
H叫做海森矩阵,其实就是目标函数对参数
θ
\theta
θ的二阶导数。
牛顿法和梯度下降法的比较
1.牛顿法:
- 通过求解目标函数的一阶导数为0时的参数,进而求出目标函数最小值时的参数。
- 收敛速度很快。
- 海森矩阵的逆在迭代过程中不断减小,可以起到逐步减小步长的效果。
- 缺点:海森矩阵的逆计算复杂,代价比较大,因此有了拟牛顿法。
2.梯度下降法:
- 通过梯度方向和步长,直接求解目标函数的最小值时的参数。
- 越接近最优值时,步长应该不断减小,否则会在最优值附近来回震荡。
举一个栗子:
使用梯度下降和牛顿法寻找Rosenbrock函数最小值
定义Rosenbrock函数:
f
(
x
,
y
)
=
(
a
−
x
)
2
+
b
(
y
−
x
2
)
2
f(x,y) = (a-x)^2+b(y-x^2)^2
f(x,y)=(a−x)2+b(y−x2)2
这里将a取值为1,b取值为100,即:
f
(
x
,
y
)
=
(
1
−
x
)
2
+
100
(
y
−
x
2
)
2
f(x,y) = (1-x)^2+100(y-x^2)^2
f(x,y)=(1−x)2+100(y−x2)2
函数图像及代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
x = np.arange(-50, 50, 1)
y = np.arange(-50, 50, 1)
x, y = np.meshgrid(x, y)
a=1
b=100
f = np.square(a-x) + b*np.square(y-x**2) # 函数
ax.plot_surface(x, y, f, rstride=1, cstride=1, cmap='rainbow')
plt.show()
牛顿法求最小值代码:
def f(x, y):
return (1 - x) ** 2 + 100 * (y - x * x) ** 2
def H(x, y):
return np.matrix([[1200 * x * x - 400 * y + 2, -400 * x],
[-400 * x, 200]])
def grad(x, y):
return np.matrix([[2 * x - 2 + 400 * x * (x * x - y)],
[200 * (y - x * x)]])
def delta_newton(x, y):
alpha = 1.0
delta = alpha * H(x, y).I * grad(x, y)
return delta
x = np.matrix([[-0.1],
[0.2]])
tol = 0.00001
xv = [x[0, 0]]
yv = [x[1, 0]]
for t in range(100):
delta = delta_newton(x[0, 0], x[1, 0])
if abs(delta[0, 0]) < tol and abs(delta[1, 0]) < tol:
break
x = x - delta
xv.append(x[0, 0])
yv.append(x[1, 0])
xv1=int(round(xv[-1],1))
yv1=int(round(yv[-1],1))
print('最小值:({},{})'.format(xv1,yv1))
参考资料:
萌弟AI(B站视频)