机器学习 - 随机梯度下降
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 的大小选择会影响算法的收敛速度和稳定性。