随机梯度下降(Stochastic Gradient Descent,简称SGD)是一种常用的参数优化算法。它是梯度下降(Gradient Descent,简称GD)算法的一种变种,常用于训练大规模数据集和大型神经网络。
梯度下降算法是求解函数最小值的一种迭代优化算法。其基本思想是按照负梯度方向迭代更新变量的取值,以此不断逼近函数的最小值。SGD算法是对梯度下降算法的改进,它不是在每一次迭代中计算所有样本的梯度,而是随机选择一个样本计算其梯度,使用此梯度来更新变量的取值。这样做可以大幅度降低计算量和内存开销,使得SGD算法适用于大规模数据集和大型神经网络的训练。
SGD算法的更新公式如下:
$$w_i=w_i-\alpha\frac{\partial L(w,x_i,y_i)}{\partial w_i}$$
其中,$w_i$表示变量的第$i$个分量,$\alpha$表示学习率,$L(w,x_i,y_i)$表示损失函数,$\frac{\partial L(w,x_i,y_i)}{\partial w_i}$表示损失函数对变量$w_i$的偏导数。
SGD算法的具体步骤如下:
1. 初始化变量$w$;
2. 随机选择样本$(x_i,y_i)$;
3. 计算样本$(x_i,y_i)$的梯度$\frac{\partial L(w,x_i,y_i)}{\partial w_i}$;
4. 使用公式更新变量$w$,即$w_i=w_i-\alpha\frac{\partial L(w,x_i,y_i)}{\partial w_i}$;
5. 重复步骤2-4,直到满足停止条件。
SGD算法的停止条件可以是达到预定的迭代次数,或者达到一定的精度要求。
SGD算法的优点是计算量和内存开销小,可以处理大规模数据集和大型神经网络。缺点是收敛速度慢,容易陷入局部极小值。
下面给出一个SGD算法的案例,用于线性回归的参数优化。
```python
import numpy as np
class LinearRegression:
def __init__(self, lr=0.01, max_iter=100, tol=1e-4):
self.lr = lr # 学习率
self.max_iter = max_iter # 最大迭代次数
self.tol = tol # 收敛精度
def fit(self, X, y):
n_features = X.shape[1]
self.w = np.zeros(n_features) # 初始化参数
for i in range(self.max_iter):
idx = np.random.randint(X.shape[0]) # 随机选择样本
sample_X = X[idx]
sample_y = y[idx]
grad = sample_X * (np.dot(sample_X, self.w) - sample_y) # 计算梯度
self.w = self.w - self.lr * grad # 更新参数
if np.linalg.norm(grad) < self.tol: # 判断是否收敛
break
def predict(self, X):
return np.dot(X, self.w)
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5]])
y = np.array([3, 4, 5, 6])
model = LinearRegression(lr=0.01)
model.fit(X, y)
test_X = np.array([[2, 3], [3, 4]])
print(model.predict(test_X))
```
这个案例中,我们用SGD算法实现了线性回归的参数优化。我们随机选择一个样本计算其梯度,使用此梯度来更新参数,重复执行直到满足停止条件。当梯度的范数小于精度要求时,我们认为算法已经收敛,可以停止优化。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复