梯度下降(Gradient Descent)算法是一种用于优化可微分函数的迭代方法,特别是在机器学习和深度学习中用于最小化损失函数。其基本原理是沿着函数在当前点的梯度(即函数值增长最快的方向)的反方向进行搜索,从而逐步逼近函数的最小值。
在梯度下降算法中,我们首先选择一个初始的权重向量(或参数向量)( w_0 ),然后按照以下步骤进行迭代:
-
计算梯度:对于当前权重向量 ( w_t ),计算损失函数 ( J(w) ) 关于 ( w ) 的梯度 ( \nabla J(w_t) )。在简单线性回归的情况下,梯度可以表示为 ( \frac{1}{n} \sum_{i=1}^{n} (w \cdot x_i - y_i) \cdot x_i ),其中 ( n ) 是样本数量,( x_i ) 是第 ( i ) 个样本的特征值,( y_i ) 是第 ( i ) 个样本的标签值。
-
更新权重:使用学习率(或步长)( \eta ) 来更新权重向量。新的权重向量 ( w_{t+1} ) 是通过从当前权重向量中减去学习率与梯度的乘积得到的,即 ( w_{t+1} = w_t - \eta \cdot \nabla J(w_t) )。学习率是一个超参数,用于控制权重更新的步长。较大的学习率可能导致算法收敛更快,但也可能导致算法在最小值附近震荡而无法收敛;较小的学习率则可能导致算法收敛较慢。
-
重复迭代:重复步骤1和步骤2,直到满足某个停止条件(如达到最大迭代次数、损失函数值小于某个阈值或梯度值小于某个阈值)。
梯度下降算法有多种变体,包括批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent, SGD)和小批量梯度下降(Mini-batch Gradient Descent)。
- 批量梯度下降:在每次迭代中,使用所有数据样本来计算梯度并更新权重。这种方法在数据量较小时效果较好,但在大数据集上可能会导致计算量过大和内存不足的问题。
- 随机梯度下降:在每次迭代中,随机选择一个样本来计算梯度并更新权重。这种方法可以大大减少计算量,但由于梯度的随机性,可能会导致算法收敛速度较慢且不稳定。
- 小批量梯度下降:在每次迭代中,使用一小批样本来计算梯度并更新权重。这种方法结合了批量梯度下降和随机梯度下降的优点,既减少了计算量,又提高了算法的稳定性。
在深度学习中,通常使用小批量梯度下降或其变体(如带有动量的梯度下降、Adam等)来训练模型。
下面是一段简单的代码,用于对该算法的理解:
import torch
import numpy as np
# 数据集,因为x和y的值相同,我们可以很明确地知道权重w的值会趋于1,但是这样也有一些隐患,最好还是
# 使x和y的值不相同
x = np.array([0.18, 0.1, 0.16, 0.08, 0.09, 0.11, 0.12, 0.17, 0.15, 0.14, 0.13])
y = np.array([0.18, 0.1, 0.16, 0.08, 0.09, 0.11, 0.12, 0.17, 0.15, 0.14, 0.13])
# lr为学习率
lr = 1
# w为权值
w = 10
# epoches为循环进行的次数
epoches = 200
# grad为维度
grad = 0
# 进行梯度的更新
def grad_new(x, y, w):
return np.mean((x * w - y) * x)
#mean是求取平均值
# 进行损失值的更新
def loss_new(x, y, w):
return 0.5 * np.sum((w * x - y) ** 2)
#乘以0.5是为了和后面的平方求导后相互抵消
for i in range(epoches):
grad = grad_new(x, y, w)
w = w - lr * grad
loss = loss_new(x, y, w)
print(f"第{i + 1}次迭代的梯度为{grad},权值为{w},损失值为{loss}")