📜  ML | Python的小批量梯度下降(1)

📅  最后修改于: 2023-12-03 15:32:54.933000             🧑  作者: Mango

ML | Python的小批量梯度下降

小批量梯度下降(mini-batch gradient descent)是机器学习中常用的一种优化算法,它可以有效地在训练大规模神经网络时优化模型参数。与传统的批量梯度下降算法相比,小批量梯度下降具有更快的收敛速度和更好的泛化能力。本文将介绍 Python 实现小批量梯度下降算法的基本思路和方法。

基本思路

小批量梯度下降算法的基本思路是根据给定的损失函数(loss function),利用梯度下降算法来不断更新模型参数,使得损失函数达到最小值。在这个过程中,我们不是利用全部的数据进行更新,而是随机选择一小部分数据(比如 32 个样本)来计算梯度,然后利用这个梯度进行参数更新。这种方法既减小了计算复杂度,又能够使得模型更快地收敛。

实现方法

下面是 Python 实现小批量梯度下降算法的基本方法:

import numpy as np
import random

def minibatch_gradient_descent(X, y, learning_rate=0.01, batch_size=32, num_epochs=100):
    ''' 
    X: 输入特征,维度为 (num_samples, num_features)
    y: 输出标签,维度为 (num_samples, )
    learning_rate: 学习率
    batch_size: 每次更新参数时,选取的样本数
    num_epochs: 更新参数的总次数

    return: 
    thetas: 更新后的参数,维度为 (num_features, )
    '''
    # 初始化模型参数
    num_samples, num_features = X.shape
    thetas = np.zeros(num_features)

    # 循环更新参数
    for epoch in range(num_epochs):
        # 随机选择一小部分样本
        minibatch_indices = random.choices(range(num_samples), k=batch_size)
        minibatch_X = X[minibatch_indices, :]
        minibatch_y = y[minibatch_indices]

        # 计算损失函数梯度
        predictions = np.dot(minibatch_X, thetas)
        errors = predictions - minibatch_y
        gradient = np.dot(minibatch_X.T, errors) / batch_size

        # 更新参数
        thetas -= learning_rate * gradient

    return thetas

在这个方法中,我们首先初始化模型参数 $\theta$(通常设置为全 0 向量)。然后,我们根据指定的更新次数循环进行更新:每次循环会从训练数据集中随机选择一小部分样本(大小为 batch_size),并计算它们的梯度。然后,我们根据学习率和梯度来更新模型参数。最终,算法会返回更新后的参数 $\theta$。

使用示例

下面是一个简单的使用示例,它演示了如何使用上述方法来训练一个简单的线性回归模型:

import numpy as np
import matplotlib.pyplot as plt

# 生成样本数据
num_samples = 1000
X = 2 * np.random.rand(num_samples, 1)
y = 4 + 3 * X + np.random.randn(num_samples, 1)

# 进行模型训练
thetas = minibatch_gradient_descent(X, y)

# 绘制数据和模型拟合结果
plt.plot(X, y, 'b.')
plt.plot(X, np.dot(X, thetas), 'r-')
plt.show()
总结

小批量梯度下降算法是机器学习中常用的一种优化算法,它可以有效地优化神经网络模型参数,并具有更快的收敛速度和更好的泛化能力。本文介绍了 Python 实现小批量梯度下降算法的基本思路和方法,以及一个简单的使用示例。