1. 梯度法 (Gradient Descent)
梯度法是求解最小值的一种优化算法,被广泛应用于深度学习中。其基本思想是,在每个迭代步骤中,沿着函数梯度的反方向移动一定距离,从而接近函数的最小值。下面将会介绍如何使用python实现梯度法。
2. 最速下降法 (Steepest Descent)
最速下降法是梯度法的一种特殊形式。在每一步迭代中,最速下降法选择沿着梯度的方向,使得下降最快。下面我们将会使用python实现最速下降法。
3. 实现:
3.1 函数定义
我们将使用以下函数进行演示:
import numpy as np
def func(x):
return x[0]**2 + (4 * x[1]**2 - 2.1 * x[1]**4) * x[1]**2 + x[0] * x[1] - 4 * x[0]**2 * x[1]**2 + 1
然后定义梯度函数:
def grad_func(x):
"""
Calculate the gradient of the function
"""
grad = [0, 0]
grad[0] = 2 * x[0] + x[1] - 8 * x[0] * x[1]**2
grad[1] = 16 * x[1]**3 - 8.4 * x[1]**2 + 2 * x[0] * x[1]
return np.array(grad)
以上代码中,func(x) 是我们需要求解的函数,grad_func(x) 是 func(x) 对 x 的梯度。
3.2 梯度法实现
下面是梯度法的 python 实现:
def gradient_descent(func, grad_func, init_x, lr=0.01, num_iters=1000):
"""
Gradient descent optimization
"""
# Initialize the solution vector
x = init_x.copy()
# Start iterating
for i in range(num_iters):
# Calculate the gradient of the function
grad = grad_func(x)
# Update x
x -= lr * grad
# Print iteration information
if i % 10 == 0:
print(f"Iteration {i}: x = {x}, func(x) = {func(x)}")
return x
上述代码定义了一个函数 gradient_descent,该函数接受 func(需求解的函数)、grad_func(计算梯度的函数)、init_x(初始 x 值)、lr(学习率)和 num_iters(迭代次数)作为参数,并返回最优解 x。
3.3 最速下降法实现
最速下降法的 python 实现与梯度法类似,只需要稍微调整一下就可以了:
def steepest_descent(func, grad_func, init_x, lr=0.01, num_iters=1000, temperature=0.6):
"""
Steepest descent optimization
"""
# Initialize the solution vector
x = init_x.copy()
# Start iterating
for i in range(num_iters):
# Calculate the gradient of the function
grad = grad_func(x)
# Calculate the step size alpha by line search
alpha = line_search(func, grad_func, x, grad, temperature=temperature)
# Update x
x -= alpha * grad
# Print iteration information
if i % 10 == 0:
print(f"Iteration {i}: x = {x}, func(x) = {func(x)}")
return x
上述代码定义了一个函数 steepest_descent,该函数接受 func(需求解的函数)、grad_func(计算梯度的函数)、init_x(初始 x 值)、lr(学习率)和 num_iters(迭代次数)作为参数,并返回最优解 x。
3.4 线搜索实现
上面我们提到了一个函数 line_search 用于计算梯度下降步长,下面介绍一下这个函数的实现方法:
def line_search(func, grad_func, x, grad, temperature=0.6):
"""
Line search using the Armijo-Goldstein condition
"""
alpha = 1.0
# Armijo-Goldstein condition
while func(x - alpha * grad) > func(x) - temperature * alpha * np.dot(grad, grad):
alpha *= 0.5
return alpha
上述代码中,line_search 函数使用了 Armijo-Goldstein 条件进行计算,它会不断地调整步长 alpha 直到满足条件。
4. 运行并可视化结果
现在我们可以运行梯度法和最速下降法了:
# Gradient descent
init_x = np.array([0, 0])
gradient_descent(func, grad_func, init_x, lr=0.01, num_iters=100)
# Steepest descent
init_x = np.array([0, 0])
steepest_descent(func, grad_func, init_x, lr=0.01, num_iters=100, temperature=0.6)
我们使用 matplotlib 库对迭代过程进行可视化:
import matplotlib.pyplot as plt
# Define a helper function for visualization
def plot_iterations(iterations):
plt.plot([x[0] for x in iterations], [x[1] for x in iterations], 'o-')
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('Optimization progress')
# Gradient descent visualization
init_x = np.array([0, 0])
iterations = [init_x]
def gradient_descent_visual(func, grad_func, init_x, lr=0.01, num_iters=1000):
x = init_x.copy()
for i in range(num_iters):
grad = grad_func(x)
x -= lr * grad
if i % 10 == 0:
iterations.append(x.copy())
plot_iterations(iterations)
gradient_descent_visual(func, grad_func, init_x, lr=0.01, num_iters=100)
# Steepest descent visualization
init_x = np.array([0, 0])
iterations = [init_x]
def steepest_descent_visual(func, grad_func, init_x, lr=0.01, num_iters=1000, temperature=0.6):
x = init_x.copy()
for i in range(num_iters):
grad = grad_func(x)
alpha = line_search(func, grad_func, x, grad, temperature=temperature)
x -= alpha * grad
if i % 10 == 0:
iterations.append(x.copy())
plot_iterations(iterations)
steepest_descent_visual(func, grad_func, init_x, lr=0.01, num_iters=100, temperature=0.6)
运行上述代码之后,我们得到了两个可视化结果。第一个结果表示使用梯度法进行优化的过程,第二个结果表示使用最速下降法进行优化的过程。
总结
本文介绍了如何使用 python 实现梯度法和最速下降法。其中,梯度法是求解最小值最常用的算法之一,而最速下降法则是梯度法的一种特殊形式,在大多数情况下优于梯度法。通过本文,对于优化算法的使用和实现会有更深入的理解。