📜  多变量优化 – Gradient 和 Hessian(1)

📅  最后修改于: 2023-12-03 15:23:43.080000             🧑  作者: Mango

多变量优化 – Gradient 和 Hessian

在数学和计算机科学中,多变量优化是指在多个自变量的情况下求解最小或最大值的问题。多变量优化的应用非常广泛,例如机器学习、图像处理、最优控制等领域。

在多变量优化中,Gradient 和 Hessian 是两个非常重要的概念。Gradient 表示函数在某一点的梯度,可以告诉我们函数在该点的方向导数最大的方向;而 Hessian 是 Gradient 的二阶导数,可以告诉我们函数在该点的曲率情况。

Gradient

假设有一个多变量函数 $f(x_1, x_2, ..., x_n)$,函数在点 $(a_1, a_2, ..., a_n)$ 的 Gradient 定义如下:

$$\nabla f(a_1, a_2, ..., a_n) = \begin{bmatrix} \frac{\partial f}{\partial x_1}(a_1, a_2, ..., a_n) \ \frac{\partial f}{\partial x_2}(a_1, a_2, ..., a_n) \ ... \ \frac{\partial f}{\partial x_n}(a_1, a_2, ..., a_n) \end{bmatrix}$$

Gradient 的几何意义是函数在该点的斜率,也就是函数在该点沿着梯度方向增加最快。

在 Python 中,可以使用 Scipy 库来计算多变量函数的 Gradient。下面是一个例子:

import numpy as np
from scipy.optimize import minimize

def fun(x):
    return x[0]**2 + x[1]**2 + 2*x[0]*x[1]

def jac(x):
    return np.array([2*x[0]+2*x[1], 2*x[1]+2*x[0]])

res = minimize(fun, [0, 0], method='BFGS', jac=jac)
print(res)

在上面的例子中,fun 是一个二元函数,jac 是该函数的 Gradient。minimize 函数可以使用 BFGS 方法来求解该函数的最小值,并且可以使用 jac 参数来指定 Gradient 函数。

Hessian

类似地,函数在点 $(a_1, a_2, ..., a_n)$ 的 Hessian 定义如下:

$$H(a_1, a_2, ..., a_n) = \begin{bmatrix} \frac{\partial^2 f}{\partial x_1^2}(a_1, a_2, ..., a_n) & \frac{\partial^2 f}{\partial x_1 \partial x_2}(a_1, a_2, ..., a_n) & ... & \frac{\partial^2 f}{\partial x_1 \partial x_n}(a_1, a_2, ..., a_n) \ \frac{\partial^2 f}{\partial x_2 \partial x_1}(a_1, a_2, ..., a_n) & \frac{\partial^2 f}{\partial x_2^2}(a_1, a_2, ..., a_n) & ... & \frac{\partial^2 f}{\partial x_2 \partial x_n}(a_1, a_2, ..., a_n) \ ... & ... & ... & ... \ \frac{\partial^2 f}{\partial x_n \partial x_1}(a_1, a_2, ..., a_n) & \frac{\partial^2 f}{\partial x_n \partial x_2}(a_1, a_2, ..., a_n) & ... & \frac{\partial^2 f}{\partial x_n^2}(a_1, a_2, ..., a_n) \end{bmatrix}$$

注意这是一个 $n \times n$ 的矩阵。Hessian 的几何意义是函数在该点的曲率情况,也就是函数在该点的二阶导数之和。

在 Python 中,可以使用 Scipy 库来计算多变量函数的 Hessian。下面是一个例子:

import numpy as np
from scipy.optimize import minimize

def fun(x):
    return x[0]**2 + x[1]**2 + 2*x[0]*x[1]

def hess(x):
    return np.array([[2, 2], [2, 2]])

res = minimize(fun, [0, 0], method='Newton-CG', jac=jac, hess=hess)
print(res)

在上面的例子中,hess 是该函数的 Hessian。minimize 函数可以使用 Newton-CG 方法来求解该函数的最小值,并且可以使用 hess 参数来指定 Hessian 函数。

总结

Gradient 和 Hessian 是多变量优化中非常重要的概念。Gradient 可以告诉我们函数在某一点的方向导数最大的方向,而 Hessian 可以告诉我们函数在该点的曲率情况。Python 中的 Scipy 库可以帮助我们方便地计算多变量函数的 Gradient 和 Hessian。