随机梯度下降(SGD)简介

随机梯度下降(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/

点赞(95) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部