怎么建设免费的网站,html网页制作简单代码,东莞网站建设 汇卓,互联网建站公司关注B站可以观看更多实战教学视频#xff1a;肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) SGD#xff0c;即随机梯度下降#xff08;Stochastic Gradient Descent#xff09;#xff0c;是机器学习中用于优化目标函数的迭代方法#xff0c;特别是在处… 关注B站可以观看更多实战教学视频肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) SGD即随机梯度下降Stochastic Gradient Descent是机器学习中用于优化目标函数的迭代方法特别是在处理大数据集和在线学习场景中。与传统的批量梯度下降Batch Gradient Descent不同SGD在每一步中仅使用一个样本来计算梯度并更新模型参数这使得它在处理大规模数据集时更加高效。
SGD算法的基本步骤
初始化参数选择初始参数值可以是随机的或者基于一些先验知识。随机选择样本从数据集中随机选择一个样本。计算梯度计算损失函数关于当前参数的梯度。更新参数沿着负梯度方向更新参数。重复重复步骤2-4直到满足停止条件如达到预设的迭代次数或损失函数的改变小于某个阈值。
SGD的Python代码示例
python实现
假设我们要使用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_rate0.01, epochs1000): # 初始化参数 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(fEpoch {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(fOptimized parameters: w {w}, b {b})解析
在上面的代码中我们首先定义了损失函数和它的梯度。对于线性回归损失函数通常是均方误差。sgd函数实现了SGD算法。它接受输入数据x和标签y以及学习率和迭代次数作为参数。在每次迭代中我们计算损失函数关于参数w和b的梯度并使用这些梯度来更新参数。我们还记录了每次迭代的损失值以便稍后可视化算法的收敛情况。最后我们打印出优化后的参数值。在实际应用中你可能还需要使用这些参数来对新数据进行预测。
在PyTorch中SGD随机梯度下降是一种基本的优化器用于调整模型的参数以最小化损失函数。下面是torch.optim.SGD的参数解析和一个简单的用例。
SGD的Pytorch代码示例
参数解析
torch.optim.SGD的主要参数如下
params (iterable)待优化的参数或者是定义了参数的模型的迭代器。lr (float)学习率。这是更新参数的步长大小。较小的值会导致更新更精细而较大的值可能会导致训练过程不稳定。这是SGD优化器的一个关键参数。momentum (float, optional)动量因子 (default: 0)。该参数加速了SGD在相关方向上的收敛并抑制了震荡。dampening (float, optional)动量的抑制因子 (default: 0)。增加此值可以减少动量的影响。在实际应用中这个参数的使用较少。weight_decay (float, optional)权重衰减 (L2 penalty) (default: 0)。通过向损失函数添加与权重向量平方成比例的惩罚项来防止过拟合。nesterov (bool, optional)是否使用Nesterov动量 (default: False)。Nesterov动量是标准动量方法的一个变种它在计算梯度时使用了未来的近似位置。
用例
下面是一个使用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(), lr0.01, momentum0.9, weight_decay0.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(fEpoch {epoch1}, Loss: {loss.item()})在这个例子中我们创建了一个简单的两层神经网络模型并使用SGD优化器来更新模型的参数。在训练循环中我们执行了前向传播来计算模型的输出然后计算了损失通过调用loss.backward()执行了反向传播来计算梯度最后通过调用optimizer.step()更新了模型的参数。在每次迭代开始时我们使用optimizer.zero_grad()来清除之前累积的梯度这是非常重要的步骤因为PyTorch默认会累积梯度。