likes
comments
collection
share

机器学习基础-监督学习-线性回归之梯度下降法

作者站长头像
站长
· 阅读数 5

梯度下降法(Gradient Descent)是一种常用的优化算法,用于求解损失函数的最小值。它通过迭代更新模型参数,沿着损失函数梯度的反方向逐步调整参数,直到达到最优解。下面是梯度下降法的详细讲解,包括算法原理、公式以及示例代码。

算法原理:

  1. 初始化模型参数。
  2. 计算损失函数关于参数的梯度。
  3. 更新参数:将参数沿着梯度的反方向移动一定步长。
  4. 重复步骤 2 和 3,直到达到停止条件(例如达到最大迭代次数或损失函数变化小于某个阈值)。

公式:

假设有一个损失函数 J(θ),其中 θ 表示模型的参数。梯度下降法的参数更新公式如下: θ = θ - α * ∇J(θ)

其中,α 称为学习率(learning rate),控制参数更新的步长;∇J(θ)表示损失函数关于参数 θ 的梯度。

示例代码:

下面是使用梯度下降法求解线性回归模型的示例代码,其中使用均方误差(Mean Squared Error)作为损失函数:

import numpy as np

# 构造训练数据
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4]])  # 特征矩阵
y = np.array([3, 4, 5, 6])  # 标签

# 初始化参数
theta = np.zeros(X.shape[1])  # 参数向量
learning_rate = 0.01  # 学习率
max_iterations = 1000  # 最大迭代次数
tolerance = 1e-4  # 停止条件:损失函数变化小于阈值

# 梯度下降迭代更新参数
iteration = 0
while iteration < max_iterations:
    # 计算损失函数关于参数的梯度
    gradients = 2 * np.dot(X.T, np.dot(X, theta) - y) / len(y)

    # 更新参数
    theta -= learning_rate * gradients

    # 计算损失函数
    loss = np.mean((np.dot(X, theta) - y) ** 2)

    # 判断是否达到停止条件
    if loss < tolerance:
        break

    iteration += 1

print("参数(theta):", theta)
print("损失函数:", loss)

在上述代码中,我们使用了梯度下降法求解线性回归模型的参数 theta。通过迭代更新参数,直到达到停止条件(损失函数变化小于阈值),得到最优参数和最小化的损失函数。

当涉及到梯度下降法时,还有几个关键点需要注意:

  1. 学习率(learning rate):学习率决定了参数更新的步长,即每次迭代中参数更新的幅度。选择合适的学习率很重要,过大的学习率可能导致参数在最小值附近震荡或无法收敛,而过小的学习率可能导致收敛速度缓慢。通常需要通过实验和调参来选择合适的学习率。

  2. 批量梯度下降和随机梯度下降:在上述示例代码中,我们使用的是批量梯度下降(Batch Gradient Descent),即每次迭代都使用所有的训练样本来计算梯度和更新参数。相比之下,随机梯度下降(Stochastic Gradient Descent)每次迭代只使用一个样本来计算梯度和更新参数。随机梯度下降通常收敛速度更快,但会引入更多的随机性。

  3. 收敛性和局部最优解:梯度下降法不保证获得全局最优解,而只能保证收敛到局部最优解或鞍点。参数初始化、学习率和损失函数的形状等因素都会影响最终结果。有时候,为了克服局部最优解的问题,可以使用随机初始化多个不同的初始参数,运行梯度下降法多次,并选择具有最小损失函数的参数。

  4. 收敛判据:在示例代码中,我们使用了损失函数变化小于阈值作为停止条件。还可以使用其他停止条件,例如达到最大迭代次数、梯度的模小于阈值等。

  5. 特征缩放:在应用梯度下降法之前,进行特征缩放可以加快算法的收敛速度。特征缩放可以将不同特征的值范围缩放到相似的尺度,避免某些特征对梯度计算和参数更新的影响过大。

以上是关于梯度下降法的一些重要细节和注意事项。理解这些概念和原理,能够更好地应用梯度下降法来求解机器学习模型的参数。

转载自:https://juejin.cn/post/7249765949742383141
评论
请登录