实际编程中计算梯度下降的过程可以分为以下几个步骤:
初始化参数
选择一个初始点作为参数向量的起始值,通常可以选择随机值或零。
设定一个学习率,它决定了每次参数更新的步长。
计算梯度
对目标函数求偏导数,得到梯度向量。梯度向量表示函数在当前参数下的斜率,指向函数值增长最快的方向。
更新参数
根据计算得到的梯度向量和学习率,按照公式 \( \theta = \theta - \alpha \nabla J(\theta) \) 更新参数向量。其中,\( \theta \) 是参数向量,\( \alpha \) 是学习率,\( \nabla J(\theta) \) 是目标函数 \( J(\theta) \) 关于 \( \theta \) 的梯度。
迭代
重复步骤2和步骤3,直到满足收敛条件或达到预设的迭代次数。
收敛条件
梯度向量的范数(长度)接近于零,表示函数已经收敛到最小值点。
目标函数值的变化量小于预设的阈值,也可以作为收敛条件。
示例代码(Python)
```python
import numpy as np
def gradient_descent(gradient, start, learn_rate, n_iter=50, tolerance=1e-6):
"""
梯度下降算法实现
参数:
gradient -- 损失函数对参数的梯度函数
start -- 参数向量的初始值
learn_rate -- 学习率
n_iter -- 迭代次数
tolerance -- 收敛容忍度
返回:
local_min -- 局部最小值点
"""
vector = start
for _ in range(n_iter):
diff = -learn_rate * gradient(vector)
if np.linalg.norm(diff) < tolerance:
break
vector += diff
return vector
示例目标函数和梯度
def objective_function(x):
return x2
def gradient_of_objective(x):
return 2*x
初始化参数
start = 10.0
learn_rate = 0.1
执行梯度下降
local_min = gradient_descent(gradient_of_objective, start, learn_rate)
print(f"Local minimum at: {local_min}")
```
在这个示例中,我们定义了一个简单的目标函数 \( f(x) = x^2 \) 及其梯度 \( \nabla f(x) = 2x \)。通过调用 `gradient_descent` 函数,我们可以找到这个函数的局部最小值点。
类型
根据每次更新所使用的数据量,梯度下降算法可以分为以下几种主要类型:
批量梯度下降(Batch Gradient Descent)
使用整个训练集来计算梯度。
优点:对梯度估计准确。
缺点:当数据集较大时,计算代价高,内存占用大。
随机梯度下降(Stochastic Gradient Descent, SGD)
每次更新仅使用一个样本。
优点:收敛速度快,计算代价低。
缺点:收敛过程可能较慢且不稳定。
小批量梯度下降(Mini-batch Gradient Descent)
每次更新使用一小部分样本(例如32、64或128个样本)。
综合了批量梯度下降和随机梯度下降的优点,平衡了计算代价和收敛速度。
选择哪种类型的梯度下降算法取决于具体的应用场景和数据集大小。