赞
踩
关注B站可以观看更多实战教学视频:肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com)
SGD,即随机梯度下降(Stochastic Gradient Descent),是机器学习中用于优化目标函数的迭代方法,特别是在处理大数据集和在线学习场景中。与传统的批量梯度下降(Batch Gradient Descent)不同,SGD在每一步中仅使用一个样本来计算梯度并更新模型参数,这使得它在处理大规模数据集时更加高效。
假设我们要使用SGD来优化一个简单的线性回归模型。
import numpy as np # 目标函数(损失函数)和其梯度 def loss_function(w, b, x, y): return np.sum((y - (w * x + b)) ** 2) / len(x) def gradient_function(w, b, x, y): dw = -2 * np.sum((y - (w * x + b)) * x) / len(x) db = -2 * np.sum(y - (w * x + b)) / len(x) return dw, db # SGD算法 def sgd(x, y, learning_rate=0.01, epochs=1000): # 初始化参数 w = np.random.rand() b = np.random.rand() # 存储每次迭代的损失值,用于可视化 losses = [] for i in range(epochs): # 随机选择一个样本(在这个示例中,我们没有实际进行随机选择,而是使用了整个数据集。在大数据集上,你应该随机选择一个样本或小批量样本。) # 注意:为了简化示例,这里我们实际上使用的是批量梯度下降。在真正的SGD中,你应该在这里随机选择一个样本。 # 计算梯度 dw, db = gradient_function(w, b, x, y) # 更新参数 w = w - learning_rate * dw b = b - learning_rate * db # 记录损失值 loss = loss_function(w, b, x, y) losses.append(loss) # 每隔一段时间打印损失值(可选) if i % 100 == 0: print(f"Epoch {i}, Loss: {loss}") return w, b, losses # 示例数据(你可以替换为自己的数据) x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 4, 6, 8, 10]) # 运行SGD算法 w, b, losses = sgd(x, y) print(f"Optimized parameters: w = {w}, b = {b}")
sgd
函数实现了SGD算法。它接受输入数据x
和标签y
,以及学习率和迭代次数作为参数。w
和b
的梯度,并使用这些梯度来更新参数。在PyTorch中,SGD
(随机梯度下降)是一种基本的优化器,用于调整模型的参数以最小化损失函数。下面是torch.optim.SGD
的参数解析和一个简单的用例。
torch.optim.SGD
的主要参数如下:
下面是一个使用SGD
优化器的简单例子:
import torch import torch.nn as nn import torch.optim as optim # 定义一个简单的模型 model = nn.Sequential( nn.Linear(10, 5), nn.ReLU(), nn.Linear(5, 2), ) # 定义损失函数 criterion = nn.CrossEntropyLoss() # 定义优化器 optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=0.001) # 假设有输入数据和目标 input_data = torch.randn(1, 10) target = torch.tensor([1]) # 训练循环(这里只展示了一次迭代) for epoch in range(1): # 通常会有多个 epochs # 前向传播 output = model(input_data) # 计算损失 loss = criterion(output, target) # 反向传播 optimizer.zero_grad() # 清除之前的梯度 loss.backward() # 计算当前梯度 # 更新参数 optimizer.step() # 应用梯度更新 # 打印损失 print(f'Epoch {epoch+1}, Loss: {loss.item()}')
在这个例子中,我们创建了一个简单的两层神经网络模型,并使用SGD
优化器来更新模型的参数。在训练循环中,我们执行了前向传播来计算模型的输出,然后计算了损失,通过调用loss.backward()
执行了反向传播来计算梯度,最后通过调用optimizer.step()
更新了模型的参数。在每次迭代开始时,我们使用optimizer.zero_grad()
来清除之前累积的梯度,这是非常重要的步骤,因为PyTorch默认会累积梯度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。