从头开始实现的梯度下降算法

在本文中,我们将通过一个示例来了解各种机器学习和神经网络算法中使用的最重要的算法之一,其中我们将在 python 中从头开始实现梯度下降算法。言归正传,让我们开始吧。

什么是梯度下降?

梯度下降是一种优化算法,用于最小化机器学习和深度学习模型中的成本函数。它是一种一阶优化算法,通过迭代调整模型的参数来降低成本。该算法的工作原理是计算成本函数相对于参数的梯度,并沿成本下降最陡的方向更新参数。在进入数学部分之前,首先让我们了解什么是任何算法的成本函数。

成本函数

在机器学习中,成本函数(也称为损失函数或误差函数)是一种数学函数,用于测量给定的一组输入/输出对的预测值与实际值之间的差异。机器学习算法的目标是找到最小化成本函数的参数。例如,在线性回归中,通常使用均方误差(MSE)作为成本函数:

均方误差

另一个非常流行的指标是RMSE,它基本上是 MSE 的根,用于确定模型的性能,RMSE 的值越低,我们的模型预测的准确性越高。

数学理解梯度下降

梯度下降背后的基本思想是从一组初始参数开始,然后朝成本下降最陡的方向迭代调整它们,直到达到最小值。调整的大小由学习率(α)决定,学习率决定每次迭代中参数更新的程度。让我们通过一个使用 MSE 的例子来理解这一点:

我们知道,给定输入特征x和输出标签y线性回归模型定义如下,其中 w 是参数向量,b 是偏差项:

线性回归器

均方误差成本函数定义如下,其中 m 是样本数,y_{pred,i} 是第 i 个样本的预测输出:

成本函数(MSE)

成本相对于参数 w 的梯度可以计算如下:

重量梯度

成本相对于偏差项b的梯度可以计算如下:

梯度与偏差

最后,可以使用梯度下降规则更新参数 w 和 b,如下所示,其中α学习率,它决定更新的步长:

每次迭代后更新

注意:较小的学习率会导致收敛速度较慢,但​​较高的学习率可能会导致算法超出最小值而无法收敛。

梯度下降的类型

  • 批量梯度下降在每次迭代中计算相对于整个训练数据集的参数的成本梯度。
  • 随机梯度下降计算每次迭代中随机选择的单个训练示例的成本梯度。
  • 小批量梯度下降计算每次迭代中随机选择的小训练示例子集的成本梯度。

小批量 GD 最常用,因为全批量学习器必须为每个权重更新执行完整数据集扫描,而小批量学习器可以在每个数据集扫描中多次执行相同的权重更新,从而使训练速度成倍加快

在 Python 中从头开始实现梯度下降

让我们考虑一个具有单个输入特征的线性回归示例来说明梯度下降算法。线性回归的成本函数是均方误差 (MSE),由下式给出:

MSE(w, b) = 1/N * sum((y_pred - y_true)^2)

其中wb是线性回归模型的参数,y_pred是预测输出,y_true是实际输出,N是训练样本数。为了实现梯度下降,我们需要计算成本函数相对于参数w和 的梯度b

dw = 1/N * 2 * sum((y_pred - y_true) * x)
db = 1/N * 2 * sum(y_pred - y_true)

接下来,我们可以使用梯度和学习率来更新参数alpha

w = w - alpha * dw
b = b - alpha * db

Python中实现线性回归的梯度下降算法的完整代码

import numpy as np
 
def gradient_descent(x, y, alpha, num_iters):
    m = x.shape[0]
    w = np.zeros(x.shape[1])
    b = 0
    for i in range(num_iters):
        y_pred = np.dot(x, w) + b
        dw = (1/m) * np.dot(x.T, (y_pred - y))
        db = (1/m) * np.sum(y_pred - y)
        w = w - alpha * dw
        b = b - alpha * db
    return w, b

概括

我们从头开始了解了梯度下降算法所涉及的数学原理以及它在 python 中的实现。如有任何疑问,请随时发表评论。

参考文献