机器学习中Stochastic Gradient Descent怎么用?SGD优化技巧详解?

文章导读
Previous Quiz Next Stochastic Gradient Descent (SGD) 是机器学习中一种流行的优化技术。它使用单个训练样本而不是整个数据集来迭代更新模型参数(权重和偏置)。它是gradient descent的一种变体,对于大型且稀疏的数据
📋 目录
  1. 什么是 Gradient Descent?
  2. 什么是 Stochastic Gradient Descent (SGD)?
  3. Stochastic Gradient Descent 算法
  4. 示例 - 在 Python 中实现随机梯度下降
  5. Stochastic Gradient Descent 的应用
  6. SGD 的优势
  7. Stochastic Gradient Descent 的挑战
A A

机器学习 - 随机梯度下降



Previous
Quiz
Next

Stochastic Gradient Descent (SGD) 是机器学习中一种流行的优化技术。它使用单个训练样本而不是整个数据集来迭代更新模型参数(权重和偏置)。它是gradient descent的一种变体,对于大型且稀疏的数据集更为高效和快速。

什么是 Gradient Descent?

Gradient Descent 是一种流行的优化算法,用于最小化机器学习模型的成本函数。它通过迭代调整模型参数来最小化预测输出与实际输出之间的差异。该算法通过计算成本函数相对于模型参数的梯度,然后沿梯度的反方向调整参数来工作。

什么是 Stochastic Gradient Descent (SGD)?

Stochastic Gradient Descent 是 Gradient Descent 的一种变体,它使用每个训练样本而不是在评估整个数据集后才更新参数。这意味着 SGD 不是使用整个数据集来计算成本函数的梯度,而是只使用单个训练样本(或 mini batch)。这种方法使算法收敛更快,并且需要更少的内存来存储数据。

Stochastic Gradient Descent 算法

Stochastic Gradient Descent 通过从数据集中随机选择单个(或小型 mini batch)训练样本并使用它来更新模型参数来工作。此过程针对固定数量的 epoch 重复,或者直到模型收敛到成本函数的最小值。

以下是 Stochastic Gradient Descent 算法的工作原理 −

  • 将模型参数初始化为随机值。
  • 对于每个 epoch,随机打乱训练数据。
  • 对于每个训练样本 −
    • 计算成本函数相对于模型参数的梯度。
    • 沿梯度的反方向更新模型参数。
  • 重复直到收敛

SGD 的参数或权重更新规则如下 −

$${w := w - J(w; x_{i}, y_{i})}$$$$

其中,

  • ${x_{i}}$:输入数据的第 $i$ 个数据点
  • ${y_{i}}$:对应的目标值
  • ${\alpha}$:学习率
  • ${J}$:损失或成本函数
  • ${J}$:损失或成本函数 $J$ 相对于 $w$ 的梯度。

这里的 ":=" 表示算法中变量的更新。

Stochastic Gradient Descent 与常规 Gradient Descent 的主要区别在于计算梯度的方式以及更新模型参数的方式。在 Stochastic Gradient Descent 中,梯度使用单个训练样本计算,而在 Gradient Descent 中,梯度使用整个数据集计算。

示例 - 在 Python 中实现随机梯度下降

让我们看一个在 Python 中实现 Stochastic Gradient Descent 的示例。我们将使用 scikit-learn 库在 Iris 数据集上实现该算法,Iris 数据集是一个常用于分类任务的流行数据集。在这个示例中,我们将使用其两个特征,即萼片宽度和萼片长度,来预测 Iris 花的种类 −

# Import required libraries
import sklearn

import numpy as np
from sklearn import datasets
from sklearn.linear_model import SGDClassifier

# Loading Iris flower dataset
iris = datasets.load_iris()
X_data, y_data = iris.data, iris.target

# Dividing the dataset into training and testing dataset
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# Getting the Iris dataset with only the first two attributes
X, y = X_data[:,:2], y_data

# Split the dataset into a training and a testing set(20 percent)
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.20, random_state=1)

# Standarize the features
scaler = StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

# create the linear model SGDclassifier
clfmodel_SGD = SGDClassifier(alpha=0.001, max_iter=200)

# Train the classifier using fit() function
clfmodel_SGD.fit(X_train, y_train)

# Evaluate the result
from sklearn import metrics
y_train_pred = clfmodel_SGD.predict(X_train)
print ("\nThe Accuracy of SGD classifier is:",
metrics.accuracy_score(y_train, y_train_pred)*100)

输出

运行此代码时,将产生以下输出 −

The Accuracy of SGD classifier is: 73.33333333333333

Stochastic Gradient Descent 的应用

Stochastic Gradient Descent (SGD) 不是一个完整的机器学习模型,而只是一种优化技术。它已成功应用于不同的机器学习问题,特别是在数据稀疏时。稀疏 ML 问题主要出现在文本分类和自然语言处理中。这种技术对于稀疏数据非常高效,并且可以扩展到具有数万示例和数万特征的问题。

SGD 的优势

以下是 Stochastic Gradient Descent 的一些优势 −

  • 效率 − 以较小的批次处理数据,减少内存需求。
  • 更快的收敛 − 比批量梯度下降收敛更快,特别是对于大型数据集。
  • 逃离局部最小值 − SGD 的随机特性有助于其逃离局部最小值并找到更好的解。

Stochastic Gradient Descent 的挑战

Stochastic Gradient Descent (SGD) 是一种高效的优化算法,但也伴随着一些可能影响其有效性的挑战。以下是 SGD 的一些挑战 −

  • 噪声梯度 − SGD 的随机特性可能导致噪声梯度,从而减慢收敛速度。
  • 学习率调优 − 选择合适的学习率对于有效的优化至关重要。
  • Mini-batch 大小 − Mini-batch 的大小选择会影响算法的收敛速度和稳定性。